diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm index 1a1d07b6a999..e6be68cae54f 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm @@ -818,7 +818,7 @@ /turf/open/floor/engine/vacuum, /area/ruin/planetengi) "yF" = ( -/mob/living/simple_animal/hostile/construct/proteon, +/mob/living/basic/construct/proteon, /turf/open/floor/iron, /area/ruin/planetengi) "Ai" = ( @@ -829,7 +829,7 @@ /turf/open/floor/iron/icemoon, /area/ruin/planetengi) "Iy" = ( -/mob/living/simple_animal/hostile/construct/proteon, +/mob/living/basic/construct/proteon, /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron/icemoon, /area/ruin/planetengi) diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm index 44e5b655c89f..7b99eeba0758 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm @@ -1,11 +1,4 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ac" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/grille, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) "af" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/grille, @@ -82,6 +75,37 @@ /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/plating, /area/ruin/plasma_facility/commons) +"aZ" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/sheet/mineral/silver, +/obj/item/stack/ore/silver, +/obj/item/stack/ore/silver, +/obj/item/stack/ore/silver, +/obj/item/stack/ore/silver, +/obj/item/stack/ore/silver, +/obj/item/stack/ore/silver, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/underground/explored) +"bj" = ( +/obj/effect/turf_decal/bot/left, +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/item/stack/sheet/mineral/plasma/thirty, +/turf/open/floor/iron/smooth_half{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/plasma_facility/operations) "br" = ( /obj/structure/table/reinforced, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -127,7 +151,7 @@ name = "Plasma Relief Valve" }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer, +/mob/living/basic/skeleton/plasmaminer/jackhammer, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) "bX" = ( @@ -274,16 +298,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/ruin/plasma_facility/commons) +"ea" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/underground/explored) "ed" = ( /obj/machinery/atmospherics/components/tank/plasma, /turf/open/floor/plating/snowed/icemoon, /area/ruin/plasma_facility/operations) -"ev" = ( -/obj/structure/window/reinforced/unanchored{ - dir = 1 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) "eC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -298,17 +321,6 @@ /obj/structure/fence/cut/large, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) -"eM" = ( -/obj/structure/window/reinforced/spawner, -/obj/effect/decal/cleanable/glass, -/obj/item/shard{ - pixel_x = 11; - pixel_y = 6 - }, -/obj/item/shard, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) "eO" = ( /obj/structure/table, /obj/item/plate, @@ -326,6 +338,12 @@ /obj/structure/bonfire, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"fc" = ( +/obj/structure/window/reinforced/unanchored{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "fx" = ( /obj/machinery/light/small/built/directional/west, /turf/open/lava/plasma/ice_moon, @@ -359,9 +377,9 @@ }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) -"gd" = ( -/mob/living/simple_animal/hostile/asteroid/wolf, -/turf/open/misc/asteroid/snow/icemoon, +"gi" = ( +/mob/living/basic/mining/wolf, +/turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) "gj" = ( /obj/structure/closet/emcloset, @@ -475,12 +493,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood/large, /area/ruin/plasma_facility/commons) -"hN" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner, -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) "hR" = ( /turf/closed/wall/ice, /area/ruin/plasma_facility/operations) @@ -563,6 +575,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, /area/ruin/plasma_facility/commons) +"im" = ( +/obj/structure/window/reinforced/spawner, +/obj/effect/decal/cleanable/glass, +/obj/item/shard, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/icemoon, +/area/ruin/plasma_facility/operations) "iw" = ( /obj/structure/railing, /obj/item/grown/log{ @@ -608,6 +627,17 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/plasma_facility/operations) +"jI" = ( +/obj/structure/window/reinforced/spawner, +/obj/effect/decal/cleanable/glass, +/obj/item/shard{ + pixel_x = 11; + pixel_y = 6 + }, +/obj/item/shard, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/icemoon, +/area/ruin/plasma_facility/operations) "jN" = ( /obj/item/grown/log{ pixel_x = -7; @@ -630,24 +660,6 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"jT" = ( -/obj/structure/window/reinforced/spawner, -/obj/structure/grille, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"kh" = ( -/obj/structure/window/reinforced/spawner, -/obj/structure/frame/computer{ - anchored = 1; - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/plasma_facility/operations) "ku" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown/anticorner{ @@ -660,30 +672,6 @@ dir = 4 }, /area/ruin/plasma_facility/commons) -"kA" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) "kG" = ( /obj/structure/flora/grass/both/style_random, /turf/open/misc/asteroid/snow/icemoon, @@ -813,6 +801,12 @@ /obj/effect/turf_decal/tile/purple/half, /turf/open/floor/iron/textured_half, /area/ruin/plasma_facility/operations) +"ng" = ( +/obj/structure/grille/broken, +/obj/structure/window/reinforced/spawner, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating/icemoon, +/area/ruin/plasma_facility/operations) "nk" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/hidden{ dir = 5 @@ -856,6 +850,14 @@ dir = 1 }, /area/ruin/plasma_facility/commons) +"ns" = ( +/obj/item/kirbyplants{ + icon_state = "applebush" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/ruin/plasma_facility/commons) "nu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -990,14 +992,6 @@ }, /turf/open/floor/iron/edge, /area/ruin/plasma_facility/commons) -"pn" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/ruin/plasma_facility/commons) "pt" = ( /obj/structure/table, /obj/item/paper/paperslip{ @@ -1106,14 +1100,6 @@ "rs" = ( /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) -"rE" = ( -/obj/effect/spawner/structure/window/hollow/reinforced/directional{ - dir = 8 - }, -/obj/effect/decal/cleanable/glass, -/obj/structure/window/reinforced/spawner, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) "rF" = ( /obj/effect/decal/cleanable/dirt, /obj/item/wallframe/airalarm{ @@ -1127,16 +1113,18 @@ dir = 1 }, /area/ruin/plasma_facility/commons) -"rS" = ( -/obj/effect/turf_decal/bot/left, +"rW" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing/corner, /obj/structure/closet/crate{ icon_state = "crateopen" }, -/obj/item/stack/sheet/mineral/plasma/thirty, -/turf/open/floor/iron/smooth_half{ - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/plasma_facility/operations) +/obj/item/stack/sheet/mineral/uranium/five, +/obj/item/stack/sheet/mineral/uranium/five, +/obj/item/stack/sheet/mineral/uranium/five, +/obj/item/stack/sheet/mineral/uranium/five, +/turf/open/lava/plasma/ice_moon, +/area/icemoon/underground/explored) "sq" = ( /obj/structure/table/reinforced/rglass, /obj/effect/decal/cleanable/dirt, @@ -1144,27 +1132,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/textured, /area/ruin/plasma_facility/commons) -"sr" = ( -/obj/structure/railing{ - dir = 5 - }, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/ore/silver, -/obj/item/stack/ore/silver, -/obj/item/stack/ore/silver, -/obj/item/stack/ore/silver, -/obj/item/stack/ore/silver, -/obj/item/stack/ore/silver, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) "su" = ( /obj/structure/chair/stool/directional/south, /obj/effect/decal/cleanable/dirt, @@ -1249,6 +1216,16 @@ }, /turf/open/lava/plasma/ice_moon, /area/icemoon/underground/explored) +"ub" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/mob/living/basic/mining/wolf, +/turf/open/floor/iron/smooth{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/plasma_facility/operations) "ui" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -1268,16 +1245,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating/icemoon, /area/ruin/plasma_facility/operations) -"up" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/mob/living/simple_animal/hostile/asteroid/wolf, -/turf/open/floor/iron/smooth{ - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/plasma_facility/operations) "uq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -1323,11 +1290,6 @@ "vt" = ( /turf/closed/wall, /area/ruin/plasma_facility/operations) -"vz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) "vI" = ( /obj/structure/fence{ dir = 4 @@ -1439,6 +1401,14 @@ }, /turf/open/floor/iron/edge, /area/ruin/plasma_facility/commons) +"yG" = ( +/obj/effect/spawner/structure/window/hollow/reinforced/directional{ + dir = 8 + }, +/obj/effect/decal/cleanable/glass, +/obj/structure/window/reinforced/spawner, +/turf/open/floor/plating/icemoon, +/area/ruin/plasma_facility/operations) "yL" = ( /obj/structure/girder, /turf/open/floor/plating/icemoon, @@ -1625,7 +1595,7 @@ name = "mining conveyor" }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/skeleton/plasmaminer, +/mob/living/basic/skeleton/plasmaminer, /obj/effect/turf_decal/tile/brown/opposingcorners, /turf/open/floor/iron, /area/ruin/plasma_facility/operations) @@ -1689,13 +1659,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/ruin/plasma_facility/commons) -"DQ" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/effect/turf_decal/tile/brown/full, -/turf/open/floor/iron/large, -/area/ruin/plasma_facility/commons) "DR" = ( /obj/machinery/light/small/broken/directional/north, /turf/open/lava/plasma/ice_moon, @@ -1757,18 +1720,6 @@ /obj/machinery/light/small/broken/directional/north, /turf/open/lava/plasma/ice_moon, /area/ruin/plasma_facility/operations) -"FD" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) "FG" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -1815,6 +1766,22 @@ /obj/item/shard, /turf/open/floor/plating/icemoon, /area/ruin/plasma_facility/operations) +"Gu" = ( +/obj/machinery/door/poddoor/shutters/window/preopen{ + id = "fire_facility_car"; + name = "Garage Door" + }, +/mob/living/basic/mining/wolf, +/turf/open/floor/plating/icemoon, +/area/ruin/plasma_facility/operations) +"Hn" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner, +/obj/item/shard, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating/icemoon, +/area/ruin/plasma_facility/operations) "Hp" = ( /obj/structure/railing/corner, /turf/open/lava/plasma/ice_moon, @@ -1832,10 +1799,6 @@ }, /turf/open/floor/plating/icemoon, /area/ruin/plasma_facility/commons) -"Hz" = ( -/mob/living/simple_animal/hostile/asteroid/wolf, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) "HA" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -1885,14 +1848,6 @@ /obj/machinery/light/small/directional/north, /turf/open/lava/plasma/ice_moon, /area/ruin/plasma_facility/operations) -"Ij" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/window/reinforced/spawner, -/obj/item/shard, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) "In" = ( /obj/structure/flora/grass/green/style_random, /obj/machinery/light/small/broken/directional/east, @@ -1903,13 +1858,13 @@ /obj/machinery/light/small/broken/directional/south, /turf/open/lava/plasma/ice_moon, /area/ruin/plasma_facility/operations) -"IJ" = ( -/obj/structure/window/reinforced/spawner, -/obj/effect/decal/cleanable/glass, -/obj/item/shard, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) +"IP" = ( +/obj/item/kirbyplants{ + icon_state = "applebush" + }, +/obj/effect/turf_decal/tile/brown/full, +/turf/open/floor/iron/large, +/area/ruin/plasma_facility/commons) "IU" = ( /obj/structure/chair/sofa/right/brown{ dir = 4 @@ -1976,7 +1931,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer, +/mob/living/basic/skeleton/plasmaminer/jackhammer, /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/smooth{ initial_gas_mix = "ICEMOON_ATMOS" @@ -2037,6 +1992,13 @@ /obj/effect/turf_decal/box/corners, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"Ku" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/grille, +/turf/open/floor/plating/icemoon, +/area/ruin/plasma_facility/operations) "Kw" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -2175,12 +2137,6 @@ /obj/item/stack/sheet/iron, /turf/open/floor/plating/snowed/icemoon, /area/ruin/plasma_facility/operations) -"MN" = ( -/obj/structure/grille/broken, -/obj/structure/window/reinforced/spawner, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) "MO" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -2260,6 +2216,10 @@ }, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) +"Np" = ( +/mob/living/basic/mining/wolf, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "Nw" = ( /obj/machinery/atmospherics/components/binary/valve{ dir = 4; @@ -2302,7 +2262,7 @@ /obj/effect/decal/cleanable/glass, /obj/item/shard, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer, +/mob/living/basic/skeleton/plasmaminer/jackhammer, /turf/open/floor/iron/freezer, /area/ruin/plasma_facility/commons) "Or" = ( @@ -2317,6 +2277,11 @@ /obj/item/crowbar/red, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) +"OB" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/grille, +/turf/open/floor/plating/icemoon, +/area/ruin/plasma_facility/operations) "OC" = ( /obj/structure/chair/office/light{ dir = 4 @@ -2325,7 +2290,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer, +/mob/living/basic/skeleton/plasmaminer/jackhammer, /obj/machinery/light_switch/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/textured, @@ -2413,6 +2378,30 @@ dir = 1 }, /area/ruin/plasma_facility/commons) +"PE" = ( +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/obj/item/stack/ore/plasma, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/underground/explored) "PP" = ( /obj/structure/dresser, /obj/effect/decal/cleanable/dirt, @@ -2477,6 +2466,12 @@ /obj/item/screwdriver, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) +"QH" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/spawner, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/plating/icemoon, +/area/ruin/plasma_facility/commons) "QJ" = ( /obj/machinery/computer/order_console/mining, /obj/effect/decal/cleanable/dirt, @@ -2583,14 +2578,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/icemoon, /area/ruin/plasma_facility/commons) -"SV" = ( -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/canister_frame/machine, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) "Tr" = ( /obj/effect/turf_decal/tile/brown/half{ dir = 1 @@ -2664,14 +2651,6 @@ /obj/structure/flora/tree/stump, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"Vy" = ( -/obj/machinery/door/poddoor/shutters/window/preopen{ - id = "fire_facility_car"; - name = "Garage Door" - }, -/mob/living/simple_animal/hostile/asteroid/wolf, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) "VD" = ( /obj/effect/turf_decal/tile/brown/half, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -2701,6 +2680,14 @@ /obj/structure/grille, /turf/open/floor/plating/icemoon, /area/ruin/plasma_facility/commons) +"Wi" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/canister_frame/machine, +/turf/open/floor/plating/snowed/icemoon, +/area/icemoon/underground/explored) "Wu" = ( /turf/open/floor/wood/large, /area/ruin/plasma_facility/commons) @@ -2815,6 +2802,19 @@ /obj/effect/turf_decal/tile/brown/full, /turf/open/floor/iron/textured_large, /area/ruin/plasma_facility/commons) +"Yk" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/frame/computer{ + anchored = 1; + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/plasma_facility/operations) "Yl" = ( /obj/structure/flora/rock/pile/icy/style_random, /turf/open/misc/asteroid/snow/icemoon, @@ -3135,7 +3135,7 @@ Yl vI Yw ms -Hz +gi Yw Yw Yw @@ -3208,11 +3208,11 @@ hJ Py Yw hJ -gd +Np Yw XI wb -hN +QH nD Km Yw @@ -3238,7 +3238,7 @@ AG AG PQ vI -Hz +gi Yw Yw Yw @@ -3321,7 +3321,7 @@ lW pl Mc af -rS +bj hd vt hR @@ -3333,7 +3333,7 @@ Ve ms VT Yw -Hz +gi ms Yw vY @@ -3355,7 +3355,7 @@ PB bM VD gj -ac +Ku pX Ib js @@ -3404,7 +3404,7 @@ ms hR Dr Dr -Vy +Gu yL vY "} @@ -3424,7 +3424,7 @@ pw Zk eC bv -DQ +IP hR OJ go @@ -3475,7 +3475,7 @@ vt FO LD FO -MN +ng vY "} (16,1,1) = {" @@ -3490,7 +3490,7 @@ hK ZH wF Cm -pn +ns PB eC yv @@ -3507,7 +3507,7 @@ AZ dO DZ Jb -up +ub FO ia HX @@ -3685,7 +3685,7 @@ ms eD tG Zf -ev +fc AG "} (22,1,1) = {" @@ -3849,7 +3849,7 @@ wm XA Rj Gb -kA +PE rk fO rs @@ -3885,7 +3885,7 @@ rk hR DZ ie -SV +Wi AT rs rs @@ -3919,7 +3919,7 @@ KV ie TY ie -vz +ea HS oc rs @@ -3991,7 +3991,7 @@ XK ak IU Dp -FD +rW Ee rs rs @@ -4022,7 +4022,7 @@ rs tX fN Na -vz +ea rk hR qP @@ -4056,7 +4056,7 @@ Ue rs Qn rs -sr +aZ Mz vt ed @@ -4194,7 +4194,7 @@ NX vt no ly -eM +jI rs rs rs @@ -4227,9 +4227,9 @@ rs rs af lX -kh +Yk mA -jT +OB rs rs rs @@ -4299,7 +4299,7 @@ oi qw Or hc -IJ +im rs rs rs @@ -4330,7 +4330,7 @@ AG AG rs rs -Ij +Hn qw qw vt @@ -4368,7 +4368,7 @@ rs Pz ul Kx -rE +yG Pz rs rs diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm index 8d851421f1cd..939ddf92b5ef 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm @@ -108,7 +108,7 @@ "la" = ( /obj/effect/decal/cleanable/blood/gibs/up, /obj/effect/mob_spawn/corpse/human/assistant, -/mob/living/simple_animal/hostile/skeleton/eskimo{ +/mob/living/basic/skeleton/settler{ name = "Village Hunter" }, /turf/open/misc/asteroid/snow/icemoon, @@ -135,7 +135,7 @@ /area/icemoon/underground/explored) "mi" = ( /obj/effect/decal/remains/human, -/mob/living/simple_animal/hostile/construct/juggernaut/hostile{ +/mob/living/basic/construct/juggernaut/hostile{ health = 450; maxHealth = 450; name = "Right Hand of the Elder" @@ -360,7 +360,7 @@ "EF" = ( /obj/effect/decal/cleanable/blood/gibs/torso, /obj/effect/decal/remains/human, -/mob/living/simple_animal/hostile/construct/juggernaut/hostile{ +/mob/living/basic/construct/juggernaut/hostile{ health = 450; maxHealth = 450; name = "Left Hand of the Elder" diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm index 03bd2ad2a5d6..77db984ba4ea 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm @@ -1,4 +1,8 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"al" = ( +/mob/living/basic/mining/wolf, +/turf/open/floor/plating/icemoon, +/area/ruin/powered/shuttle) "aD" = ( /obj/structure/fence/cut/medium, /turf/open/misc/asteroid/snow/icemoon, @@ -6,10 +10,6 @@ "aU" = ( /turf/open/genturf, /area/icemoon/underground/unexplored/rivers) -"bh" = ( -/mob/living/simple_animal/hostile/asteroid/wolf, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) "cv" = ( /obj/structure/flora/rock/pile/icy/style_random, /obj/machinery/light/small/directional/north, @@ -43,6 +43,12 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) +"fD" = ( +/mob/living/basic/mining/wolf, +/turf/open/floor/iron/showroomfloor{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/ruin/powered/shuttle) "gz" = ( /turf/closed/wall/ice, /area/ruin/powered/shuttle) @@ -68,12 +74,6 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) -"oD" = ( -/mob/living/simple_animal/hostile/asteroid/wolf, -/turf/open/floor/iron/showroomfloor{ - initial_gas_mix = "ICEMOON_ATMOS" - }, -/area/ruin/powered/shuttle) "oT" = ( /turf/open/floor/iron/showroomfloor{ initial_gas_mix = "ICEMOON_ATMOS" @@ -98,10 +98,6 @@ initial_gas_mix = "ICEMOON_ATMOS" }, /area/ruin/powered/shuttle) -"rn" = ( -/mob/living/simple_animal/hostile/asteroid/wolf, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) "rS" = ( /obj/structure/flora/tree/pine/style_random, /obj/structure/flora/grass/green/style_random, @@ -130,6 +126,13 @@ }, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"tx" = ( +/obj/structure/window/reinforced/spawner, +/obj/structure/grille, +/obj/item/shard, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating/icemoon, +/area/ruin/powered/shuttle) "uz" = ( /obj/structure/tank_dispenser, /turf/open/floor/iron/smooth{ @@ -226,7 +229,7 @@ /obj/structure/fence/cut/large, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) -"CH" = ( +"DV" = ( /obj/structure/window/reinforced/spawner, /obj/effect/spawner/structure/window/hollow/reinforced/directional{ dir = 1 @@ -248,11 +251,6 @@ }, /turf/open/floor/plating/icemoon, /area/ruin/powered/shuttle) -"FK" = ( -/mob/living/simple_animal/hostile/asteroid/wolf, -/obj/machinery/light/small/broken/directional/north, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/shuttle) "FP" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle{ dir = 4 @@ -276,12 +274,10 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/plating/icemoon, /area/ruin/powered/shuttle) -"GQ" = ( -/obj/structure/window/reinforced/spawner, -/obj/structure/grille, -/obj/item/shard, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/icemoon, +"GX" = ( +/mob/living/basic/mining/wolf, +/obj/machinery/light/small/broken/directional/north, +/turf/open/floor/plating/snowed/smoothed/icemoon, /area/ruin/powered/shuttle) "HT" = ( /obj/structure/closet/wardrobe/grey, @@ -347,6 +343,10 @@ }, /turf/open/floor/plating/icemoon, /area/ruin/powered/shuttle) +"Ok" = ( +/mob/living/basic/mining/wolf, +/turf/open/floor/plating/snowed/smoothed/icemoon, +/area/icemoon/underground/explored) "OM" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -530,7 +530,7 @@ aU aU qS TG -CH +DV Gl gz Cr @@ -553,7 +553,7 @@ GH NO MS oT -oD +fD oT oT eC @@ -568,7 +568,7 @@ qS aU qS qS -GQ +tx oj gz wJ @@ -613,7 +613,7 @@ Et gz SR wP -bh +Ok qS th yl @@ -645,7 +645,7 @@ aU aU gz wg -rn +al Qj te RK @@ -668,7 +668,7 @@ OM yW Kh gz -FK +GX wP qS wP diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm index 9a4abac267d0..f90f0d86cd3b 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm @@ -13,7 +13,7 @@ /turf/open/misc/asteroid/snow/ice/icemoon, /area/icemoon/underground/unexplored) "q" = ( -/mob/living/simple_animal/hostile/megafauna/wendigo, +/mob/living/simple_animal/hostile/megafauna/wendigo/monkestation_override, /turf/open/indestructible/necropolis{ initial_gas_mix = "ICEMOON_ATMOS" }, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm index 7ab354935c39..ef650913f141 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm @@ -671,7 +671,7 @@ /area/ruin/powered/clownplanet) "RW" = ( /obj/effect/mapping_helpers/no_lava, -/mob/living/simple_animal/hostile/retaliate/clown, +/mob/living/basic/clown, /turf/open/floor/noslip, /area/ruin/powered/clownplanet) "Tj" = ( @@ -714,7 +714,7 @@ "YI" = ( /obj/machinery/light/small/directional/south, /obj/effect/mapping_helpers/no_lava, -/mob/living/simple_animal/hostile/retaliate/clown, +/mob/living/basic/clown, /turf/open/floor/noslip, /area/ruin/powered/clownplanet) "Zg" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index d63d261b813c..47fe3152a8b5 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -213,7 +213,7 @@ dir = 1 }, /obj/structure/stone_tile, -/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck, +/mob/living/basic/mining/gutlunch/milk, /turf/open/indestructible/boss, /area/ruin/unpowered/ash_walkers) "aR" = ( @@ -287,7 +287,7 @@ /obj/structure/stone_tile{ dir = 4 }, -/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen, +/mob/living/basic/mining/gutlunch/warrior, /turf/open/indestructible/boss, /area/ruin/unpowered/ash_walkers) "bd" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm index f83887d9b427..a49846f2b0a6 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm @@ -148,7 +148,7 @@ /turf/open/floor/wood, /area/ruin/powered/snow_biodome) "aH" = ( -/mob/living/simple_animal/hostile/skeleton/eskimo, +/mob/living/basic/skeleton/settler, /turf/open/floor/wood, /area/ruin/powered/snow_biodome) "aI" = ( @@ -258,11 +258,11 @@ /area/ruin/powered/snow_biodome) "gz" = ( /obj/structure/chair/stool/directional/south, -/mob/living/simple_animal/hostile/skeleton/eskimo, +/mob/living/basic/skeleton/settler, /turf/open/floor/pod/dark, /area/ruin/powered/snow_biodome) "hr" = ( -/mob/living/simple_animal/hostile/skeleton/eskimo, +/mob/living/basic/skeleton/settler, /obj/effect/turf_decal/siding/wood{ dir = 1 }, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_mookvillage.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_mookvillage.dmm new file mode 100644 index 000000000000..01891e8ef3dd --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_mookvillage.dmm @@ -0,0 +1,620 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ab" = ( +/obj/structure/bonfire/prelit, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ad" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ae" = ( +/obj/structure/flora/ash/fireblossom, +/mob/living/basic/mining/mook/worker/tribal_chief, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ah" = ( +/turf/closed/wall/mineral/wood, +/area/lavaland/surface/outdoors) +"al" = ( +/obj/structure/flora/ash/fireblossom, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"an" = ( +/obj/structure/flora/ash/fireblossom, +/mob/living/basic/mining/mook/worker, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"as" = ( +/obj/effect/landmark/mook_village, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"at" = ( +/obj/structure/chair/pew/left, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"au" = ( +/obj/structure/railing, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"aw" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"az" = ( +/mob/living/basic/mining/mook/worker/bard, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"aA" = ( +/obj/structure/chair/pew/right, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"aB" = ( +/turf/open/misc/grass/jungle, +/area/lavaland/surface/outdoors) +"aC" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall/mineral/wood, +/area/lavaland/surface/outdoors) +"aD" = ( +/obj/item/flashlight/lantern{ + on = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"aF" = ( +/obj/structure/chair/pew, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"aI" = ( +/mob/living/basic/mining/mook, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"aJ" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"aK" = ( +/obj/structure/table/wood/shuttle_bar, +/obj/item/hatchet/wooden, +/obj/item/storage/belt/champion/wrestling, +/turf/open/floor/holofloor/wood, +/area/lavaland/surface/outdoors) +"aL" = ( +/obj/item/flashlight/lantern{ + on = 1 + }, +/turf/open/floor/holofloor/wood, +/area/lavaland/surface/outdoors) +"aM" = ( +/obj/structure/chair/pew/right{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"aN" = ( +/turf/open/floor/holofloor/wood, +/area/lavaland/surface/outdoors) +"aP" = ( +/mob/living/basic/mining/mook/worker, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"aR" = ( +/obj/structure/bed/pod, +/obj/item/bedsheet/nanotrasen, +/turf/open/floor/holofloor/wood, +/area/lavaland/surface/outdoors) +"aT" = ( +/obj/structure/flora/tree/jungle/style_5, +/turf/open/misc/grass/jungle, +/area/lavaland/surface/outdoors) +"aU" = ( +/obj/structure/table/wood/shuttle_bar, +/turf/open/floor/holofloor/wood, +/area/lavaland/surface/outdoors) +"aV" = ( +/obj/structure/chair/pew{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"aX" = ( +/obj/structure/flora/grass/jungle/b, +/turf/open/misc/grass/jungle, +/area/lavaland/surface/outdoors) +"aY" = ( +/obj/structure/chair/pew/left{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"eN" = ( +/obj/structure/table/wood/shuttle_bar, +/obj/item/flashlight/flare/candle/infinite, +/turf/open/floor/holofloor/wood, +/area/lavaland/surface/outdoors) +"hi" = ( +/turf/open/floor/carpet/lone, +/area/lavaland/surface/outdoors) +"sk" = ( +/obj/structure/bed/maint, +/turf/open/floor/holofloor/wood, +/area/lavaland/surface/outdoors) +"xb" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/holofloor/wood, +/area/lavaland/surface/outdoors) +"xv" = ( +/obj/item/fishing_rod, +/obj/structure/bed/maint, +/turf/open/floor/holofloor/wood, +/area/lavaland/surface/outdoors) +"Br" = ( +/obj/structure/ore_container/material_stand, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"Jh" = ( +/obj/structure/closet/cabinet, +/obj/item/food/grown/banana, +/obj/item/food/meat/slab/goliath, +/turf/open/floor/holofloor/wood, +/area/lavaland/surface/outdoors) +"Mn" = ( +/obj/structure/flora/tree/jungle/style_3, +/turf/open/misc/grass/jungle, +/area/lavaland/surface/outdoors) +"WL" = ( +/obj/structure/chair/wood, +/turf/open/floor/holofloor/wood, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +al +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +al +aD +aa +aa +aa +aa +aa +aa +aa +at +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Br +aa +aa +aa +aa +aF +aa +aa +aa +aa +"} +(4,1,1) = {" +ah +ah +ah +ah +ah +ah +aa +as +aa +aa +aa +aa +aa +aa +aa +aF +aa +ab +aa +aa +"} +(5,1,1) = {" +aN +aN +Jh +sk +aN +aN +aa +aD +aa +aa +aa +aa +aP +aa +aD +aF +aa +aa +aa +aa +"} +(6,1,1) = {" +aN +aL +aN +aN +aN +aN +hi +an +aa +aP +aa +aa +aa +aa +aa +aA +aa +aa +aa +aa +"} +(7,1,1) = {" +aN +aN +aN +aN +aN +aN +hi +aa +aI +aa +aa +aa +aa +aa +al +ae +aY +aV +aV +aM +"} +(8,1,1) = {" +aN +WL +eN +xb +aN +aN +aa +aa +aa +aa +aw +aw +aw +aa +aI +aa +aa +aa +aa +aa +"} +(9,1,1) = {" +ah +ah +ah +ah +ah +ah +aa +aa +aa +au +aB +aB +aT +ad +aa +aa +aa +aP +aa +aa +"} +(10,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aI +aa +au +aB +aB +aX +ad +aa +aa +al +aa +aa +aa +"} +(11,1,1) = {" +aa +aa +al +al +aa +aa +aa +aa +aa +au +aB +Mn +aX +ad +aa +aa +aa +aa +aa +aa +"} +(12,1,1) = {" +aa +aa +aa +aa +aa +aP +aa +aa +aa +au +aB +aB +aT +ad +aa +aa +aa +aa +aa +aa +"} +(13,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aJ +aJ +aJ +aa +aa +aa +aP +aa +aa +aa +"} +(14,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +az +aD +al +aa +aa +aI +al +al +aa +aI +aa +aa +al +"} +(15,1,1) = {" +sk +sk +sk +sk +xv +sk +sk +al +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(16,1,1) = {" +aN +aN +aN +aN +aN +aN +aN +hi +aa +aa +aa +aa +ah +aN +aN +aN +ah +aa +aa +aa +"} +(17,1,1) = {" +aN +aN +aN +aL +aN +aN +aN +hi +aa +aP +aa +aa +ah +aK +aN +aN +ah +aa +aa +aa +"} +(18,1,1) = {" +sk +sk +sk +sk +sk +sk +sk +aa +aa +aa +aa +aa +aC +aU +aN +aN +ah +aa +aa +aa +"} +(19,1,1) = {" +ah +ah +ah +ah +ah +ah +ah +aa +aa +al +aa +aD +ah +aL +aN +aR +ah +aa +aa +aa +"} +(20,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ah +aN +aN +aN +ah +aa +aa +aa +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm index 22a59bb5fa5e..0c96ffbd6d5f 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm @@ -375,8 +375,8 @@ dir = 8 }, /obj/structure/table/reinforced, -/obj/machinery/splicer, /obj/item/food/grown/poppy/lily, +/obj/machinery/plantgenes, /turf/open/floor/mineral/plastitanium, /area/ruin/powered/seedvault) "bb" = ( diff --git a/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm b/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm index 17b00b712a32..0d97c9d3c7a6 100644 --- a/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/anomaly_research.dmm @@ -1130,10 +1130,6 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/iron/white, /area/misc/anomaly_research) -"Ch" = ( -/obj/machinery/rnd/experimentor, -/turf/open/floor/engine, -/area/misc/anomaly_research) "Cl" = ( /obj/effect/spawner/structure/window/plasma, /turf/open/floor/engine, @@ -2533,7 +2529,7 @@ oI Fg Fm Jy -Ch +CI pu AV xE diff --git a/_maps/RandomRuins/SpaceRuins/atmosasteroidruin.dmm b/_maps/RandomRuins/SpaceRuins/atmosasteroidruin.dmm index a68da2a99759..8670ad8113ce 100644 --- a/_maps/RandomRuins/SpaceRuins/atmosasteroidruin.dmm +++ b/_maps/RandomRuins/SpaceRuins/atmosasteroidruin.dmm @@ -604,7 +604,7 @@ /obj/effect/turf_decal/tile/yellow/half{ dir = 4 }, -/mob/living/simple_animal/hostile/asteroid/hivelord, +/mob/living/basic/mining/hivelord, /turf/open/floor/iron/co2_pressurized, /area/ruin/space/has_grav/atmosasteroid) "RK" = ( diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm index bf0972ae3118..9641778ac2cf 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -749,7 +749,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/mob/living/basic/syndicate/ranged/smg/space, +/mob/living/basic/trooper/syndicate/ranged/smg/space, /turf/open/floor/iron/airless, /area/shuttle/ruin/caravan/freighter3) "Cj" = ( @@ -1009,7 +1009,7 @@ /area/shuttle/ruin/caravan/freighter3) "PF" = ( /obj/effect/decal/cleanable/dirt, -/mob/living/basic/syndicate/ranged/smg/space, +/mob/living/basic/trooper/syndicate/ranged/smg/space, /turf/open/floor/iron/airless, /area/shuttle/ruin/caravan/freighter3) "PY" = ( @@ -1165,7 +1165,7 @@ /obj/effect/turf_decal/box/white/corners{ dir = 4 }, -/mob/living/basic/syndicate/ranged/shotgun/space/stormtrooper, +/mob/living/basic/trooper/syndicate/ranged/shotgun/space/stormtrooper, /turf/open/floor/iron/dark/airless, /area/shuttle/ruin/caravan/freighter3) "Zz" = ( diff --git a/_maps/RandomRuins/SpaceRuins/clericden.dmm b/_maps/RandomRuins/SpaceRuins/clericden.dmm index 0bf5a3a05798..5b1782559aed 100644 --- a/_maps/RandomRuins/SpaceRuins/clericden.dmm +++ b/_maps/RandomRuins/SpaceRuins/clericden.dmm @@ -131,7 +131,7 @@ /area/ruin/space) "E" = ( /obj/effect/decal/cleanable/blood/tracks, -/mob/living/simple_animal/hostile/construct/proteon/hostile, +/mob/living/basic/construct/proteon/hostile, /turf/open/floor/carpet/airless, /area/ruin/space) "F" = ( @@ -171,7 +171,7 @@ /turf/open/floor/plating/airless, /area/ruin/space) "N" = ( -/mob/living/simple_animal/hostile/construct/proteon, +/mob/living/basic/construct/proteon, /turf/open/misc/asteroid/airless, /area/ruin/space) "O" = ( diff --git a/_maps/RandomRuins/SpaceRuins/clownplanet.dmm b/_maps/RandomRuins/SpaceRuins/clownplanet.dmm index b0cc8cc29e20..fa0b50cc4435 100644 --- a/_maps/RandomRuins/SpaceRuins/clownplanet.dmm +++ b/_maps/RandomRuins/SpaceRuins/clownplanet.dmm @@ -26,7 +26,7 @@ /turf/open/floor/engine, /area/ruin/space/has_grav/powered/clownplanet) "ah" = ( -/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/destroyer, +/mob/living/basic/clown/clownhulk/destroyer, /turf/open/floor/engine, /area/ruin/space/has_grav/powered/clownplanet) "ai" = ( diff --git a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm index da21f9ffb4a0..52b7347f1353 100644 --- a/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm +++ b/_maps/RandomRuins/SpaceRuins/dangerous_research.dmm @@ -1334,10 +1334,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/dangerous_research/lab) "re" = ( -/mob/living/simple_animal/hostile/heretic_summon/raw_prophet{ - AIStatus = 1; - stop_automated_movement = 0 - }, +/mob/living/basic/heretic_summon/raw_prophet/ruins, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/dangerous_research/medical) "ri" = ( @@ -2017,10 +2014,7 @@ /obj/effect/decal/cleanable/glass, /obj/item/shard, /obj/item/stack/sheet/iron, -/mob/living/simple_animal/hostile/heretic_summon/rust_spirit{ - AIStatus = 1; - stop_automated_movement = 0 - }, +/mob/living/basic/heretic_summon/rust_walker, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/dangerous_research/lab) "zR" = ( @@ -2050,10 +2044,7 @@ dir = 1 }, /obj/effect/decal/cleanable/blood/footprints, -/mob/living/simple_animal/hostile/heretic_summon/raw_prophet{ - AIStatus = 1; - stop_automated_movement = 0 - }, +/mob/living/basic/heretic_summon/raw_prophet/ruins, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research/medical) @@ -3751,10 +3742,7 @@ /turf/open/floor/engine/airless, /area/ruin/space/has_grav/dangerous_research/maint) "Xh" = ( -/mob/living/simple_animal/hostile/heretic_summon/rust_spirit{ - AIStatus = 1; - stop_automated_movement = 0 - }, +/mob/living/basic/heretic_summon/rust_walker, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -3896,10 +3884,7 @@ /turf/open/floor/iron/white, /area/ruin/space/has_grav/dangerous_research/medical) "YZ" = ( -/mob/living/simple_animal/hostile/heretic_summon/rust_spirit{ - AIStatus = 1; - stop_automated_movement = 0 - }, +/mob/living/basic/heretic_summon/rust_walker, /turf/open/floor/plating/rust, /area/ruin/space/has_grav/dangerous_research/lab) "Zc" = ( diff --git a/_maps/RandomRuins/SpaceRuins/forgottenship.dmm b/_maps/RandomRuins/SpaceRuins/forgottenship.dmm index 27626b3466d4..fb7e04b2d32e 100644 --- a/_maps/RandomRuins/SpaceRuins/forgottenship.dmm +++ b/_maps/RandomRuins/SpaceRuins/forgottenship.dmm @@ -295,7 +295,7 @@ /area/ruin/space/has_grav/syndicate_forgotten_cargopod) "bc" = ( /obj/machinery/light/directional/south, -/mob/living/simple_animal/hostile/nanotrasen/ranged/assault, +/mob/living/basic/trooper/nanotrasen/ranged/assault, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/syndicate_forgotten_ship) "bd" = ( @@ -657,7 +657,7 @@ /area/ruin/space/has_grav/syndicate_forgotten_ship) "cd" = ( /obj/machinery/light/directional/south, -/mob/living/simple_animal/hostile/nanotrasen/ranged/assault, +/mob/living/basic/trooper/nanotrasen/ranged/assault, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/syndicate_forgotten_ship) "ce" = ( @@ -812,7 +812,7 @@ dir = 10 }, /obj/item/wrench, -/mob/living/simple_animal/hostile/nanotrasen/ranged/assault, +/mob/living/basic/trooper/nanotrasen/ranged/assault, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/syndicate_forgotten_ship) "cz" = ( @@ -971,7 +971,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/mob/living/simple_animal/hostile/nanotrasen/elite, +/mob/living/basic/trooper/nanotrasen/ranged/elite, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/syndicate_forgotten_ship) "cR" = ( diff --git a/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm b/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm index 43640452bb24..dfcdf0852910 100644 --- a/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm +++ b/_maps/RandomRuins/SpaceRuins/old_infiltrator.dmm @@ -233,9 +233,6 @@ /area/ruin/space/unpowered) "pl" = ( /obj/structure/table, -/obj/item/relic{ - pixel_y = 5 - }, /turf/open/floor/mineral/plastitanium/red/airless, /area/ruin/space/unpowered) "qL" = ( diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index b52d531e4613..cff5ce4e560e 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -7926,7 +7926,6 @@ /obj/structure/closet/crate/secure/science{ req_access = list("away_science") }, -/obj/item/relic, /obj/item/transfer_valve, /obj/item/raw_anomaly_core/bluespace, /obj/item/raw_anomaly_core/random, diff --git a/_maps/RandomRuins/SpaceRuins/prey_pod.dmm b/_maps/RandomRuins/SpaceRuins/prey_pod.dmm index 9089dea664c0..6f53409b8735 100644 --- a/_maps/RandomRuins/SpaceRuins/prey_pod.dmm +++ b/_maps/RandomRuins/SpaceRuins/prey_pod.dmm @@ -17,7 +17,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/mob/living/simple_animal/hostile/asteroid/hivelord, +/mob/living/basic/mining/hivelord, /turf/open/floor/mineral/titanium/white/airless, /area/ruin/space/has_grav) "p" = ( @@ -32,7 +32,7 @@ /area/ruin/space/has_grav) "D" = ( /obj/structure/chair/comfy/shuttle, -/mob/living/simple_animal/hostile/asteroid/hivelord, +/mob/living/basic/mining/hivelord, /turf/open/floor/mineral/titanium/white/airless, /area/ruin/space/has_grav) "E" = ( @@ -57,7 +57,7 @@ /turf/open/floor/mineral/titanium/white/airless, /area/ruin/space/has_grav) "S" = ( -/mob/living/simple_animal/hostile/asteroid/hivelord, +/mob/living/basic/mining/hivelord, /turf/open/floor/mineral/titanium/white/airless, /area/ruin/space/has_grav) "T" = ( diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm index cafa74f8d3f5..e1bfb59abaa2 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm @@ -772,7 +772,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/directional/east, -/mob/living/basic/syndicate/ranged/smg/space, +/mob/living/basic/trooper/syndicate/ranged/smg/space, /turf/open/floor/iron/dark/textured, /area/ruin/space/has_grav/hotel/security) "gQ" = ( @@ -875,7 +875,7 @@ "hH" = ( /obj/structure/cable, /obj/machinery/airalarm/directional/north, -/mob/living/basic/syndicate/melee/sword/space/stormtrooper, +/mob/living/basic/trooper/syndicate/melee/sword/space/stormtrooper, /turf/open/floor/glass/reinforced, /area/ruin/space/has_grav/hotel/security) "hI" = ( @@ -1645,7 +1645,7 @@ /obj/effect/turf_decal/trimline/yellow/warning{ dir = 10 }, -/mob/living/basic/syndicate/ranged/shotgun/space/stormtrooper, +/mob/living/basic/trooper/syndicate/ranged/shotgun/space/stormtrooper, /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/blood, /turf/open/floor/iron/dark/textured, @@ -1907,7 +1907,7 @@ /area/ruin/space/has_grav/hotel/security) "pr" = ( /obj/effect/decal/cleanable/dirt/dust, -/mob/living/basic/syndicate/melee/space/stormtrooper, +/mob/living/basic/trooper/syndicate/melee/space/stormtrooper, /turf/open/floor/iron/dark/textured_large, /area/ruin/space/has_grav/hotel/dock) "pz" = ( @@ -1993,7 +1993,7 @@ /turf/open/misc/beach/sand, /area/ruin/space/has_grav/hotel/pool) "qx" = ( -/mob/living/basic/syndicate/melee/sword/space/stormtrooper, +/mob/living/basic/trooper/syndicate/melee/sword/space/stormtrooper, /turf/open/floor/glass/reinforced, /area/ruin/space/has_grav/hotel/security) "qz" = ( diff --git a/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm b/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm index dd6656c22cdd..1c727e56d91c 100644 --- a/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm +++ b/_maps/RandomRuins/SpaceRuins/the_faceoff.dmm @@ -174,8 +174,7 @@ /turf/open/floor/iron/dark/airless, /area/ruin/space) "eI" = ( -/obj/item/ammo_casing/a357, -/mob/living/basic/syndicate/melee/space, +/mob/living/basic/trooper/syndicate/melee/space, /turf/open/floor/iron/dark/airless, /area/ruin/space) "eU" = ( @@ -699,7 +698,14 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/stripes/full, /obj/item/grenade/c4, -/mob/living/simple_animal/hostile/mining_drone, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mob_spawn/corpse/human/russian, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/full, +/mob/living/basic/mining_drone, +/obj/item/grenade/c4, /turf/open/misc/asteroid/basalt/airless, /area/ruin/space) "Do" = ( diff --git a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm index 44721abb8966..05a9867e8ca7 100644 --- a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm +++ b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm @@ -103,7 +103,7 @@ /turf/open/floor/eighties, /area/ruin/space/has_grav/the_outlet/storefront) "cK" = ( -/mob/living/simple_animal/hostile/construct/proteon/hostile, +/mob/living/basic/construct/proteon/hostile, /obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/blood{ icon_state = "floor2-old" @@ -1064,7 +1064,7 @@ /obj/effect/decal/cleanable/dirt{ icon_state = "dirt-4" }, -/mob/living/simple_animal/hostile/construct/proteon/hostile, +/mob/living/basic/construct/proteon/hostile, /obj/effect/decal/cleanable/crayon{ icon_state = "rune6" }, @@ -1238,7 +1238,7 @@ /area/ruin/space/has_grav/the_outlet/storefront) "Db" = ( /obj/effect/decal/cleanable/crayon, -/mob/living/simple_animal/hostile/construct/proteon/hostile, +/mob/living/basic/construct/proteon/hostile, /turf/open/floor/cult, /area/ruin/space/has_grav/the_outlet/cultinfluence) "Do" = ( @@ -1493,7 +1493,7 @@ /obj/effect/decal/cleanable/crayon{ icon_state = "rune2" }, -/mob/living/simple_animal/hostile/construct/proteon/hostile, +/mob/living/basic/construct/proteon/hostile, /turf/open/floor/iron/white, /area/ruin/space/has_grav/the_outlet/researchrooms) "IF" = ( @@ -1585,7 +1585,7 @@ /turf/template_noop, /area/template_noop) "LL" = ( -/mob/living/simple_animal/hostile/construct/proteon/hostile, +/mob/living/basic/construct/proteon/hostile, /obj/effect/decal/cleanable/crayon{ icon_state = "rune2" }, @@ -1645,7 +1645,7 @@ /obj/effect/decal/cleanable/blood{ icon_state = "gib2-old" }, -/mob/living/simple_animal/hostile/construct/juggernaut/hostile, +/mob/living/basic/construct/juggernaut/hostile, /turf/open/floor/cult, /area/ruin/space/has_grav/the_outlet/cultinfluence) "MR" = ( @@ -1686,7 +1686,7 @@ /obj/effect/decal/cleanable/crayon{ icon_state = "rune4" }, -/mob/living/simple_animal/hostile/construct/proteon/hostile, +/mob/living/basic/construct/proteon/hostile, /turf/open/floor/cult, /area/ruin/space/has_grav/the_outlet/cultinfluence) "NE" = ( @@ -2013,7 +2013,7 @@ dir = 8 }, /obj/effect/decal/cleanable/crayon, -/mob/living/simple_animal/hostile/construct/proteon/hostile, +/mob/living/basic/construct/proteon/hostile, /obj/effect/decal/cleanable/dirt{ icon_state = "dirt-127" }, @@ -2142,7 +2142,7 @@ /turf/open/floor/iron/white, /area/ruin/space/has_grav/the_outlet/researchrooms) "Yr" = ( -/mob/living/simple_animal/hostile/construct/proteon/hostile, +/mob/living/basic/construct/proteon/hostile, /obj/effect/decal/cleanable/crayon, /turf/open/floor/cult, /area/ruin/space/has_grav/the_outlet/cultinfluence) diff --git a/_maps/RandomRuins/SpaceRuins/waystation.dmm b/_maps/RandomRuins/SpaceRuins/waystation.dmm index 6dac443f81ab..9f4c138fec8c 100644 --- a/_maps/RandomRuins/SpaceRuins/waystation.dmm +++ b/_maps/RandomRuins/SpaceRuins/waystation.dmm @@ -73,7 +73,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/waystation) "bA" = ( -/mob/living/basic/syndicate/melee/sword/space/stormtrooper, +/mob/living/basic/trooper/syndicate/melee/sword/space/stormtrooper, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/waystation/securestorage) "bG" = ( @@ -1960,7 +1960,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/waystation/cargobay) "JM" = ( -/mob/living/basic/syndicate/ranged/shotgun/space, +/mob/living/basic/trooper/syndicate/ranged/shotgun/space, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) "Kc" = ( @@ -2120,7 +2120,7 @@ "LW" = ( /obj/effect/turf_decal/loading_area/red, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/mob/living/basic/syndicate/ranged/smg/space, +/mob/living/basic/trooper/syndicate/ranged/smg/space, /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) @@ -2562,19 +2562,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargobay) "SJ" = ( -/mob/living/basic/syndicate/ranged/shotgun/space, -/obj/item/ammo_casing/shotgun/buckshot{ - pixel_x = 6; - pixel_y = 1 - }, -/obj/item/ammo_casing/shotgun/buckshot{ - pixel_x = 3; - pixel_y = 10 - }, -/obj/item/ammo_casing/shotgun/buckshot{ - pixel_x = -3; - pixel_y = 1 - }, +/mob/living/basic/trooper/syndicate/ranged/shotgun/space, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/dorms) "SL" = ( @@ -2686,7 +2674,7 @@ /area/ruin/space/has_grav/waystation/dorms) "UC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/mob/living/basic/syndicate/ranged/smg/space, +/mob/living/basic/trooper/syndicate/ranged/smg/space, /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/has_grav/waystation/cargooffice) diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index e9661b18531c..f28f8e70e8d1 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -3044,12 +3044,11 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood, /obj/effect/decal/cleanable/blood/gibs, -/mob/living/simple_animal/hostile/skeleton{ +/mob/living/basic/skeleton{ desc = "Oh shit!"; dir = 1; faction = list("sewer"); - name = "sewer skeleton"; - wander = 0 + name = "sewer skeleton" }, /turf/open/floor/carpet, /area/awaymission/cabin/caves/mountain) @@ -3859,14 +3858,13 @@ /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) "yj" = ( -/mob/living/simple_animal/hostile/skeleton/ice{ +/mob/living/basic/skeleton/ice{ desc = "A reanimated skeleton covered in thick sheet of natural ice. It is obvious to tell that they look really slow."; maxHealth = 20; melee_damage_lower = 5; melee_damage_upper = 5; name = "frozen skeleton"; - speed = 7; - wander = 0 + speed = 7 }, /turf/open/misc/ice/smooth, /area/awaymission/cabin/caves) @@ -3899,7 +3897,7 @@ /obj/item/shovel{ desc = "A large tool for digging and moving snow."; force = 10; - name = "eskimo shovel" + name = "settler's shovel" }, /obj/effect/decal/remains/human{ color = "#72e4fa" @@ -4036,14 +4034,13 @@ /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) "BR" = ( -/mob/living/simple_animal/hostile/skeleton/ice{ +/mob/living/basic/skeleton/ice{ desc = "A reanimated skeleton covered in thick sheet of natural ice. It is obvious to tell that they look really slow."; maxHealth = 20; melee_damage_lower = 5; melee_damage_upper = 5; name = "frozen skeleton"; - speed = 7; - wander = 0 + speed = 7 }, /turf/open/misc/asteroid/snow/snow_cabin, /area/awaymission/cabin/caves) diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/TheBeach.dmm index 29098c05096d..a34169c53478 100644 --- a/_maps/RandomZLevels/TheBeach.dmm +++ b/_maps/RandomZLevels/TheBeach.dmm @@ -930,7 +930,7 @@ /turf/open/water/beach/biodome, /area/awaymission/beach) "da" = ( -/mob/living/simple_animal/parrot, +/mob/living/basic/parrot, /turf/open/misc/beach/sand, /area/awaymission/beach) "db" = ( diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 40b88aa6addf..0263f8789372 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -283,7 +283,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_three) "bD" = ( -/mob/living/simple_animal/hostile/skeleton, +/mob/living/basic/skeleton, /turf/open/floor/engine/cult{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -360,7 +360,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_two) "bY" = ( -/mob/living/simple_animal/hostile/skeleton, +/mob/living/basic/skeleton, /turf/open/floor/plating{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, @@ -1210,7 +1210,7 @@ "he" = ( /obj/structure/window/spawner/directional/west, /obj/structure/window/spawner/directional/south, -/mob/living/simple_animal/hostile/mining_drone, +/mob/living/basic/mining_drone, /turf/open/floor/plating, /area/awaymission/caves/listeningpost) "hq" = ( @@ -1734,7 +1734,7 @@ /area/awaymission/caves/bmp_asteroid/level_three) "IH" = ( /obj/structure/window/spawner/directional/west, -/mob/living/simple_animal/hostile/mining_drone, +/mob/living/basic/mining_drone, /turf/open/floor/plating, /area/awaymission/caves/listeningpost) "IN" = ( @@ -2006,7 +2006,7 @@ }, /area/awaymission/caves/bmp_asteroid/level_three) "YZ" = ( -/mob/living/simple_animal/hostile/skeleton, +/mob/living/basic/skeleton, /turf/open/misc/asteroid/basalt{ initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index 28b4725a1600..759bd7198736 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -5450,6 +5450,10 @@ heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/research) +"pO" = ( +/mob/living/basic/construct/proteon/hostile, +/turf/open/space, +/area/space) "qr" = ( /obj/effect/decal/cleanable/blood/tracks{ desc = "Your instincts say you shouldn't be following these."; @@ -13954,7 +13958,7 @@ aa aa aa aa -aa +pO aa aa aa @@ -14731,6 +14735,7 @@ aa aa aa aa +pO aa aa aa @@ -14741,8 +14746,7 @@ aa aa aa aa -aa -aa +pO aa aa aa @@ -17041,7 +17045,7 @@ aa aa aa aa -aa +pO aa aa aa @@ -17310,13 +17314,13 @@ aa aa aa aa +pO aa aa aa aa aa -aa -aa +pO aa aa aa @@ -18312,7 +18316,7 @@ aa aa aa aa -aa +pO aa aa aa @@ -18838,6 +18842,7 @@ aa aa aa aa +pO aa aa aa @@ -18851,8 +18856,7 @@ aa aa aa aa -aa -aa +pO aa aa aa @@ -20107,7 +20111,7 @@ aa aa aa aa -aa +pO aa aa aa @@ -20400,7 +20404,7 @@ aa aa aa aa -aa +pO aa aa aa @@ -21644,7 +21648,7 @@ aa aa aa aa -aa +pO aa aa aa @@ -21900,7 +21904,7 @@ aa aa aa aa -aa +pO aa aa aa diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm index bc6878f09530..cd0fab883407 100644 --- a/_maps/RandomZLevels/research.dmm +++ b/_maps/RandomZLevels/research.dmm @@ -72,7 +72,7 @@ /turf/closed/wall/r_wall, /area/awaymission/research/interior/engineering) "as" = ( -/mob/living/basic/syndicate/ranged/smg, +/mob/living/basic/trooper/syndicate/ranged/smg, /turf/open/floor/mineral/plastitanium/red, /area/awaymission/research/interior/engineering) "at" = ( @@ -113,7 +113,7 @@ /obj/structure/chair{ dir = 8 }, -/mob/living/basic/syndicate, +/mob/living/basic/trooper/syndicate, /turf/open/floor/mineral/plastitanium/red, /area/awaymission/research/interior/engineering) "az" = ( @@ -207,7 +207,7 @@ /turf/open/floor/plating, /area/awaymission/research/interior/engineering) "aT" = ( -/mob/living/basic/syndicate/melee/sword, +/mob/living/basic/trooper/syndicate/melee/sword, /turf/open/floor/plating, /area/awaymission/research/interior/engineering) "aU" = ( @@ -575,7 +575,7 @@ /area/awaymission/research/interior/maint) "cz" = ( /obj/structure/cable, -/mob/living/basic/syndicate/ranged/smg, +/mob/living/basic/trooper/syndicate/ranged/smg, /turf/open/floor/plating, /area/awaymission/research/interior/maint) "cA" = ( @@ -603,7 +603,7 @@ /area/awaymission/research/interior/gateway) "cL" = ( /obj/structure/cable, -/mob/living/basic/syndicate/ranged, +/mob/living/basic/trooper/syndicate/ranged, /turf/open/floor/plating, /area/awaymission/research/interior/maint) "cM" = ( @@ -718,7 +718,7 @@ /area/awaymission/research/interior) "dn" = ( /obj/item/ammo_casing/c45, -/mob/living/basic/syndicate, +/mob/living/basic/trooper/syndicate, /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 8 }, @@ -801,7 +801,7 @@ /turf/open/floor/iron/dark, /area/awaymission/research/interior/secure) "dP" = ( -/mob/living/basic/syndicate/ranged/smg, +/mob/living/basic/trooper/syndicate/ranged/smg, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior/medbay) @@ -848,7 +848,7 @@ /turf/open/floor/iron/stairs, /area/awaymission/research/interior/genetics) "ec" = ( -/mob/living/basic/syndicate/ranged/smg, +/mob/living/basic/trooper/syndicate/ranged/smg, /turf/open/floor/plating, /area/awaymission/research/interior/maint) "ed" = ( @@ -947,7 +947,7 @@ /turf/open/floor/iron/white, /area/awaymission/research/interior/cryo) "eB" = ( -/mob/living/simple_animal/hostile/nanotrasen/ranged, +/mob/living/basic/trooper/nanotrasen/ranged, /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 1 }, @@ -996,7 +996,7 @@ /turf/open/floor/iron/white, /area/awaymission/research/interior) "eL" = ( -/mob/living/basic/syndicate, +/mob/living/basic/trooper/syndicate, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 4 }, @@ -1048,7 +1048,7 @@ /turf/open/floor/iron/dark, /area/awaymission/research/interior/secure) "eV" = ( -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg, +/mob/living/basic/trooper/nanotrasen/ranged/smg, /turf/open/floor/iron/dark, /area/awaymission/research/interior/secure) "eW" = ( @@ -1134,7 +1134,7 @@ /turf/open/floor/iron/white, /area/awaymission/research/interior) "fn" = ( -/mob/living/basic/syndicate/melee/sword, +/mob/living/basic/trooper/syndicate/melee/sword, /turf/open/floor/iron/white, /area/awaymission/research/interior) "fo" = ( @@ -1201,7 +1201,7 @@ /area/awaymission/research/interior/secure) "fA" = ( /obj/machinery/light/small/directional/west, -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg, +/mob/living/basic/trooper/nanotrasen/ranged/smg, /turf/open/floor/iron/dark, /area/awaymission/research/interior/secure) "fD" = ( @@ -1331,7 +1331,7 @@ /area/awaymission/research/interior/secure) "gj" = ( /obj/structure/cable, -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg, +/mob/living/basic/trooper/nanotrasen/ranged/smg, /turf/open/floor/iron/dark, /area/awaymission/research/interior/secure) "gk" = ( @@ -1511,7 +1511,7 @@ /turf/open/floor/iron/white, /area/awaymission/research/interior/security) "hq" = ( -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg, +/mob/living/basic/trooper/nanotrasen/ranged/smg, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, @@ -1858,7 +1858,7 @@ /turf/open/floor/iron/freezer, /area/awaymission/research/interior/bathroom) "iQ" = ( -/mob/living/basic/syndicate, +/mob/living/basic/trooper/syndicate, /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 }, @@ -3093,7 +3093,7 @@ /turf/open/floor/iron, /area/awaymission/research/interior/security) "sn" = ( -/mob/living/basic/syndicate/ranged/smg, +/mob/living/basic/trooper/syndicate/ranged/smg, /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior) @@ -3265,7 +3265,7 @@ pixel_x = 32; pixel_y = 26 }, -/mob/living/basic/syndicate/ranged/smg, +/mob/living/basic/trooper/syndicate/ranged/smg, /obj/effect/turf_decal/tile/green/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior) @@ -3283,7 +3283,7 @@ /turf/open/floor/iron/white, /area/awaymission/research/interior) "yW" = ( -/mob/living/simple_animal/hostile/nanotrasen, +/mob/living/basic/trooper/nanotrasen, /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, /area/awaymission/research/interior/cryo) @@ -3343,7 +3343,7 @@ /turf/open/floor/iron, /area/awaymission/research/interior/genetics) "BQ" = ( -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg, +/mob/living/basic/trooper/nanotrasen/ranged/smg, /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior/security) @@ -3413,7 +3413,7 @@ /turf/open/floor/iron, /area/awaymission/research/interior/genetics) "DY" = ( -/mob/living/simple_animal/hostile/nanotrasen/ranged, +/mob/living/basic/trooper/nanotrasen/ranged, /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior/cryo) @@ -3823,7 +3823,7 @@ /turf/open/floor/iron, /area/awaymission/research/interior/genetics) "Qq" = ( -/mob/living/simple_animal/hostile/nanotrasen/ranged, +/mob/living/basic/trooper/nanotrasen/ranged, /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron, /area/awaymission/research/interior/security) @@ -3892,7 +3892,7 @@ /turf/open/misc/asteroid, /area/awaymission/research/exterior) "Th" = ( -/mob/living/basic/syndicate, +/mob/living/basic/trooper/syndicate, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/awaymission/research/interior/medbay) @@ -3951,7 +3951,7 @@ /turf/open/floor/plating, /area/awaymission/research/interior/maint) "Uq" = ( -/mob/living/basic/syndicate/ranged/smg/space, +/mob/living/basic/trooper/syndicate/ranged/smg/space, /turf/open/misc/asteroid/airless, /area/awaymission/research/exterior) "Uu" = ( diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 5ee092df524a..05445ae1d834 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -1643,6 +1643,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/awaymission/snowdin/post/research) +"fb" = ( +/obj/structure/cable, +/mob/living/basic/skeleton/plasmaminer, +/turf/open/floor/iron, +/area/awaymission/snowdin/post/cavern1) "fd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ @@ -2213,6 +2218,10 @@ "gW" = ( /turf/closed/mineral/diamond/ice, /area/awaymission/snowdin/cave/cavern) +"gX" = ( +/obj/structure/closet/crate, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_dock) "gZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ dir = 8; @@ -4909,6 +4918,10 @@ /obj/item/shard, /turf/open/floor/plating, /area/awaymission/snowdin/post/secpost) +"oj" = ( +/mob/living/basic/skeleton/plasmaminer/jackhammer, +/turf/open/misc/asteroid/snow/ice, +/area/awaymission/snowdin/cave/cavern) "ol" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -6206,14 +6219,6 @@ /obj/structure/cable, /turf/open/floor/engine/cult, /area/awaymission/snowdin/post/cavern2) -"st" = ( -/mob/living/simple_animal/hostile/skeleton/ice, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) "su" = ( /obj/machinery/door/airlock/maintenance{ name = "SMES Storage" @@ -6429,10 +6434,6 @@ }, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) -"tt" = ( -/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) "tu" = ( /obj/structure/closet/crate/wooden, /obj/effect/spawner/random/exotic/antag_gear_weak, @@ -6442,10 +6443,6 @@ /obj/structure/barricade/wooden/crude/snow, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/cave/cavern) -"tz" = ( -/mob/living/simple_animal/hostile/skeleton/ice, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) "tE" = ( /turf/closed/indestructible/rock/snow, /area/awaymission/snowdin/cave) @@ -6571,11 +6568,6 @@ "uI" = ( /turf/closed/wall/ice, /area/awaymission/snowdin/post/cavern1) -"uK" = ( -/obj/structure/cable, -/mob/living/simple_animal/hostile/skeleton/plasmaminer, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern1) "uM" = ( /obj/structure/table, /obj/effect/mapping_helpers/broken_floor, @@ -6594,11 +6586,6 @@ /obj/effect/spawner/structure/electrified_grille, /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern1) -"uS" = ( -/mob/living/simple_animal/hostile/skeleton/plasmaminer, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) "uU" = ( /obj/item/chair, /turf/open/floor/iron, @@ -6610,6 +6597,13 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/cavern1) +"uX" = ( +/mob/living/basic/skeleton/templar, +/turf/open/floor/engine/cult{ + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + temperature = 120 + }, +/area/awaymission/snowdin/cave/cavern) "uY" = ( /obj/docking_port/stationary{ dir = 4; @@ -6677,13 +6671,6 @@ slowdown = 1 }, /area/awaymission/snowdin/outside) -"vi" = ( -/mob/living/simple_animal/hostile/skeleton/templar, -/turf/open/floor/engine/cult{ - initial_gas_mix = "n2=82;plasma=24;TEMP=120"; - temperature = 120 - }, -/area/awaymission/snowdin/cave/cavern) "vj" = ( /obj/structure/table, /obj/structure/cable, @@ -6786,6 +6773,14 @@ }, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/post/cavern1) +"vK" = ( +/mob/living/basic/skeleton/ice, +/turf/open/misc/asteroid/snow{ + floor_variance = 0; + icon_state = "snow_dug"; + slowdown = 1 + }, +/area/awaymission/snowdin/cave) "vL" = ( /turf/closed/wall/mineral/titanium, /area/awaymission/snowdin/post/broken_shuttle) @@ -7193,19 +7188,6 @@ }, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) -"xU" = ( -/obj/structure/bed{ - dir = 4 - }, -/mob/living/simple_animal/hostile/skeleton/ice{ - name = "Privateer Jones" - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) "xV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ dir = 4; @@ -7263,14 +7245,6 @@ /obj/structure/fence, /turf/open/floor/plating/snowed/cavern, /area/awaymission/snowdin/cave/cavern) -"yj" = ( -/obj/machinery/light/directional/west, -/obj/structure/closet/crate, -/obj/item/relic, -/obj/item/relic, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "yl" = ( /obj/structure/sign/warning/no_smoking/directional/west, /turf/open/floor/plating, @@ -7344,13 +7318,6 @@ "yv" = ( /turf/closed/wall/mineral/snow, /area/awaymission/snowdin/outside) -"yx" = ( -/obj/structure/closet/crate, -/obj/item/relic, -/obj/item/relic, -/obj/item/relic, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) "yy" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -7443,20 +7410,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plating/snowed, /area/awaymission/snowdin/cave) -"yM" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 8 - }, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 4 - }, -/mob/living/simple_animal/hostile/skeleton/eskimo, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) "yO" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -7795,6 +7748,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/cave) +"An" = ( +/mob/living/basic/skeleton/settler, +/turf/open/misc/asteroid/snow{ + floor_variance = 0; + icon_state = "snow_dug"; + slowdown = 1 + }, +/area/awaymission/snowdin/outside) "Ao" = ( /obj/structure/mineral_door/wood, /turf/open/floor/wood, @@ -7855,10 +7816,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/cave) -"AA" = ( -/mob/living/simple_animal/hostile/skeleton/eskimo, -/turf/open/floor/wood, -/area/awaymission/snowdin/igloo) "AC" = ( /obj/machinery/door/airlock/external/glass/ruin, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -8772,6 +8729,10 @@ "EH" = ( /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) +"EI" = ( +/mob/living/basic/skeleton/plasmaminer/jackhammer, +/turf/open/floor/plating/snowed/cavern, +/area/awaymission/snowdin/cave/cavern) "EK" = ( /obj/structure/bed/roller, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -9985,6 +9946,17 @@ "JQ" = ( /turf/open/floor/plating/elevatorshaft, /area/awaymission/snowdin/post/mining_main) +"JT" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/mob/living/basic/skeleton/settler, +/turf/open/misc/asteroid/snow{ + floor_variance = 0; + icon_state = "snow_dug"; + slowdown = 1 + }, +/area/awaymission/snowdin/outside) "JU" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -10488,15 +10460,6 @@ /obj/machinery/light/broken/directional/north, /turf/open/floor/engine/cult, /area/awaymission/snowdin/post/mining_dock) -"Ma" = ( -/obj/effect/turf_decal/weather/snow/corner, -/mob/living/simple_animal/hostile/skeleton/eskimo, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) "Mb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ dir = 8 @@ -10530,6 +10493,16 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) +"Mk" = ( +/mob/living/basic/skeleton/ice{ + name = "Captain Bones" + }, +/turf/open/misc/asteroid/snow{ + floor_variance = 0; + icon_state = "snow_dug"; + slowdown = 1 + }, +/area/awaymission/snowdin/cave) "Ml" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ dir = 8 @@ -10554,6 +10527,12 @@ /obj/structure/fence, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) +"MA" = ( +/obj/machinery/light/directional/west, +/obj/structure/closet/crate, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_dock) "MB" = ( /obj/structure/fence{ dir = 4 @@ -10610,6 +10589,10 @@ /obj/machinery/light/broken/directional/east, /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) +"MQ" = ( +/mob/living/basic/skeleton/settler, +/turf/open/floor/wood, +/area/awaymission/snowdin/igloo) "MR" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 6 @@ -10988,14 +10971,6 @@ slowdown = 1 }, /area/awaymission/snowdin/cave) -"Pc" = ( -/obj/structure/closet/crate, -/obj/item/relic, -/obj/item/relic, -/obj/item/relic, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Pd" = ( /turf/open/misc/asteroid/snow{ floor_variance = 0; @@ -11017,6 +10992,15 @@ slowdown = 1 }, /area/awaymission/snowdin/cave) +"Pj" = ( +/obj/effect/turf_decal/weather/snow/corner, +/mob/living/basic/skeleton/settler, +/turf/open/misc/asteroid/snow{ + floor_variance = 0; + icon_state = "snow_dug"; + slowdown = 1 + }, +/area/awaymission/snowdin/outside) "Pm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ dir = 4; @@ -11141,17 +11125,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) -"PY" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 4 - }, -/mob/living/simple_animal/hostile/skeleton/eskimo, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) "Qc" = ( /obj/structure/flora/tree/stump, /obj/effect/light_emitter{ @@ -11516,10 +11489,6 @@ /mob/living/basic/bear/snow, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/cave) -"Sb" = ( -/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) "Sd" = ( /obj/item/stack/rods, /obj/effect/turf_decal/weather/snow, @@ -11697,12 +11666,6 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/engineering) -"SN" = ( -/obj/structure/closet/crate, -/obj/item/relic, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "SQ" = ( /obj/machinery/light/small/directional/west, /obj/item/stack/rods{ @@ -11820,10 +11783,6 @@ /obj/machinery/light/broken/directional/east, /turf/open/floor/iron, /area/awaymission/snowdin/post/gateway) -"TA" = ( -/mob/living/simple_animal/hostile/skeleton/eskimo, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) "TD" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine/n2, @@ -11853,6 +11812,10 @@ slowdown = 1 }, /area/awaymission/snowdin/outside) +"TO" = ( +/mob/living/basic/skeleton/settler, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/mining_main) "TR" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -11865,10 +11828,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) -"TW" = ( -/mob/living/simple_animal/hostile/skeleton/plasmaminer, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) "TY" = ( /obj/machinery/power/port_gen/pacman, /obj/item/stack/sheet/mineral/plasma{ @@ -12000,6 +11959,11 @@ }, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) +"UD" = ( +/mob/living/basic/skeleton/plasmaminer, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/awaymission/snowdin/post/cavern1) "UG" = ( /obj/effect/light_emitter{ name = "outdoor light"; @@ -12022,14 +11986,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) -"UM" = ( -/mob/living/simple_animal/hostile/skeleton/eskimo, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) "UQ" = ( /obj/machinery/light/small/directional/north, /obj/item/stack/rods, @@ -12059,10 +12015,6 @@ /mob/living/basic/migo, /turf/open/floor/iron/white, /area/awaymission/snowdin/post/mining_main/robotics) -"Ve" = ( -/mob/living/simple_animal/hostile/skeleton/plasmaminer, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) "Vf" = ( /obj/item/trash/can, /turf/open/misc/asteroid/snow{ @@ -12331,6 +12283,10 @@ "WN" = ( /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) +"WP" = ( +/mob/living/basic/skeleton/ice, +/turf/open/floor/plating/snowed/cavern, +/area/awaymission/snowdin/cave/cavern) "WR" = ( /obj/item/shard, /turf/open/misc/ice/smooth, @@ -12361,10 +12317,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main/mechbay) -"Xb" = ( -/mob/living/simple_animal/hostile/skeleton/eskimo, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) "Xd" = ( /obj/item/stack/rods, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -12388,6 +12340,10 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/awaymission/snowdin/post/mining_main/robotics) +"Xl" = ( +/mob/living/basic/skeleton/plasmaminer, +/turf/open/misc/asteroid/snow/ice, +/area/awaymission/snowdin/cave/cavern) "Xo" = ( /obj/structure/flora/grass/both/style_random, /obj/effect/light_emitter{ @@ -12437,6 +12393,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/snowdin, /area/awaymission/snowdin/cave) +"XF" = ( +/mob/living/basic/skeleton/plasmaminer, +/turf/open/floor/plating/snowed/cavern, +/area/awaymission/snowdin/cave/cavern) +"XH" = ( +/mob/living/basic/skeleton/settler, +/turf/open/misc/asteroid/snow, +/area/awaymission/snowdin/outside) "XI" = ( /obj/effect/spawner/random/exotic/snow_gear, /turf/open/misc/asteroid/snow, @@ -12594,6 +12558,20 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern1) +"Yw" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 8 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 4 + }, +/mob/living/basic/skeleton/settler, +/turf/open/misc/asteroid/snow{ + floor_variance = 0; + icon_state = "snow_dug"; + slowdown = 1 + }, +/area/awaymission/snowdin/outside) "Yx" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/iron/grimy, @@ -12695,6 +12673,19 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main/mechbay) +"Za" = ( +/obj/structure/bed{ + dir = 4 + }, +/mob/living/basic/skeleton/ice{ + name = "Privateer Jones" + }, +/turf/open/misc/asteroid/snow{ + floor_variance = 0; + icon_state = "snow_dug"; + slowdown = 1 + }, +/area/awaymission/snowdin/cave) "Zb" = ( /obj/effect/gibspawner/generic, /turf/open/misc/asteroid/snow{ @@ -12755,16 +12746,6 @@ /obj/machinery/light/small/directional/east, /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/post/minipost) -"Zv" = ( -/mob/living/simple_animal/hostile/skeleton/ice{ - name = "Captain Bones" - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) "Zw" = ( /obj/structure/chair/stool/directional/south, /turf/open/misc/asteroid/snow{ @@ -23875,7 +23856,7 @@ GP Go HE Gq -Xb +TO HW IS HV @@ -34065,7 +34046,7 @@ Zy Zy Aa zD -AA +MQ zD zD zD @@ -35103,7 +35084,7 @@ Aa up zD zD -AA +MQ zD Aa Zy @@ -36639,7 +36620,7 @@ Ym Ym QH QH -PY +JT Ym vh vh @@ -36649,7 +36630,7 @@ Tk Zy Zy Zy -TA +XH Zy YE Zy @@ -36890,7 +36871,7 @@ Rd Ym vh vh -yM +Yw QH QH MR @@ -36902,7 +36883,7 @@ QH Ym Ym Ym -Ma +Pj Zy TI Zy @@ -39469,7 +39450,7 @@ Vm vh vh vh -UM +An Ym Ym tF @@ -39722,7 +39703,7 @@ TI Zy Vm vh -UM +An Ym Ym QH @@ -40743,7 +40724,7 @@ Zy Zy yv Zy -TA +XH Zy Qj Zy @@ -41526,7 +41507,7 @@ Aa Zy Aa zD -AA +MQ zD zD zD @@ -41775,7 +41756,7 @@ Zy Zy Aa zD -AA +MQ AI zD zD @@ -44044,10 +44025,10 @@ ae ae aj SF -st +vK RP RP -xU +Za aj aj aj @@ -45074,7 +45055,7 @@ ae ae aj aj -Zv +Mk RP RP RP @@ -52466,7 +52447,7 @@ gc gV gc gc -vi +uX WN WN WN @@ -52602,7 +52583,7 @@ eL eJ tp qi -TW +XF qi tp eJ @@ -53370,13 +53351,13 @@ eJ eJ tp qi -TW +XF tv qi -TW +XF qi tv -TW +XF qi tp eJ @@ -54144,7 +54125,7 @@ eJ eJ tp qi -TW +XF qi tp eJ @@ -55293,7 +55274,7 @@ eJ eJ eJ WN -Sb +oj WN WN WN @@ -55835,7 +55816,7 @@ eJ tp qi qi -tz +WP qi tp WN @@ -56606,7 +56587,7 @@ qi qi qi tp -tz +WP qi tp eJ @@ -56861,7 +56842,7 @@ eJ tp qi qi -TW +XF qi qi qi @@ -57118,7 +57099,7 @@ tp tp qi qi -tz +WP qi qi qi @@ -57373,7 +57354,7 @@ eJ eJ tp qi -tz +WP tp tv tp @@ -57634,7 +57615,7 @@ qi tp qi qi -tz +WP qi tp eJ @@ -59707,7 +59688,7 @@ tZ vo uG ul -uS +UD LV tY tZ @@ -59963,7 +59944,7 @@ ul tZ WS PI -uK +fb PI um vp @@ -60809,7 +60790,7 @@ BP Bo BY Cc -Ve +Xl WN WN UI @@ -62840,8 +62821,8 @@ VP wL wL WB -yj -Pc +MA +Sm xW eJ eJ @@ -63097,8 +63078,8 @@ xy Tn xy WB -SN -yx +Sm +gX wD eJ eJ @@ -63876,7 +63857,7 @@ eJ eJ eJ WN -Ve +Xl qi pA eJ @@ -63933,7 +63914,7 @@ WN WN qi WN -Ve +Xl WN EX WN @@ -64038,7 +64019,7 @@ qi WN WN Nz -Sb +oj WN WN fr @@ -64609,7 +64590,7 @@ eJ eJ eJ tp -tz +WP tp eJ fr @@ -66114,7 +66095,7 @@ eJ eJ eJ tp -tz +WP VU tp eJ @@ -66152,12 +66133,12 @@ fr qi tv qi -TW +XF tp qi tp qi -tz +WP tp eJ eJ @@ -66491,7 +66472,7 @@ eJ eJ eJ WN -Ve +Xl WN WN WN @@ -66618,9 +66599,9 @@ tp tp tp qi -tz +WP qi -TW +XF qi qi qi @@ -66662,7 +66643,7 @@ eJ eJ eJ tp -tz +WP qi tp qi @@ -66878,7 +66859,7 @@ qi qi qi qi -tz +WP qi qi qi @@ -67383,7 +67364,7 @@ eJ gW tp qi -tt +EI tp qi qi @@ -67436,7 +67417,7 @@ ge eJ eJ tp -tz +WP qi PH tp @@ -67639,7 +67620,7 @@ eJ eJ eJ tp -tz +WP qi tp tv @@ -67649,7 +67630,7 @@ qi tp qi qi -tz +WP tp eJ eJ @@ -68157,7 +68138,7 @@ qi qi tp qi -tt +EI qi tp tp @@ -68168,7 +68149,7 @@ eJ gW eJ tp -tz +WP VU tp eJ @@ -68176,7 +68157,7 @@ eJ eJ tp VU -tz +WP tp eJ eJ @@ -68602,7 +68583,7 @@ WN WN WN WN -Ve +Xl IZ eJ bh diff --git a/_maps/map_files/Basketball/ash_gladiators.dmm b/_maps/map_files/Basketball/ash_gladiators.dmm new file mode 100644 index 000000000000..75315e028a83 --- /dev/null +++ b/_maps/map_files/Basketball/ash_gladiators.dmm @@ -0,0 +1,1657 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"af" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"ao" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"at" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"aw" = ( +/obj/structure/fluff/drake_statue, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"bA" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"cc" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"cw" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"dg" = ( +/obj/structure/stone_tile/block, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"eD" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"eM" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"fj" = ( +/obj/effect/decal/remains/human, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"fu" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/block, +/obj/item/reagent_containers/cup/glass/trophy/silver_cup, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"fT" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"gY" = ( +/turf/open/floor/plating, +/area/centcom/basketball) +"hn" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/center/cracked, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"hZ" = ( +/obj/item/storage/bag/plants/portaseeder, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"ie" = ( +/mob/living/basic/mining/gutlunch/warrior, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"ix" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"iB" = ( +/obj/item/spear, +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"jb" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"jq" = ( +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"ku" = ( +/obj/structure/fence{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"kv" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"ld" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"lh" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"lD" = ( +/obj/structure/fence{ + dir = 8 + }, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"lQ" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/center, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"mk" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/center, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"mW" = ( +/obj/structure/stone_tile/surrounding_tile/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"nv" = ( +/obj/machinery/hydroponics/soil, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"oR" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"pV" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"qF" = ( +/obj/structure/fence/corner{ + dir = 1 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"ro" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"ru" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"rU" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"sb" = ( +/turf/closed/indestructible/riveted/boss, +/area/centcom/basketball) +"sA" = ( +/obj/effect/decal/remains/xeno, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"un" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"uH" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"vo" = ( +/turf/open/floor/fakepit, +/area/centcom/basketball) +"vq" = ( +/obj/structure/fence/corner{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"wN" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/effect/landmark/basketball/team_spawn/referee, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"xe" = ( +/obj/item/flashlight/flare/torch, +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"xG" = ( +/obj/structure/fence/corner{ + dir = 5 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"xI" = ( +/obj/structure/stone_tile/slab/burnt, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"yk" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/center/cracked, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"yK" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"yO" = ( +/obj/effect/landmark/basketball/team_spawn/home, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"yY" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/spear, +/obj/item/scythe, +/turf/open/indestructible/boss, +/area/centcom/basketball) +"zk" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"zU" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/center/cracked, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"zZ" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/obj/item/reagent_containers/cup/glass/trophy/bronze_cup, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Aj" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/item/spear, +/obj/item/storage/belt/utility, +/turf/open/indestructible/boss, +/area/centcom/basketball) +"Aw" = ( +/obj/effect/mob_spawn/corpse/human/miner, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"AA" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"BD" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"BW" = ( +/obj/structure/stone_tile/block/cracked, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Ct" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Cv" = ( +/obj/structure/hoop/minigame{ + dir = 4 + }, +/obj/effect/landmark/basketball/team_spawn/home_hoop, +/turf/open/floor/fakepit, +/area/centcom/basketball) +"Cw" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"CI" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 8 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Dc" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Di" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"DN" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"DP" = ( +/obj/effect/landmark/basketball/team_spawn/away_hoop, +/obj/structure/hoop/minigame{ + dir = 8 + }, +/turf/open/floor/fakepit, +/area/centcom/basketball) +"DV" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Eb" = ( +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"EX" = ( +/obj/structure/fence/corner, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Fh" = ( +/obj/item/flashlight/lantern, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Fi" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Fy" = ( +/mob/living/basic/mining/gutlunch/milk, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"FS" = ( +/obj/structure/stone_tile/block/burnt, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Gh" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Hu" = ( +/turf/closed/indestructible/riveted, +/area/centcom/basketball) +"Hx" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Ih" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/cracked, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"IM" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Jb" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"JX" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Kf" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Kh" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Lu" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Lx" = ( +/obj/effect/landmark/basketball/team_spawn/home, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"LV" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/closet/crate/internals, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/effect/mapping_helpers/no_lava, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"MA" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/item/flashlight/flare/torch, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"MN" = ( +/obj/structure/stone_tile/surrounding, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"MR" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Nc" = ( +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/block/burnt, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Nt" = ( +/turf/closed/indestructible/rock, +/area/centcom/basketball) +"Nw" = ( +/obj/item/cultivator/rake, +/obj/structure/stone_tile/surrounding/cracked, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"NX" = ( +/obj/structure/stone_tile/block, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"OB" = ( +/obj/effect/landmark/basketball/team_spawn/home, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"OF" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile/cracked, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/item/spear, +/turf/open/indestructible/boss, +/area/centcom/basketball) +"OG" = ( +/obj/effect/mob_spawn/corpse/human/damaged, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"OS" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Ql" = ( +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"QF" = ( +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Rc" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Rl" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/cracked, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Ry" = ( +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Se" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Tc" = ( +/obj/structure/stone_tile/block/cracked, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Ue" = ( +/obj/structure/fluff/drake_statue/falling, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Uv" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"UL" = ( +/obj/structure/bonfire/dense, +/obj/structure/stone_tile/center, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"UT" = ( +/obj/effect/landmark/basketball/team_spawn/away, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Vc" = ( +/obj/structure/stone_tile/block{ + dir = 8 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Vf" = ( +/obj/structure/fence, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Vm" = ( +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Vr" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"VI" = ( +/obj/effect/landmark/basketball/team_spawn/away, +/obj/structure/stone_tile, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"VM" = ( +/obj/structure/stone_tile/block{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"VY" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/item/spear, +/obj/item/clothing/head/helmet/roman/legionnaire, +/turf/open/indestructible/boss, +/area/centcom/basketball) +"WE" = ( +/obj/structure/ore_box, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"WH" = ( +/obj/structure/stone_tile/surrounding/cracked, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Xq" = ( +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/center, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"XQ" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 4 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"XT" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/obj/structure/stone_tile/cracked, +/turf/open/lava/smooth/basketball, +/area/centcom/basketball) +"Yl" = ( +/obj/structure/water_source/puddle{ + pixel_x = -3; + pixel_y = 1 + }, +/obj/item/reagent_containers/cup/bucket/wooden, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Yv" = ( +/obj/effect/landmark/basketball/team_spawn/away, +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"YI" = ( +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 8 + }, +/obj/item/reagent_containers/cup/glass/trophy/gold_cup{ + pixel_x = 0 + }, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"YX" = ( +/obj/structure/lavaland/ash_walker_fake, +/obj/item/toy/basketball, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) +"Zc" = ( +/obj/structure/necropolis_arch, +/obj/structure/stone_tile/slab, +/obj/structure/necropolis_gate/locked, +/turf/open/floor/fakebasalt, +/area/centcom/basketball) + +(1,1,1) = {" +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +"} +(2,1,1) = {" +Hu +gY +gY +gY +gY +Nt +Nt +Nt +Nt +Nt +Nt +Nt +Nt +Nt +Nt +Nt +Nt +Nt +Nt +Nt +gY +gY +gY +gY +Hu +"} +(3,1,1) = {" +Hu +gY +gY +gY +gY +Nt +Cw +Ql +Ql +Nt +Nt +WE +LV +Nt +Ql +Ql +Nt +WE +Nt +Nt +gY +gY +gY +gY +Hu +"} +(4,1,1) = {" +Hu +gY +gY +gY +gY +Nt +Cw +Ql +Ql +Ql +Ql +Ql +Ql +Ql +Ql +Ql +Ql +Ql +Ql +Nt +gY +gY +gY +gY +Hu +"} +(5,1,1) = {" +Hu +gY +sb +sb +sb +sb +Cw +Ql +vq +Vf +Vf +Vf +Vf +Vf +Vf +Vf +qF +Ql +Ql +sb +sb +sb +sb +gY +Hu +"} +(6,1,1) = {" +Hu +gY +sb +eD +JX +Eb +Cw +Ql +ku +sA +Ql +vo +Cv +vo +Ql +sA +ku +Ql +Ql +ix +Aj +yY +sb +gY +Hu +"} +(7,1,1) = {" +Hu +gY +sb +dg +aw +Dc +Cw +Ql +ku +Ql +yO +vo +vo +vo +yO +Ql +ku +Fh +Ql +XQ +WH +OF +sb +gY +Hu +"} +(8,1,1) = {" +Hu +sb +sb +Fi +DN +mk +Cw +Ql +ku +Ct +zk +OB +yO +Lx +zk +Ct +ku +Ql +Aw +Vr +MA +VY +sb +sb +Hu +"} +(9,1,1) = {" +Hu +sb +Cw +Cw +Cw +Cw +Cw +Uv +lD +kv +kv +lh +kv +ao +kv +Lu +lD +ao +ao +ao +ao +Nt +Nt +sb +Hu +"} +(10,1,1) = {" +Hu +sb +Cw +MN +ro +AA +rU +MN +ku +Ql +OS +MR +xI +VM +yK +Ql +ku +MN +Vc +iB +Jb +MN +Nt +sb +Hu +"} +(11,1,1) = {" +Hu +sb +Ry +at +dg +zZ +Dc +at +ku +Ql +NX +jb +cw +QF +fT +Ql +ku +XT +eM +Kh +cc +FS +Nt +Nt +Hu +"} +(12,1,1) = {" +Hu +Zc +Se +Uv +BW +YI +Dc +Uv +ku +Ql +xI +Tc +YX +Gh +Kf +Ql +ku +wN +Tc +UL +af +NX +Nt +Nt +Hu +"} +(13,1,1) = {" +Hu +sb +yk +bA +dg +fu +Dc +Rl +ku +Ql +pV +mW +Ct +BD +oR +un +ku +IM +Di +Ct +Xq +Nc +Nt +Nt +Hu +"} +(14,1,1) = {" +Hu +sb +jq +MN +Ih +Vm +DV +MN +ku +Ql +Hx +ld +Kf +ao +uH +Ql +ku +MN +Lu +Vc +lh +MN +Nt +sb +Hu +"} +(15,1,1) = {" +Hu +sb +Cw +Cw +Cw +ru +Cw +Uv +lD +kv +lh +kv +Lu +NX +kv +ao +lD +VM +VM +VM +VM +Nt +Nt +sb +Hu +"} +(16,1,1) = {" +Hu +sb +sb +CI +JX +hn +Cw +Ql +ku +Kh +Rc +VI +UT +Yv +Rc +Kh +ku +Ql +xe +nv +nv +Nt +sb +sb +Hu +"} +(17,1,1) = {" +Hu +gY +sb +dg +Ue +Dc +Cw +Ql +ku +Ql +UT +vo +vo +vo +UT +Ql +ku +Ql +Yl +hZ +Nw +Nt +sb +gY +Hu +"} +(18,1,1) = {" +Hu +gY +sb +zU +DN +lQ +Cw +Ql +ku +fj +Ql +vo +DP +vo +Ql +fj +ku +Ql +Gh +nv +nv +Nt +sb +gY +Hu +"} +(19,1,1) = {" +Hu +gY +sb +sb +sb +sb +Cw +Ql +xG +Vf +Vf +Vf +Vf +Vf +Vf +Vf +EX +Ql +Ql +sb +sb +sb +sb +gY +Hu +"} +(20,1,1) = {" +Hu +gY +gY +gY +gY +Nt +Cw +Ql +Ql +Ql +Ql +Fy +Ql +OG +Ql +Ql +Ql +Ql +Nt +Nt +gY +gY +gY +gY +Hu +"} +(21,1,1) = {" +Hu +gY +gY +gY +gY +Nt +Cw +Ql +OG +Nt +Nt +Ql +Ql +Ql +ie +Ql +Nt +Ql +Nt +Nt +gY +gY +gY +gY +Hu +"} +(22,1,1) = {" +Hu +gY +gY +gY +gY +Nt +Nt +Nt +Nt +Nt +Nt +Nt +Nt +Nt +Nt +Nt +Nt +Nt +Nt +Nt +gY +gY +gY +gY +Hu +"} +(23,1,1) = {" +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +Hu +"} diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 4af93d6ff876..0ae526448a5d 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -320,27 +320,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/main) -"adK" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/door/window/brigdoor/left/directional/north{ - name = "Chamber Access"; - req_access = list("science") - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/poddoor/preopen{ - id = "sci_experimentor"; - name = "Experimentor Blast Door" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/caution/stand_clear, -/turf/open/floor/iron/dark, -/area/station/science/explab) "adM" = ( /obj/effect/landmark/start/security_officer, /obj/effect/turf_decal/trimline/red/filled/line, @@ -381,6 +360,14 @@ dir = 1 }, /area/station/commons/fitness/recreation) +"aen" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/sign/warning/secure_area/directional/north, +/obj/machinery/light/directional/north, +/turf/open/floor/engine, +/area/station/science/research) "aeu" = ( /obj/machinery/hydroponics/constructable, /obj/effect/turf_decal/tile/blue{ @@ -574,6 +561,12 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron, /area/station/medical/abandoned) +"aga" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/cardboard, +/turf/open/floor/iron/dark, +/area/station/maintenance/port) "agb" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 @@ -875,6 +868,14 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/engine/o2, /area/station/engineering/atmos) +"akI" = ( +/obj/structure/closet/cabinet, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port) "akS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1173,6 +1174,7 @@ /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /obj/effect/mapping_helpers/airlock/access/any/command/ai_upload, /obj/structure/cable/layer3, +/obj/effect/landmark/navigate_destination/minisat_access_ai, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "anF" = ( @@ -1432,11 +1434,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/cargo/storage) -"aqa" = ( -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/snack, -/turf/open/floor/carpet/black, -/area/station/maintenance/port) "aqc" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -1503,6 +1500,12 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/maintenance/department/eva/abandoned) +"aqF" = ( +/obj/structure/table, +/obj/effect/spawner/random/entertainment/dice, +/obj/effect/spawner/random/entertainment/toy, +/turf/open/floor/carpet/black, +/area/station/maintenance/port) "aqS" = ( /obj/structure/bed{ dir = 4 @@ -2104,6 +2107,13 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"aww" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/library/abandoned) "awA" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/sign/poster/random{ @@ -2113,14 +2123,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/science/circuits) -"awC" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/maintenance/port) "awD" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -2343,6 +2345,12 @@ /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) +"azS" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/maintenance/port) "azW" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -2435,6 +2443,13 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"aBq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/closed/wall, +/area/station/science/explab) "aBr" = ( /obj/structure/chair, /obj/effect/turf_decal/siding/white, @@ -3205,6 +3220,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/department/science) +"aKh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/station/science/explab) "aKn" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/duct, @@ -3434,11 +3455,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron/dark/corner, /area/station/hallway/secondary/exit/departure_lounge) -"aNE" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/engine, -/area/station/science/explab) "aNF" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, @@ -3451,6 +3467,14 @@ }, /turf/open/floor/iron, /area/station/maintenance/disposal) +"aNG" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/newscaster/directional/north, +/mob/living/basic/parrot/poly, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "aNM" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -3523,7 +3547,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/landmark/navigate_destination, /obj/machinery/door/airlock{ name = "Locker Room" }, @@ -3840,10 +3863,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs/aft) -"aSV" = ( -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/station/service/library/abandoned) "aSW" = ( /obj/structure/cable, /obj/machinery/button/flasher{ @@ -3936,7 +3955,6 @@ layer = 4.1 }, /obj/structure/railing{ - dir = 10; layer = 3.1 }, /turf/open/space/basic, @@ -4423,6 +4441,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/landmark/navigate_destination/common/starboardquartersolar, /turf/open/floor/iron, /area/station/maintenance/solars/starboard/aft) "bbx" = ( @@ -4547,6 +4566,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/department/chapel) +"bcV" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/maintenance/port) "bdt" = ( /obj/structure/cable, /obj/machinery/power/energy_accumulator/tesla_coil/anchored, @@ -4629,11 +4653,11 @@ name = "Head of Personnel's Office" }, /obj/structure/cable, -/obj/effect/landmark/navigate_destination, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/command/hop, +/obj/effect/landmark/navigate_destination/hop, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) "beP" = ( @@ -5715,6 +5739,27 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) +"bqF" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "bqP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5823,10 +5868,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/department/chapel) -"bsk" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/grimy, -/area/station/service/library/abandoned) "bsx" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/yellow{ @@ -6107,12 +6148,6 @@ /obj/effect/landmark/start/chaplain, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) -"bvP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/library/abandoned) "bvT" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 @@ -6430,12 +6465,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"bAz" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "bAA" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -7034,13 +7063,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"bGn" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/airalarm/directional/south, -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/dark, -/area/station/science/explab) "bGr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7423,13 +7445,6 @@ }, /turf/open/floor/iron, /area/station/engineering/supermatter/room) -"bKu" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/science/explab) "bKw" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -7461,7 +7476,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/security/courtroom) "bLd" = ( @@ -7860,6 +7874,28 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"bPP" = ( +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/machinery/door/airlock/research{ + name = "Artifact Science" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/science/explab) +"bPR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/library/abandoned) "bPY" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 @@ -7922,6 +7958,11 @@ dir = 8 }, /area/station/science/lobby) +"bRn" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/engine, +/area/station/science/research) "bRw" = ( /obj/structure/sign/warning/deathsposal/directional/east, /obj/machinery/disposal/bin, @@ -8259,6 +8300,9 @@ }, /turf/open/floor/iron/dark, /area/station/service/theater) +"bTz" = ( +/turf/open/space/basic, +/area/station/cargo/mining/asteroid_magnet) "bTJ" = ( /obj/structure/lattice, /obj/structure/transit_tube/diagonal{ @@ -8314,6 +8358,16 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment, /turf/open/floor/iron, /area/station/engineering/storage) +"bUd" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/library/abandoned) "bUy" = ( /obj/structure/rack, /obj/machinery/light/small/directional/south, @@ -8730,13 +8784,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/electronic_marketing_den) -"bYR" = ( -/obj/structure/closet/cabinet, -/obj/effect/spawner/random/food_or_drink/booze, -/obj/effect/spawner/random/food_or_drink/booze, -/obj/effect/spawner/random/food_or_drink/booze, -/turf/open/floor/plating, -/area/station/maintenance/port) "bYV" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, @@ -9021,14 +9068,6 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"ccY" = ( -/obj/item/relic, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/cardboard, -/obj/item/book/manual/wiki/experimentor, -/turf/open/floor/iron/dark, -/area/station/maintenance/port) "cdb" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 @@ -9436,6 +9475,15 @@ /obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"cjn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/closed/wall, +/area/station/science/explab) "cjs" = ( /obj/structure/chair/office, /obj/effect/decal/cleanable/dirt, @@ -9477,18 +9525,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay) -"cjH" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/firealarm/directional/south, -/obj/structure/frame/computer{ - anchored = 1; - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/science/explab) "cjI" = ( /obj/structure/table/wood, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -9911,6 +9947,21 @@ }, /turf/open/floor/iron, /area/station/tcommsat/server) +"cnz" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/line, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/holopad, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "cnE" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -10516,21 +10567,6 @@ dir = 4 }, /area/station/commons/fitness/recreation) -"cwE" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/poddoor/preopen{ - id = "sci_experimentor"; - name = "Experimentor Blast Door" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/explab) "cwI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/effect/turf_decal/stripes/line{ @@ -10635,13 +10671,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"cxM" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/engine, -/area/station/science/explab) "cxR" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/red{ @@ -10998,6 +11027,23 @@ /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"cCE" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "cCJ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -11259,6 +11305,22 @@ dir = 1 }, /area/station/engineering/atmos/storage/gas) +"cEY" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/table, +/obj/item/taperecorder, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/poddoor/preopen{ + id = "sci_experimentor"; + name = "Experimentor Blast Door" + }, +/obj/item/tape/random, +/obj/item/tape/random, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/research) "cFe" = ( /obj/machinery/duct, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -11280,6 +11342,21 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"cFx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/poddoor/preopen{ + id = "sci_experimentor"; + name = "Experimentor Blast Door" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/research) "cFz" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -11343,6 +11420,7 @@ name = "Turbine Generator Access" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/effect/landmark/navigate_destination/incinerator, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "cGA" = ( @@ -11852,6 +11930,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/command/teleporter, +/obj/effect/landmark/navigate_destination/teleporter, /turf/open/floor/iron, /area/station/command/teleporter) "cNv" = ( @@ -11943,6 +12022,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/unres, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/delta/abandtheatre, /turf/open/floor/iron, /area/station/service/theater/abandoned) "cOD" = ( @@ -11989,16 +12069,6 @@ /obj/structure/sign/warning/secure_area/directional/north, /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"cPa" = ( -/obj/machinery/rnd/experimentor, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/explab) "cPb" = ( /obj/structure/table, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -12176,10 +12246,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron, /area/station/commons/storage/primary) -"cRl" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/iron/grimy, -/area/station/service/library/abandoned) "cRs" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -12278,6 +12344,7 @@ /obj/effect/turf_decal/trimline/yellow/line{ dir = 8 }, +/obj/effect/landmark/navigate_destination/common/fitness, /turf/open/floor/iron/white/smooth_edge{ dir = 4 }, @@ -12873,13 +12940,6 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, /area/station/security/prison/garden) -"daz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "daB" = ( /obj/effect/landmark/start/hangover, /turf/open/floor/iron/grimy, @@ -13843,22 +13903,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"dou" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/table, -/obj/item/taperecorder, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/poddoor/preopen{ - id = "sci_experimentor"; - name = "Experimentor Blast Door" - }, -/obj/item/tape/random, -/obj/item/tape/random, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/explab) "doI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, @@ -13895,28 +13939,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/service/hydroponics/garden/abandoned) -"dpw" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/rack, -/obj/effect/turf_decal/bot, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/item/book/manual/wiki/telescience{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/book/manual/wiki/experimentor, -/obj/machinery/door/poddoor/preopen{ - id = "sci_experimentor"; - name = "Experimentor Blast Door" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/explab) "dpI" = ( /obj/structure/table, /obj/item/clothing/gloves/latex, @@ -14148,13 +14170,6 @@ }, /turf/open/floor/iron, /area/station/science/lobby) -"dsj" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/delivery, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron, -/area/station/engineering/main) "dso" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/rnd/server, @@ -14177,19 +14192,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/prison/visit) -"dsy" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "dsC" = ( /obj/effect/spawner/random/clothing/gloves, /obj/structure/table, @@ -14658,13 +14660,6 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/iron/dark, /area/station/service/theater) -"dxl" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/status_display/evac/directional/west, -/obj/structure/filingcabinet/chestdrawer, -/mob/living/simple_animal/parrot/poly, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "dxo" = ( /obj/structure/bed/roller, /obj/item/radio/intercom/directional/south, @@ -15163,6 +15158,14 @@ /obj/structure/table/glass, /turf/open/floor/iron, /area/station/medical/cryo) +"dEq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/obj/effect/landmark/navigate_destination/library, +/turf/open/floor/wood, +/area/station/service/library) "dEv" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/smooth_large, @@ -15535,16 +15538,6 @@ }, /turf/open/floor/wood, /area/station/service/library/abandoned) -"dJM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "dJO" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -15575,6 +15568,13 @@ /obj/item/clothing/head/costume/cardborg, /turf/open/floor/wood, /area/station/service/theater/abandoned) +"dJY" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/court, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) "dKg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16184,7 +16184,6 @@ /area/station/hallway/primary/fore) "dRK" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) "dRO" = ( @@ -16918,6 +16917,10 @@ /obj/machinery/light/small/red/directional/south, /turf/open/floor/iron/dark/smooth_large, /area/station/service/chapel/funeral) +"ebs" = ( +/obj/machinery/artifact_xray, +/turf/open/floor/iron/dark, +/area/station/science/explab) "ebF" = ( /obj/structure/chair, /obj/effect/decal/cleanable/dirt, @@ -17218,6 +17221,27 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"efC" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/item/book/manual/wiki/telescience{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/machinery/door/poddoor/preopen{ + id = "sci_experimentor"; + name = "Experimentor Blast Door" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/research) "efQ" = ( /obj/structure/grille, /obj/structure/lattice, @@ -17899,14 +17923,6 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron/dark, /area/station/science/breakroom) -"epp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/service/library/abandoned) "epy" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, @@ -19226,10 +19242,6 @@ }, /turf/open/floor/wood/large, /area/station/service/library) -"eGb" = ( -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "eGp" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/barricade/wooden, @@ -19480,6 +19492,22 @@ /obj/item/folder/blue, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) +"eIG" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Experimentor Lab Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/poddoor/preopen{ + id = "sci_experimentor"; + name = "Experimentor Blast Door" + }, +/turf/open/floor/iron, +/area/station/science/research) "eIQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19926,12 +19954,6 @@ /obj/machinery/coffeemaker/impressa, /turf/open/floor/iron/dark, /area/station/medical/break_room) -"eOF" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/turf/open/floor/carpet/black, -/area/station/maintenance/port) "eOL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/effect/turf_decal/stripes/line{ @@ -19982,6 +20004,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay) +"ePf" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/event_spawn, +/turf/open/floor/engine, +/area/station/science/research) "ePl" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -20169,6 +20196,11 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat_interior) +"eQJ" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron, +/area/station/engineering/main) "eQK" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 1 @@ -20345,6 +20377,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/landmark/navigate_destination/common/starboardbowsolar, /turf/open/floor/iron, /area/station/maintenance/solars/starboard/fore) "eUf" = ( @@ -20693,14 +20726,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"eXN" = ( -/obj/machinery/vending/wardrobe/engi_wardrobe, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "eXW" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=hall6"; @@ -21137,13 +21162,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/auxlab/firing_range) -"fdJ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/sign/departments/engineering/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "fdK" = ( /obj/machinery/conveyor/inverted{ dir = 10; @@ -21409,6 +21427,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/landmark/navigate_destination/common/shitter, /turf/open/floor/iron, /area/station/commons/toilet/restrooms) "ffo" = ( @@ -21635,12 +21654,6 @@ }, /turf/open/floor/iron, /area/station/science/research/abandoned) -"fiq" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "fiu" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /mob/living/basic/cockroach, @@ -21775,6 +21788,12 @@ /obj/machinery/rnd/server/master, /turf/open/floor/circuit/green/telecomms/mainframe, /area/station/science/server) +"fkp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/grimy, +/area/station/service/library/abandoned) "fkt" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -21941,16 +21960,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/service/abandoned_gambling_den) -"fmD" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "fmI" = ( /obj/effect/turf_decal/tile/neutral, /obj/machinery/bluespace_vendor/directional/south, @@ -22247,6 +22256,18 @@ /obj/effect/mapping_helpers/mail_sorting/medbay/cmo_office, /turf/open/floor/iron/white, /area/station/medical/medbay) +"fqN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Science - Experimentor"; + name = "science camera"; + network = list("ss13","rd") + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/engine, +/area/station/science/research) "fqO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22271,6 +22292,7 @@ "fqZ" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/plaque/static_plaque/golden/commission/delta, +/obj/effect/landmark/navigate_destination/dockarrival, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "frq" = ( @@ -23087,6 +23109,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"fAN" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/engine, +/area/station/science/research) "fAP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23104,6 +23131,7 @@ }, /obj/effect/turf_decal/stripes/line, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/landmark/navigate_destination/common/portbowsolar, /turf/open/floor/iron, /area/station/maintenance/solars/port/fore) "fAT" = ( @@ -23122,8 +23150,6 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/landmark/start/hangover, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) "fAY" = ( @@ -23202,6 +23228,9 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"fBX" = ( +/turf/open/floor/iron/dark, +/area/station/science/explab) "fBZ" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/yellow{ @@ -23226,10 +23255,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/half, /area/station/engineering/atmos) -"fCj" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/iron/dark, -/area/station/service/library/abandoned) "fCn" = ( /obj/machinery/door/airlock/medical{ name = "Medical Break Room" @@ -23347,12 +23372,6 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"fEx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/random, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "fEI" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional{ dir = 9 @@ -23912,6 +23931,22 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"fMn" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light_switch/directional/east, +/obj/machinery/power/smes/engineering, +/obj/structure/cable, +/turf/open/floor/circuit/green, +/area/station/engineering/main) "fMo" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -24263,10 +24298,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/landmark/navigate_destination, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/landmark/navigate_destination/common/vaccommissary, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) "fRa" = ( @@ -24320,13 +24355,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/space, /area/space/nearstation) -"fRK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/engine, -/area/station/science/explab) "fRP" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -24675,6 +24703,15 @@ }, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den) +"fXc" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "fXi" = ( /obj/machinery/light/directional/north, /obj/structure/sign/plaques/kiddie/badger{ @@ -24802,6 +24839,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/fore) +"fYe" = ( +/obj/effect/turf_decal/tile/neutral/anticorner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/maintenance/port) "fYh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -25033,14 +25077,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"gaT" = ( -/obj/item/kirbyplants/random, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "gbj" = ( /obj/machinery/door/window/brigdoor{ dir = 1; @@ -25471,15 +25507,25 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/dark, /area/station/science/auxlab/firing_range) +"gfQ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/power/smes/engineering, +/obj/structure/cable, +/turf/open/floor/circuit/green, +/area/station/engineering/main) "gfR" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/genetics) -"gfX" = ( -/obj/structure/table, -/obj/effect/spawner/random/entertainment/deck, -/turf/open/floor/carpet/black, -/area/station/maintenance/port) "gga" = ( /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -25828,8 +25874,6 @@ /area/station/security/courtroom) "glb" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) @@ -26717,6 +26761,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/landmark/navigate_destination/lawyer, /turf/open/floor/iron, /area/station/service/lawoffice) "guI" = ( @@ -27022,6 +27067,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/command/gateway, +/obj/effect/landmark/navigate_destination/gateway, /turf/open/floor/iron, /area/station/command/gateway) "gyn" = ( @@ -27283,26 +27329,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"gCn" = ( -/obj/structure/sign/warning/electric_shock/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "gCo" = ( /obj/structure/frame/machine{ anchored = 1 @@ -27491,6 +27517,18 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) +"gEq" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/poddoor/preopen{ + id = "sci_experimentor"; + name = "Experimentor Blast Door" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/research) "gEz" = ( /obj/structure/sign/calendar/directional/south, /turf/open/floor/carpet/blue, @@ -28046,16 +28084,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/department/science) -"gLh" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/tank_holder/extinguisher, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/explab) "gLv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral{ @@ -28283,6 +28311,23 @@ }, /turf/open/floor/iron, /area/station/security/prison) +"gOA" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Access" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination/common/holodeck, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) "gOH" = ( /obj/effect/landmark/blobstart, /turf/open/floor/plating, @@ -28939,7 +28984,6 @@ /obj/machinery/door/airlock/grunge{ name = "Morgue" }, -/obj/effect/landmark/navigate_destination, /obj/machinery/duct, /turf/open/floor/iron, /area/station/medical/morgue) @@ -28949,11 +28993,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white, /area/station/medical/paramedic) -"gXn" = ( -/obj/structure/table, -/obj/effect/spawner/random/entertainment/dice, -/turf/open/floor/carpet/black, -/area/station/maintenance/port) "gXr" = ( /obj/effect/mapping_helpers/dead_body_placer, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -29106,6 +29145,13 @@ /obj/item/hand_labeler, /turf/open/floor/carpet, /area/station/security/detectives_office) +"gZC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/engine, +/area/station/science/research) "gZM" = ( /obj/structure/table, /obj/machinery/light_switch/directional/south{ @@ -29425,6 +29471,15 @@ /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/open/floor/iron, /area/station/engineering/atmos) +"hew" = ( +/obj/item/kirbyplants/random, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/library/abandoned) "hey" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29878,12 +29933,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/department/chapel) -"hjP" = ( -/obj/structure/table, -/obj/effect/spawner/random/entertainment/toy, -/obj/effect/spawner/random/entertainment/toy, -/turf/open/floor/carpet/black, -/area/station/maintenance/port) "hjQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -29961,13 +30010,6 @@ /obj/structure/sign/warning/secure_area/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay) -"hkR" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/mob/living/basic/cockroach, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "hkU" = ( /obj/machinery/door/firedoor/heavy, /obj/effect/turf_decal/stripes/line{ @@ -30370,6 +30412,14 @@ /obj/item/pen, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) +"hpz" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/tank_holder/extinguisher, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/research) "hpG" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/stripes/corner{ @@ -30864,7 +30914,6 @@ /obj/machinery/door/airlock/engineering/glass{ name = "Auxiliary Tool Storage" }, -/obj/effect/landmark/navigate_destination, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -30873,6 +30922,7 @@ /obj/effect/mapping_helpers/airlock/unres{ dir = 1 }, +/obj/effect/landmark/navigate_destination/tools, /turf/open/floor/iron, /area/station/commons/storage/tools) "hwK" = ( @@ -30946,14 +30996,6 @@ "hxS" = ( /turf/open/floor/carpet/royalblack, /area/station/service/chapel/office) -"hxT" = ( -/obj/structure/table/reinforced, -/obj/structure/sign/poster/official/random/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/obj/item/relic, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron, -/area/station/maintenance/department/science) "hxY" = ( /obj/effect/spawner/random/trash/mess, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -31541,17 +31583,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"hHf" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/radio/intercom/directional/north, -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/science/explab) "hHo" = ( /obj/structure/disposalpipe/trunk, /obj/machinery/chem_heater/withbuffer, @@ -31683,7 +31714,6 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/navigate_destination, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -31731,6 +31761,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"hIR" = ( +/obj/structure/table, +/obj/effect/spawner/random/entertainment/cigarette_pack, +/obj/effect/spawner/random/entertainment/toy, +/turf/open/floor/carpet/black, +/area/station/maintenance/port) "hIU" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -31760,6 +31796,14 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/iron/grimy, /area/station/security/detectives_office/private_investigators_office) +"hJp" = ( +/obj/machinery/portable_atmospherics/canister/plasma, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/explab) "hJs" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -32063,6 +32107,13 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/brig) +"hOG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/engine, +/area/station/science/research) "hOY" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32221,16 +32272,6 @@ /obj/effect/turf_decal/trimline/yellow/warning, /turf/open/floor/iron, /area/station/engineering/atmos/project) -"hQx" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "hQA" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /obj/machinery/camera/directional/east{ @@ -32263,6 +32304,28 @@ /obj/structure/reflector/box, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"hQM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/station/science/explab) +"hQO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + 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/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "hQQ" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -32608,6 +32671,24 @@ }, /turf/open/floor/carpet/blue, /area/station/medical/psychology) +"hWc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/item/radio/intercom/directional/east, +/obj/structure/cable, +/obj/machinery/modular_computer/console/preset/engineering{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "hWh" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ @@ -32653,6 +32734,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/security/checkpoint/customs/aft) +"hWP" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "hWW" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 @@ -32669,15 +32764,6 @@ }, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"hXd" = ( -/obj/effect/turf_decal/box/corners, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/effect/landmark/bitrunning/station_reward_spawn, -/turf/open/floor/iron/dark/smooth_large, -/area/station/bitrunning/den) "hXf" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -32814,6 +32900,15 @@ }, /turf/open/floor/wood/tile, /area/station/service/library/artgallery) +"hYi" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/dim/directional/south, +/obj/effect/landmark/start/hangover, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark, +/area/station/maintenance/port) "hYn" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 @@ -32911,6 +33006,12 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"hZw" = ( +/obj/machinery/artifact_zapper{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/explab) "hZz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/line{ @@ -32982,6 +33083,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) +"iaC" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/floor/iron/dark, +/area/station/service/library/abandoned) "iaF" = ( /obj/machinery/power/solar_control{ dir = 8; @@ -33176,11 +33282,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/electronic_marketing_den) -"ick" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants/random, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "icn" = ( /obj/effect/landmark/start/hangover, /obj/structure/chair/sofa/right/brown{ @@ -33746,12 +33847,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/command/gateway) -"ihO" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/service/library/abandoned) "iib" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" @@ -33985,11 +34080,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/engineering/storage_shared) -"ikY" = ( -/obj/structure/chair/office, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/service/library/abandoned) "ikZ" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/white, @@ -34099,11 +34189,6 @@ /obj/machinery/power/terminal, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"imp" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/engine, -/area/station/science/explab) "ims" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -34323,6 +34408,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/garden) +"ipk" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/effect/turf_decal/box/corners, +/turf/open/floor/engine, +/area/station/science/research) "ipr" = ( /obj/machinery/computer/rdconsole{ dir = 8 @@ -34350,6 +34442,16 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"ipD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "ipM" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -34369,6 +34471,20 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"iqc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/closet/secure_closet/engineering_personal, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "iqd" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -34758,6 +34874,10 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plating, /area/station/maintenance/department/security) +"iuY" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall, +/area/station/science/explab) "ivg" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ dir = 1 @@ -35191,6 +35311,13 @@ /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, /turf/open/floor/iron, /area/station/maintenance/port) +"iAX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/engine, +/area/station/science/research) "iAY" = ( /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/trimline/blue/filled/corner, @@ -35395,6 +35522,20 @@ }, /turf/open/floor/iron, /area/station/engineering/storage_shared) +"iDX" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/sign/departments/engineering/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "iEa" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/table/wood, @@ -35413,14 +35554,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/storage) -"iEg" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/purple/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/science/explab) "iEi" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -35910,12 +36043,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) -"iKP" = ( -/obj/structure/table/wood, -/obj/item/clothing/under/rank/civilian/curator, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "iKZ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37230,11 +37357,6 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"jcg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible, -/turf/open/floor/iron, -/area/station/engineering/supermatter/room) "jcl" = ( /obj/effect/turf_decal/tile/dark_blue/opposingcorners, /obj/structure/sink/directional/east, @@ -37639,6 +37761,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"jgw" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space) "jgI" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -38287,15 +38414,6 @@ /obj/effect/decal/cleanable/oil, /turf/open/floor/iron, /area/station/science/research/abandoned) -"joc" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "jof" = ( /obj/structure/table/wood, /obj/machinery/door/window/right/directional/south{ @@ -38537,20 +38655,24 @@ dir = 1 }, /area/station/hallway/primary/central/aft) +"jrg" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/landmark/navigate_destination/delta/abandmedbay, +/turf/open/floor/iron, +/area/station/medical/abandoned) "jrp" = ( /turf/closed/wall, /area/station/cargo/storage) -"jrz" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/mob/living/simple_animal/sloth/citrus, -/turf/open/floor/iron, -/area/station/command/heads_quarters/qm) "jrA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -38931,6 +39053,7 @@ "jwy" = ( /obj/structure/chair/stool/directional/south, /obj/effect/turf_decal/trimline/purple/filled/warning, +/obj/effect/landmark/navigate_destination/research, /turf/open/floor/iron/white, /area/station/science/lobby) "jwA" = ( @@ -39475,12 +39598,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) -"jCt" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "jCu" = ( /obj/structure/closet/secure_closet/miner, /obj/effect/decal/cleanable/dirt, @@ -39647,6 +39764,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/atmos/storage/gas) +"jEo" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/firealarm/directional/south, +/obj/structure/closet/secure_closet/engineering_personal, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "jEt" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -39907,6 +40031,13 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"jHs" = ( +/obj/structure/table/reinforced, +/obj/structure/sign/poster/official/random/directional/south, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron, +/area/station/maintenance/department/science) "jHw" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -40137,18 +40268,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay) -"jKY" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/effect/decal/cleanable/oil/streak, -/obj/machinery/camera/directional/south, -/obj/effect/landmark/bitrunning/station_reward_spawn, -/turf/open/floor/iron/dark/smooth_large, -/area/station/bitrunning/den) "jKZ" = ( /obj/structure/table/reinforced, /obj/machinery/button/door{ @@ -40345,15 +40464,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"jMU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "jNn" = ( /obj/structure/table/reinforced, /obj/machinery/button/door{ @@ -40628,7 +40738,6 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/medical/pharmacy) "jQq" = ( @@ -40715,6 +40824,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/structure/cable, +/obj/effect/landmark/navigate_destination/common/shitter, /turf/open/floor/iron, /area/station/commons/toilet/locker) "jQY" = ( @@ -41802,6 +41912,10 @@ /obj/effect/turf_decal/siding/white, /turf/open/floor/iron/dark/side, /area/station/commons/fitness/recreation) +"kew" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/science/explab) "kex" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -42123,22 +42237,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/department/science) -"khB" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/machinery/door/airlock/research{ - name = "Experimentor Control" - }, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron, -/area/station/science/explab) "khE" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -42622,6 +42720,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/checker, /area/station/engineering/supermatter/room) +"koa" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "kod" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, @@ -42646,17 +42748,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) -"kor" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/light_switch/directional/east{ - pixel_x = 24 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/explab) "kot" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -43015,6 +43106,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/storage) +"kuE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/engine, +/area/station/science/research) "kuF" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -43349,6 +43448,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/landmark/navigate_destination/common/portquartersolar, /turf/open/floor/iron, /area/station/maintenance/solars/port/aft) "kyD" = ( @@ -44160,6 +44260,7 @@ /obj/effect/mapping_helpers/airlock/access/any/command/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, +/obj/effect/landmark/navigate_destination/delta/evamaint, /turf/open/floor/iron, /area/station/maintenance/department/eva/abandoned) "kIM" = ( @@ -44340,11 +44441,6 @@ }, /turf/open/floor/iron, /area/station/medical/medbay/lobby) -"kLu" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/bookcase/random, -/turf/open/floor/plating, -/area/station/service/library/abandoned) "kLx" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, @@ -44484,6 +44580,7 @@ /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/delta/pioffice, /turf/open/floor/iron, /area/station/security/detectives_office/private_investigators_office) "kNk" = ( @@ -44768,13 +44865,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/maintenance/disposal/incinerator) -"kRk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/engine, -/area/station/science/explab) "kRn" = ( /obj/machinery/door/poddoor/shutters{ dir = 4; @@ -45877,6 +45967,13 @@ }, /turf/open/floor/iron, /area/station/medical/medbay) +"lee" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/engine, +/area/station/science/research) "leh" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -46879,6 +46976,12 @@ /obj/item/kirbyplants/random, /turf/open/floor/wood, /area/station/commons/dorms) +"lsj" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/snack, +/obj/effect/spawner/random/entertainment/deck, +/turf/open/floor/carpet/black, +/area/station/maintenance/port) "lsl" = ( /obj/effect/turf_decal/bot, /obj/item/robot_suit, @@ -46980,10 +47083,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/iron, /area/station/maintenance/port/fore) -"ltt" = ( -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/dark, -/area/station/maintenance/port) "ltu" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 @@ -47304,6 +47403,14 @@ /obj/item/stamp/ce, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) +"lwN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/status_display/ai/directional/north, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/engine, +/area/station/science/research) "lwZ" = ( /turf/closed/wall, /area/station/medical/medbay) @@ -47741,6 +47848,7 @@ /obj/effect/mapping_helpers/airlock/unres, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/delta/abandlibrary, /turf/open/floor/iron, /area/station/service/library/abandoned) "lCw" = ( @@ -48137,6 +48245,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) +"lHp" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/science/explab) "lHu" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot_white/left, @@ -48518,13 +48633,6 @@ }, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) -"lLa" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/engine, -/area/station/science/explab) "lLy" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -48635,6 +48743,27 @@ }, /turf/open/floor/iron, /area/station/security/prison/safe) +"lMO" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Chamber Access"; + req_access = list("science") + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/poddoor/preopen{ + id = "sci_experimentor"; + name = "Experimentor Blast Door" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/iron/dark, +/area/station/science/research) "lMT" = ( /obj/structure/chair/sofa/bench/right{ dir = 8 @@ -48845,6 +48974,12 @@ }, /turf/open/floor/iron, /area/station/security/lockers) +"lPK" = ( +/obj/effect/turf_decal/tile/neutral/anticorner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/maintenance/port) "lPM" = ( /obj/effect/turf_decal/loading_area, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -49245,6 +49380,13 @@ /obj/item/taperecorder, /turf/open/floor/wood, /area/station/hallway/secondary/service) +"lUz" = ( +/obj/machinery/door/airlock/research{ + name = "Artifact Storage" + }, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/turf/open/floor/iron/dark, +/area/station/science/explab) "lUB" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/highsecurity{ @@ -49262,6 +49404,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/effect/landmark/navigate_destination/aiupload, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) "lUI" = ( @@ -50316,15 +50459,6 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) -"mlo" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/scientist, -/turf/open/floor/iron/dark, -/area/station/science/explab) "mlt" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/siding/wood{ @@ -50391,6 +50525,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"mmc" = ( +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/research) "mmj" = ( /obj/machinery/computer/prisoner/management{ dir = 8 @@ -50458,6 +50601,11 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"mmy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/loafer, +/turf/open/floor/plating, +/area/station/maintenance/department/security) "mmM" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -50483,6 +50631,10 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/engineering/main) +"mne" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/iron/dark, +/area/station/science/explab) "mnh" = ( /obj/structure/table/reinforced, /obj/machinery/airalarm/directional/north, @@ -50500,6 +50652,22 @@ }, /turf/open/floor/wood, /area/station/engineering/break_room) +"mnu" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/machinery/door/airlock/research{ + name = "Experimentor Control" + }, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron, +/area/station/science/research) "mnz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -51392,7 +51560,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/command/heads_quarters/cmo) "myI" = ( @@ -51901,7 +52068,6 @@ name = "Brig" }, /obj/structure/cable, -/obj/effect/landmark/navigate_destination, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "brig-entrance" }, @@ -51915,16 +52081,9 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/navigate_destination/sec, /turf/open/floor/iron/dark, /area/station/security/brig) -"mEH" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/obj/item/folder, -/obj/item/pen, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "mEI" = ( /obj/machinery/newscaster/directional/north, /obj/structure/table/wood, @@ -52053,13 +52212,13 @@ /obj/machinery/door/airlock/security{ name = "Detective's Office" }, -/obj/effect/landmark/navigate_destination, /obj/effect/mapping_helpers/airlock/access/all/security/detective, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /obj/structure/disposalpipe/segment, +/obj/effect/landmark/navigate_destination/det, /turf/open/floor/iron, /area/station/security/detectives_office) "mGw" = ( @@ -52860,6 +53019,18 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/science/xenobiology) +"mOT" = ( +/obj/effect/decal/cleanable/oil/streak, +/obj/machinery/camera/directional/south, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind{ + pixel_x = 5 + }, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) "mPg" = ( /obj/machinery/door/airlock/external{ name = "External Docking Port" @@ -52882,6 +53053,15 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"mPm" = ( +/obj/machinery/light/directional/north, +/obj/machinery/asteroid_magnet{ + center_y = 61; + center_x = 105; + area_size = 3 + }, +/turf/open/floor/iron/dark, +/area/station/science/explab) "mPo" = ( /obj/structure/table/wood, /obj/item/food/grown/poppy/lily, @@ -53114,18 +53294,6 @@ /mob/living/carbon/human/species/monkey/punpun, /turf/open/floor/carpet/green, /area/station/commons/lounge) -"mSD" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/poddoor/preopen{ - id = "sci_experimentor"; - name = "Experimentor Blast Door" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/explab) "mSG" = ( /obj/structure/cable, /obj/machinery/light/small/directional/north, @@ -53645,6 +53813,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/landmark/navigate_destination/delta/abandgameroom, /turf/open/floor/iron, /area/station/service/abandoned_gambling_den/gaming) "mZr" = ( @@ -53867,13 +54036,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/hop) -"ncw" = ( -/obj/item/kirbyplants/random, -/obj/machinery/light/small/directional/south, -/obj/machinery/newscaster/directional/south, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "ncE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54006,12 +54168,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/cmo) -"nev" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/plating, -/area/station/service/library/abandoned) "nez" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 @@ -54167,36 +54323,6 @@ "nhm" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/lesser) -"nhn" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/table/reinforced, -/obj/item/clipboard{ - pixel_x = 6; - pixel_y = 3 - }, -/obj/item/paper{ - pixel_x = 6; - pixel_y = 3 - }, -/obj/item/pen{ - pixel_x = 5; - pixel_y = 4 - }, -/obj/machinery/button/door{ - id = "sci_experimentor"; - name = "Experimentor Containment Control"; - pixel_x = -7; - pixel_y = 6; - req_access = list("science") - }, -/obj/item/assembly/signaler{ - pixel_x = -5 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/science/explab) "nht" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -54811,13 +54937,8 @@ /turf/open/floor/iron/dark/textured_half, /area/station/service/chapel/storage) "nps" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) "npE" = ( @@ -55023,6 +55144,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"ntg" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/scientist, +/turf/open/floor/iron/dark, +/area/station/science/research) "nti" = ( /obj/structure/chair/office/light{ dir = 8 @@ -55044,6 +55174,10 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den) +"ntA" = ( +/obj/effect/artifact_spawner, +/turf/open/floor/iron/dark, +/area/station/science/explab) "ntK" = ( /obj/structure/chair/office/light{ dir = 4 @@ -55635,6 +55769,15 @@ }, /turf/open/floor/iron, /area/station/security/office) +"nzU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/artifact_heatingpad{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/explab) "nzW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56169,7 +56312,6 @@ "nHf" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ - dir = 10; layer = 3.1 }, /turf/open/space/basic, @@ -56258,13 +56400,6 @@ "nHY" = ( /turf/open/floor/iron/grimy, /area/station/service/library) -"nIa" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/engine, -/area/station/science/explab) "nIb" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -56691,6 +56826,12 @@ }, /turf/open/floor/iron, /area/station/maintenance/port/fore) +"nMP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/wood, +/area/station/service/library/abandoned) "nMT" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/event_spawn, @@ -57047,6 +57188,25 @@ /obj/effect/turf_decal/trimline/purple/filled/corner, /turf/open/floor/iron/white, /area/station/science/lobby) +"nRr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/external{ + name = "External Airlock" + }, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/effect/mapping_helpers/airlock/access/any/engineering/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) "nRv" = ( /obj/effect/spawner/random/maintenance, /obj/effect/spawner/random/trash/bin, @@ -57972,13 +58132,6 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) -"odD" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron, -/area/station/engineering/main) "odI" = ( /obj/effect/landmark/start/hangover, /obj/structure/table/wood/poker, @@ -58251,6 +58404,17 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) +"ohw" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "ohH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -58708,6 +58872,7 @@ }, /obj/effect/turf_decal/stripes/line, /obj/effect/mapping_helpers/airlock/access/all/service/janitor, +/obj/effect/landmark/navigate_destination/janitor, /turf/open/floor/iron/checker, /area/station/service/janitor) "omW" = ( @@ -59308,6 +59473,12 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"owP" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/closed/wall, +/area/station/science/explab) "owU" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -59595,6 +59766,15 @@ }, /turf/open/floor/iron/dark, /area/station/service/library) +"oAo" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/science/research) "oAu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -60201,6 +60381,13 @@ }, /turf/open/floor/iron/cafeteria, /area/station/engineering/atmos) +"oIm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "oIu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/plating, @@ -60255,6 +60442,12 @@ }, /turf/open/floor/plating, /area/station/security/detectives_office) +"oIX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/explab) "oJj" = ( /obj/structure/reagent_dispensers/watertank/high, /obj/effect/turf_decal/delivery/white{ @@ -60476,6 +60669,13 @@ }, /turf/open/floor/plating, /area/station/construction/mining/aux_base) +"oMA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron/grimy, +/area/station/service/library/abandoned) "oMO" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -60608,6 +60808,14 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"oOE" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/purple/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/science/research) "oOF" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/delivery, @@ -61093,19 +61301,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"oVo" = ( -/obj/structure/cable, -/obj/structure/sign/warning/no_smoking/circle{ - pixel_x = 28; - pixel_y = -28 - }, -/obj/machinery/modular_computer/console/preset/engineering{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "oVp" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -61121,6 +61316,18 @@ dir = 6 }, /area/station/service/chapel) +"oVu" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/mob/living/basic/sloth/citrus, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/command/heads_quarters/qm) "oVF" = ( /obj/effect/turf_decal/siding/white{ dir = 1 @@ -61155,10 +61362,6 @@ }, /turf/open/floor/iron/large, /area/station/science/research) -"oWm" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron/grimy, -/area/station/service/library/abandoned) "oWn" = ( /obj/structure/table/reinforced, /obj/machinery/cell_charger, @@ -61787,6 +61990,8 @@ }, /obj/effect/mapping_helpers/airlock/access/any/engineering/construction, /obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/effect/landmark/navigate_destination/atmos, +/obj/effect/landmark/navigate_destination/engineering, /turf/open/floor/iron, /area/station/engineering/lobby) "peK" = ( @@ -62291,12 +62496,6 @@ /obj/structure/chair/stool/bar/directional/north, /turf/open/floor/carpet/green, /area/station/commons/lounge) -"pky" = ( -/obj/structure/cable, -/obj/machinery/power/smes/engineering, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/circuit/green, -/area/station/engineering/main) "pkA" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62367,12 +62566,6 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"pll" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/spawner/random/structure/steam_vent, -/turf/open/floor/plating, -/area/station/maintenance/port) "pln" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/canister/water_vapor, @@ -62662,11 +62855,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmos/hfr_room) -"pqg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table_frame/wood, -/turf/open/floor/plating, -/area/station/service/library/abandoned) "pqm" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -63280,12 +63468,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/fore) -"pyh" = ( -/obj/structure/chair/office, -/obj/structure/sign/poster/random/directional/north, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet/black, -/area/station/maintenance/port) "pyq" = ( /obj/effect/landmark/start/hangover, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -63483,25 +63665,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"pAv" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/disposal/bin{ - layer = 3.21 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/door/poddoor/preopen{ - id = "sci_experimentor"; - name = "Experimentor Blast Door" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/explab) "pAx" = ( /obj/structure/window/spawner/directional/south, /obj/machinery/seed_extractor, @@ -63835,6 +63998,14 @@ /obj/structure/chair/stool/bar/directional/east, /turf/open/floor/carpet/green, /area/station/commons/lounge) +"pEs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/mob/living/basic/goat/pete, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen/coldroom) "pEx" = ( /obj/machinery/cryopod, /turf/open/floor/iron/freezer, @@ -63932,11 +64103,6 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted, /turf/open/floor/iron, /area/station/engineering/lobby) -"pFd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) "pFk" = ( /obj/machinery/conveyor/inverted{ dir = 10; @@ -64260,6 +64426,20 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"pJm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/requests_console/directional/south{ + assistance_requestable = 1; + department = "Engineering"; + name = "Engineering Requests Console"; + supplies_requestable = 1 + }, +/obj/structure/sign/poster/official/do_not_question{ + pixel_x = 32 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/engineering/main) "pJo" = ( /obj/structure/cable, /obj/machinery/computer/security/telescreen{ @@ -64420,6 +64600,17 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron/dark, /area/station/science/ordnance) +"pLb" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light_switch/directional/east{ + pixel_x = 24 + }, +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/research) "pLe" = ( /obj/structure/sign/poster/official/report_crimes{ pixel_y = 32 @@ -64957,6 +65148,12 @@ }, /turf/open/floor/wood, /area/station/service/electronic_marketing_den) +"pQU" = ( +/obj/machinery/light/directional/south, +/obj/machinery/byteforge, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) "pRk" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/line{ @@ -65039,6 +65236,7 @@ name = "Auxiliary Construction Zone" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/aux_base, +/obj/effect/landmark/navigate_destination/common/auxbaseconst, /turf/open/floor/iron, /area/station/construction/mining/aux_base) "pSr" = ( @@ -65298,6 +65496,7 @@ /obj/machinery/door/airlock/mining/glass{ name = "Bitrunning Den" }, +/obj/effect/landmark/navigate_destination/common/bitrunner, /turf/open/floor/iron/dark/textured_large, /area/station/bitrunning/den) "pUw" = ( @@ -65773,6 +65972,14 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"pZr" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/obj/structure/cable, +/turf/open/floor/iron/grimy, +/area/station/service/library/abandoned) "pZs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66536,6 +66743,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/unres, +/obj/effect/landmark/navigate_destination/med, /turf/open/floor/iron, /area/station/medical/medbay/lobby) "qkf" = ( @@ -67144,15 +67352,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"qsv" = ( -/obj/machinery/light/directional/south, -/obj/machinery/computer/station_alert{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "qsw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/wood, @@ -67385,22 +67584,6 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/departmental, /turf/open/floor/iron, /area/station/maintenance/port/fore) -"qvq" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Experimentor Lab Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/poddoor/preopen{ - id = "sci_experimentor"; - name = "Experimentor Blast Door" - }, -/turf/open/floor/iron, -/area/station/science/explab) "qvv" = ( /obj/structure/table/wood, /obj/item/clothing/head/costume/papersack/smiley, @@ -67614,14 +67797,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmos/project) -"qym" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/decal/cleanable/dirt, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/plating, -/area/station/service/library/abandoned) "qyy" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -68025,7 +68200,6 @@ name = "Vault Door" }, /obj/structure/sign/warning/secure_area/directional/north, -/obj/effect/landmark/navigate_destination, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -68059,6 +68233,23 @@ }, /turf/open/floor/iron, /area/station/medical/virology) +"qDX" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/sign/warning/electric_shock/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "qDZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -68187,6 +68378,13 @@ "qGm" = ( /turf/open/floor/iron/dark, /area/station/service/theater) +"qGo" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/library/abandoned) "qGr" = ( /obj/structure/cable, /obj/machinery/status_display/ai/directional/north, @@ -68202,11 +68400,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/corporate_showroom) -"qGz" = ( -/obj/structure/bookcase, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "qGJ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -68409,6 +68602,21 @@ }, /turf/open/floor/iron, /area/station/cargo/office) +"qIc" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Departures Lounge" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/duct, +/obj/effect/landmark/navigate_destination/dockesc, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "qIf" = ( /obj/effect/spawner/random/trash/mess, /obj/effect/mapping_helpers/broken_floor, @@ -69066,6 +69274,36 @@ /obj/effect/turf_decal/tile/bar, /turf/open/floor/iron/dark, /area/station/service/bar) +"qPa" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table/reinforced, +/obj/item/clipboard{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/paper{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/pen{ + pixel_x = 5; + pixel_y = 4 + }, +/obj/machinery/button/door{ + id = "sci_experimentor"; + name = "Experimentor Containment Control"; + pixel_x = -7; + pixel_y = 6; + req_access = list("science") + }, +/obj/item/assembly/signaler{ + pixel_x = -5 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/science/research) "qPg" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/yellow, @@ -69385,12 +69623,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/theater) -"qTB" = ( -/obj/structure/displaycase_chassis, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood/large, -/area/station/service/library/abandoned) "qTF" = ( /obj/machinery/porta_turret/ai, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -69557,6 +69789,11 @@ }, /turf/open/floor/iron, /area/station/maintenance/port) +"qWV" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/cable, +/turf/open/floor/iron/grimy, +/area/station/service/library/abandoned) "qWY" = ( /obj/effect/turf_decal/bot, /obj/machinery/light/small/directional/north, @@ -69718,6 +69955,14 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) +"qZB" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "sci_experimentor"; + name = "Experimentor Blast Door" + }, +/turf/open/floor/plating, +/area/station/science/research) "qZC" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted, /obj/effect/decal/cleanable/dirt, @@ -70154,6 +70399,11 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"rgn" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/maintenance/port) "rgA" = ( /obj/structure/chair, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -70170,6 +70420,13 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"rgF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/engine, +/area/station/science/research) "rgK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -70716,7 +70973,6 @@ /obj/item/radio/intercom/directional/south, /obj/structure/table/glass, /obj/item/food/grown/poppy/geranium, -/obj/machinery/infuser, /turf/open/floor/iron, /area/station/service/hydroponics) "rlQ" = ( @@ -70952,15 +71208,6 @@ "rov" = ( /turf/closed/wall/r_wall, /area/station/engineering/lobby) -"roB" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/science/explab) "roF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/effect/turf_decal/stripes/line{ @@ -70968,19 +71215,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/cryo) -"roX" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/holopad, -/turf/open/floor/iron/white, -/area/station/science/explab) "roZ" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral, @@ -71032,6 +71266,17 @@ /obj/item/pen/red, /turf/open/floor/wood, /area/station/commons/dorms) +"rqc" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/radio/intercom/directional/north, +/obj/machinery/modular_computer/console/preset/civilian{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/science/research) "rqn" = ( /obj/machinery/disposal/bin, /obj/machinery/light/directional/south, @@ -72332,6 +72577,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/landmark/navigate_destination/delta/abandkitchen, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) "rIn" = ( @@ -72500,6 +72746,13 @@ dir = 1 }, /area/station/engineering/atmos) +"rKy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/engine, +/area/station/science/research) "rKA" = ( /obj/machinery/firealarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -73061,6 +73314,7 @@ /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/navigate_destination/delta/abandsci, /turf/open/floor/iron, /area/station/science/research/abandoned) "rQp" = ( @@ -73289,14 +73543,6 @@ /obj/effect/spawner/random/trash/soap, /turf/open/floor/iron, /area/station/maintenance/department/medical/morgue) -"rSG" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/landmark/start/hangover, -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet/black, -/area/station/maintenance/port) "rSJ" = ( /obj/machinery/telecomms/server/presets/engineering, /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ @@ -73414,14 +73660,6 @@ }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"rUj" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "sci_experimentor"; - name = "Experimentor Blast Door" - }, -/turf/open/floor/plating, -/area/station/science/explab) "rUl" = ( /obj/machinery/door/window/brigdoor{ name = "Creature Pen"; @@ -73471,21 +73709,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/fore) -"rVc" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/barricade/wooden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/turf/open/floor/iron, -/area/station/service/library/abandoned) "rVf" = ( /obj/effect/turf_decal/tile/neutral, /obj/machinery/light/directional/east, @@ -74211,6 +74434,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/effect/landmark/navigate_destination/dockaux, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "seP" = ( @@ -74685,24 +74909,6 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron/grimy, /area/station/service/chapel) -"slx" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/departments/engineering/directional/north, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"slC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/status_display/ai/directional/north, -/obj/structure/sign/poster/official/random/directional/west, -/turf/open/floor/engine, -/area/station/science/explab) "slE" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -74837,6 +75043,11 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/science/robotics/lab) +"snw" = ( +/obj/structure/table, +/obj/item/analysis_bin, +/turf/open/floor/iron/dark, +/area/station/science/explab) "snE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -75186,14 +75397,12 @@ /turf/open/floor/iron, /area/station/security/warden) "sst" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /turf/open/floor/iron, /area/station/engineering/supermatter/room) "ssy" = ( @@ -75685,7 +75894,6 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/navigate_destination, /obj/structure/cable, /obj/machinery/duct, /turf/open/floor/iron, @@ -76434,16 +76642,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"sIn" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "sIp" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -76740,7 +76938,7 @@ }, /obj/effect/turf_decal/stripes/line, /obj/effect/mapping_helpers/airlock/access/all/service/theatre, -/obj/effect/landmark/navigate_destination, +/obj/effect/landmark/navigate_destination/common/theatrebackstage, /turf/open/floor/iron, /area/station/service/theater) "sLc" = ( @@ -78878,10 +79076,6 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"tnJ" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "tnR" = ( /obj/structure/sign/painting/library{ pixel_y = -32 @@ -79413,6 +79607,25 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"ttC" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin{ + layer = 3.21 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/poddoor/preopen{ + id = "sci_experimentor"; + name = "Experimentor Blast Door" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/research) "ttE" = ( /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, @@ -79467,18 +79680,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/maintenance/disposal/incinerator) -"tuj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Science - Experimentor"; - name = "science camera"; - network = list("ss13","rd") - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/engine, -/area/station/science/explab) "tuk" = ( /obj/structure/disposalpipe/junction/flip{ dir = 8 @@ -79600,7 +79801,6 @@ /obj/machinery/door/airlock/command/glass{ name = "Bridge Access" }, -/obj/effect/landmark/navigate_destination, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "bridge-right" @@ -79612,6 +79812,7 @@ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/effect/landmark/navigate_destination/bridge, /turf/open/floor/iron/dark, /area/station/command/bridge) "tvG" = ( @@ -79698,13 +79899,6 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) -"txc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/engine, -/area/station/science/explab) "txd" = ( /obj/structure/table/reinforced, /obj/item/stack/cable_coil{ @@ -79864,12 +80058,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/security/range) -"tAh" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "tAj" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/newscaster/directional/east, @@ -80137,20 +80325,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"tCS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "tCW" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -80279,6 +80453,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) +"tEg" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/rack, +/obj/item/storage/bag/ore, +/obj/item/storage/bag/ore, +/obj/item/storage/bag/ore, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/turf/open/floor/iron/dark, +/area/station/science/explab) "tEh" = ( /obj/structure/sign/directions/evac{ pixel_y = -8 @@ -80378,6 +80563,16 @@ /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/wood, /area/station/maintenance/port/fore) +"tFs" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "tFG" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -80822,6 +81017,13 @@ /obj/structure/sign/warning/radiation, /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) +"tLH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/engine, +/area/station/science/explab) "tLN" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -81197,6 +81399,13 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"tPd" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/maintenance/port) "tPk" = ( /obj/structure/lattice/catwalk, /obj/effect/landmark/generic_maintenance_landmark, @@ -81867,6 +82076,10 @@ }, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) +"tXN" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space) "tXO" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron, @@ -82019,21 +82232,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/engineering/supermatter/room) -"tZa" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/requests_console/directional/south{ - assistance_requestable = 1; - department = "Engineering"; - name = "Engineering Requests Console"; - supplies_requestable = 1 - }, -/obj/structure/sign/poster/official/do_not_question{ - pixel_x = 32 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/engineering/main) "tZi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -82092,16 +82290,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"uao" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/mob/living/simple_animal/hostile/retaliate/goat{ - name = "Pete" - }, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "uaz" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -82898,6 +83086,20 @@ /obj/structure/filingcabinet/security, /turf/open/floor/iron, /area/station/security/checkpoint/escape) +"ujR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/sign/departments/engineering/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "ujT" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 @@ -82926,13 +83128,13 @@ name = "E.V.A. Storage" }, /obj/structure/cable, -/obj/effect/landmark/navigate_destination, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/command/eva, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/eva, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) "ukn" = ( @@ -83480,6 +83682,7 @@ }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/effect/landmark/navigate_destination/delta/abandgambling, /turf/open/floor/iron, /area/station/service/abandoned_gambling_den) "urV" = ( @@ -83693,11 +83896,6 @@ /obj/effect/turf_decal/box/corners, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"uuJ" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/event_spawn, -/turf/open/floor/engine, -/area/station/science/explab) "uuN" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch{ @@ -84685,12 +84883,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/service/bar) -"uHc" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/obj/item/flashlight/lamp, -/turf/open/floor/plating, -/area/station/service/library/abandoned) "uHd" = ( /obj/structure/lattice, /obj/structure/grille, @@ -85014,13 +85206,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/locker) -"uMs" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/obj/effect/turf_decal/box/corners, -/turf/open/floor/engine, -/area/station/science/explab) "uMu" = ( /obj/structure/disposalpipe/trunk, /obj/machinery/firealarm/directional/east, @@ -85742,6 +85927,18 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/medical/virology) +"uUC" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/firealarm/directional/south, +/obj/structure/frame/computer{ + anchored = 1; + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/science/research) "uUG" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -86083,24 +86280,6 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/port) -"uZj" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external{ - name = "External Airlock" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/external, -/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) "uZs" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -86867,11 +87046,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) -"vjm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron/grimy, -/area/station/service/library/abandoned) "vjw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -87522,10 +87696,6 @@ /turf/open/floor/iron/grimy, /area/station/service/library/lounge) "vrs" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister, /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) @@ -87545,6 +87715,13 @@ /obj/item/taperecorder, /turf/open/floor/iron/dark, /area/station/security/office) +"vrF" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/iron, +/area/station/maintenance/port) "vrJ" = ( /obj/machinery/modular_computer/console/preset/id{ dir = 8 @@ -87911,6 +88088,17 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"vvU" = ( +/obj/structure/sign/warning/no_smoking/circle{ + pixel_x = 28; + pixel_y = -28 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/computer/station_alert{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "vwa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -88156,14 +88344,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/science/auxlab/firing_range) -"vyC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/library/abandoned) "vyG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -88601,25 +88781,6 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) -"vDj" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/line, -/obj/effect/turf_decal/trimline/brown/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -8; - pixel_y = 17 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/holopad, -/turf/open/floor/iron/dark/textured_large, -/area/station/bitrunning/den) "vDm" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -88676,6 +88837,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/storage) +"vEj" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/science/explab) "vEl" = ( /obj/machinery/modular_computer/console/preset/engineering, /obj/structure/cable, @@ -89299,6 +89466,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/chapel) +"vNr" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/research) "vNF" = ( /turf/open/floor/plating, /area/station/maintenance/department/security) @@ -89555,6 +89729,13 @@ dir = 8 }, /area/station/service/kitchen) +"vRi" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/airalarm/directional/south, +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron/dark, +/area/station/science/research) "vRn" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/siding/white/corner, @@ -89579,11 +89760,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron, /area/station/security/prison/garden) -"vRy" = ( -/obj/structure/table, -/obj/effect/spawner/random/entertainment/cigarette_pack, -/turf/open/floor/carpet/black, -/area/station/maintenance/port) "vRB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -89857,9 +90033,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/supermatter/room) -"vVa" = ( -/turf/open/floor/iron/grimy, -/area/station/service/library/abandoned) "vVc" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, @@ -90030,6 +90203,7 @@ dir = 8 }, /obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/effect/landmark/navigate_destination/bridge, /turf/open/floor/iron/dark, /area/station/command/bridge) "vXQ" = ( @@ -90484,14 +90658,6 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) -"wdu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/engine, -/area/station/science/explab) "wdv" = ( /obj/structure/closet, /obj/effect/spawner/random/maintenance/three, @@ -90752,6 +90918,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, +/obj/effect/landmark/navigate_destination/tcomms, /turf/open/floor/iron, /area/station/hallway/secondary/command) "wgc" = ( @@ -91757,12 +91924,6 @@ /obj/machinery/iv_drip, /turf/open/floor/iron, /area/station/medical/virology) -"wpW" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/port) "wqk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -92376,6 +92537,21 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"wwm" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable, +/obj/machinery/newscaster/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/camera/directional/north{ + c_tag = "Science - Experimentor Control"; + name = "science camera"; + network = list("ss13","rd") + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/science/research) "wwr" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, @@ -92474,6 +92650,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"wxF" = ( +/obj/structure/chair/office, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/carpet/black, +/area/station/maintenance/port) "wxI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -92662,7 +92843,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/medical/medbay) "wzT" = ( @@ -92845,10 +93025,6 @@ }, /turf/open/floor/iron, /area/station/medical/treatment_center) -"wBX" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/service/library/abandoned) "wCc" = ( /obj/structure/flora/bush/lavendergrass/style_random, /obj/structure/flora/bush/grassy/style_random, @@ -92999,6 +93175,12 @@ }, /turf/open/floor/iron, /area/station/service/kitchen/abandoned) +"wDA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/explab) "wDD" = ( /obj/machinery/firealarm/directional/north{ pixel_x = -4 @@ -94072,24 +94254,6 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"wTq" = ( -/obj/structure/table, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/item/relic, -/obj/item/assembly/signaler{ - pixel_x = 6; - pixel_y = 5 - }, -/obj/machinery/door/poddoor/preopen{ - id = "sci_experimentor"; - name = "Experimentor Blast Door" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/explab) "wTu" = ( /obj/effect/turf_decal/trimline/dark_red/filled/warning{ dir = 8 @@ -94802,14 +94966,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/storage) -"xeg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/sign/warning/secure_area/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/engine, -/area/station/science/explab) "xeh" = ( /obj/structure/cable, /obj/machinery/duct, @@ -94946,6 +95102,14 @@ /obj/structure/cable, /turf/open/floor/wood/large, /area/station/service/library/lounge) +"xft" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/explab) "xfz" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/north, @@ -95144,6 +95308,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/landmark/navigate_destination/delta/abandmarketbay, /turf/open/floor/iron, /area/station/service/electronic_marketing_den) "xhV" = ( @@ -95295,13 +95460,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/storage_shared) -"xkO" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/iron/grimy, -/area/station/service/library/abandoned) "xkU" = ( /obj/effect/turf_decal/bot_white{ color = "#435a88" @@ -95614,11 +95772,6 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) -"xoX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/iron/grimy, -/area/station/service/library/abandoned) "xpr" = ( /obj/effect/spawner/random/decoration/carpet, /obj/effect/spawner/random/structure/furniture_parts, @@ -96506,7 +96659,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/navigate_destination, +/obj/effect/landmark/navigate_destination/chemfactory, /turf/open/floor/iron, /area/station/medical/chemistry) "xzQ" = ( @@ -96566,6 +96719,19 @@ "xAo" = ( /turf/closed/wall, /area/station/security/detectives_office/private_investigators_office) +"xAq" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/holopad, +/turf/open/floor/iron/white, +/area/station/science/research) "xAt" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/junction{ dir = 8 @@ -96864,6 +97030,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/event_spawn, +/obj/effect/landmark/navigate_destination/chapel, /turf/open/floor/iron/grimy, /area/station/service/chapel) "xEE" = ( @@ -97073,21 +97240,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/research) -"xGn" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/newscaster/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/camera/directional/north{ - c_tag = "Science - Experimentor Control"; - name = "science camera"; - network = list("ss13","rd") - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/science/explab) "xGu" = ( /obj/structure/frame/machine{ anchored = 1 @@ -97437,14 +97589,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"xLg" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/iron/dark, -/area/station/service/library/abandoned) "xLi" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 10 @@ -97756,6 +97900,7 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/supply/vault, +/obj/effect/landmark/navigate_destination/vault, /turf/open/floor/iron/dark, /area/station/hallway/primary/central/fore) "xPz" = ( @@ -97842,6 +97987,13 @@ }, /turf/open/floor/iron, /area/station/engineering/lobby) +"xQy" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/explab) "xQB" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -98304,6 +98456,11 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/crew_quarters/bar) +"xWV" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/artifact_spawner, +/turf/open/floor/iron/dark, +/area/station/science/explab) "xXc" = ( /obj/structure/table/reinforced, /obj/item/assembly/timer, @@ -98533,6 +98690,23 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/station/commons/toilet/locker) +"xZr" = ( +/obj/structure/table, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/item/assembly/signaler{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/machinery/door/poddoor/preopen{ + id = "sci_experimentor"; + name = "Experimentor Blast Door" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/research) "xZC" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/disposalpipe/segment, @@ -98675,7 +98849,6 @@ dir = 4 }, /obj/structure/railing{ - dir = 10; layer = 3.1 }, /turf/open/space/basic, @@ -99181,12 +99354,6 @@ /obj/item/hand_labeler, /turf/open/floor/plating, /area/station/maintenance/port) -"yix" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/maintenance/port) "yiA" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/red{ @@ -99265,11 +99432,6 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron/dark/smooth_large, /area/station/science/genetics) -"yjV" = ( -/obj/structure/chair/office, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet/black, -/area/station/maintenance/port) "ykb" = ( /obj/structure/table, /obj/item/storage/bag/plants/portaseeder, @@ -99432,6 +99594,15 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/engineering/atmos/project) +"ylS" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/vending/wardrobe/engi_wardrobe, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/engineering/main) "ylT" = ( /obj/machinery/newscaster/directional/west, /obj/effect/turf_decal/tile/brown{ @@ -119402,8 +119573,8 @@ tqa gnw lFQ mWF -jcg -jcg +mWF +mWF sst pgY gAw @@ -119661,7 +119832,7 @@ sHT glb dRK wcP -yeO +fXc nbZ gAw ifw @@ -121691,7 +121862,7 @@ kTd wwr rSZ bAR -dxl +aNG viB kCq hrK @@ -124846,10 +125017,10 @@ aaa aad aaa abj -aad -aad -aad -abj +aaa +aaa +aaa +aaa aaa aaa aaa @@ -125106,11 +125277,11 @@ abj aaa aaa aaa -abj -aad -aad -aad -abj +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -125335,7 +125506,7 @@ loj wEI kdN oqA -hxT +jHs wEI rMy uWJ @@ -125360,19 +125531,19 @@ aaa aad aaa abj -qYo -qYo -qYo -vVc +tXN +tXN +tXN +tXN +tXN +tXN +tXN +tXN +tXN aaa aaa +jgw aaa -vVc -qYo -qYo -vVc -qYo -qYo efQ qYo pSj @@ -125561,7 +125732,7 @@ gRE bEN ogj jaZ -eXN +ogj tqo grl iJU @@ -125617,19 +125788,19 @@ aaa aad aaa aaa -aaa -qYo -aaa -vVc -qYo -qYo -qYo -vVc -aaa -aaa -vVc -aaa -aaa +tXN +bTz +bTz +bTz +bTz +bTz +bTz +bTz +tXN +jUT +jUT +jgw +jUT qYo qYo pSj @@ -125818,7 +125989,7 @@ cui kpD vvH hcQ -dsj +eQJ rRD pgA hOa @@ -125874,19 +126045,19 @@ aaa aad aaa aaa -aaa -qYo +tXN +bTz +bTz +bTz +bTz +bTz +bTz +bTz +tXN aaa aaa +jgw aaa -qYo -aaa -vVc -qYo -qYo -vVc -qYo -qYo efQ qYo kun @@ -126074,8 +126245,8 @@ eOe bTN pWd geR -odD -tZa +ylS +pJm rRD adb odL @@ -126131,17 +126302,17 @@ aaa aad aaa aaa -aaa -qYo -aaa -aaa -aaa -qYo -aaa -aaa +tXN +bTz +bTz +bTz +bTz +bTz +bTz +bTz +tXN aaa aaa -qYo aaa aaa efQ @@ -126388,19 +126559,19 @@ aaa aad aaa aaa +tXN +bTz +bTz +bTz +bTz +bTz +bTz +bTz +tXN aaa -qYo aaa aaa aaa -qYo -aaa -aaa -efQ -efQ -efQ -qYo -qYo aad aad bbD @@ -126645,15 +126816,15 @@ aaa aad aaa aaa -aaa -qYo -aaa -aaa -aaa -qYo -aaa -aaa -aaa +tXN +bTz +bTz +bTz +bTz +bTz +bTz +bTz +tXN aaa aaa aaa @@ -126843,7 +127014,7 @@ slp aJu iSi mQF -qsv +jEo pTC lsf uGP @@ -126902,19 +127073,19 @@ aaa abj aad aad -qYo -efQ -efQ -qYo -efQ -efQ -efQ -efQ -efQ -qYo -efQ -efQ -qYo +tXN +bTz +bTz +bTz +bTz +bTz +bTz +bTz +tXN +aaa +jgw +aaa +aaa aad fuV htw @@ -127097,10 +127268,10 @@ rAH kdd gzF wGA -pky -tCS -gCn -oVo +aJu +tFs +hQO +vvU pTC goD sjH @@ -127159,19 +127330,19 @@ aaa aad aaa aaa -aaa -aaa -qYo -aaa -aaa -aaa -qYo -aaa -aaa -aaa -qYo -aaa -qYo +tXN +bTz +bTz +bTz +bTz +bTz +bTz +bTz +tXN +jUT +jgw +jUT +jUT fuV fuV jNx @@ -127354,10 +127525,10 @@ wGA wGA wGA wGA -pTC -pTC -pTC -gXx +gfQ +cCE +hWP +iqc pTC vcB eru @@ -127416,19 +127587,19 @@ aaa abj abj abj -qYo +tXN +tXN +tXN +tXN +tXN +tXN +tXN +tXN +tXN +aaa +jgw aaa -efQ -efQ -efQ -efQ -efQ -qYo -efQ -efQ -efQ aaa -qYo dPR arE uWa @@ -127610,14 +127781,14 @@ emB hza ejp hza -quQ -vcB -lmJ -qVA -qAR -qev -yix -pps +pPy +fMn +bqF +qDX +hWc +pTC +lPK +fYe pTC qNN req @@ -127673,19 +127844,19 @@ cUJ kzc rnW qQM -qYo -qYo -qYo -qYo -qYo -qYo -qYo -qYo -qYo -qYo -qYo -qYo -qYo +aaa +jUT +aaa +aaa +aaa +aaa +aaa +aaa +jUT +aaa +aaa +aaa +aaa dPR kde jKG @@ -127866,15 +128037,15 @@ uSR opq rrw fAX -tAh -crT -xhw -fBp -miM -uiM -rQi -qzu -cOt +uED +pPy +pTC +pTC +pTC +gXx +pTC +vrF +rgn pTC pFP pFP @@ -127929,19 +128100,19 @@ wHL fYU kzc dqo -qQM -kGi -kGi -kGi -kGi -kGi -kGi -kGi -kGi -kGi -kGi -kGi -qQM +igg +igg +igg +igg +kew +kew +kew +igg +igg +igg +igg +igg +igg aad dPR eXD @@ -128124,14 +128295,14 @@ svI oEV sOM tFa -bPD -vcB -vcB -vcB -vcB +quQ vcB -qcM -cOt +lmJ +qVA +qAR +qev +azS +pps pTC jVS nED @@ -128185,20 +128356,20 @@ pPs pYA fYU kzc -uZj -qQM -qym -vLq -wBX -bAz -dJM -qGz -nev -kLu -eGb -jCt -uHc -qQM +koa +igg +snw +tEg +ebs +mne +mne +wDA +hZw +igg +ntA +ntA +ntA +igg qQM kzc jGs @@ -128378,17 +128549,17 @@ dGS dGS dGS vBX -dsy +iCO nps nps -vcB -vcB -dGQ -caW -bYR -vcB -jPf +crT +xhw +fBp +miM +uiM rQi +qzu +cOt pTC rnr lRx @@ -128442,20 +128613,20 @@ jYs rxK hGW hEt -pFd -qQM -pqg -xLg -qTB -gDT -jMU -mmq -wgL -qGz -tnJ -ikY -mEH -qQM +nRr +igg +mPm +fBX +oIX +fBX +aKh +nzU +hQM +lUz +fBX +fBX +fBX +igg tTg dzF dzF @@ -128635,15 +128806,15 @@ jPJ xTT oUk dGS -slx +iCO uED -fdJ +nXK +bPD +vcB +vcB +vcB +vcB vcB -qcM -ieM -iMH -gnW -ofk lhZ rQi pTC @@ -128664,7 +128835,7 @@ vcB jto gcr vcB -ccY +aga kVT vcB tiM @@ -128699,20 +128870,20 @@ xoR lou syJ kzc -tlV -dBs -bvP -ihO -sIn -epp -hQx -hkR -vyC -daz -bAz -vLq -ncw -qQM +ipD +bPP +lHp +vEj +vEj +xft +hJp +tLH +xQy +aBq +ntA +fBX +xWV +igg uYH frM avb @@ -128892,18 +129063,18 @@ ehj ehj mPA dGS -iCO -uED -ozx +iDX +ohw +ujR vcB -jtp -aqa -iPb -kCi +vcB +dGQ +caW +akI vcB lbX pgV -pll +jTw jTw lvI pxo @@ -128956,20 +129127,20 @@ vHx ntK xeN kzc -tTg -rVc -bsk -oWm -vVa -kZP -aSV -vVa -vVa -vjm -bsk -fmD -iKP -qQM +oIm +cjn +iuY +igg +igg +igg +igg +igg +igg +iuY +iuY +owP +igg +igg dnV frM kzc @@ -129151,14 +129322,14 @@ vYG dGS iCO uED -nXK -vcB -pyh -hjP -eOF -awC +ozx vcB qcM +ieM +iMH +gnW +ofk +qcM win vcB vcB @@ -129177,10 +129348,10 @@ jTw sIe hlX pTC -slC -wdu -nIa -wTq +lwN +kuE +iAX +xZr ffb cMn bUz @@ -129220,7 +129391,7 @@ crd kcH iIk nUL -jzW +fkp jzW kZP kZP @@ -129410,10 +129581,10 @@ iCO axQ ilo vcB -yjV -gfX -rSG -qcM +jtp +lsj +iPb +kCi vcB jPf ant @@ -129434,10 +129605,10 @@ wFE qcM uDk pTC -xeg -cPa -aNE -dou +aen +oAo +bRn +cEY ffb dBJ hwS @@ -129474,15 +129645,15 @@ iBz dBs ntZ iQf +bPR dJH -dJH -joc +bUd mVQ ovP xeR woc edw -ick +nMP qQM dnV ijm @@ -129667,10 +129838,10 @@ kAS uED nXK vcB -jtp -gXn -vRy -kCi +wxF +aqF +hIR +hYi vcB lbX pps @@ -129691,10 +129862,10 @@ vcB kbN eHn pTC -kRk -uMs -aNE -mSD +rKy +ipk +bRn +gEq ffb dBJ sLY @@ -129730,10 +129901,10 @@ uYH ejx qQM wVd -fCj +iaC dYS gDT -fiq +qGo kVH vLq xHr @@ -129927,7 +130098,7 @@ rIU pSL nsH lbS -wpW +tPd vcB mYM iAM @@ -129947,12 +130118,12 @@ wjI vcB qcM axm -qvq -bKu -uuJ -cxM -adK -roX +eIG +vNr +ePf +lee +lMO +xAq dBJ hwS vfU @@ -129990,7 +130161,7 @@ fCw wqv bsF ddo -gaT +hew pLI wgL uko @@ -130181,7 +130352,7 @@ rRr uED nXK vcB -ltt +bcV hRs grA pTC @@ -130205,10 +130376,10 @@ eaC kUg eHn pTC -tuj -roB -imp -cwE +fqN +mmc +fAN +cFx ffb dBJ hwS @@ -130246,8 +130417,8 @@ qQM isR ycA qQe -cRl -fEx +qWV +aww gtY pGe mmq @@ -130462,10 +130633,10 @@ vcB xXz pZc pTC -xeg -uMs -imp -dpw +aen +ipk +fAN +efC ffb dBJ hwS @@ -130503,7 +130674,7 @@ qQM svk dXB xXj -xkO +pZr wog kGi kGi @@ -130670,7 +130841,7 @@ hXw btc hFP xAt -uao +pEs oTB sqM oYs @@ -130719,10 +130890,10 @@ pTC qWO duV pTC -lLa -fRK -txc -pAv +hOG +rgF +gZC +ttC ffb dqP nlp @@ -130760,7 +130931,7 @@ qQM vxY kTy dHo -xoX +oMA din kGi hST @@ -130976,10 +131147,10 @@ pTC pTC rOH pTC -rUj -rUj -rUj -igg +qZB +qZB +qZB +xWf wnW kyD qmd @@ -131233,10 +131404,10 @@ kjI kPc evI dNS -hHf -nhn -cjH -igg +rqc +qPa +uUC +xWf pbW nfj tla @@ -131490,10 +131661,10 @@ kjI shP ptc dNS -xGn -mlo -iEg -khB +wwm +ntg +oOE +mnu oaE vcL gxX @@ -131747,10 +131918,10 @@ khb bPY nlF dNS -gLh -kor -bGn -igg +hpz +pLb +vRi +xWf tFM cTj dyx @@ -143090,7 +143261,7 @@ arU dkL arU bDv -dgJ +qIc vaK vaK gFW @@ -143521,7 +143692,7 @@ pxS xMZ mlF qsF -jKY +mOT mdR lDY tpZ @@ -143777,8 +143948,8 @@ llj rer xMZ mDm -vDj -hXd +cnz +pQU mdR qmT tpZ @@ -144320,7 +144491,7 @@ dra omj epc omj -dra +dJY vtn mDw vwO @@ -145053,7 +145224,7 @@ aDg krp cAF qqx -jrz +oVu xZC iIj aJE @@ -145631,7 +145802,7 @@ wxv nHY nbd nHY -nbd +dEq lLJ nbd aBz @@ -149751,7 +149922,7 @@ pCY iOX pWX fWr -cbA +jrg hPu dHq pbu @@ -151776,7 +151947,7 @@ adM uHP dth fws -vHY +mmy rYA vHY hie @@ -154877,7 +155048,7 @@ mfC lsG mfC mfC -lsG +gOA mfC mfC fIQ diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 8e2776eef326..2d2b877d966a 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -450,6 +450,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/security/prison/workout) +"ajS" = ( +/obj/machinery/light/directional/north, +/obj/machinery/portable_atmospherics/canister/plasma, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/engine, +/area/station/science/explab) "akk" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer2{ dir = 4 @@ -497,17 +503,6 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/iron, /area/station/commons/dorms) -"akL" = ( -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/light/small/directional/west, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) "akQ" = ( /obj/effect/turf_decal/weather/snow/corner, /turf/open/floor/glass/reinforced/icemoon, @@ -942,6 +937,12 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"aqt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/station/science/explab) "aqy" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -3361,6 +3362,20 @@ /obj/effect/spawner/structure/window/hollow/reinforced/end, /turf/open/floor/plating, /area/mine/eva/lower) +"bfA" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/research/glass{ + name = "Test Chamber" + }, +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/research, +/turf/open/floor/engine, +/area/station/science/explab) "bfB" = ( /obj/item/kirbyplants/random, /obj/machinery/firealarm/directional/east, @@ -3961,6 +3976,17 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron/dark/side, /area/mine/eva/lower) +"boe" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/research/glass{ + name = "Test Chamber" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/access/all/science/research, +/turf/open/floor/iron/dark, +/area/station/science/explab) "bol" = ( /turf/open/floor/iron/dark/textured, /area/station/security/prison) @@ -4264,12 +4290,6 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) -"bup" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/simple_animal/parrot/poly, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "buv" = ( /obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2{ color = "#ff0000"; @@ -4573,6 +4593,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral/diagonal_edge, +/obj/effect/landmark/navigate_destination/kitchen, /turf/open/floor/iron/kitchen/diagonal, /area/station/service/kitchen) "bzB" = ( @@ -5043,6 +5064,7 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/structure/sign/directions/cryo/directional/west, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "bEH" = ( @@ -5863,6 +5885,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, +/obj/effect/landmark/navigate_destination/dockescpod1, /turf/open/floor/plating, /area/station/hallway/secondary/entry) "bRz" = ( @@ -7051,7 +7074,6 @@ "cks" = ( /obj/item/wrench, /obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) @@ -7881,6 +7903,11 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"cyb" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/landmark/navigate_destination/icebox/maintsbar, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) "cyh" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -8806,6 +8833,17 @@ /obj/structure/sign/poster/random/directional/south, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"cKR" = ( +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/light/small/directional/west, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/reagent_dispensers/fueltank/large, +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) "cLo" = ( /obj/machinery/recharge_station, /turf/open/floor/iron, @@ -8943,20 +8981,6 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/exit/departure_lounge) -"cMy" = ( -/obj/structure/table, -/obj/item/folder/white, -/obj/item/folder/white, -/obj/item/pen, -/obj/item/taperecorder, -/obj/item/paper_bin{ - pixel_y = 6 - }, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/science/explab) "cMA" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig Control" @@ -9058,7 +9082,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/navigate_destination, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/textured, /area/station/service/hydroponics/garden) @@ -10447,6 +10470,8 @@ }, /obj/effect/mapping_helpers/airlock/access/any/engineering/general, /obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/landmark/navigate_destination/engineering, +/obj/effect/landmark/navigate_destination/atmos, /turf/open/floor/iron, /area/station/engineering/lobby) "djT" = ( @@ -11445,6 +11470,10 @@ dir = 5 }, /area/station/command/heads_quarters/rd) +"dAJ" = ( +/obj/effect/landmark/navigate_destination/bar, +/turf/open/openspace, +/area/station/service/bar/atrium) "dAO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/siding/wood{ @@ -11586,12 +11615,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/fitness) -"dDm" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/science/explab) "dDp" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -12158,6 +12181,10 @@ }, /turf/open/floor/iron, /area/station/command/bridge) +"dNb" = ( +/obj/structure/sign/directions/cryo/directional/west, +/turf/closed/wall, +/area/station/commons/storage/mining) "dNi" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/plating, @@ -12672,6 +12699,10 @@ dir = 8 }, /area/station/science/research) +"dWv" = ( +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/turf/open/genturf, +/area/icemoon/underground/unexplored/rivers/deep) "dWK" = ( /obj/machinery/hydroponics/soil, /obj/item/shovel/spade, @@ -14683,9 +14714,7 @@ /area/station/commons/fitness) "eDC" = ( /obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "eDM" = ( @@ -14775,6 +14804,7 @@ cycle_id = "brigoutpost" }, /obj/effect/mapping_helpers/airlock/access/all/security/entrance, +/obj/effect/landmark/navigate_destination/sec, /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, @@ -17387,11 +17417,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"fya" = ( -/obj/structure/cable, -/mob/living/simple_animal/sloth/paperwork, -/turf/open/floor/iron, -/area/station/cargo/storage) "fyc" = ( /obj/structure/cable, /turf/open/floor/iron/dark, @@ -18199,14 +18224,6 @@ /area/station/cargo/drone_bay) "fMg" = ( /obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/acidic_buffer{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/basic_buffer{ - pixel_x = -5; - pixel_y = 3 - }, /obj/item/reagent_containers/cup/bottle/formaldehyde{ pixel_x = 1 }, @@ -18250,7 +18267,6 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/effect/landmark/navigate_destination, /turf/open/floor/plating, /area/station/hallway/secondary/entry) "fNp" = ( @@ -18269,6 +18285,7 @@ }, /area/station/engineering/engine_smes) "fNA" = ( +/obj/structure/sign/warning/bodysposal/directional/north, /turf/open/openspace, /area/station/medical/medbay/central) "fNK" = ( @@ -18904,7 +18921,6 @@ id_tag = "cargooffice"; name = "Cargo Office" }, -/obj/effect/landmark/navigate_destination, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -18912,6 +18928,7 @@ }, /obj/effect/mapping_helpers/airlock/access/any/supply/general, /obj/effect/mapping_helpers/airlock/access/any/supply/mining, +/obj/effect/landmark/navigate_destination/cargo, /turf/open/floor/iron, /area/station/cargo/office) "gaq" = ( @@ -19082,7 +19099,6 @@ dir = 9 }, /obj/machinery/light/directional/north, -/obj/machinery/infuser, /obj/structure/table/glass, /turf/open/floor/iron/dark, /area/station/service/hydroponics) @@ -19283,15 +19299,6 @@ /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"geg" = ( -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron, -/area/station/science/explab) "gem" = ( /obj/structure/railing, /turf/open/floor/plating/snowed/smoothed/icemoon, @@ -19495,14 +19502,6 @@ }, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) -"giR" = ( -/obj/structure/table, -/obj/item/relic, -/obj/effect/spawner/random/maintenance, -/obj/item/screwdriver, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/iron/checker, -/area/station/maintenance/port/fore) "giV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19751,16 +19750,6 @@ /obj/item/circuitboard/machine/chem_master, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) -"gmR" = ( -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/airalarm/directional/north, -/obj/structure/reagent_dispensers/fueltank/large, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/engine_smes) "gmW" = ( /turf/closed/wall, /area/station/commons/fitness) @@ -19809,6 +19798,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, /turf/open/floor/iron, /area/station/engineering/atmos) +"gnH" = ( +/obj/effect/spawner/random/structure/table_fancy, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/sign/painting/large/library{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/service/library) "gnL" = ( /obj/structure/closet/bombcloset/security, /turf/open/floor/iron/smooth, @@ -20981,6 +20979,10 @@ "gHv" = ( /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) +"gHx" = ( +/obj/effect/artifact_spawner, +/turf/open/floor/engine, +/area/station/science/explab) "gHA" = ( /mob/living/simple_animal/hostile/asteroid/polarbear{ move_force = 999; @@ -21094,6 +21096,10 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"gJR" = ( +/obj/structure/sign/directions/cryo/directional/north, +/turf/closed/wall, +/area/station/maintenance/central/lesser) "gJT" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/white/side{ @@ -21594,6 +21600,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, /obj/effect/turf_decal/tile/yellow/full, +/obj/effect/landmark/navigate_destination/chemfactory, /turf/open/floor/iron/large, /area/station/medical/treatment_center) "gTw" = ( @@ -22819,6 +22826,14 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) +"hpX" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Chapel" + }, +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination/chapel, +/turf/open/floor/iron/sepia, +/area/station/service/library) "hqi" = ( /obj/machinery/door/window/brigdoor{ dir = 1; @@ -22881,6 +22896,11 @@ /obj/item/shovel/spade, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"hrG" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/sign/directions/cryo/directional/west, +/turf/open/floor/plating, +/area/station/hallway/primary/central) "hrJ" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -24177,6 +24197,23 @@ /obj/machinery/door/firedoor, /turf/open/floor/wood, /area/station/security/prison/rec) +"hPq" = ( +/obj/item/book/manual/wiki/tcomms{ + pixel_x = 10; + pixel_y = -1 + }, +/obj/item/book/manual/wiki/ordnance{ + pixel_x = 10; + pixel_y = 3 + }, +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -7; + pixel_y = 5 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/security/processing) "hPs" = ( /turf/closed/wall/r_wall, /area/station/security/prison/work) @@ -25651,6 +25688,12 @@ /obj/item/clothing/mask/breath, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"imU" = ( +/obj/machinery/artifact_zapper{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/explab) "imV" = ( /obj/structure/stairs/east, /obj/structure/railing{ @@ -25893,6 +25936,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/security/detective, +/obj/effect/landmark/navigate_destination/det, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) "iry" = ( @@ -27089,27 +27133,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) -"iLv" = ( -/obj/item/book/manual/wiki/tcomms{ - pixel_x = 10; - pixel_y = -1 - }, -/obj/item/book/manual/wiki/ordnance{ - pixel_x = 10; - pixel_y = 3 - }, -/obj/item/book/manual/wiki/experimentor{ - pixel_x = 10; - pixel_y = 8 - }, -/obj/structure/table/wood, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -7; - pixel_y = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/processing) "iLK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28122,6 +28145,7 @@ /obj/effect/turf_decal/trimline/dark_red/arrow_ccw{ dir = 8 }, +/obj/effect/landmark/navigate_destination/incinerator, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "jaS" = ( @@ -28979,6 +29003,10 @@ "jre" = ( /turf/closed/wall, /area/station/maintenance/starboard/lesser) +"jrj" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) "jrk" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/mapping_helpers/broken_floor, @@ -29052,6 +29080,13 @@ dir = 1 }, /area/station/hallway/primary/port) +"jsP" = ( +/obj/structure/table, +/obj/effect/spawner/random/maintenance, +/obj/item/screwdriver, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/iron/checker, +/area/station/maintenance/port/fore) "jtl" = ( /obj/machinery/light/directional/north, /obj/machinery/meter/monitored/waste_loop, @@ -30327,8 +30362,8 @@ name = "Bridge" }, /obj/structure/cable, -/obj/effect/landmark/navigate_destination, /obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/effect/landmark/navigate_destination/bridge, /turf/open/floor/iron, /area/station/command/bridge) "jOj" = ( @@ -31250,6 +31285,7 @@ /area/station/science/ordnance/testlab) "kdF" = ( /obj/effect/spawner/random/vending/snackvend, +/obj/structure/sign/directions/cryo/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/starboard) "kdJ" = ( @@ -31600,6 +31636,10 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"kit" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) "kix" = ( /obj/machinery/door/airlock/mining/glass{ name = "Mining Base" @@ -31962,14 +32002,6 @@ }, /turf/open/floor/iron/smooth, /area/station/security/holding_cell) -"kpn" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/effect/turf_decal/box/corners, -/obj/effect/landmark/bitrunning/station_reward_spawn, -/turf/open/floor/iron/dark/smooth_large, -/area/station/bitrunning/den) "kpp" = ( /obj/structure/table/wood, /obj/item/storage/box/matches, @@ -32258,10 +32290,6 @@ }, /turf/open/floor/plating/snowed/smoothed/icemoon, /area/icemoon/underground/explored) -"ksu" = ( -/mob/living/simple_animal/hostile/asteroid/gutlunch, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) "ksC" = ( /turf/open/floor/iron, /area/station/security/brig/upper) @@ -32537,13 +32565,6 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"kxe" = ( -/obj/structure/rack, -/obj/item/poster/random_official, -/obj/effect/spawner/random/maintenance, -/obj/item/relic, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/morgue) "kxp" = ( /obj/machinery/door/airlock/security/glass{ name = "Security Desk" @@ -32975,6 +32996,12 @@ /obj/machinery/light/dim/directional/north, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/bar) +"kDy" = ( +/obj/machinery/light/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/science/explab) "kDz" = ( /obj/structure/toilet{ pixel_y = 8 @@ -33497,6 +33524,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/navigate_destination/common/shitter, /turf/open/floor/iron/freezer, /area/station/commons/toilet) "kMF" = ( @@ -33563,6 +33591,12 @@ /obj/structure/fence, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"kNI" = ( +/obj/structure/rack, +/obj/item/poster/random_official, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/morgue) "kNQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34017,12 +34051,8 @@ pixel_x = 32 }, /obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/door/window{ - dir = 8; - name = "Secure Art Exhibition"; - req_access = list("library") - }, /obj/effect/spawner/random/structure/table_fancy, +/obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/wood, /area/station/service/library) "kVM" = ( @@ -34947,8 +34977,8 @@ /obj/machinery/door/airlock/public/glass{ name = "Primary Tool Storage" }, -/obj/effect/landmark/navigate_destination, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/navigate_destination/tools, /turf/open/floor/iron/textured, /area/station/commons/storage/primary) "lka" = ( @@ -36426,13 +36456,13 @@ /obj/machinery/door/airlock/engineering{ name = "Telecommunications" }, -/obj/effect/landmark/navigate_destination, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /obj/effect/mapping_helpers/airlock/access/any/command/general, +/obj/effect/landmark/navigate_destination/tcomms, /turf/open/floor/iron, /area/station/tcommsat/computer) "lIK" = ( @@ -37032,6 +37062,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/effect/turf_decal/tile/blue/full, +/obj/effect/landmark/navigate_destination/med, /turf/open/floor/iron/large, /area/station/medical/medbay/lobby) "lUw" = ( @@ -37440,6 +37471,7 @@ name = "Escape Pod Four" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/landmark/navigate_destination/dockescpod3, /turf/open/floor/plating, /area/station/engineering/storage_shared) "mcl" = ( @@ -37859,16 +37891,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/maintenance/disposal/incinerator) -"mko" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4 - }, -/obj/structure/sign/warning/secure_area/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/explab) "mku" = ( /obj/effect/spawner/random/structure/grille, /obj/effect/decal/cleanable/glass, @@ -38048,6 +38070,15 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"mnT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/artifact_heatingpad{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/explab) "moc" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -39123,11 +39154,6 @@ /obj/machinery/keycard_auth/directional/south, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) -"mHd" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/iron/dark, -/area/station/science/explab) "mHu" = ( /obj/machinery/atmospherics/components/tank, /turf/open/floor/iron/dark, @@ -39659,6 +39685,12 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/iron/dark, /area/station/maintenance/department/medical/central) +"mQH" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/mob/living/basic/parrot/poly, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "mQV" = ( /obj/structure/chair/pew/right, /obj/machinery/light/warm/directional/east, @@ -39898,6 +39930,7 @@ name = "Hydroponics" }, /obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, +/obj/effect/landmark/navigate_destination/hydro, /turf/open/floor/iron/textured_half{ dir = 1 }, @@ -40913,6 +40946,7 @@ name = "Unisex Showers" }, /obj/structure/cable, +/obj/effect/landmark/navigate_destination/common/shitter, /turf/open/floor/iron/freezer, /area/station/commons/toilet) "nkO" = ( @@ -42344,7 +42378,6 @@ }, /obj/machinery/door/firedoor, /obj/structure/cable, -/obj/effect/landmark/navigate_destination, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, @@ -43050,12 +43083,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating, /area/station/maintenance/department/chapel) -"nOy" = ( -/obj/structure/sign/directions/cryo/directional/south{ - pixel_y = 1 - }, -/turf/closed/wall, -/area/station/service/hydroponics/garden) "nOB" = ( /obj/structure/railing{ dir = 4 @@ -43527,6 +43554,10 @@ dir = 1 }, /area/station/service/hydroponics) +"nVA" = ( +/obj/structure/sign/directions/cryo/directional/east, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "nVB" = ( /obj/effect/turf_decal/trimline/dark/warning{ dir = 4 @@ -43620,10 +43651,6 @@ /area/station/security/prison/safe) "nXl" = ( /obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) "nXn" = ( @@ -43901,15 +43928,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"ocF" = ( -/mob/living/simple_animal/hostile/retaliate/goat{ - atmos_requirements = list("min_oxy"=1,"max_oxy"=0,"min_plas"=0,"max_plas"=1,"min_co2"=0,"max_co2"=5,"min_n2"=0,"max_n2"=0); - desc = "Not known for their pleasant disposition. This one seems a bit more hardy to the cold."; - minbodytemp = 150; - name = "Snowy Pete" - }, -/turf/open/misc/asteroid/snow/coldroom, -/area/station/service/kitchen/coldroom) "ocY" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/spawner/random/engineering/tracking_beacon, @@ -44289,6 +44307,7 @@ /obj/structure/disposalpipe/junction/flip{ dir = 8 }, +/obj/effect/landmark/navigate_destination/common/vaccommissary, /turf/open/floor/iron/dark, /area/station/commons/vacant_room/commissary) "oiO" = ( @@ -47087,6 +47106,15 @@ /obj/item/coin/silver, /turf/open/floor/iron, /area/station/commons/dorms) +"pcX" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Research Division Testing Lab - Chamber"; + network = list("test","rd") + }, +/obj/machinery/light/directional/south, +/obj/effect/artifact_spawner, +/turf/open/floor/engine, +/area/station/science/explab) "pdc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -47115,10 +47143,6 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory/upper) -"pdO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/engine, -/area/station/science/explab) "pdR" = ( /obj/machinery/camera/directional/west{ c_tag = "Cargo Bay Receiving Dock" @@ -47183,18 +47207,6 @@ /obj/machinery/vending/cart, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) -"pee" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/research/glass{ - name = "Test Chamber" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/mapping_helpers/airlock/access/all/science/research, -/turf/open/floor/iron/dark, -/area/station/science/explab) "pez" = ( /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron/dark/textured_edge{ @@ -47550,6 +47562,14 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"pkv" = ( +/obj/machinery/light_switch/directional/west, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/byteforge, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) "pkM" = ( /obj/machinery/light/directional/south, /obj/effect/landmark/start/hangover, @@ -47638,19 +47658,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/security/holding_cell) -"pmQ" = ( -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/landmark/bitrunning/station_reward_spawn, -/turf/open/floor/iron/dark/smooth_large, -/area/station/bitrunning/den) "pna" = ( /obj/machinery/door/poddoor/preopen{ id = "Engineering"; @@ -48157,6 +48164,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/court, /turf/open/floor/iron/dark, /area/station/security/courtroom) "pvB" = ( @@ -48699,6 +48707,7 @@ name = "Escape Pod Three"; space_dir = 1 }, +/obj/effect/landmark/navigate_destination/dockescpod4, /turf/open/floor/iron/dark/textured, /area/station/security/processing) "pDI" = ( @@ -49462,6 +49471,12 @@ /obj/effect/landmark/start/hangover/closet, /turf/open/floor/carpet, /area/station/commons/dorms) +"pOt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/science/explab) "pOy" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -49904,6 +49919,13 @@ }, /turf/open/genturf, /area/icemoon/surface/outdoors/unexplored/rivers/no_monsters) +"pWL" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/explab) "pWY" = ( /obj/structure/table/glass, /obj/structure/extinguisher_cabinet/directional/east, @@ -50088,6 +50110,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/purple/half, +/obj/effect/landmark/navigate_destination/research, /turf/open/floor/iron/half, /area/station/hallway/primary/starboard) "qaF" = ( @@ -50647,6 +50670,16 @@ /obj/structure/closet/crate, /turf/open/floor/plating/snowed/icemoon, /area/icemoon/underground/explored) +"qlX" = ( +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/power/smes/engineering, +/turf/open/floor/iron/dark, +/area/station/engineering/engine_smes) "qmi" = ( /turf/open/floor/iron, /area/station/cargo/lobby) @@ -51841,9 +51874,9 @@ }, /obj/structure/disposalpipe/segment, /obj/effect/landmark/event_spawn, -/obj/effect/landmark/navigate_destination, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/service/janitor, +/obj/effect/landmark/navigate_destination/janitor, /turf/open/floor/iron, /area/station/service/janitor) "qGe" = ( @@ -52093,6 +52126,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/obj/effect/landmark/navigate_destination/common/bitrunner, /turf/open/floor/iron, /area/station/bitrunning/den) "qKq" = ( @@ -53990,6 +54024,10 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/science/xenobiology) +"roD" = ( +/obj/structure/sign/directions/cryo/directional/west, +/turf/closed/wall, +/area/station/commons/toilet) "roH" = ( /obj/structure/chair/pew/right, /turf/open/floor/wood, @@ -54084,13 +54122,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/storage) -"rqF" = ( -/obj/machinery/door/poddoor{ - id = "Secure Storage"; - name = "Secure Storage" - }, -/turf/open/floor/plating, -/area/station/engineering/engine_smes) "rqH" = ( /obj/structure/closet/crate, /obj/item/stack/sheet/leather, @@ -54656,6 +54687,7 @@ /area/icemoon/surface/outdoors/nospawn) "rzS" = ( /obj/structure/sign/departments/chemistry/pharmacy/directional/west, +/obj/structure/sign/warning/bodysposal/directional/south, /turf/open/openspace, /area/station/medical/medbay/lobby) "rAr" = ( @@ -55275,11 +55307,11 @@ /obj/machinery/door/airlock/public/glass{ name = "Dormitory" }, -/obj/effect/landmark/navigate_destination, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 }, +/obj/effect/landmark/navigate_destination/common/dorms, /turf/open/floor/iron, /area/station/commons/dorms) "rKQ" = ( @@ -55785,6 +55817,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, +/obj/effect/landmark/navigate_destination/dockescpod2, /turf/open/floor/plating, /area/station/hallway/secondary/entry) "rTO" = ( @@ -56103,6 +56136,12 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/hop) +"rYl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/explab) "rYq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56474,6 +56513,10 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/engine, /area/station/engineering/supermatter) +"seS" = ( +/obj/structure/sign/directions/cryo/directional/north, +/turf/closed/wall/r_wall, +/area/station/maintenance/central/greater) "seX" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/mechanical, @@ -57123,15 +57166,15 @@ /turf/open/floor/iron, /area/station/command/gateway) "spW" = ( -/obj/structure/sign/painting/library_secure{ - pixel_x = 32 - }, +/obj/effect/spawner/random/structure/table_fancy, /obj/machinery/door/window{ dir = 8; name = "Secure Art Exhibition"; req_access = list("library") }, -/obj/effect/spawner/random/structure/table_fancy, +/obj/structure/sign/painting/library_secure{ + pixel_x = 32 + }, /turf/open/floor/wood, /area/station/service/library) "sqs" = ( @@ -57142,6 +57185,24 @@ "sqt" = ( /turf/open/floor/iron/dark, /area/station/science/ordnance/office) +"sqv" = ( +/obj/machinery/door/poddoor{ + id = "Secure Storage"; + name = "Secure Storage" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"sqL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/engineering/engine_smes) "sqN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -57378,6 +57439,13 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) +"stV" = ( +/obj/structure/sign/warning/secure_area/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/explab) "stZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -58186,10 +58254,6 @@ /area/mine/living_quarters) "sGJ" = ( /obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) @@ -58502,6 +58566,7 @@ id_tag = "FitnessShower"; name = "Cryogenic Storage" }, +/obj/effect/landmark/navigate_destination/common/cryogenics, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) "sMY" = ( @@ -58562,6 +58627,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/effect/landmark/navigate_destination/bridge, /turf/open/floor/iron, /area/station/command/bridge) "sOl" = ( @@ -58945,6 +59011,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"sVa" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark/smooth_half{ + dir = 1 + }, +/area/station/engineering/engine_smes) "sVf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -62063,6 +62135,10 @@ }, /turf/open/floor/iron/white, /area/station/science/robotics/lab) +"tXi" = ( +/obj/machinery/artifact_xray, +/turf/open/floor/engine, +/area/station/science/explab) "tXn" = ( /obj/machinery/light/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62266,6 +62342,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, +/obj/effect/landmark/navigate_destination/aiupload, /turf/open/floor/iron/dark/textured_large, /area/station/ai_monitored/turret_protected/ai_upload) "uan" = ( @@ -62301,10 +62378,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/showroomfloor, /area/station/security/warden) -"uaT" = ( -/obj/machinery/rnd/experimentor, -/turf/open/floor/engine, -/area/station/science/explab) "ubc" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -62771,14 +62844,6 @@ /obj/structure/sign/warning/deathsposal/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"uie" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Research Division Testing Lab - Chamber"; - network = list("test","rd") - }, -/obj/machinery/light/directional/south, -/turf/open/floor/engine, -/area/station/science/explab) "uif" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62898,10 +62963,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) -"ukf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/iron/dark, -/area/station/science/explab) "uko" = ( /obj/structure/chair/pew/left{ dir = 1 @@ -63931,21 +63992,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/security/armory/upper) -"uCJ" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/research/glass{ - name = "Test Chamber" - }, -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "Test Chamber Blast Door" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/mapping_helpers/airlock/access/all/science/research, -/turf/open/floor/engine, -/area/station/science/explab) "uCN" = ( /obj/structure/grille/broken, /turf/open/misc/asteroid/snow/icemoon, @@ -64307,9 +64353,7 @@ /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "uIV" = ( -/obj/machinery/meter, /obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) "uJn" = ( @@ -64329,10 +64373,18 @@ "uJt" = ( /turf/open/floor/carpet, /area/station/service/chapel) -"uJO" = ( -/obj/machinery/porta_turret/aux_base, -/turf/closed/wall/r_wall, -/area/station/security/lockers) +"uJV" = ( +/obj/structure/table, +/obj/item/folder/white, +/obj/item/folder/white, +/obj/item/pen, +/obj/item/taperecorder, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/item/analysis_bin, +/turf/open/floor/iron/dark, +/area/station/science/explab) "uJX" = ( /obj/structure/closet/firecloset, /obj/item/radio/intercom/directional/north, @@ -64848,6 +64900,13 @@ dir = 1 }, /area/station/engineering/main) +"uSM" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/loafer, +/turf/open/floor/plating, +/area/station/security/prison/safe) "uTc" = ( /obj/machinery/chem_heater/withbuffer, /obj/structure/window/reinforced/spawner/directional/north{ @@ -65714,6 +65773,17 @@ dir = 6 }, /area/station/science/research) +"vij" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Chapel" + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination/chapel, +/turf/open/floor/iron/white/corner, +/area/station/hallway/secondary/exit/departure_lounge) "vip" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67247,11 +67317,11 @@ name = "Vault" }, /obj/structure/cable, -/obj/effect/landmark/navigate_destination, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/supply/vault, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/navigate_destination/vault, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) "vGJ" = ( @@ -68578,6 +68648,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/smooth_half, /area/station/security/office) +"weW" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/station/science/explab) "weY" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/table/glass, @@ -68658,6 +68732,11 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/xenobiology) +"wgs" = ( +/obj/structure/cable, +/mob/living/basic/sloth/paperwork, +/turf/open/floor/iron, +/area/station/cargo/storage) "wgu" = ( /obj/structure/table/wood, /obj/item/storage/fancy/candle_box{ @@ -68826,6 +68905,9 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/medical/chemistry) +"wiw" = ( +/turf/open/floor/iron/dark, +/area/station/science/explab) "wiz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -69378,6 +69460,15 @@ "wqx" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/fore) +"wqE" = ( +/mob/living/basic/goat/pete{ + desc = "Not known for their pleasant disposition. This one seems a bit more hardy to the cold."; + habitable_atmos = list("min_oxy"=1,"max_oxy"=0,"min_plas"=0,"max_plas"=1,"min_co2"=0,"max_co2"=5,"min_n2"=0,"max_n2"=0); + minimum_survivable_temperature = 150; + name = "Snowy Pete" + }, +/turf/open/misc/asteroid/snow/coldroom, +/area/station/service/kitchen/coldroom) "wqI" = ( /obj/item/radio/intercom/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -69757,6 +69848,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/service/lawyer, +/obj/effect/landmark/navigate_destination/lawyer, /turf/open/floor/wood, /area/station/service/lawoffice) "wxg" = ( @@ -71497,6 +71589,10 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/cargo/office) +"wXU" = ( +/mob/living/basic/mining/gutlunch/warrior, +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) "wXW" = ( /obj/structure/sign/warning/gas_mask/directional/south, /obj/effect/spawner/random/trash/grille_or_waste, @@ -71946,7 +72042,6 @@ /obj/machinery/door/airlock/research{ name = "Research Division Access" }, -/obj/effect/landmark/navigate_destination, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, @@ -72214,6 +72309,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/disposals, /turf/open/floor/plating, /area/station/maintenance/disposal) "xit" = ( @@ -72775,10 +72871,10 @@ name = "Tech Storage" }, /obj/structure/cable, -/obj/effect/landmark/navigate_destination, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, +/obj/effect/landmark/navigate_destination/techstorage, /turf/open/floor/plating, /area/station/engineering/storage/tech) "xsD" = ( @@ -74056,6 +74152,10 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/security/prison/visit) +"xMC" = ( +/obj/structure/cable, +/turf/closed/wall/r_wall, +/area/station/engineering/engine_smes) "xMI" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -74677,11 +74777,10 @@ /obj/machinery/camera/directional/east{ c_tag = "Library Art Gallery" }, -/obj/structure/window/reinforced/spawner/directional/west, /obj/effect/spawner/random/structure/table_fancy, /obj/machinery/light/blacklight/directional/north, -/obj/structure/sign/painting/large/library{ - dir = 4 +/obj/structure/sign/painting/library_secure{ + pixel_x = 32 }, /turf/open/floor/wood, /area/station/service/library) @@ -74823,12 +74922,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/smooth_large, /area/station/ai_monitored/command/storage/eva) -"yaG" = ( -/obj/effect/landmark/navigate_destination/chapel, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/primary/starboard) "yaJ" = ( /obj/effect/turf_decal/trimline/green/filled/warning{ dir = 4 @@ -78025,7 +78118,7 @@ oSU oSU oSU oSU -oSU +dWv oSU oSU oSU @@ -88394,7 +88487,7 @@ iDt iDt iDt iDt -ksu +wXU iDt exv iDt @@ -170915,7 +171008,7 @@ wRa vVH nRO ulz -ulz +uSM ulz pNm eOz @@ -173558,7 +173651,7 @@ eix bvS bbv qck -kxe +kNI nxM nxM nxM @@ -178928,7 +179021,7 @@ dEB dMS jBB mQk -ocF +wqE wMP fwB fwB @@ -221835,7 +221928,7 @@ kMu esB oCO xJv -fsv +nVA fsv nDk fsv @@ -222092,7 +222185,7 @@ slv rEN oCO oCO -nOy +oCO aPI iKR aPI @@ -226996,7 +227089,7 @@ tKI tKI tkk vlN -fya +wgs vlN ajw wiz @@ -227021,7 +227114,7 @@ bln ptf qOl ace -ybu +cyb thW pRj uhP @@ -227779,8 +227872,8 @@ gjP ajw ajw aKb -pmQ -kpn +pkv +kit uAS ehu tFP @@ -231298,7 +231391,7 @@ tGr tGr tGr tGr -uJO +bDu bDu bDu bDu @@ -231584,7 +231677,7 @@ sDl sDl sDl hEI -giR +jsP uxm rmU ure @@ -231880,7 +231973,7 @@ gfb gfb pYB gfb -gfb +seS nqU rcE rcE @@ -232691,7 +232784,7 @@ xYI mNY oXX mNY -hpd +jrj hpd hpd wkw @@ -232948,9 +233041,9 @@ csT mNY kCn mNY -yaL -rqF -rqF +xMC +sqv +sqv yaL yaL yaL @@ -233205,8 +233298,8 @@ kYq mNY kCn mNY -akL -tvF +cKR +sVa tvF izF gTK @@ -233462,8 +233555,8 @@ wmM mNY kCn mNY -gmR -tMD +qlX +sqL rMG lui twt @@ -234171,7 +234264,7 @@ tgn itN nuX yfF -pAZ +hrG dnq kgD utR @@ -235999,7 +236092,7 @@ qQC qQC kta kta -kta +dNb tqQ iuv vyb @@ -236801,7 +236894,7 @@ ami oPU wHj mBB -bup +mQH ojv htc wox @@ -239054,7 +239147,7 @@ uja uja uja hsB -uja +roD wJk iuv ezK @@ -239076,7 +239169,7 @@ lpM lpM log sIt -sIt +gJR sIt log mhQ @@ -241077,7 +241170,7 @@ wWU xjL evw aML -iLv +hPq hSJ ykw deY @@ -242659,7 +242752,7 @@ mrF ptO jRA jRA -jRA +dAJ ixH fmD ptO @@ -251913,7 +252006,7 @@ hUD qnm btQ hUD -uum +hpX uum hUD hUD @@ -252415,7 +252508,7 @@ kKL xUT uZn kKL -ttv +gnH prg prg caY @@ -253459,7 +253552,7 @@ gEE fTX wjS bMY -yaG +emp cYE lso pHX @@ -254267,7 +254360,7 @@ xUk sqt uiN nsZ -geg +kDy eVY ihu epH @@ -254524,7 +254617,7 @@ xUk aSB tHT nsZ -mko +stV oZn sFj rck @@ -254781,8 +254874,8 @@ xUk sqt duE nsZ -ukf -cMy +wiw +uJV trb sXC rDZ @@ -254997,7 +255090,7 @@ qPL pRG mtN dFt -vHI +vij vHI dFt dFt @@ -255038,7 +255131,7 @@ xUk sqt iOv nsZ -pee +boe hjE wGc wGc @@ -255295,12 +255388,12 @@ fkX vQp opB nsZ -mHd +weW hjE +tXi +imU rDZ -rDZ -rDZ -rDZ +gHx bgx cJC gqv @@ -255552,12 +255645,12 @@ uAx pFl cyG nsZ -uCJ +bfA hjE rDZ rDZ rDZ -rDZ +gHx bgx qUY jCl @@ -255809,12 +255902,12 @@ vaa xLq xLq nsZ -pdO +rDZ sFA rDZ vyx -uaT -uie +rDZ +pcX bgx jCl jCl @@ -256066,9 +256159,9 @@ vaa xLq grs nsZ -pdO -dDm -rDZ +pOt +mnT +aqt rDZ rDZ rDZ @@ -256323,12 +256416,12 @@ vaa xLq ezJ nsZ +ajS +rYl +pWL rDZ pxu -rDZ -rDZ -pxu -rDZ +gHx bgx vzD vzD diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index d19cbd5e49e6..6936e6c65cae 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -918,6 +918,18 @@ /obj/structure/cable/layer3, /turf/open/floor/engine, /area/station/ai_monitored/turret_protected/ai) +"alF" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/machinery/keycard_auth/directional/north{ + pixel_x = -6 + }, +/obj/machinery/light_switch/directional/north{ + pixel_x = 12 + }, +/obj/item/radio/intercom/directional/east, +/mob/living/basic/parrot/poly, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "alL" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -6736,19 +6748,6 @@ /obj/structure/grille, /turf/closed/wall/r_wall, /area/space/nearstation) -"cox" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/mob/living/simple_animal/sloth/citrus, -/turf/open/floor/iron, -/area/station/cargo/sorting) "coy" = ( /obj/structure/flora/rock/style_random, /turf/open/misc/asteroid/airless, @@ -7039,10 +7038,6 @@ /mob/living/basic/mining/goliath/ancient, /turf/open/misc/asteroid/airless, /area/space/nearstation) -"cuj" = ( -/mob/living/simple_animal/hostile/asteroid/hivelord, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) "cup" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -11698,6 +11693,15 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"ebc" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/remains/human, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/maintenance/port/fore) "ebp" = ( /obj/effect/turf_decal/delivery, /obj/machinery/atmospherics/components/unary/bluespace_sender, @@ -13214,16 +13218,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"eBu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood/old, -/mob/living/simple_animal/hostile/retaliate/goat{ - name = "Pete" - }, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "eBx" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -15934,6 +15928,16 @@ "fuB" = ( /turf/closed/wall/rust, /area/station/maintenance/starboard/aft) +"fuV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/chair/stool/directional/west, +/mob/living/basic/trooper/russian/ranged/lootless, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "fuX" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20282,6 +20286,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/safe) +"gMy" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/mob/living/basic/mining/legion, +/turf/open/floor/plating, +/area/station/cargo/warehouse) "gMA" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -20958,6 +20969,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"gXU" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/structure/grille/broken, +/obj/item/clothing/gloves/color/fyellow, +/obj/item/flashlight, +/obj/item/flashlight/flare, +/obj/machinery/light/small/directional/west, +/obj/structure/sign/poster/contraband/random/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "gXX" = ( /obj/effect/turf_decal/bot, /obj/machinery/portable_atmospherics/canister/air, @@ -24277,6 +24300,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) +"hYx" = ( +/mob/living/basic/mining/legion, +/turf/open/misc/asteroid/airless, +/area/space/nearstation) "hYY" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/decal/cleanable/dirt, @@ -29517,6 +29544,9 @@ /obj/machinery/firealarm/directional/west, /obj/item/radio/intercom/directional/north, /obj/machinery/pdapainter/supply, +/obj/machinery/byteforge{ + pixel_y = 14 + }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/qm) "jGt" = ( @@ -31811,17 +31841,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/gateway) -"kwf" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/jungle/mook{ - environment_smash = 0; - name = "deformed creature" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/maintenance/port/fore) "kwm" = ( /obj/structure/closet/firecloset/full, /turf/open/floor/iron, @@ -38269,17 +38288,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/station/engineering/atmos/storage/gas) -"mCF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/spider/stickyweb, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/turf_decal/siding/wood, -/mob/living/basic/syndicate/russian/ranged/lootless, -/turf/open/floor/plating, -/area/station/maintenance/starboard) "mCO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41616,19 +41624,6 @@ /obj/structure/closet/athletic_mixed, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"nJV" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/remains/human, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/mob/living/simple_animal/hostile/jungle/mook{ - environment_smash = 0; - name = "deformed creature" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/maintenance/port/fore) "nKh" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -42712,6 +42707,16 @@ /mob/living/carbon/human/species/monkey, /turf/open/floor/grass, /area/station/medical/virology) +"ofH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/blood/gibs/old, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/mob/living/basic/mining/legion, +/turf/open/floor/plating, +/area/station/cargo/warehouse) "ogg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -45137,6 +45142,19 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) +"oYe" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/mob/living/basic/goat/pete, +/obj/machinery/duct, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/fore) "oYi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46281,19 +46299,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) -"pqh" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/structure/grille/broken, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/flashlight, -/obj/item/flashlight/flare, -/obj/machinery/light/small/directional/west, -/obj/item/relic, -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard) "pqm" = ( /obj/effect/turf_decal/siding/purple{ dir = 1 @@ -51468,16 +51473,6 @@ /obj/item/taperecorder, /turf/open/floor/carpet/green, /area/station/security/detectives_office) -"rbN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/chair/stool/directional/west, -/mob/living/basic/syndicate/russian/ranged/lootless, -/turf/open/floor/plating, -/area/station/maintenance/starboard) "rbO" = ( /turf/open/floor/iron, /area/station/service/hydroponics) @@ -52692,6 +52687,10 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/station/maintenance/port/lesser) +"rvd" = ( +/mob/living/basic/mining/legion, +/turf/open/misc/asteroid/lowpressure, +/area/space/nearstation) "rvj" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -53208,6 +53207,17 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/engineering/atmos) +"rEh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/spider/stickyweb, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/siding/wood, +/mob/living/basic/trooper/russian/ranged/lootless, +/turf/open/floor/plating, +/area/station/maintenance/starboard) "rEi" = ( /obj/structure/table/glass, /obj/machinery/computer/records/medical/laptop, @@ -55125,6 +55135,13 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/station/maintenance/fore) +"skW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen/coldroom) "slh" = ( /obj/structure/flora/bush/flowers_br/style_random, /obj/item/radio/intercom/directional/south, @@ -55540,6 +55557,19 @@ }, /turf/open/floor/iron/dark, /area/station/service/kitchen) +"srn" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/mob/living/basic/sloth/citrus, +/turf/open/floor/iron, +/area/station/cargo/sorting) "srs" = ( /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, @@ -55912,6 +55942,17 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/starboard) +"syS" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/mob/living/basic/parrot/poly, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/space/basic, +/area/space) "syZ" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -63416,19 +63457,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"uWO" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/pen, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central/fore) "uWQ" = ( /obj/structure/flora/rock/pile/style_random{ pixel_x = -6; @@ -68114,13 +68142,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) -"wpu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/mob/living/simple_animal/hostile/asteroid/hivelord, -/turf/open/floor/plating, -/area/station/cargo/warehouse) "wpw" = ( /turf/closed/wall, /area/station/science/xenobiology) @@ -68781,16 +68802,6 @@ "wAt" = ( /turf/closed/wall, /area/station/security/execution/education) -"wAv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/mob/living/simple_animal/hostile/asteroid/hivelord, -/turf/open/floor/plating, -/area/station/cargo/warehouse) "wAz" = ( /obj/structure/railing{ dir = 4 @@ -69161,7 +69172,6 @@ }, /obj/item/reagent_containers/spray/cleaner, /obj/effect/turf_decal/bot, -/obj/machinery/infuser, /turf/open/floor/iron, /area/station/service/hydroponics) "wGD" = ( @@ -70250,6 +70260,13 @@ /obj/structure/sign/warning, /turf/closed/wall, /area/station/maintenance/port/lesser) +"wZt" = ( +/obj/effect/decal/cleanable/blood/gibs/old, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/maintenance/port/fore) "wZW" = ( /obj/machinery/door/firedoor, /turf/open/floor/iron/dark, @@ -70731,18 +70748,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"xjl" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/machinery/keycard_auth/directional/north{ - pixel_x = -6 - }, -/obj/machinery/light_switch/directional/north{ - pixel_x = 12 - }, -/obj/item/radio/intercom/directional/east, -/mob/living/simple_animal/parrot/poly, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "xjr" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -71519,6 +71524,12 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/security/prison/garden) +"xvC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/holopad, +/mob/living/basic/sloth/citrus, +/turf/open/space/basic, +/area/station/solars/port/fore) "xvF" = ( /obj/machinery/firealarm/directional/north, /obj/machinery/door/poddoor/preopen{ @@ -73510,10 +73521,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"ycp" = ( -/mob/living/simple_animal/hostile/asteroid/hivelord, -/turf/open/misc/asteroid/lowpressure, -/area/space/nearstation) "ycr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, @@ -87599,7 +87606,7 @@ aof aUz cmU grV -grV +xvC grV grV grV @@ -92419,7 +92426,7 @@ aeu aeu aeu aeU -cuj +hYx aeU aap aeu @@ -93251,7 +93258,7 @@ pVz uLS wjj jhv -kwf +wZt xOg hRg eRC @@ -93509,7 +93516,7 @@ mBW hNF jQh gNE -nJV +ebc gjD qku tmd @@ -94513,7 +94520,7 @@ aaa aaa aaa aaa -aaa +syS aaa aaa aaa @@ -97382,7 +97389,7 @@ gQd gQd pAq nki -uWO +oYe wWp tsg imM @@ -107417,7 +107424,7 @@ irL bXz hdm dMp -eBu +skW jDF rzV jgB @@ -110791,7 +110798,7 @@ gtI cuV pgG qZX -xjl +alF vqg gYS eYE @@ -111287,7 +111294,7 @@ hKV cIW liB lpf -cox +srn eLU pRu rEE @@ -111530,7 +111537,7 @@ pwy mGS lDu vMo -pqh +gXU vOX vOO gsO @@ -114073,7 +114080,7 @@ xZL xZL fsp wCY -rbN +fuV bQD pio qpZ @@ -114327,7 +114334,7 @@ wCY rZV cQJ iFd -mCF +rEh fML gxW oHR @@ -117600,7 +117607,7 @@ aeu aeU aeU aeU -cuj +hYx aeU aeu aeu @@ -118138,7 +118145,7 @@ aeu aeu dME wlO -wAv +ofH qgV itR qUZ @@ -119680,7 +119687,7 @@ aeu dME hBG rZi -wpu +gMy amU dsD heD @@ -121992,7 +121999,7 @@ aeu dvN dvN dvN -ycp +rvd dvN dvN dvN @@ -126936,7 +126943,7 @@ aeU aeu aeu aeu -cuj +hYx aeu aeu aeu diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 5d3a454518ed..75915bede965 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -144,6 +144,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/carpet, /area/station/service/library) +"acH" = ( +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/research) "adp" = ( /turf/closed/wall, /area/station/hallway/primary/starboard) @@ -420,6 +427,14 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/white, /area/station/security/prison/mess) +"aim" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/item/radio/intercom/directional/north, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white, +/area/station/science/research) "air" = ( /obj/structure/table/reinforced, /obj/item/tank/internals/anesthetic{ @@ -867,6 +882,14 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"aqU" = ( +/obj/machinery/asteroid_magnet{ + center_x = 128; + center_y = 58; + area_size = 3 + }, +/turf/open/floor/iron/dark, +/area/station/science/explab) "ara" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/plating, @@ -1297,6 +1320,10 @@ "ayr" = ( /turf/open/floor/iron, /area/station/engineering/break_room) +"ayz" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/station/science/research) "ayH" = ( /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, @@ -1405,6 +1432,12 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) +"aBH" = ( +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/science/research) "aBJ" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/delivery, @@ -2957,6 +2990,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) +"aZS" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/landmark/start/scientist, +/turf/open/floor/iron/white, +/area/station/science/research) "bau" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -3083,6 +3121,16 @@ /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"bcG" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Science Firing Range"; + network = list("ss13","rd") + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/science/research) "bcQ" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/window/reinforced/spawner/directional/west, @@ -3105,6 +3153,7 @@ cycle_id = "bridge-right" }, /obj/effect/mapping_helpers/airlock/access/any/command/general, +/obj/effect/landmark/navigate_destination/bridge, /turf/open/floor/iron/dark, /area/station/command/bridge) "bdb" = ( @@ -3413,13 +3462,10 @@ }, /turf/open/floor/iron/white, /area/station/security/prison/visit) -"bix" = ( -/obj/machinery/component_printer, -/turf/open/floor/iron/white, -/area/station/science/explab) "biA" = ( /obj/machinery/holopad, /obj/effect/turf_decal/delivery, +/obj/effect/landmark/navigate_destination/dockesc, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "biI" = ( @@ -3434,19 +3480,6 @@ /obj/item/reagent_containers/cup/rag, /turf/open/floor/iron/white, /area/station/medical/abandoned) -"bje" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/effect/decal/cleanable/oil/streak, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/landmark/bitrunning/station_reward_spawn, -/turf/open/floor/iron/dark/smooth_large, -/area/station/bitrunning/den) "bjB" = ( /obj/structure/sign/directions/security{ dir = 1; @@ -3507,10 +3540,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"bkM" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine, -/area/station/science/explab) "bkO" = ( /obj/machinery/iv_drip, /obj/effect/turf_decal/tile/green/half/contrasted{ @@ -4027,7 +4056,6 @@ name = "Dormitories" }, /obj/structure/cable, -/obj/effect/landmark/navigate_destination, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -4185,14 +4213,6 @@ /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, /area/station/maintenance/starboard/fore) -"buv" = ( -/obj/structure/sign/warning/secure_area/directional/west, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/closet/bombcloset, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "buw" = ( /obj/structure/table, /obj/item/clothing/gloves/color/orange, @@ -4761,10 +4781,6 @@ /obj/effect/mapping_helpers/mail_sorting/medbay/chemistry, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"bIa" = ( -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "bIo" = ( /obj/machinery/light_switch/directional/west, /obj/structure/table/reinforced, @@ -4989,6 +5005,7 @@ /obj/structure/disposalpipe/sorting/mail/flip{ dir = 1 }, +/obj/effect/mapping_helpers/mail_sorting/supply/disposals, /turf/open/floor/plating, /area/station/maintenance/port/fore) "bMY" = ( @@ -5143,9 +5160,6 @@ /obj/item/bodypart/arm/left, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"bQs" = ( -/turf/open/floor/iron/white, -/area/station/science/explab) "bQK" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -5164,11 +5178,6 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron, /area/station/science/xenobiology) -"bRb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/scientist, -/turf/open/floor/engine, -/area/station/science/explab) "bRG" = ( /obj/machinery/shower/directional/west, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -5262,12 +5271,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/dark, /area/station/medical/storage) -"bSY" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "bTj" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -5602,12 +5605,6 @@ }, /turf/open/floor/iron/kitchen_coldroom, /area/station/medical/coldroom) -"cbg" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/explab) "cbi" = ( /obj/machinery/camera/directional/east{ c_tag = "Aft Primary Hallway - Fore" @@ -5709,10 +5706,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"ceD" = ( -/obj/structure/table, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "ceF" = ( /obj/machinery/blackbox_recorder, /turf/open/floor/circuit/telecomms/mainframe, @@ -6069,15 +6062,6 @@ /obj/item/toy/basketball, /turf/open/floor/iron, /area/station/security/prison) -"cnu" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/science/explab) "cnv" = ( /obj/machinery/power/terminal{ dir = 1 @@ -6192,18 +6176,6 @@ /obj/item/pen, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) -"cpp" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/explab) "cpB" = ( /obj/machinery/computer/security/telescreen{ desc = "Used for watching Prison Wing holding areas."; @@ -6323,14 +6295,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/service/bar) -"cqL" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/external, -/obj/machinery/door/airlock/external, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "crg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, @@ -6398,6 +6362,8 @@ }, /obj/effect/mapping_helpers/airlock/access/any/engineering/general, /obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/landmark/navigate_destination/atmos, +/obj/effect/landmark/navigate_destination/engineering, /turf/open/floor/iron, /area/station/engineering/break_room) "csz" = ( @@ -6574,7 +6540,6 @@ name = "Locker Room" }, /obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/navigate_destination, /turf/open/floor/iron, /area/station/commons/locker) "cvO" = ( @@ -6971,6 +6936,7 @@ /area/station/engineering/supermatter/room) "cBw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/common/shitter, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) "cBy" = ( @@ -7331,10 +7297,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"cKm" = ( -/obj/structure/training_machine, -/turf/open/floor/engine, -/area/station/science/explab) "cKn" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, @@ -7384,10 +7346,6 @@ }, /turf/open/floor/engine/air, /area/station/engineering/atmos) -"cLu" = ( -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/station/science/explab) "cLx" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -7410,10 +7368,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"cML" = ( -/obj/structure/cable, -/turf/closed/wall/r_wall, -/area/station/maintenance/starboard/fore) "cMQ" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "hopqueue"; @@ -7568,12 +7522,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"cPQ" = ( -/obj/structure/rack, -/obj/item/clothing/gloves/color/fyellow, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "cPT" = ( /obj/machinery/door/airlock/research{ name = "Ordnance Lab" @@ -7744,12 +7692,6 @@ /obj/effect/mapping_helpers/mail_sorting/science/genetics, /turf/open/floor/iron/white, /area/station/science/research) -"cTj" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/science/explab) "cTk" = ( /obj/machinery/camera/motion/directional/south{ active_power_usage = 0; @@ -8856,10 +8798,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"dpN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "dpT" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/security_space_law{ @@ -9519,7 +9457,6 @@ /obj/machinery/door/airlock/external{ name = "Common Mining Dock" }, -/obj/effect/landmark/navigate_destination, /turf/open/floor/plating, /area/station/hallway/primary/port) "dEp" = ( @@ -9610,6 +9547,12 @@ }, /turf/open/floor/wood, /area/station/service/library) +"dGa" = ( +/obj/machinery/light/directional/north, +/obj/machinery/portable_atmospherics/canister/plasma, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/engine, +/area/station/science/explab) "dGq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/stairs/left{ @@ -9626,6 +9569,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/command/gateway, +/obj/effect/landmark/navigate_destination/gateway, /turf/open/floor/iron, /area/station/command/gateway) "dGv" = ( @@ -9680,16 +9624,6 @@ /obj/structure/sign/departments/telecomms/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"dHg" = ( -/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/tile/neutral/fourcorners, -/obj/machinery/computer/atmos_alert, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "dHG" = ( /obj/machinery/atmospherics/components/binary/crystallizer{ dir = 4 @@ -10077,12 +10011,6 @@ /obj/effect/turf_decal/siding/purple, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) -"dON" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/purple, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/explab) "dOQ" = ( /obj/structure/closet/toolcloset, /obj/effect/turf_decal/delivery, @@ -10394,6 +10322,12 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"dVa" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/research) "dVb" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, @@ -11084,11 +11018,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/prison/safe) -"egk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "egs" = ( /obj/effect/spawner/random/maintenance/two, /obj/structure/rack, @@ -11347,6 +11276,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"ekD" = ( +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/explab) "ekG" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -11725,16 +11658,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"erx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) "erF" = ( /obj/structure/cable, /obj/machinery/door/airlock/virology/glass{ @@ -11862,14 +11785,6 @@ /area/station/engineering/atmos) "ett" = ( /obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/acidic_buffer{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/basic_buffer{ - pixel_x = -5; - pixel_y = 3 - }, /obj/item/reagent_containers/cup/bottle/formaldehyde{ pixel_x = 1 }, @@ -11950,14 +11865,6 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) -"eur" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/explab) "eut" = ( /turf/closed/wall, /area/station/science/robotics/lab) @@ -12400,6 +12307,10 @@ }, /turf/open/floor/wood, /area/station/service/bar/backroom) +"eEl" = ( +/obj/effect/landmark/start/scientist, +/turf/open/floor/iron/white, +/area/station/science/research) "eEx" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, @@ -12995,6 +12906,14 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"eSh" = ( +/obj/structure/sign/warning/secure_area/directional/east, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft/lesser) "eSl" = ( /obj/structure/cable, /obj/effect/turf_decal/siding/purple{ @@ -13714,6 +13633,16 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/pharmacy) +"fhh" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "artsci" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "fhi" = ( /turf/open/floor/iron/dark, /area/station/science/ordnance) @@ -13783,7 +13712,6 @@ name = "MiniSat Access" }, /obj/structure/cable, -/obj/effect/landmark/navigate_destination, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/poddoor/preopen{ id = "transitlockdown" @@ -13791,8 +13719,17 @@ /obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, /obj/effect/mapping_helpers/airlock/access/any/command/general, /obj/effect/mapping_helpers/airlock/access/any/command/minisat, +/obj/effect/landmark/navigate_destination/minisat_access_tcomms_ai, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) +"fid" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/holopad, +/obj/effect/landmark/start/scientist, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/science/research) "fip" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -14015,6 +13952,15 @@ /obj/effect/landmark/start/chaplain, /turf/open/floor/iron/dark, /area/station/service/chapel) +"fkV" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/obj/machinery/module_duplicator, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron/white, +/area/station/science/research) "fkW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -14460,6 +14406,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/engineering/break_room) +"fxh" = ( +/obj/structure/rack, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/storage/bag/ore, +/obj/item/storage/bag/ore, +/obj/item/storage/bag/ore, +/turf/open/floor/iron/dark, +/area/station/science/explab) "fxj" = ( /obj/machinery/door/airlock/security{ name = "Court Cell" @@ -14643,10 +14599,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/engineering/atmos) -"fBt" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/science/explab) "fBz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14786,10 +14738,6 @@ "fEK" = ( /turf/closed/wall, /area/station/medical/medbay/central) -"fEU" = ( -/obj/machinery/bci_implanter, -/turf/open/floor/iron, -/area/station/science/explab) "fEW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -14809,13 +14757,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"fFa" = ( -/obj/effect/turf_decal/tile/purple, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/explab) "fFi" = ( /obj/machinery/computer/crew{ dir = 4 @@ -15066,6 +15007,14 @@ "fJy" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/engine) +"fJJ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/research) "fJW" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -15184,6 +15133,7 @@ cycle_id = "brig-entrance" }, /obj/effect/mapping_helpers/airlock/access/all/security/entrance, +/obj/effect/landmark/navigate_destination/sec, /turf/open/floor/iron, /area/station/security/brig) "fMb" = ( @@ -15228,6 +15178,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) +"fMx" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/research) "fMF" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/north, @@ -15476,6 +15434,7 @@ /obj/structure/table, /obj/item/storage/crayons, /obj/effect/landmark/start/hangover, +/obj/effect/landmark/navigate_destination/common/dorms, /turf/open/floor/iron, /area/station/commons/dorms) "fRr" = ( @@ -15492,6 +15451,15 @@ }, /turf/open/floor/iron, /area/station/command/teleporter) +"fRB" = ( +/obj/machinery/door/airlock/research/glass{ + name = "Testing Labs" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/research, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/science/research) "fRG" = ( /obj/machinery/firealarm/directional/east, /obj/effect/decal/cleanable/dirt, @@ -15769,17 +15737,12 @@ "fXj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/obj/structure/railing/corner{ +/obj/structure/railing, +/obj/structure/railing{ dir = 8 }, -/obj/structure/railing/corner, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos) -"fXm" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine, -/area/station/science/explab) "fXK" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 8 @@ -15788,6 +15751,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/security/prison) +"fYa" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "fYb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -16134,6 +16103,7 @@ /area/station/command/bridge) "gev" = ( /obj/effect/turf_decal/delivery, +/obj/effect/landmark/navigate_destination/common/vaccommissary, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) "gey" = ( @@ -16179,6 +16149,13 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics/garden) +"gfh" = ( +/obj/structure/sign/poster/random/directional/east, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/structure/cable, +/obj/machinery/door/airlock/research/glass, +/turf/open/floor/plating, +/area/station/science/explab) "gfk" = ( /obj/structure/table/wood, /obj/item/phone{ @@ -16232,9 +16209,12 @@ "ggj" = ( /turf/closed/wall, /area/station/security/evidence) -"ggH" = ( -/obj/effect/spawner/random/structure/chair_maintenance, -/turf/open/floor/iron/checker, +"ggx" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, /area/station/maintenance/aft/lesser) "ggM" = ( /obj/structure/cable, @@ -16610,6 +16590,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"gmR" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/modular_computer/console/preset/engineering, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "gmS" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -16954,7 +16941,7 @@ name = "Medbay Clinic" }, /obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/landmark/navigate_destination, +/obj/effect/landmark/navigate_destination/med, /turf/open/floor/iron/white, /area/station/medical/medbay/central) "gtb" = ( @@ -17852,15 +17839,6 @@ /obj/structure/cable, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) -"gLo" = ( -/obj/machinery/power/terminal, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/main) "gLy" = ( /obj/machinery/portable_atmospherics/pump/lil_pump, /obj/effect/turf_decal/siding/purple{ @@ -17950,15 +17928,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"gMG" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Power Monitoring" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/computer/station_alert, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "gMO" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/green{ @@ -18028,10 +17997,6 @@ /obj/effect/mapping_helpers/airlock/access/any/command/general, /turf/open/floor/iron/dark, /area/station/command/bridge) -"gNC" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/engine, -/area/station/science/explab) "gND" = ( /obj/machinery/iv_drip, /obj/effect/turf_decal/tile/blue/half/contrasted, @@ -18755,6 +18720,12 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron, /area/station/engineering/main) +"gZL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/research) "gZQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19103,7 +19074,6 @@ /area/station/maintenance/starboard/aft) "hgE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing, /obj/machinery/atmospherics/pipe/bridge_pipe/orange/hidden, /turf/open/floor/iron/stairs/right{ dir = 8 @@ -19376,6 +19346,15 @@ "hlD" = ( /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) +"hlE" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/science/research) "hlF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19569,6 +19548,13 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms) +"hoT" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/machinery/artifact_zapper{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/station/science/ordnance/burnchamber) "hoY" = ( /obj/structure/chair/office{ dir = 4 @@ -19588,6 +19574,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) +"hps" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Engineering - Power Monitoring" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "hpv" = ( /obj/item/storage/bag/plants/portaseeder, /obj/item/plant_analyzer, @@ -20151,6 +20146,15 @@ /obj/machinery/holopad/secure, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"hzl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft/lesser) "hzw" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -20434,6 +20438,11 @@ /obj/effect/turf_decal/box/red, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"hGq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft/lesser) "hGv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -20975,6 +20984,16 @@ }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) +"hRA" = ( +/obj/structure/sign/warning/electric_shock{ + pixel_x = -31 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/engineering/main) "hRD" = ( /obj/structure/chair/office{ dir = 4 @@ -21552,6 +21571,7 @@ location = "15-Court" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/navigate_destination/court, /turf/open/floor/iron/dark, /area/station/security/courtroom) "ibc" = ( @@ -22215,6 +22235,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"imV" = ( +/obj/structure/easel, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "inp" = ( /obj/effect/spawner/random/maintenance, /obj/structure/cable, @@ -22603,12 +22627,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"isI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/maintenance/aft/lesser) "isO" = ( /obj/machinery/conveyor{ dir = 8; @@ -22664,10 +22682,12 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) -"itn" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/engine, -/area/station/science/explab) +"ita" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/mob/living/basic/parrot/poly, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) "itp" = ( /obj/structure/chair{ dir = 8 @@ -23213,15 +23233,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/main) -"iBp" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Departure Lounge Airlock" - }, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "iBq" = ( /turf/closed/wall/r_wall, /area/station/maintenance/fore/lesser) @@ -23268,7 +23279,6 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/cable, -/obj/effect/landmark/navigate_destination, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/supply/vault, @@ -23303,12 +23313,6 @@ /obj/structure/cable, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"iDg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/explab) "iDh" = ( /obj/machinery/computer/communications{ dir = 8 @@ -23577,6 +23581,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/security/medical) +"iIC" = ( +/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/tile/neutral/fourcorners, +/obj/machinery/computer/station_alert, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "iIP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -24416,6 +24430,13 @@ }, /turf/open/floor/iron/white, /area/station/security/prison/mess) +"iSq" = ( +/obj/machinery/light_switch/directional/west, +/obj/machinery/power/smes/engineering, +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "iSI" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -24881,6 +24902,16 @@ /obj/item/shard, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"jbI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/science/research) "jcd" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -25245,14 +25276,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/abandoned) -"jhA" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/mob/living/simple_animal/sloth/citrus, -/turf/open/floor/iron, -/area/station/cargo/storage) "jhD" = ( /obj/structure/closet/radiation, /obj/structure/sign/warning/radiation/rad_area/directional/north, @@ -25377,6 +25400,16 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"jjU" = ( +/obj/structure/sign/map/left{ + 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-left-MS"; + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/computer/atmos_alert, +/turf/open/floor/iron/dark, +/area/station/engineering/main) "jkj" = ( /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 4 @@ -26169,17 +26202,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/commons/dorms) -"jwP" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/explab) "jwW" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -26785,6 +26807,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) +"jJh" = ( +/obj/effect/landmark/navigate_destination/common/holodeck, +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/station/holodeck/rec_center) "jJi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26846,6 +26874,7 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/landmark/navigate_destination/dockescpod4, /turf/open/floor/iron, /area/station/security/execution/transfer) "jKz" = ( @@ -27310,6 +27339,15 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron, /area/station/cargo/storage) +"jRU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/artifact_heatingpad{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/explab) "jSf" = ( /obj/structure/chair/stool/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -27324,9 +27362,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/xenobio, /turf/open/floor/iron, /area/station/science/xenobiology) -"jSk" = ( -/turf/open/floor/engine, -/area/station/science/explab) "jSm" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -28374,15 +28409,6 @@ /obj/machinery/griddle, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) -"klT" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/door/airlock/research{ - name = "Testing Labs" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/science/research, -/turf/open/floor/iron/white, -/area/station/science/explab) "kms" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28762,14 +28788,6 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload_foyer) -"ktz" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/obj/effect/spawner/random/trash/bin, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "ktD" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 @@ -29058,6 +29076,11 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"kyo" = ( +/obj/effect/spawner/random/trash/garbage, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft/lesser) "kyB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29235,18 +29258,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/command/teleporter) -"kCq" = ( -/obj/structure/sign/map/left{ - 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-left-MS"; - pixel_y = 32 - }, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/modular_computer/console/preset/engineering, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "kCC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, @@ -29482,17 +29493,6 @@ /obj/effect/landmark/start/bitrunner, /turf/open/floor/iron/dark/textured_half, /area/station/bitrunning/den) -"kHU" = ( -/obj/effect/turf_decal/box/corners, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light_switch/directional/north, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/landmark/bitrunning/station_reward_spawn, -/turf/open/floor/iron/dark/smooth_large, -/area/station/bitrunning/den) "kIG" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance/two, @@ -29779,6 +29779,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/landmark/navigate_destination/common/portquartersolar, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) "kOf" = ( @@ -30032,7 +30033,6 @@ dir = 4; layer = 4.1 }, -/obj/structure/railing, /turf/open/floor/iron, /area/station/engineering/atmos) "kRi" = ( @@ -30060,21 +30060,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port) -"kRF" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 4; - id = "ordnancebridge" - }, -/obj/machinery/button/door{ - id = "ordnancebridge"; - pixel_y = 24; - req_one_access = list("maint_tunnels","science") - }, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "kRS" = ( /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -30267,11 +30252,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"kVq" = ( -/obj/structure/sign/warning/secure_area/directional/east, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "kVs" = ( /obj/machinery/door/airlock/maintenance{ name = "Storage Room" @@ -30599,7 +30579,10 @@ /area/station/engineering/atmos/pumproom) "laI" = ( /obj/structure/railing{ - dir = 5 + dir = 1 + }, +/obj/structure/railing{ + dir = 4 }, /turf/open/floor/plating/airless, /area/space/nearstation) @@ -30981,6 +30964,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"liK" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "artsci" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "liL" = ( /obj/structure/table, /obj/effect/turf_decal/tile/red, @@ -30997,6 +30989,17 @@ /obj/machinery/bluespace_vendor/directional/west, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"lja" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/science/research) "ljf" = ( /obj/structure/table, /obj/item/wirecutters, @@ -31351,13 +31354,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"loz" = ( -/obj/structure/rack, -/obj/item/integrated_circuit/loaded/hello_world, -/obj/item/storage/toolbox/electrical, -/obj/item/integrated_circuit/loaded/speech_relay, -/turf/open/floor/iron/white, -/area/station/science/explab) "loA" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -32093,6 +32089,10 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal) +"lBv" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft/lesser) "lBz" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/mining{ @@ -32301,6 +32301,17 @@ /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/carpet, /area/station/service/chapel) +"lHP" = ( +/obj/machinery/door/window/right/directional/north{ + dir = 8; + name = "Research Test Chamber"; + req_access = list("science") + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/research) "lIa" = ( /obj/structure/table/wood, /obj/item/folder, @@ -32852,6 +32863,15 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"lRG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "lRS" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /obj/effect/spawner/structure/window/reinforced, @@ -33024,13 +33044,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/engineering/break_room) -"lUD" = ( -/obj/machinery/space_heater, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/maintenance/aft/lesser) "lUI" = ( /obj/effect/turf_decal/arrows/red{ dir = 4 @@ -33106,6 +33119,11 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"lVE" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "lVH" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, @@ -33647,6 +33665,12 @@ /obj/machinery/shower/directional/east, /turf/open/floor/iron/freezer, /area/station/commons/toilet/restrooms) +"mgH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/science/explab) "mgJ" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -34020,6 +34044,17 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"moe" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/research) "mos" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 @@ -34090,6 +34125,12 @@ }, /turf/open/floor/iron/dark, /area/station/security/lockers) +"mpx" = ( +/obj/structure/cable, +/obj/structure/sink/kitchen/directional/west, +/mob/living/basic/goat/pete, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "mpC" = ( /obj/structure/rack, /obj/item/clothing/under/rank/prisoner, @@ -34148,6 +34189,11 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"mqZ" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/white, +/area/station/science/research) "mrC" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -34184,6 +34230,16 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port) +"mrR" = ( +/turf/open/floor/iron/dark, +/area/station/science/explab) +"mrU" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/costume, +/obj/effect/spawner/random/clothing/costume, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft/lesser) "msd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -34436,6 +34492,10 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/station/science/research) +"mwt" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron/white, +/area/station/science/research) "mww" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -34632,6 +34692,7 @@ /obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ dir = 10 }, +/obj/effect/landmark/navigate_destination/dockescpod3, /turf/open/floor/plating, /area/station/maintenance/department/engine) "mzD" = ( @@ -34821,16 +34882,6 @@ /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"mCt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/explab) "mCL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -35177,6 +35228,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/landmark/navigate_destination/common/portbowsolar, /turf/open/floor/plating, /area/station/maintenance/solars/port/fore) "mIi" = ( @@ -35342,6 +35394,18 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/station/science/research) +"mLm" = ( +/obj/structure/table, +/obj/item/multitool/circuit{ + pixel_x = 7 + }, +/obj/item/multitool/circuit, +/obj/item/multitool/circuit{ + pixel_x = -8 + }, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/white, +/area/station/science/research) "mLu" = ( /obj/machinery/camera/directional/south{ c_tag = "Science Hallway - RD Office"; @@ -35477,6 +35541,14 @@ "mMX" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/office) +"mMZ" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/mob/living/basic/sloth/citrus, +/turf/open/floor/iron, +/area/station/cargo/storage) "mNG" = ( /obj/machinery/requests_console/directional/north{ department = "Chapel"; @@ -36096,6 +36168,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"mYu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/science/research) "mYw" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -36245,6 +36323,11 @@ }, /turf/open/floor/plating, /area/station/maintenance/central) +"naE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft/lesser) "naM" = ( /obj/item/radio/intercom/directional/west{ pixel_y = -10 @@ -36717,6 +36800,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"nki" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft/lesser) "nkj" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -37309,6 +37401,12 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"ntH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/station/science/explab) "ntM" = ( /obj/machinery/power/solar_control{ id = "foreport"; @@ -38060,6 +38158,19 @@ }, /turf/open/floor/iron/white, /area/station/science/cytology) +"nHQ" = ( +/obj/machinery/button/door{ + id = "ordnancebridge"; + pixel_y = 24; + req_one_access = list("maint_tunnels","science") + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/machinery/door/airlock/research/glass, +/turf/open/floor/plating, +/area/station/science/explab) "nIj" = ( /obj/structure/easel, /turf/open/floor/plating, @@ -38144,12 +38255,6 @@ /obj/effect/turf_decal/loading_area/white, /turf/open/floor/iron/white, /area/station/science/robotics/lab) -"nJL" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance/two, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "nJW" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -38863,11 +38968,6 @@ /obj/effect/spawner/random/entertainment/deck, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"nXT" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/easel, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "nYa" = ( /obj/machinery/door/airlock/research{ name = "Ordnance Lab" @@ -39348,13 +39448,6 @@ /obj/effect/spawner/random/engineering/flashlight, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"ofk" = ( -/obj/machinery/light_switch/directional/west, -/obj/machinery/power/smes/engineering, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/main) "ofQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -39389,6 +39482,10 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"ogr" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft/lesser) "ogs" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/tile/bar{ @@ -39896,12 +39993,6 @@ }, /turf/open/floor/engine/n2, /area/station/engineering/atmos) -"oqc" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/iron/checker, -/area/station/maintenance/aft/lesser) "oqi" = ( /obj/effect/landmark/start/paramedic, /obj/structure/disposalpipe/segment{ @@ -40000,6 +40091,18 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/iron, /area/station/commons/storage/primary) +"orO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft/lesser) "orU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -40423,6 +40526,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/landmark/navigate_destination/common/starboardbowsolar, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) "ozB" = ( @@ -40572,6 +40676,15 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"oCM" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Science Firing Range"; + network = list("ss13","rd") + }, +/turf/open/floor/iron/dark, +/area/station/science/explab) "oCN" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -40739,6 +40852,9 @@ dir = 8 }, /area/station/engineering/atmos) +"oFz" = ( +/turf/closed/wall, +/area/station/science/explab) "oFC" = ( /obj/machinery/status_display/ai/directional/west, /obj/machinery/light/directional/west, @@ -40927,6 +41043,15 @@ "oIg" = ( /turf/closed/wall/r_wall, /area/station/science/genetics) +"oIm" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/machinery/door/airlock/research{ + name = "Testing Labs" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/science/research, +/turf/open/floor/iron/white, +/area/station/science/research) "oIG" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, @@ -40964,10 +41089,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/lockers) -"oJu" = ( -/obj/effect/spawner/random/structure/closet_maintenance, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "oJD" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -40984,6 +41105,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/effect/landmark/navigate_destination/incinerator, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "oKc" = ( @@ -41024,13 +41146,13 @@ }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/cable, -/obj/effect/landmark/navigate_destination, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/any/command/general, /obj/effect/mapping_helpers/airlock/access/any/command/minisat, /obj/effect/mapping_helpers/airlock/access/any/engineering/tcoms, +/obj/effect/landmark/navigate_destination/tcomms, /turf/open/floor/iron/dark, /area/station/tcommsat/computer) "oKI" = ( @@ -41088,6 +41210,13 @@ }, /turf/open/floor/plating, /area/station/command/heads_quarters/hos) +"oMy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/landmark/navigate_destination/dockescpod1, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "oMA" = ( /turf/closed/wall/r_wall, /area/station/science/cytology) @@ -41263,6 +41392,11 @@ /obj/structure/grille, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"oQb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "oQc" = ( /obj/machinery/computer/security/telescreen{ desc = "Used for the Auxiliary Mining Base."; @@ -41295,6 +41429,16 @@ /obj/machinery/suit_storage_unit/industrial/loader, /turf/open/floor/iron, /area/station/cargo/warehouse) +"oQH" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "oQS" = ( /obj/machinery/cell_charger, /obj/item/stock_parts/cell/crap, @@ -41315,6 +41459,16 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) +"oRt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft/lesser) "oRM" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 @@ -41919,18 +42073,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/plating, /area/station/maintenance/fore) -"pdi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "pdl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42130,14 +42272,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/command/gateway) -"phv" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/engine, -/area/station/science/explab) "phz" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=7-Command-Starboard"; @@ -42244,6 +42378,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"piQ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light_switch/directional/north, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/byteforge, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) "piT" = ( /obj/structure/rack, /obj/item/reagent_containers/cup/bottle/epinephrine{ @@ -42268,6 +42410,7 @@ /turf/open/floor/plating, /area/station/service/chapel/funeral) "pjd" = ( +/obj/effect/landmark/navigate_destination/dockescpod2, /turf/open/floor/plating, /area/station/commons/fitness/recreation) "pjh" = ( @@ -42554,11 +42697,11 @@ name = "Detective's Office" }, /obj/structure/cable, -/obj/effect/landmark/navigate_destination, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/security/detective, +/obj/effect/landmark/navigate_destination/det, /turf/open/floor/iron, /area/station/security/detectives_office) "pqc" = ( @@ -42929,6 +43072,12 @@ /obj/effect/landmark/start/cargo_technician, /turf/open/floor/iron, /area/station/cargo/storage) +"pvX" = ( +/obj/machinery/power/terminal, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/engineering/main) "pvY" = ( /obj/machinery/camera/directional/north{ c_tag = "Holodeck - Fore"; @@ -43059,6 +43208,7 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, /obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination/chemfactory, /turf/open/floor/iron/white, /area/station/medical/chemistry) "pyP" = ( @@ -43087,6 +43237,13 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) +"pzg" = ( +/obj/machinery/computer/department_orders/science{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/station/science/research) "pzu" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -43414,6 +43571,10 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) +"pFC" = ( +/obj/machinery/bci_implanter, +/turf/open/floor/iron, +/area/station/science/research) "pFG" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/neutral{ @@ -43452,6 +43613,12 @@ /obj/structure/cable, /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) +"pGp" = ( +/obj/machinery/artifact_zapper{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/science/explab) "pGt" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/random/maintenance/three, @@ -43561,6 +43728,10 @@ dir = 1 }, /area/station/engineering/atmos) +"pHD" = ( +/obj/machinery/component_printer, +/turf/open/floor/iron/white, +/area/station/science/research) "pHS" = ( /obj/structure/light_construct/directional/east, /turf/open/floor/wood, @@ -43572,8 +43743,8 @@ }, /obj/effect/turf_decal/delivery, /obj/structure/cable, -/obj/effect/landmark/navigate_destination, /obj/effect/mapping_helpers/airlock/access/any/command/eva, +/obj/effect/landmark/navigate_destination/eva, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) "pIv" = ( @@ -43655,14 +43826,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"pJt" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/radio/intercom/directional/north, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/science/explab) "pJu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44149,6 +44312,13 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"pSP" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/costume, +/obj/effect/spawner/random/clothing/costume, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft/lesser) "pSS" = ( /obj/structure/lattice/catwalk, /obj/structure/transit_tube/junction/flipped{ @@ -44349,6 +44519,17 @@ }, /turf/open/floor/iron/white/corner, /area/station/medical/medbay/lobby) +"pWM" = ( +/obj/structure/sign/warning/secure_area/directional/west, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/closet/bombcloset, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft/lesser) "pWN" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -44510,6 +44691,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/fore) +"pZI" = ( +/obj/effect/landmark/navigate_destination/library, +/turf/open/floor/carpet, +/area/station/service/library) "pZQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44654,14 +44839,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"qdw" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/external, -/obj/machinery/door/airlock/external, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "qdI" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 5 @@ -45235,6 +45412,10 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"qnd" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/science/research) "qnj" = ( /obj/structure/window/spawner/directional/west, /turf/open/floor/grass, @@ -45596,6 +45777,18 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"qtf" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/research) "qtm" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -45682,6 +45875,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/holding_cell) +"qvj" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft/lesser) "qvJ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -45818,6 +46015,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/supply/vault, +/obj/effect/landmark/navigate_destination/vault, /turf/open/floor/iron/dark, /area/station/construction/storage_wing) "qyr" = ( @@ -45944,6 +46142,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"qAe" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space) "qAA" = ( /obj/machinery/newscaster/directional/east, /obj/machinery/computer/security/mining{ @@ -46025,12 +46227,13 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) -"qBK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/explab) +"qBP" = ( +/obj/structure/table, +/obj/item/controller, +/obj/item/compact_remote, +/obj/item/compact_remote, +/turf/open/floor/iron/white, +/area/station/science/research) "qCa" = ( /obj/structure/rack, /obj/item/storage/box/shipping, @@ -47091,6 +47294,10 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"qVf" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/science/explab) "qVi" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 @@ -47236,12 +47443,6 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/plating, /area/station/maintenance/port) -"qXw" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/simple_animal/parrot/poly, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) "qXB" = ( /turf/closed/wall, /area/station/maintenance/starboard/fore) @@ -47270,12 +47471,6 @@ }, /turf/open/floor/plating, /area/station/service/lawoffice) -"qXW" = ( -/obj/effect/spawner/random/structure/chair_maintenance{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "qYd" = ( /obj/structure/cable, /turf/open/floor/iron/white, @@ -47314,6 +47509,9 @@ req_access = list("atmospherics") }, /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/obj/structure/railing{ + dir = 1 + }, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos) "qZa" = ( @@ -47323,14 +47521,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"qZg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/holopad, -/obj/effect/landmark/start/scientist, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/explab) "qZn" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -47520,10 +47710,6 @@ }, /turf/open/floor/iron, /area/station/engineering/break_room) -"rdt" = ( -/obj/structure/sign/warning/vacuum/external/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "rdv" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -47875,10 +48061,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) -"rkT" = ( -/obj/item/target/syndicate, -/turf/open/floor/engine, -/area/station/science/explab) "rla" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -48015,6 +48197,14 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"rnk" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/obj/effect/spawner/random/trash/bin, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft/lesser) "rnn" = ( /obj/structure/chair/comfy{ dir = 8 @@ -48271,6 +48461,12 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"rtu" = ( +/obj/structure/table, +/obj/effect/spawner/random/maintenance, +/obj/item/clothing/gloves/color/fyellow, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "rtG" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -48559,15 +48755,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) -"rxG" = ( -/obj/machinery/door/airlock/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/any/science/maintenance, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "rxH" = ( /obj/structure/cable, /turf/open/floor/plating/airless, @@ -48604,6 +48791,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"ryc" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/power/terminal, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/engineering/main) "ryf" = ( /obj/structure/bookcase/random/reference, /obj/effect/turf_decal/siding/wood{ @@ -48646,6 +48842,12 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/medical/abandoned) +"ryA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/science/explab) "ryJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -48693,10 +48895,6 @@ /obj/item/multitool, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"rzx" = ( -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "rzz" = ( /obj/structure/sign/warning/cold_temp, /obj/effect/spawner/structure/window/reinforced, @@ -48832,6 +49030,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/dockarrival, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/entry) "rCn" = ( @@ -49322,18 +49521,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/open/floor/plating, /area/station/maintenance/port) -"rKc" = ( -/obj/structure/table, -/obj/item/multitool/circuit{ - pixel_x = 7 - }, -/obj/item/multitool/circuit, -/obj/item/multitool/circuit{ - pixel_x = -8 - }, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/white, -/area/station/science/explab) "rKf" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -49364,10 +49551,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"rKB" = ( -/obj/machinery/airalarm/directional/east, -/turf/open/floor/engine, -/area/station/science/explab) "rKG" = ( /obj/structure/cable, /obj/machinery/door/airlock/virology/glass{ @@ -49678,6 +49861,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, +/obj/effect/landmark/navigate_destination/aiupload, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload_foyer) "rPF" = ( @@ -49836,6 +50020,10 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/transit_tube) +"rRY" = ( +/obj/structure/cable, +/turf/closed/wall/r_wall, +/area/station/engineering/main) "rRZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -50825,13 +51013,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"sip" = ( -/obj/structure/table, -/obj/item/controller, -/obj/item/compact_remote, -/obj/item/compact_remote, -/turf/open/floor/iron/white, -/area/station/science/explab) "siz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, @@ -51984,8 +52165,8 @@ dir = 4 }, /obj/structure/cable, -/obj/effect/landmark/navigate_destination, /obj/effect/mapping_helpers/airlock/access/any/command/hop, +/obj/effect/landmark/navigate_destination/hop, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) "sDS" = ( @@ -52187,11 +52368,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"sIW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/engine, -/area/station/science/explab) "sIX" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible/layer2{ dir = 9 @@ -52393,6 +52569,13 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"sMV" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/science/research) "sNi" = ( /turf/open/floor/wood, /area/station/service/theater) @@ -52414,6 +52597,13 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"sNr" = ( +/obj/structure/rack, +/obj/item/integrated_circuit/loaded/hello_world, +/obj/item/storage/toolbox/electrical, +/obj/item/integrated_circuit/loaded/speech_relay, +/turf/open/floor/iron/white, +/area/station/science/research) "sNw" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -52634,7 +52824,6 @@ /area/station/science/cytology) "sRb" = ( /obj/structure/table, -/obj/machinery/infuser, /obj/item/book/manual/hydroponics_pod_people, /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -53069,17 +53258,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"sXe" = ( -/obj/effect/landmark/start/station_engineer, -/obj/machinery/light/directional/west, -/obj/structure/sign/warning/electric_shock{ - pixel_x = -31 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/engineering/main) "sXq" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -53313,6 +53491,7 @@ /obj/effect/turf_decal/bot, /obj/structure/sink/directional/west, /obj/structure/sign/poster/random/directional/south, +/obj/structure/reagent_dispensers/watertank/high, /turf/open/floor/iron, /area/station/service/hydroponics) "tck" = ( @@ -53430,15 +53609,6 @@ /obj/machinery/bluespace_vendor/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central) -"tdl" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/obj/machinery/module_duplicator, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/white, -/area/station/science/explab) "tds" = ( /obj/effect/turf_decal/box/corners{ dir = 8 @@ -54105,6 +54275,19 @@ }, /turf/open/floor/wood, /area/station/service/library) +"toD" = ( +/obj/machinery/light/directional/west, +/obj/machinery/modular_computer/console/preset/cargochat/science{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/science/research) "toK" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -54372,12 +54555,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"ttW" = ( -/obj/effect/spawner/random/structure/chair_flipped, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "ttX" = ( /obj/structure/rack, /obj/item/electronics/airlock, @@ -54451,12 +54628,6 @@ /obj/effect/spawner/random/food_or_drink/seed, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"tvg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "tvE" = ( /turf/closed/wall/r_wall, /area/station/command/gateway) @@ -54592,13 +54763,6 @@ }, /turf/open/floor/iron, /area/station/commons/locker) -"txv" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "txz" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -54817,14 +54981,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/garden) -"tCG" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron, -/area/station/security/brig) "tCJ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -55093,13 +55249,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"tIN" = ( -/obj/machinery/computer/department_orders/science{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/station/science/explab) "tIR" = ( /obj/structure/table/wood, /obj/item/storage/photo_album{ @@ -55241,6 +55390,15 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"tKZ" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/science/research) "tLb" = ( /obj/structure/sign/warning/electric_shock/directional/south, /turf/open/space/basic, @@ -55866,13 +56024,6 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/plating, /area/station/maintenance/disposal) -"tWL" = ( -/obj/structure/rack, -/obj/effect/spawner/random/clothing/costume, -/obj/effect/spawner/random/clothing/costume, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "tWV" = ( /obj/machinery/holopad, /obj/structure/cable, @@ -56380,6 +56531,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"ufy" = ( +/obj/structure/table, +/obj/item/analysis_bin, +/turf/open/floor/iron/dark, +/area/station/science/explab) "ufX" = ( /obj/machinery/photocopier{ pixel_y = 3 @@ -56409,6 +56565,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, +/obj/effect/landmark/navigate_destination/dockaux, /turf/open/floor/plating, /area/station/hallway/secondary/entry) "ugE" = ( @@ -56919,6 +57076,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/yellow/fourcorners, /obj/effect/mapping_helpers/airlock/access/all/engineering/aux_base, +/obj/effect/landmark/navigate_destination/common/auxbaseconst, /turf/open/floor/iron, /area/station/construction/mining/aux_base) "uqp" = ( @@ -56938,6 +57096,13 @@ /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/iron/white, /area/station/science/research) +"uqG" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/station/science/research) "uqL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -57728,13 +57893,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/hallway/primary/fore) -"uDS" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Science Firing Range"; - network = list("ss13","rd") - }, -/turf/open/floor/engine, -/area/station/science/explab) "uEn" = ( /obj/machinery/light/directional/west, /obj/effect/decal/cleanable/dirt, @@ -58165,19 +58323,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white, /area/station/medical/virology) -"uKA" = ( -/obj/machinery/light/directional/west, -/obj/machinery/modular_computer/console/preset/cargochat/science{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/explab) "uKP" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -58384,7 +58529,6 @@ /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 }, -/obj/structure/railing/corner, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 }, @@ -58484,10 +58628,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/engine_equipment, /turf/open/floor/iron, /area/station/engineering/main) -"uQH" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/iron/checker, -/area/station/maintenance/aft/lesser) "uQK" = ( /obj/structure/closet{ name = "evidence closet 4" @@ -58618,6 +58758,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/construction/storage_wing) +"uTN" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/trimline/purple/filled/warning, +/turf/open/floor/iron/dark, +/area/station/science/research) "uTP" = ( /obj/machinery/light_switch/directional/south, /turf/open/floor/iron, @@ -58852,15 +58998,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/grass, /area/station/medical/virology) -"uYg" = ( -/obj/structure/cable, -/obj/structure/sink/kitchen/directional/west, -/obj/machinery/power/apc/auto_name/directional/north, -/mob/living/simple_animal/hostile/retaliate/goat{ - name = "Pete" - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "uYi" = ( /turf/open/floor/plating/airless, /area/station/solars/starboard/aft) @@ -58962,15 +59099,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"uZP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "vae" = ( /obj/effect/turf_decal/tile/red/fourcorners, /obj/machinery/camera/directional/east{ @@ -59021,15 +59149,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /turf/open/floor/plating, /area/station/science/ordnance) -"vbO" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Testing Labs" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/research, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white, -/area/station/science/explab) "vbV" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 8 @@ -59089,10 +59208,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) -"vdx" = ( -/obj/machinery/rnd/experimentor, -/turf/open/floor/engine, -/area/station/science/explab) "vdJ" = ( /obj/structure/closet/crate/freezer, /obj/item/reagent_containers/blood/random, @@ -59172,14 +59287,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white/smooth_large, /area/station/medical/treatment_center) -"vfh" = ( -/obj/machinery/door/window/right/directional/north{ - dir = 8; - name = "Research Test Chamber"; - req_access = list("science") - }, -/turf/open/floor/engine, -/area/station/science/explab) "vfm" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -59750,6 +59857,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/command/teleporter) +"vns" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/research) "vnE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/brown{ @@ -59818,13 +59934,13 @@ name = "Bridge Access" }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/navigate_destination, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "bridge-left" }, /obj/effect/mapping_helpers/airlock/access/any/command/general, +/obj/effect/landmark/navigate_destination/bridge, /turf/open/floor/iron/dark, /area/station/command/bridge) "vph" = ( @@ -59961,11 +60077,6 @@ /obj/structure/sink/directional/west, /turf/open/floor/iron/white, /area/station/science/research) -"vrv" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/light/small/directional/north, -/turf/open/floor/engine, -/area/station/science/explab) "vrF" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/bar, @@ -60196,6 +60307,7 @@ id_tag = "FitnessShower"; name = "Cryogenic Storage" }, +/obj/effect/landmark/navigate_destination/common/cryogenics, /turf/open/floor/iron/freezer, /area/station/commons/fitness/recreation) "vwP" = ( @@ -60601,6 +60713,12 @@ "vEp" = ( /turf/open/floor/iron, /area/station/security/warden) +"vEs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/explab) "vEt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, @@ -60612,6 +60730,13 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation) +"vEF" = ( +/obj/effect/landmark/start/station_engineer, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/main) "vEH" = ( /obj/machinery/door/window/right/directional/east{ name = "Danger: Conveyor Access"; @@ -60937,11 +61062,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/drone_bay) -"vKm" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hazardvest, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) "vKt" = ( /obj/structure/table/wood/fancy/royalblue, /obj/structure/sign/painting/library_secure{ @@ -61152,10 +61272,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/railing, /obj/structure/railing{ dir = 8; layer = 4.1 @@ -61463,6 +61579,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) +"vVq" = ( +/obj/machinery/light/directional/south, +/obj/machinery/artifact_xray, +/turf/open/floor/iron/dark, +/area/station/science/explab) "vVr" = ( /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, @@ -61713,10 +61834,13 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/command/gateway) -"vYl" = ( -/obj/structure/sign/poster/random/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) +"vYi" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/explab) "vYD" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -61894,6 +62018,10 @@ /obj/effect/spawner/random/trash/bin, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"wbK" = ( +/obj/effect/artifact_spawner, +/turf/open/floor/iron/dark, +/area/station/science/explab) "wcr" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -62354,6 +62482,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) +"wjV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/chapel, +/turf/open/floor/iron/dark, +/area/station/service/chapel) "wjW" = ( /obj/structure/table/wood, /obj/item/cigbutt/cigarbutt{ @@ -62569,6 +62703,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) +"woR" = ( +/obj/effect/landmark/start/scientist, +/turf/open/floor/iron/dark, +/area/station/science/explab) "woV" = ( /obj/machinery/door/window{ dir = 1 @@ -63073,10 +63211,6 @@ }, /turf/open/floor/wood, /area/station/command/corporate_showroom) -"wyu" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "wyz" = ( /obj/structure/chair{ dir = 4; @@ -64528,6 +64662,13 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"wYy" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination/research, +/turf/open/floor/iron/white, +/area/station/science/lobby) "wYB" = ( /turf/closed/wall, /area/station/hallway/secondary/service) @@ -64661,6 +64802,11 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"xbP" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/iron/dark, +/area/station/maintenance/aft/lesser) "xbT" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64705,6 +64851,13 @@ /obj/effect/mapping_helpers/mail_sorting/service/bar, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"xcR" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/clothing/suit/hazardvest, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "xdm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -65124,6 +65277,10 @@ }, /turf/open/floor/wood/parquet, /area/station/medical/psychology) +"xjY" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/explab) "xko" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -65494,7 +65651,6 @@ name = "Private Study"; req_access = list("library") }, -/obj/effect/landmark/navigate_destination, /turf/open/floor/engine/cult, /area/station/service/library) "xrf" = ( @@ -65694,15 +65850,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"xuD" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/delivery, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/station/science/explab) "xuH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -66066,6 +66213,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, +/obj/effect/landmark/navigate_destination/common/starboardquartersolar, /turf/open/floor/plating, /area/station/maintenance/solars/starboard/aft) "xBx" = ( @@ -66591,13 +66739,6 @@ }, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"xLI" = ( -/obj/structure/rack, -/obj/effect/spawner/random/clothing/costume, -/obj/effect/spawner/random/clothing/costume, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "xLR" = ( /obj/machinery/door/firedoor, /obj/structure/table/reinforced, @@ -66731,10 +66872,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"xOx" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/engine, -/area/station/science/explab) "xOF" = ( /obj/docking_port/stationary/laborcamp_home{ dir = 8 @@ -66933,11 +67070,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"xRf" = ( -/obj/effect/spawner/random/structure/table, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "xRh" = ( /obj/machinery/door/airlock/external{ name = "Atmospherics External Access" @@ -67320,6 +67452,10 @@ /obj/structure/mirror/directional/west, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"xZv" = ( +/obj/effect/spawner/random/loafer, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) "xZx" = ( /obj/machinery/space_heater, /turf/open/floor/plating, @@ -67404,18 +67540,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) -"yaH" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/explab) "yaL" = ( /obj/item/target, /obj/structure/window/reinforced/spawner/directional/east, @@ -67613,6 +67737,12 @@ }, /turf/open/floor/engine, /area/station/engineering/atmospherics_engine) +"yen" = ( +/obj/effect/decal/cleanable/oil/streak, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) "yeq" = ( /obj/machinery/conveyor{ dir = 1; @@ -67801,15 +67931,6 @@ }, /turf/open/floor/iron/white, /area/station/security/prison) -"yia" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/explab) "yib" = ( /obj/structure/lattice/catwalk, /obj/item/toy/plush/space_lizard_plushie{ @@ -67861,6 +67982,9 @@ "yjd" = ( /turf/closed/wall, /area/station/command/gateway) +"yjv" = ( +/turf/open/space/basic, +/area/station/cargo/mining/asteroid_magnet) "yjw" = ( /obj/machinery/airalarm/directional/east, /obj/structure/table/wood, @@ -77626,7 +77750,7 @@ edl cSk auJ jMZ -sCZ +oMy lGL qHs lMJ @@ -84278,7 +84402,7 @@ aaa aaa aaa aaa -mWd +aaa aaa aaa lMJ @@ -85058,7 +85182,7 @@ dHa ugJ edP jXu -bje +yen pII ttG oBV @@ -85315,7 +85439,7 @@ cTQ xte mzs jXu -kHU +piQ boz pPV pPV @@ -86875,7 +86999,7 @@ hLL hod dfk dfk -jhA +mMZ tmm aok bgx @@ -88697,7 +88821,7 @@ rSk sVY bla cWr -ecO +pZI rFB tmB wcL @@ -90451,7 +90575,7 @@ aaa bxr jXu rOz -sHu +xZv siY jXu aaa @@ -91585,7 +91709,7 @@ hsN jJi phR phR -phR +wjV phR pwq fkT @@ -95186,7 +95310,7 @@ opk krc bVB ltx -iBp +sou hQu cSv qVo @@ -96624,7 +96748,7 @@ ahj jwg wIr cJj -erx +klp lsP vYF eaP @@ -97395,7 +97519,7 @@ lPl prY mLL jxV -tCG +pXC pHb qwh iQg @@ -98222,7 +98346,7 @@ ylQ bGC wHu igr -ibw +wYy ibw nIP gFQ @@ -99296,8 +99420,8 @@ lMJ uGg nFa uGg -lMJ -aaa +dKC +dKC aaa aaa aaa @@ -99543,7 +99667,7 @@ huj fhi xEU iqx -deY +hoT gil deY oet @@ -99553,8 +99677,8 @@ lMJ uGg nFa uGg -lMJ -aaa +nFa +fhh aaa aaa aaa @@ -99810,17 +99934,17 @@ lMJ uGg nFa uGg -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +nFa +dKC +qAe +qAe +qAe +qAe +qAe +qAe +qAe +qAe +qAe aaa aaa aaa @@ -100066,18 +100190,18 @@ kgC lMJ uGg wpn -uGg -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +liK +nFa +dKC +qAe +yjv +yjv +yjv +yjv +yjv +yjv +yjv +qAe aaa aaa aaa @@ -100317,24 +100441,24 @@ svS svS xuV svS -svS -svS -svS -svS -svS -kRF -dKC -anS -lMJ -oPS -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +tVv +tVv +tVv +tVv +tVv +nHQ +oFz +oFz +oFz +qAe +yjv +yjv +yjv +yjv +yjv +yjv +yjv +qAe aaa aaa aaa @@ -100566,32 +100690,32 @@ cuO ove iHv gIK -buv -xLu -ktz +pWM +nki +rnk svS -wyu -nJL -ttW -xRf -qXW -dKC -rzx -nFa -pjX -tvg -dKC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +qvj +qvj +hGq +xbP +oFz +oCM +wbK +wbK +xjY +ryA +mrR +ufy +qVf +qAe +yjv +yjv +yjv +yjv +yjv +yjv +yjv +qAe aaa aaa aaa @@ -100823,32 +100947,32 @@ enO psV psV psV -psV -uZP -dpN -rxG -dpN -dpN -egk -oEx -bIa -vYl -nFa -nFa -rDB -nFa -dKC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +oRt +hzl +naE +oQH +naE +naE +naE +kyo +gfh +ekD +mrR +woR +mrR +mrR +mrR +aqU +qVf +qAe +yjv +yjv +yjv +yjv +yjv +yjv +yjv +qAe aaa aaa aaa @@ -101080,32 +101204,32 @@ oGn nFa mHy mHy -kVq -pdi -txv +eSh +orO +ggx svS -xLI -tWL -gma -oJu -dKC -lUD -isI -isI -dKC -qdw -dKC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +mrU +pSP +ogr +lBv +oFz +mgH +jRU +ntH +mrR +mrR +mrR +fxh +qVf +qAe +yjv +yjv +yjv +yjv +yjv +yjv +yjv +qAe aaa aaa aaa @@ -101326,12 +101450,12 @@ vQb jJR gwf fnh -tVv -tVv -klT -tVv -tVv -tVv +gFQ +gFQ +oIm +gFQ +gFQ +gFQ svS oGn nFa @@ -101345,24 +101469,24 @@ svS svS dKC dKC -dKC -ggH -oqc -uQH -dKC -rdt -dKC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +oFz +dGa +vEs +vYi +pGp +vVq +oFz +oFz +oFz +qAe +yjv +yjv +yjv +yjv +yjv +yjv +yjv +qAe aaa aaa aaa @@ -101583,12 +101707,12 @@ iio kjG gwf kiJ -tVv -pJt -bQs -uKA -tIN -fEU +gFQ +aim +cOQ +toD +pzg +pFC oWk lMW oWk @@ -101602,24 +101726,24 @@ vWa krN kYD lMJ -dKC -dKC -uGg -dKC -dKC -cqL -dKC -aaa -aaa -aaa -aaa -aaa -aaa -lKu -aaa -aaa +oFz +oFz +qVf +oFz +oFz +oFz +oFz aaa aaa +qAe +yjv +yjv +yjv +yjv +yjv +yjv +yjv +qAe aaa aaa aaa @@ -101840,12 +101964,12 @@ vQb jbg gwf pOv -fBt -loz -cLu -cnu -yaH -cpp +qnd +sNr +aZS +hlE +qtf +lja oWk ttM xZx @@ -101868,15 +101992,15 @@ aox lMJ aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +qAe +qAe +qAe +qAe +qAe +qAe +qAe +qAe +qAe aaa aaa aaa @@ -102097,12 +102221,12 @@ tAg moH gwf pOv -vbO -cTj -dON -qZg -mCt -eur +fRB +aJd +mYu +fid +jbI +fJJ aqh akp uGX @@ -102133,7 +102257,7 @@ aaa aaa aaa aaa -aaa +lKu aaa aaa aaa @@ -102354,12 +102478,12 @@ tAg pbt gwf mLu -fBt -xuD -fFa -iDg -yia -tdl +qnd +tKZ +acH +gZL +vns +fkV oWk oWb xej @@ -102611,12 +102735,12 @@ tAg sWB gwf cQd -tVv -rKc -sip -jwP -cbg -bix +gFQ +mLm +qBP +moe +dVa +pHD oWk bLd fKi @@ -102868,12 +102992,12 @@ gFQ wGE gwf itC -tVv -vrv -xOx -phv -vfh -fXm +gFQ +uTN +mwt +fMx +lHP +mqZ oWk hgA uqO @@ -103125,12 +103249,12 @@ elJ qNA gwf ucd -tVv -uDS -vdx -sIW -bRb -cKm +gFQ +bcG +cOQ +cOQ +eEl +cOQ oWk nYU fPD @@ -103382,12 +103506,12 @@ saf hXd gwf itC -tVv -jSk -itn -sIW -jSk -rkT +gFQ +cOQ +cOQ +cOQ +cOQ +cOQ oWk luE tZo @@ -103639,12 +103763,12 @@ elJ wGH emh fQo -tVv -gNC -jSk -qBK -rKB -bkM +gFQ +ayz +cOQ +aBH +sMV +uqG oWk luE fPD @@ -105150,7 +105274,7 @@ inI iHh aNN huG -uYg +mpx oXd apt huG @@ -106146,12 +106270,12 @@ eBn qXB fwG ldO -vKm -tbd -cPQ -nXT -wyG -qXB +oQb +psZ +mSB +psZ +edC +psZ psZ qXB ttA @@ -106397,19 +106521,19 @@ lCN kbo psZ psZ -bSY +xcR kbo kbo eqt psZ psZ ckX -psZ -mSB -edC -psZ -psZ -psZ +uXd +rRY +uXd +uXd +rRY +uXd qXB gAU kQD @@ -106661,12 +106785,12 @@ tCS tCS tCS tCS -tCS -cML -tCS -tCS -cML -tCS +uXd +gmR +hRA +ryc +iSq +uXd tCS sqE sqE @@ -106919,10 +107043,10 @@ tfg ssI ssI uXd -kCq -sXe -gLo -ofk +jjU +vEF +pvX +fYa uXd fDL hSt @@ -107150,7 +107274,7 @@ pvY afD afD afD -afD +jJh afD afD afD @@ -107176,10 +107300,10 @@ tfg ssI mBw uXd -dHg +iIC gLK qul -acs +fYa uXd tKS nLz @@ -107417,7 +107541,7 @@ qXB dOx jCw jCw -jCw +lVE qXB lOK jcy @@ -107433,7 +107557,7 @@ bYp gXu oaC uXd -gMG +hps dWG uGm acs @@ -107931,10 +108055,10 @@ qXB oPZ wha jRz -ceD +rtu qXB cgL -wrn +imV tCS mHe wYx @@ -107957,7 +108081,7 @@ nLz jEh hYE rEd -qXw +ita tUw iqU jLg @@ -108190,7 +108314,7 @@ qXB qXB qXB qXB -igz +lRG tCS tCS cnK diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 0217356bd591..c1575d8acef6 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -1,8 +1,4 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aah" = ( -/obj/machinery/rnd/experimentor, -/turf/open/floor/engine, -/area/station/science/explab) "aak" = ( /obj/structure/displaycase/labcage, /turf/open/floor/engine, @@ -531,14 +527,6 @@ /obj/structure/cable, /turf/open/floor/wood/tile, /area/station/service/library) -"agt" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port/fore) "agv" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -808,12 +796,6 @@ /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/dark, /area/station/hallway/floor3/aft) -"akh" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/wood/tile, -/area/station/service/library) "aki" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -1125,12 +1107,6 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/medical) -"anW" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/wood/tile, -/area/station/service/library) "aof" = ( /obj/machinery/suit_storage_unit/radsuit, /obj/machinery/light/small/directional/west, @@ -1351,15 +1327,6 @@ dir = 1 }, /area/station/cargo/sorting) -"aqR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "aqU" = ( /obj/effect/decal/cleanable/oil, /obj/effect/decal/cleanable/dirt/dust, @@ -1369,9 +1336,6 @@ /obj/effect/turf_decal/trimline/green/filled/arrow_cw{ dir = 1 }, -/obj/structure/railing/corner{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -1529,14 +1493,6 @@ "asS" = ( /turf/open/floor/bamboo/tatami/black, /area/station/commons/storage/art) -"asU" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "asV" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/firedoor/heavy, @@ -1547,19 +1503,7 @@ }, /turf/open/floor/iron/dark, /area/station/service/kitchen) -"ata" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/starboard/aft) "ate" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/effect/turf_decal/trimline/purple/corner{ dir = 4 }, @@ -2650,7 +2594,7 @@ /area/station/maintenance/floor1/port/fore) "aGK" = ( /obj/structure/railing{ - dir = 9 + dir = 1 }, /obj/structure/chair/comfy/brown, /obj/machinery/door/firedoor/border_only{ @@ -3818,9 +3762,6 @@ /area/station/hallway/floor2/aft) "aWd" = ( /obj/effect/landmark/event_spawn, -/obj/structure/railing/corner{ - dir = 8 - }, /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 8 }, @@ -3918,7 +3859,6 @@ /obj/effect/turf_decal/trimline/green/filled/arrow_cw{ dir = 9 }, -/obj/structure/railing/corner, /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron/dark/textured, /area/station/medical/virology/isolation) @@ -4182,15 +4122,6 @@ }, /turf/open/floor/bamboo/tatami/black, /area/station/commons/storage/art) -"aZI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/starboard/aft) "aZN" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -4210,21 +4141,6 @@ "aZW" = ( /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port/aft) -"baa" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/wood/tile, -/area/station/service/library) "bad" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -4450,7 +4366,6 @@ /turf/open/floor/iron/dark/side, /area/station/cargo/lobby) "bdx" = ( -/obj/structure/railing/corner, /obj/structure/chair/stool/bar/directional/east, /obj/structure/disposalpipe/segment{ dir = 9 @@ -4716,16 +4631,6 @@ /obj/structure/reflector/double, /turf/open/floor/plating/airless, /area/space/nearstation) -"bhb" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port/aft) "bhj" = ( /obj/effect/turf_decal/siding/white{ dir = 8 @@ -5157,12 +5062,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/space/nearstation) -"blq" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/hedge, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/grass, -/area/station/service/chapel) "blt" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/light/small/directional/west, @@ -5217,7 +5116,6 @@ /turf/open/floor/iron/white, /area/station/science/xenobiology) "blO" = ( -/obj/structure/railing/corner, /obj/effect/turf_decal/trimline/green/corner, /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -6253,6 +6151,12 @@ /obj/structure/girder, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) +"bxc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/floor4/port/fore) "bxd" = ( /obj/structure/table, /obj/machinery/airalarm/directional/north, @@ -6585,9 +6489,6 @@ /obj/effect/turf_decal/trimline/green/filled/arrow_cw{ dir = 5 }, -/obj/structure/railing/corner{ - dir = 8 - }, /turf/open/floor/iron/dark/textured, /area/station/medical/virology/isolation) "bAu" = ( @@ -6772,9 +6673,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/railing/corner{ - dir = 4 - }, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) "bDr" = ( @@ -6790,11 +6688,9 @@ /turf/closed/wall/r_wall, /area/station/security/checkpoint) "bDO" = ( -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 4 - }, /obj/machinery/status_display/evac/directional/north, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "bDU" = ( @@ -6963,6 +6859,16 @@ }, /turf/open/openspace, /area/station/maintenance/floor4/port/aft) +"bGM" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/pod, +/area/station/maintenance/floor4/port/aft) "bGP" = ( /obj/machinery/vending/cigarette, /obj/machinery/camera/autoname/directional/west, @@ -7014,21 +6920,6 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/maintenance/floor2/port) -"bIk" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/wood/tile, -/area/station/service/library) "bIl" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -7135,16 +7026,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/station/medical/abandoned) -"bJN" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/pod/light, -/area/station/maintenance/floor4/starboard/fore) "bJQ" = ( /obj/structure/railing/corner{ dir = 1 @@ -7829,12 +7710,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/security/execution/transfer) -"bSj" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/wood/tile, -/area/station/service/library) "bSq" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ dir = 6 @@ -8110,16 +7985,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"bVQ" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/cable, -/mob/living/simple_animal/parrot/poly, -/obj/machinery/computer/security/telescreen/engine{ - name = "Engineering and atmospherics monitor" - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/command/heads_quarters/ce) "bVT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8391,16 +8256,11 @@ }, /area/station/hallway/floor2/aft) "caN" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, /obj/machinery/firealarm/directional/south, /obj/machinery/light/directional/south, /obj/effect/decal/cleanable/oil/streak, -/obj/effect/landmark/bitrunning/station_reward_spawn, +/obj/machinery/byteforge, +/obj/effect/turf_decal/box, /turf/open/floor/iron/dark/smooth_large, /area/station/bitrunning/den) "caQ" = ( @@ -9277,6 +9137,14 @@ /obj/structure/cable, /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard) +"cls" = ( +/mob/living/basic/sloth/paperwork, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "clv" = ( /obj/machinery/door/airlock/hatch{ name = "Stairwell Access" @@ -11318,12 +11186,12 @@ /turf/open/floor/iron/dark/side, /area/station/hallway/floor2/aft) "cPQ" = ( -/obj/structure/railing{ - dir = 5 - }, /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 5 }, +/obj/structure/railing{ + dir = 1 + }, /turf/open/water/jungle{ desc = "Filthy."; name = "untreated water"; @@ -11592,7 +11460,7 @@ "cTs" = ( /obj/structure/cable/multilayer/multiz, /obj/structure/cable, -/turf/open/openspace, +/turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/aft) "cTw" = ( /obj/structure/table/reinforced, @@ -11613,9 +11481,6 @@ /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "cTJ" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/effect/turf_decal/trimline/green/warning{ dir = 10 }, @@ -11921,9 +11786,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/structure/railing/corner{ - dir = 1 - }, /obj/structure/railing/corner{ dir = 8 }, @@ -12490,15 +12352,6 @@ /obj/machinery/status_display/ai/directional/west, /turf/open/openspace, /area/station/ai_monitored/turret_protected/aisat/hallway) -"dfA" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/starboard) "dfD" = ( /obj/structure/disposalpipe/trunk/multiz/down, /turf/open/floor/plating/foam, @@ -12510,9 +12363,6 @@ /turf/open/floor/iron/checker, /area/station/commons/locker) "dfY" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -12758,15 +12608,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/command/bridge) -"djX" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/starboard/fore) "dke" = ( /obj/machinery/door/window/left/directional/south, /obj/machinery/door/window/left/directional/north, @@ -12798,12 +12639,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/supply/visible, /turf/open/floor/iron, /area/station/engineering/atmos) -"dkn" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/space/openspace, -/area/space) "dks" = ( /obj/structure/girder, /obj/item/stack/sheet/iron, @@ -13324,9 +13159,6 @@ /turf/open/floor/iron, /area/station/cargo/miningdock) "dso" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -13852,9 +13684,6 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) "dAk" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, @@ -14039,9 +13868,6 @@ /area/station/command/bridge) "dDF" = ( /obj/effect/turf_decal/trimline/green/filled/line, -/obj/structure/railing/corner{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 5 }, @@ -14310,12 +14136,13 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) "dHd" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/airalarm/directional/north, /obj/machinery/status_display/ai/directional/east, /obj/structure/cable, /obj/machinery/light/small/directional/east, -/turf/open/floor/iron/textured_large, +/obj/machinery/power/terminal{ + dir = 1 + }, +/turf/open/floor/catwalk_floor/iron, /area/station/engineering/engine_smes) "dHf" = ( /turf/open/floor/catwalk_floor/iron, @@ -14352,9 +14179,6 @@ /obj/effect/turf_decal/trimline/green/filled/arrow_cw{ dir = 10 }, -/obj/structure/railing/corner{ - dir = 4 - }, /obj/machinery/light/cold/no_nightlight/directional/west, /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark/textured, @@ -14430,13 +14254,6 @@ }, /turf/open/floor/iron/grimy, /area/station/science/xenobiology/hallway) -"dIO" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/railing/corner, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port/fore) "dIQ" = ( /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -15344,7 +15161,6 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) "dUU" = ( -/obj/structure/railing/corner, /obj/effect/turf_decal/trimline/green/warning{ dir = 9 }, @@ -16915,9 +16731,6 @@ "eoo" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner{ - dir = 4 - }, /obj/effect/turf_decal/stripes/corner{ dir = 4 }, @@ -17152,9 +16965,6 @@ /area/station/tcommsat/server) "esu" = ( /obj/effect/turf_decal/trimline/green/filled/arrow_cw, -/obj/structure/railing/corner{ - dir = 1 - }, /turf/open/floor/iron/dark/textured, /area/station/medical/virology/isolation) "esw" = ( @@ -17256,9 +17066,6 @@ /turf/open/floor/iron/dark/side, /area/station/hallway/floor3/fore) "eud" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/effect/turf_decal/tile/green{ dir = 4 }, @@ -17470,21 +17277,6 @@ }, /turf/open/floor/carpet/royalblack, /area/station/service/theater) -"ewH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port) "ewM" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrogen_output, /obj/effect/turf_decal/trimline/red/line, @@ -18013,9 +17805,6 @@ /area/station/medical/psychology) "eGr" = ( /obj/effect/turf_decal/tile/green/full, -/obj/structure/railing/corner{ - dir = 8 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -18226,6 +18015,9 @@ /obj/machinery/door/firedoor/border_only{ dir = 8 }, +/obj/structure/railing{ + dir = 8 + }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port) "eJs" = ( @@ -18235,6 +18027,12 @@ /obj/machinery/duct, /turf/open/floor/iron/dark, /area/station/hallway/floor3/fore) +"eJA" = ( +/obj/structure/cable, +/obj/machinery/power/smes/engineering, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/station/engineering/engine_smes) "eJF" = ( /obj/machinery/airalarm/directional/south, /obj/item/kirbyplants/random, @@ -18417,7 +18215,6 @@ /area/station/commons/toilet) "eMj" = ( /obj/effect/turf_decal/tile/green/full, -/obj/machinery/infuser, /obj/structure/table, /turf/open/floor/iron, /area/station/service/hydroponics) @@ -18433,6 +18230,12 @@ /obj/effect/baseturf_helper/reinforced_plating/ceiling, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) +"eMC" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/mob/living/basic/goat/pete, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "eMR" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/pod/light, @@ -19094,9 +18897,6 @@ /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) "eYp" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/effect/turf_decal/trimline/green/warning{ dir = 6 }, @@ -19734,13 +19534,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/side, /area/station/hallway/floor1/fore) -"fio" = ( -/obj/structure/railing/corner, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/wood/tile, -/area/station/service/library) "fiu" = ( /obj/machinery/light/directional/west, /turf/open/floor/carpet/red, @@ -20234,14 +20027,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard) -"foB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing/corner, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/port/aft) "foF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20987,9 +20772,6 @@ /turf/open/floor/iron, /area/station/engineering/lobby) "fzG" = ( -/obj/structure/railing/corner{ - dir = 8 - }, /obj/effect/turf_decal/trimline/green/warning{ dir = 4 }, @@ -21008,9 +20790,6 @@ /turf/open/floor/wood/tile, /area/station/command/heads_quarters/captain/private) "fzV" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/structure/chair{ dir = 8 }, @@ -21071,15 +20850,6 @@ }, /turf/open/floor/iron, /area/station/hallway/floor3/aft) -"fAU" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port/fore) "fBa" = ( /obj/structure/railing{ dir = 4 @@ -21912,13 +21682,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard) -"fLX" = ( -/obj/structure/railing/corner, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "fMa" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23310,15 +23073,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/plating/airless, /area/space/nearstation) -"geL" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port) "geW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23773,7 +23527,7 @@ "glN" = ( /obj/effect/mapping_helpers/airlock/access/any/security/armory, /obj/machinery/door/airlock/security/glass{ - name = "Armoury" + name = "Armory" }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23826,12 +23580,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"gmA" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/starboard/fore) "gmC" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ dir = 4 @@ -23880,12 +23628,6 @@ /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron/dark/smooth_large, /area/station/engineering/storage/tech) -"gnj" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/engine/hull/reinforced, -/area/space/nearstation) "gnm" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24626,9 +24368,6 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/aft) "gyp" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -24914,9 +24653,6 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/hallway/floor3/fore) "gCH" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -25492,16 +25228,6 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port/aft) -"gKO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "gKQ" = ( /obj/structure/window/plasma/spawner, /obj/machinery/rnd/server/master, @@ -26468,15 +26194,6 @@ "gZu" = ( /turf/open/floor/iron/white, /area/station/science/lobby) -"gZG" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/engine/hull/reinforced, -/area/space/nearstation) "gZJ" = ( /obj/structure/closet/secure_closet/captains, /obj/item/camera, @@ -26864,9 +26581,6 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 5 }, -/obj/structure/railing/corner{ - dir = 8 - }, /obj/item/radio/intercom/directional/east, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) @@ -26995,18 +26709,6 @@ /obj/machinery/atmospherics/components/binary/pump, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/aft) -"hfE" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/testlab) "hge" = ( /turf/open/floor/engine, /area/station/command/heads_quarters/rd) @@ -27535,9 +27237,6 @@ /obj/effect/turf_decal/stripes{ dir = 5 }, -/obj/structure/railing/corner{ - dir = 1 - }, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) "hnK" = ( @@ -27602,18 +27301,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/hallway/floor1/fore) -"hoK" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/port/fore) "hoU" = ( /obj/effect/spawner/random/contraband/landmine, /turf/open/floor/pod/dark, @@ -27735,7 +27422,6 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) "hqR" = ( -/obj/structure/railing/corner, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -28098,9 +27784,6 @@ /obj/effect/turf_decal/trimline/brown/filled/mid_joiner{ dir = 8 }, -/obj/structure/railing/corner{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, @@ -28216,9 +27899,6 @@ /turf/open/floor/iron/white, /area/station/science/ordnance/storage) "hxN" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -30333,14 +30013,6 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/maintenance/floor3/starboard/fore) -"idf" = ( -/mob/living/simple_animal/sloth/paperwork, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "idn" = ( /obj/structure/sign/directions/science/directional/west, /turf/open/floor/iron/dark/side{ @@ -30596,9 +30268,6 @@ /obj/effect/turf_decal/arrows{ dir = 1 }, -/obj/structure/railing/corner{ - dir = 1 - }, /turf/open/floor/wood/tile, /area/station/service/library/lounge) "igS" = ( @@ -30718,10 +30387,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/structure/railing/corner, -/obj/structure/railing/corner{ - dir = 8 - }, /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port) @@ -30777,13 +30442,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) -"ijJ" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/structure/railing/corner, -/turf/open/floor/engine/hull/reinforced, -/area/space/nearstation) "ijL" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/textured_large, @@ -31359,13 +31017,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/eva) -"isk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing/corner, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard/aft) "isl" = ( /obj/machinery/door/airlock/hatch{ name = "Shelter" @@ -32211,13 +31862,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) -"iEU" = ( -/obj/machinery/door/firedoor, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/pod/dark, -/area/station/maintenance/floor3/starboard) "iFn" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/north, /obj/effect/decal/cleanable/dirt, @@ -33011,9 +32655,6 @@ /turf/open/floor/iron/dark, /area/station/command/bridge) "iPV" = ( -/obj/structure/railing/corner{ - dir = 8 - }, /obj/effect/turf_decal/trimline/green/warning{ dir = 1 }, @@ -33268,12 +32909,6 @@ }, /turf/open/floor/grass, /area/station/service/library/garden) -"iTJ" = ( -/obj/structure/railing/corner, -/obj/effect/spawner/random/structure/crate_abandoned, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) "iTM" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/red/half{ @@ -33309,9 +32944,6 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, -/obj/structure/railing/corner{ - dir = 1 - }, /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/dark/side{ dir = 10 @@ -33600,15 +33232,6 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron/dark, /area/station/science/auxlab) -"iYA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/starboard) "iYE" = ( /obj/effect/turf_decal/trimline/brown/line{ dir = 4 @@ -33671,15 +33294,6 @@ dir = 8 }, /area/station/security/prison) -"iZi" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port/aft) "iZA" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/remains/human{ @@ -35891,15 +35505,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) -"jDL" = ( -/obj/effect/turf_decal/trimline/red/warning{ - dir = 4 - }, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/station/hallway/secondary/entry) "jEc" = ( /obj/effect/mapping_helpers/airlock/access/any/supply/mining, /obj/structure/cable, @@ -36113,7 +35718,6 @@ /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port) "jFT" = ( -/obj/structure/railing/corner, /obj/effect/decal/cleanable/dirt, /obj/structure/grille, /turf/open/floor/pod/light, @@ -36802,7 +36406,6 @@ name = "Starboard Quarter Solars" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/construction, -/obj/structure/railing/corner, /turf/open/floor/pod/light, /area/station/maintenance/solars/starboard/aft) "jOX" = ( @@ -36874,9 +36477,6 @@ /turf/open/floor/iron/smooth, /area/station/cargo/office) "jPD" = ( -/obj/structure/railing/corner{ - dir = 8 - }, /obj/effect/turf_decal/trimline/brown/filled/arrow_ccw{ dir = 4 }, @@ -36966,15 +36566,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"jQK" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port) "jQP" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/bottle/syrup_bottle/korta_nectar{ @@ -37404,7 +36995,6 @@ /turf/open/floor/iron, /area/station/cargo/storage) "jWR" = ( -/obj/structure/railing/corner, /obj/effect/turf_decal/siding/wood/corner{ dir = 8 }, @@ -37798,15 +37388,6 @@ /obj/effect/turf_decal/tile/red/fourcorners, /turf/open/floor/iron/dark, /area/station/security/evidence) -"kcy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/port) "kcA" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/access/any/engineering/external, @@ -38070,16 +37651,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/cargo/storage) -"kgK" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, -/area/station/service/library) "kgT" = ( /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard) @@ -39258,6 +38829,10 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) +"kwO" = ( +/obj/machinery/power/smes/engineering, +/turf/open/floor/iron, +/area/station/engineering/engine_smes) "kxf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -39712,10 +39287,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"kCk" = ( -/obj/structure/railing/corner, -/turf/open/floor/wood/tile, -/area/station/service/library) "kCm" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/holopad, @@ -39809,7 +39380,6 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor1/port/fore) "kEv" = ( -/obj/structure/railing/corner, /obj/effect/turf_decal/arrows, /turf/open/floor/wood/tile, /area/station/service/library) @@ -40288,9 +39858,6 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) "kKk" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/effect/turf_decal/siding/wood/corner{ dir = 1 }, @@ -40335,15 +39902,6 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/tile, /area/station/service/library) -"kKG" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/starboard/aft) "kKJ" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/space_heater, @@ -40459,9 +40017,6 @@ /turf/open/floor/plating, /area/station/hallway/floor1/fore) "kLM" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/machinery/door/firedoor/border_only{ dir = 1 }, @@ -40704,15 +40259,6 @@ dir = 4 }, /area/station/hallway/floor4/aft) -"kQo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/starboard) "kQp" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -41025,16 +40571,6 @@ dir = 8 }, /area/station/service/chapel) -"kUe" = ( -/obj/structure/holosign/barrier/engineering, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port/aft) "kUf" = ( /obj/effect/turf_decal/tile/blue/full, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42674,6 +42210,9 @@ dir = 10 }, /obj/structure/marker_beacon/burgundy, +/obj/structure/railing{ + dir = 8 + }, /turf/open/floor/plating/airless, /area/station/solars/starboard/aft) "lpe" = ( @@ -42901,9 +42440,6 @@ /turf/open/floor/iron/white, /area/station/medical/storage) "lsm" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/effect/turf_decal/trimline/green/warning{ dir = 10 }, @@ -43450,6 +42986,9 @@ dir = 6 }, /obj/structure/marker_beacon/burgundy, +/obj/structure/railing{ + dir = 4 + }, /turf/open/floor/plating/airless, /area/station/solars/starboard/aft) "lzA" = ( @@ -44267,15 +43806,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"lKh" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port) "lKj" = ( /obj/structure/closet/crate/solarpanel_small, /obj/structure/window/spawner/directional/west, @@ -44403,15 +43933,6 @@ /obj/structure/cable, /turf/open/floor/iron/white/smooth_corner, /area/station/commons/fitness/recreation) -"lMx" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard/fore) "lMz" = ( /obj/effect/turf_decal/siding/thinplating_new{ dir = 8 @@ -44801,7 +44322,7 @@ /area/station/maintenance/floor2/port/aft) "lQt" = ( /obj/structure/railing{ - dir = 5 + dir = 1 }, /obj/structure/chair/comfy/brown, /obj/machinery/door/firedoor/border_only{ @@ -44892,9 +44413,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/structure/railing, -/obj/structure/railing/corner{ - dir = 4 - }, /obj/machinery/door/firedoor/border_only, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port) @@ -45790,14 +45308,6 @@ icon_state = "snow7" }, /area/station/hallway/floor2/fore) -"mdE" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/hallway/floor4/fore) "mdJ" = ( /obj/item/radio/intercom/directional/north, /obj/effect/turf_decal/tile/yellow{ @@ -46287,7 +45797,7 @@ "mjP" = ( /obj/structure/cable/multilayer/multiz, /obj/structure/cable, -/turf/open/openspace, +/turf/open/floor/catwalk_floor, /area/station/maintenance/floor3/port) "mjQ" = ( /obj/effect/turf_decal/tile/yellow, @@ -47251,10 +46761,6 @@ /turf/open/floor/iron/textured_large, /area/station/cargo/miningoffice) "mvg" = ( -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister, /obj/machinery/camera{ c_tag = "Supermatter Foyer Cam #4"; network = list("ss13","engine") @@ -47586,7 +47092,7 @@ /area/station/maintenance/floor2/starboard/aft) "mzT" = ( /obj/structure/cable, -/turf/open/openspace, +/turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/aft) "mzW" = ( /obj/structure/cable, @@ -47762,10 +47268,6 @@ /obj/machinery/door/firedoor/border_only{ dir = 4 }, -/obj/structure/railing/corner, -/obj/structure/railing/corner{ - dir = 4 - }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/aft) "mCQ" = ( @@ -48424,9 +47926,6 @@ /area/station/maintenance/floor1/port/aft) "mLk" = ( /obj/machinery/door/firedoor, -/obj/structure/railing/corner{ - dir = 4 - }, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/starboard) "mLm" = ( @@ -49221,9 +48720,6 @@ /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/exit/escape_pod) "mVp" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -49646,9 +49142,6 @@ /obj/effect/turf_decal/siding/wideplating_new/corner{ dir = 8 }, -/obj/structure/railing/corner{ - dir = 8 - }, /turf/open/floor/iron/white/smooth_edge{ dir = 8 }, @@ -50210,9 +49703,6 @@ /obj/structure/railing/corner{ dir = 1 }, -/obj/structure/railing/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -50314,9 +49804,6 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor1/starboard/fore) "niA" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/effect/turf_decal/trimline/green/corner{ dir = 4 }, @@ -50496,16 +49983,6 @@ /obj/structure/cable, /turf/open/floor/iron/solarpanel/airless, /area/station/solars/starboard/fore) -"nko" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/railing/corner, -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "nkp" = ( /obj/structure/railing, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50556,9 +50033,6 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/brown/line, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -50808,12 +50282,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) -"nnU" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor2/port/fore) "nnV" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/pod/light, @@ -51467,9 +50935,6 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/aft) "nvv" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/effect/turf_decal/trimline/blue/corner{ dir = 1 }, @@ -51532,12 +50997,6 @@ /obj/effect/turf_decal/siding/wideplating_new{ dir = 8 }, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/railing/corner{ - dir = 1 - }, /turf/open/floor/iron/white/smooth_edge{ dir = 8 }, @@ -51614,9 +51073,6 @@ /obj/item/cigbutt/cigarbutt{ pixel_x = 7 }, -/obj/effect/turf_decal/stripes{ - dir = 8 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, @@ -51776,15 +51232,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"nzm" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port/fore) "nzq" = ( /obj/machinery/door/airlock/wood{ name = "Bedroom" @@ -51990,9 +51437,6 @@ }, /area/station/security/brig) "nBV" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -52010,15 +51454,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/side, /area/station/hallway/secondary/exit/departure_lounge) -"nCd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard) "nCg" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/reagent_containers/pill/happinesspsych{ @@ -52667,9 +52102,6 @@ dir = 4 }, /obj/structure/cable, -/obj/structure/railing/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor/border_only, @@ -53192,7 +52624,6 @@ /obj/effect/turf_decal/trimline/yellow/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/railing/corner, /obj/machinery/door/firedoor/border_only{ dir = 8 }, @@ -53218,13 +52649,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port) -"nRn" = ( -/obj/structure/railing/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard/fore) "nRo" = ( /obj/machinery/vending/games, /turf/open/floor/bamboo/tatami/black, @@ -53586,14 +53010,6 @@ "nWe" = ( /turf/closed/wall, /area/station/commons/fitness) -"nWf" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "nWk" = ( /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -54065,9 +53481,6 @@ /turf/open/floor/iron/dark/side, /area/station/hallway/floor4/aft) "ocu" = ( -/obj/structure/railing/corner{ - dir = 8 - }, /obj/effect/turf_decal/trimline/blue/corner{ dir = 8 }, @@ -54691,15 +54104,6 @@ dir = 4 }, /area/station/maintenance/floor1/starboard/aft) -"olt" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port/fore) "olA" = ( /obj/effect/turf_decal/trimline/green/warning{ dir = 9 @@ -55467,11 +54871,13 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, -/obj/effect/turf_decal/stripes, /obj/effect/turf_decal/trimline/brown/line, /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/iron/dark/smooth_half, /area/station/bitrunning/den) "owo" = ( @@ -55899,15 +55305,6 @@ /obj/structure/table, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/office) -"oCe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/aft) "oCf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56158,13 +55555,6 @@ dir = 1 }, /area/station/hallway/floor3/aft) -"oGc" = ( -/obj/effect/turf_decal/trimline/red/warning{ - dir = 4 - }, -/obj/structure/railing/corner, -/turf/open/floor/pod/dark, -/area/station/hallway/secondary/entry) "oGf" = ( /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/trimline/dark_blue/filled/line{ @@ -57373,14 +56763,6 @@ /obj/structure/grille, /turf/open/floor/plating/airless, /area/station/service/chapel) -"oXd" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/structure/railing/corner, -/turf/open/space/openspace, -/area/space/nearstation) "oXg" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -58279,14 +57661,6 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port/aft) -"pmG" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/mob/living/simple_animal/hostile/retaliate/goat{ - name = "Pete" - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "pmO" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -58984,10 +58358,6 @@ /obj/machinery/hydroponics/constructable, /turf/open/floor/iron, /area/station/service/hydroponics) -"pwH" = ( -/obj/structure/railing/corner, -/turf/open/floor/engine/hull/reinforced, -/area/space/nearstation) "pwL" = ( /obj/effect/turf_decal/siding/blue{ dir = 4 @@ -59193,9 +58563,6 @@ /turf/open/floor/iron, /area/station/engineering/gravity_generator) "pze" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59525,14 +58892,6 @@ /obj/machinery/duct, /turf/open/floor/iron/checker, /area/station/service/bar/atrium) -"pDX" = ( -/obj/structure/railing/corner, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/bar/atrium) "pEp" = ( /turf/open/openspace, /area/station/maintenance/floor2/port/aft) @@ -59628,14 +58987,6 @@ }, /turf/open/floor/iron/large, /area/station/command/gateway) -"pFy" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard/fore) "pFA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -59763,15 +59114,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/solars/port/aft) -"pHQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/port) "pHT" = ( /obj/structure/table/wood, /obj/item/paper/fluff/gateway, @@ -60113,7 +59455,6 @@ /turf/open/floor/iron/white, /area/station/science/xenobiology/hallway) "pMW" = ( -/obj/structure/railing/corner, /obj/effect/turf_decal/trimline/purple/corner, /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -61965,12 +61306,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard/aft) -"qng" = ( -/obj/structure/railing/corner, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "qnq" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 8 @@ -62431,7 +61766,6 @@ /turf/open/floor/pod/light, /area/station/maintenance/floor4/port/fore) "qtA" = ( -/obj/structure/railing/corner, /obj/structure/chair{ dir = 4 }, @@ -62503,14 +61837,6 @@ "qun" = ( /turf/closed/wall/r_wall, /area/station/science/genetics) -"quA" = ( -/obj/structure/railing/corner, -/obj/machinery/door/firedoor/border_only, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, -/area/station/service/library) "quB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63084,9 +62410,6 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port/fore) "qAM" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -63481,9 +62804,6 @@ }, /area/station/security/checkpoint) "qEB" = ( -/obj/structure/railing/corner{ - dir = 8 - }, /obj/effect/turf_decal/trimline/green/corner{ dir = 8 }, @@ -64271,9 +63591,6 @@ /obj/effect/turf_decal/tile/green/full, /obj/machinery/camera/autoname/directional/west, /obj/machinery/vending/wallmed/directional/west, -/obj/structure/railing/corner{ - dir = 8 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -64660,14 +63977,6 @@ /obj/structure/sign/departments/psychology, /turf/closed/wall, /area/station/maintenance/floor1/port) -"qUV" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/structure/railing/corner, -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/station/solars/starboard/aft) "qVa" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -65316,9 +64625,6 @@ /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) "rdK" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/wood, /area/station/service/bar/atrium) @@ -65574,15 +64880,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/service/library/private) -"rgE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard/aft) "rgG" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -65804,9 +65101,6 @@ }, /area/station/maintenance/floor1/starboard/aft) "rjp" = ( -/obj/structure/railing/corner{ - dir = 8 - }, /obj/effect/turf_decal/trimline/yellow/corner{ dir = 8 }, @@ -66726,15 +66020,6 @@ "ryx" = ( /turf/open/floor/carpet/royalblue, /area/station/commons/dorms/room4) -"ryz" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/fore) "ryA" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -66754,13 +66039,6 @@ /obj/machinery/hydroponics/constructable, /turf/open/floor/plating, /area/station/maintenance/floor4/starboard) -"ryX" = ( -/obj/structure/railing/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port) "rza" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 9 @@ -67006,6 +66284,9 @@ "rCO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/catwalk_floor/iron, /area/station/engineering/engine_smes) "rCQ" = ( @@ -67300,15 +66581,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/wood/tile, /area/station/service/chapel/office) -"rHP" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/port) "rHX" = ( /obj/effect/turf_decal/bot_white/right, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -67623,15 +66895,6 @@ }, /turf/open/floor/pod/dark, /area/station/maintenance/floor1/port) -"rMc" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/fore) "rMl" = ( /obj/structure/chair/sofa/bench{ dir = 4 @@ -68019,12 +67282,6 @@ dir = 4 }, /area/station/engineering/storage/tech) -"rSu" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor3/port) "rSw" = ( /turf/open/misc/asteroid/snow/standard_air{ icon_state = "snow1" @@ -68059,9 +67316,6 @@ /obj/structure/railing/corner{ dir = 1 }, -/obj/structure/railing/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -68259,13 +67513,6 @@ "rVk" = ( /turf/open/floor/iron, /area/station/security/courtroom) -"rVo" = ( -/obj/structure/railing/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/starboard/fore) "rVy" = ( /turf/open/floor/plating, /area/station/maintenance/floor4/port/fore) @@ -68385,6 +67632,12 @@ dir = 4 }, /area/station/hallway/floor3/aft) +"rXZ" = ( +/obj/effect/landmark/navigate_destination/dockaux, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/hallway/floor3/fore) "rYa" = ( /obj/structure/window/reinforced/tinted/frosted{ dir = 8 @@ -68621,12 +67874,6 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/floor2/starboard/aft) -"scu" = ( -/obj/structure/railing/corner, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) "scv" = ( /turf/closed/wall/r_wall, /area/station/maintenance/disposal) @@ -69299,6 +68546,9 @@ /obj/structure/railing{ dir = 6 }, +/obj/structure/railing{ + dir = 4 + }, /turf/open/space/openspace, /area/space/nearstation) "soI" = ( @@ -69334,13 +68584,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard/aft) -"spa" = ( -/obj/structure/railing/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/starboard) "spb" = ( /obj/machinery/newscaster/directional/south, /obj/machinery/light_switch/directional/west, @@ -69550,15 +68793,6 @@ }, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"ssz" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/starboard/aft) "ssL" = ( /obj/machinery/door/airlock/science/glass{ name = "Research and Development" @@ -70225,9 +69459,6 @@ /turf/open/floor/wood, /area/station/maintenance/floor3/starboard/aft) "sBF" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/effect/turf_decal/trimline/green/corner{ dir = 1 }, @@ -71193,9 +70424,6 @@ /obj/effect/turf_decal/siding/wood{ dir = 9 }, -/obj/structure/railing/corner{ - dir = 4 - }, /obj/effect/turf_decal/arrows{ dir = 1 }, @@ -71872,9 +71100,6 @@ /turf/open/floor/wood/parquet, /area/station/medical/psychology) "sYw" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/effect/turf_decal/trimline/brown/filled/arrow_ccw{ dir = 4 }, @@ -72014,9 +71239,6 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 6 }, -/obj/structure/railing/corner{ - dir = 1 - }, /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) @@ -72076,15 +71298,6 @@ /obj/structure/cable, /turf/open/floor/wood/tile, /area/station/service/library) -"tbh" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/port/fore) "tbp" = ( /obj/item/kirbyplants/random, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -72271,13 +71484,6 @@ /obj/machinery/light/dim/directional/west, /turf/open/floor/pod/light, /area/station/maintenance/floor2/starboard) -"tdB" = ( -/obj/structure/railing/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/starboard/aft) "tdF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -73221,7 +72427,7 @@ "trz" = ( /obj/structure/cable/multilayer/multiz, /obj/structure/cable, -/turf/open/floor/plating, +/turf/open/floor/catwalk_floor, /area/station/maintenance/floor2/port) "trB" = ( /obj/machinery/ai_slipper{ @@ -74504,9 +73710,6 @@ /turf/open/floor/carpet/red, /area/station/commons/dorms/room1) "tKl" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark/side{ @@ -74920,9 +74123,6 @@ /turf/open/floor/iron/dark, /area/station/hallway/floor4/aft) "tQJ" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -75581,9 +74781,6 @@ /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) "ubi" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark/side{ dir = 1 @@ -75694,9 +74891,6 @@ }, /area/station/cargo/lobby) "ucS" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/random/trash/graffiti, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -75767,13 +74961,6 @@ }, /turf/open/floor/plating/foam, /area/station/maintenance/floor2/starboard/fore) -"uep" = ( -/obj/structure/railing/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port/fore) "ueu" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -75881,9 +75068,6 @@ /turf/open/floor/iron/dark, /area/station/security/office) "ufL" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/effect/turf_decal/trimline/yellow/corner{ dir = 1 }, @@ -76258,9 +75442,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct, -/obj/structure/railing/corner{ - dir = 1 - }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/port/aft) "ukK" = ( @@ -77042,17 +76223,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/pod/light, /area/station/maintenance/floor4/starboard/fore) -"uxD" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port) "uxF" = ( /obj/machinery/status_display/ai/directional/west, /obj/structure/flora/bush/sparsegrass/style_random, @@ -77549,9 +76719,6 @@ "uEY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/railing/corner{ - dir = 1 - }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard/fore) "uFc" = ( @@ -77788,9 +76955,6 @@ /obj/structure/railing/corner{ dir = 1 }, -/obj/structure/railing/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -77964,23 +77128,6 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/pod/dark, /area/station/maintenance/floor3/port) -"uLj" = ( -/obj/structure/railing/corner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/port) -"uLk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/port/aft) "uLA" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -77997,12 +77144,10 @@ /turf/open/floor/carpet/royalblue, /area/station/commons/dorms/room4) "uLN" = ( -/obj/effect/turf_decal/box/corners, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, /obj/effect/decal/cleanable/dirt/dust, -/obj/effect/landmark/bitrunning/station_reward_spawn, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, /turf/open/floor/iron/dark/smooth_large, /area/station/bitrunning/den) "uLO" = ( @@ -79148,21 +78293,6 @@ "uZF" = ( /turf/closed/wall/r_wall, /area/station/maintenance/floor2/starboard/aft) -"uZG" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/border_only, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/machinery/duct, -/obj/structure/railing, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor4/port/aft) "uZV" = ( /obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, /obj/machinery/door/airlock/hatch{ @@ -79932,12 +79062,16 @@ /obj/effect/turf_decal/trimline/brown/filled/mid_joiner{ dir = 8 }, -/obj/structure/railing{ - dir = 4 - }, /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing, /turf/open/floor/carpet/red, /area/station/service/theater) "vlQ" = ( @@ -80306,7 +79440,6 @@ /obj/structure/railing{ dir = 8 }, -/obj/structure/railing/corner, /turf/open/openspace, /area/station/maintenance/floor2/port/aft) "vqz" = ( @@ -81437,13 +80570,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/floor1/port/aft) -"vFJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port) "vFS" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/random/maintenance, @@ -81815,15 +80941,6 @@ /obj/structure/rack, /turf/open/floor/iron/textured_large, /area/station/medical/chemistry) -"vKw" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port) "vKD" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/light/dim/directional/north, @@ -82878,9 +81995,6 @@ /turf/open/floor/iron/dark, /area/station/command/gateway) "vZl" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/structure/railing/corner{ dir = 8 }, @@ -82948,12 +82062,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/large, /area/station/security/prison/safe) -"waX" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/starboard) "wba" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -83272,9 +82380,6 @@ /area/station/hallway/floor1/aft) "weg" = ( /obj/structure/sign/poster/official/random/directional/east, -/obj/structure/railing/corner{ - dir = 8 - }, /obj/effect/turf_decal/arrows, /obj/machinery/camera/autoname/directional/east, /turf/open/floor/wood/tile, @@ -83327,13 +82432,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"wfl" = ( -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "wfx" = ( /obj/machinery/door/window/brigdoor/left/directional/west, /obj/structure/cable, @@ -83408,12 +82506,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/dark/smooth_half, /area/station/engineering/storage/tech) -"wgo" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/pod/light, -/area/station/maintenance/floor1/starboard) "wgO" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -84078,15 +83170,6 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/floor2/fore) -"wpa" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard/fore) "wpc" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/bodycontainer/morgue{ @@ -84530,16 +83613,6 @@ dir = 4 }, /area/station/hallway/floor4/aft) -"wuS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing/corner, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/port/fore) "wuZ" = ( /obj/structure/rack, /obj/effect/decal/cleanable/dirt, @@ -85555,9 +84628,6 @@ /turf/open/floor/pod/dark, /area/station/maintenance/floor4/starboard) "wHs" = ( -/obj/structure/railing/corner{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -85653,9 +84723,6 @@ /turf/open/floor/iron/dark, /area/station/command/gateway) "wIC" = ( -/obj/structure/railing/corner{ - dir = 1 - }, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side{ dir = 8 @@ -86362,9 +85429,6 @@ dir = 1 }, /obj/machinery/duct, -/obj/structure/railing/corner{ - dir = 8 - }, /obj/structure/railing{ dir = 1 }, @@ -86785,15 +85849,6 @@ /obj/structure/ladder, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) -"wWm" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port/aft) "wWn" = ( /obj/machinery/light/cold/no_nightlight/directional/east, /obj/item/radio/intercom/directional/east, @@ -87089,14 +86144,6 @@ /obj/item/shovel/spade, /turf/open/floor/iron, /area/station/service/hydroponics) -"xbj" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port) "xbk" = ( /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 4 @@ -87325,6 +86372,16 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/pod/light, /area/station/maintenance/floor1/port) +"xdT" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/cable, +/obj/machinery/computer/security/telescreen/engine{ + name = "Engineering and atmospherics monitor" + }, +/mob/living/basic/parrot/poly, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/command/heads_quarters/ce) "xdV" = ( /obj/machinery/vending/coffee, /obj/structure/extinguisher_cabinet/directional/north, @@ -87638,9 +86695,6 @@ /turf/open/floor/grass, /area/station/service/bar/atrium) "xit" = ( -/obj/structure/railing/corner{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -87826,7 +86880,6 @@ /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 }, -/obj/structure/railing/corner, /obj/machinery/light/directional/north, /turf/open/floor/carpet/red, /area/station/service/theater) @@ -88105,7 +87158,6 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner, /obj/structure/railing{ dir = 1 }, @@ -88554,19 +87606,6 @@ /obj/structure/grille, /turf/open/floor/pod/light, /area/station/maintenance/floor2/port/fore) -"xvA" = ( -/obj/effect/turf_decal/tile/green/full, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/turf/open/floor/iron/smooth_large, -/area/station/hallway/secondary/entry) "xvK" = ( /obj/structure/table/reinforced/rglass, /obj/item/clothing/gloves/latex, @@ -88812,15 +87851,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"xyC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/starboard) "xyD" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -88860,15 +87890,6 @@ /obj/machinery/duct, /turf/open/floor/iron/dark/textured, /area/station/commons/fitness) -"xzr" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor1/port/aft) "xzA" = ( /obj/machinery/light/cold/no_nightlight/directional/west, /turf/open/floor/iron, @@ -89487,9 +88508,6 @@ /turf/open/floor/iron/dark/side, /area/station/security/courtroom) "xHw" = ( -/obj/structure/railing{ - dir = 8 - }, /obj/effect/turf_decal/trimline/brown/filled/arrow_ccw{ dir = 4 }, @@ -89642,15 +88660,6 @@ /obj/effect/spawner/random/engineering/canister, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/port) -"xJW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor3/port) "xKa" = ( /obj/effect/turf_decal/stripes/white/corner, /turf/open/floor/iron/dark/corner, @@ -89668,10 +88677,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/evidence) -"xKt" = ( -/obj/structure/railing/corner, -/turf/open/space/openspace, -/area/space) "xKy" = ( /obj/machinery/modular_computer/console/preset/id{ dir = 8 @@ -89896,15 +88901,6 @@ dir = 1 }, /area/station/engineering/lobby) -"xNX" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/floor2/starboard/fore) "xOd" = ( /obj/structure/cable, /turf/closed/wall, @@ -90104,6 +89100,9 @@ dir = 10 }, /obj/structure/marker_beacon/burgundy, +/obj/structure/railing{ + dir = 8 + }, /turf/open/space/openspace, /area/space/nearstation) "xRG" = ( @@ -90254,12 +89253,6 @@ /obj/effect/turf_decal/tile/green/full, /turf/open/floor/iron, /area/station/service/hydroponics) -"xUk" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/space/openspace, -/area/space) "xUI" = ( /obj/structure/cable, /obj/structure/chair/sofa/bench/left, @@ -90997,9 +89990,6 @@ /obj/structure/railing{ dir = 1 }, -/obj/structure/railing/corner{ - dir = 8 - }, /obj/machinery/door/firedoor/border_only{ dir = 1 }, @@ -91365,12 +90355,6 @@ /obj/effect/turf_decal/siding/wideplating_new{ dir = 8 }, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/railing/corner{ - dir = 1 - }, /turf/open/floor/iron/white/smooth_corner{ dir = 4 }, @@ -110122,7 +109106,7 @@ xob wnP nnV oic -rVo +rRf ala ala ala @@ -110662,7 +109646,7 @@ hJy hJy sui sui -olt +hOV hJy uoP cnW @@ -110893,7 +109877,7 @@ uzN aaC twL oic -djX +rRf jIW tNS ybF @@ -111407,7 +110391,7 @@ laS btP bxf oic -rVo +rRf wsw tNS thq @@ -111690,7 +110674,7 @@ hJy hJy vZl pxY -agt +omF hJy jMI eiM @@ -112178,7 +111162,7 @@ oic oic sBT qLI -djX +rRf lIe lIe joP @@ -112721,7 +111705,7 @@ kDQ sDT vZw hJy -dIO +iGt hJy hJy hJy @@ -114006,11 +112990,11 @@ hJy eqK iGt udE -fAU +iGt fqg fqg fqg -nzm +iGt iGt iGt iGt @@ -116037,7 +115021,7 @@ gWv new jbl nzL -idf +cls oUH npD lyw @@ -116321,8 +115305,8 @@ brj brj fmf jlx -jDL -oGc +uzn +uzn jlx cCR brj @@ -116578,7 +115562,7 @@ bsu qPM ixQ ixQ -xvA +eGr eGr ixQ ixQ @@ -119139,12 +118123,12 @@ tTU kyP pLe xgH -qng +dyS uya uya uya uya -xbj +dyS xgH twx dyS @@ -119653,12 +118637,12 @@ oMV dyS dyS qLN -nWf +dyS ema ema ema ema -asU +dyS xgH pLe dyS @@ -120162,9 +119146,9 @@ rpj ppf uOT xgH -iTJ +gbh xee -xbj +dyS xgH rTt trD @@ -126823,10 +125807,10 @@ whV whV whV jJm -wgo +sKW nSv vWS -xyC +erU crj nLk efr @@ -127077,7 +126061,7 @@ foI iGz nnN whV -spa +kSp bcK bcK kSp @@ -127849,7 +126833,7 @@ jJm nQw jJm kSp -waX +jJm vwJ bMD aut @@ -129688,7 +128672,7 @@ aIV xgH eKk hdA -uLj +eVk bQV bQV gaH @@ -133785,7 +132769,7 @@ igQ wec fOq sQD -iAS +eJA uRS pSG sQD @@ -134047,7 +133031,7 @@ nPb rCO cjc aRI -bVQ +xdT vMJ vgn kzE @@ -134556,7 +133540,7 @@ hTS rBP nag rBP -oSt +kwO dHd tNC sQD @@ -136361,12 +135345,12 @@ xYU fYg fvP dEc -bhb +ulU vcr eCr uhx vcr -kUe +xep wRM nJt nJt @@ -137903,12 +136887,12 @@ unW dEc mSe uov -wWm +uov bwL bwL bwL bwL -xzr +uov nsX vcr cIW @@ -138412,8 +137396,8 @@ vap lQD juf klY -kfo -wfl +xgW +xgW dEc uhx uov @@ -138669,7 +137653,7 @@ uyD uyD uyD bDO -kfo +xgW mvg dEc ggX @@ -174891,7 +173875,7 @@ bQv tEb rYw uUG -wpa +kEI wwu wwu wwu @@ -175658,11 +174642,11 @@ ebA lXs gqP gqP -nRn +kEI lGh lGh lGh -lMx +kEI wwu mdC tTB @@ -176429,11 +175413,11 @@ ebA lXs gqP gqP -wpa +kEI egD tqw ozn -xNX +kEI pgS wwu xXe @@ -176943,7 +175927,7 @@ crd wwu wwu wwu -nRn +kEI eLK tqw cWF @@ -177714,11 +176698,11 @@ wwu cNf bDr wwu -wpa +kEI roe roe roe -pFy +dAk gaf vlo qln @@ -178257,7 +177241,7 @@ hLz uXA hLz jVu -wuS +hpW hLz hLz fGy @@ -179542,11 +178526,11 @@ hLz uXA uXA uXA -tbh +uXA wNb wNb wNb -hoK +jly jJu kxh lvM @@ -181047,7 +180031,7 @@ cwq vlV xuv xOe -aah +qyx qyx lRi tGa @@ -184680,7 +183664,7 @@ vXT vXT vXT vXT -nnU +vaF ssy xop mSZ @@ -188290,7 +187274,7 @@ dWR aal cdH cda -kcy +ybG fzm aal aal @@ -190090,7 +189074,7 @@ aal gzw gzw gzw -rHP +xit aal aal ucA @@ -190812,7 +189796,7 @@ vnK vnK vnK uBW -nCd +kpt sHv kpt kRS @@ -199853,7 +198837,7 @@ aal oVH oVH aal -pHQ +ybG iRN iRN aal @@ -202126,9 +201110,9 @@ mPw mPw mPw uJs -isk +mPw syP -rgE +mPw mPw dEt lgO @@ -202668,12 +201652,12 @@ rGL qjn wkw aXC -foB +qjn eCK qWN vqx jOj -uLk +xui xui xui xui @@ -207804,7 +206788,7 @@ hQT oyh oyh hQT -ilK +oyh oyh oyh oyh @@ -239923,7 +238907,7 @@ vpa gec qTD bks -bks +rXZ bks myU viZ @@ -242468,7 +241452,7 @@ ucA ucA iTg aZN -oXd +pRs soz ucA xuh @@ -242762,7 +241746,7 @@ gwL gwL xwI vuN -rMc +gyp oIj gwL jPd @@ -244057,7 +243041,7 @@ gwL uQL niP lGK -uep +dso eZa eZa eZa @@ -245346,7 +244330,7 @@ gwL gwL gwL vGT -ryz +dso gwL gwL ucA @@ -245571,7 +244555,7 @@ upT lXW aYJ ccp -pDX +ccp upT sjX rdK @@ -249706,7 +248690,7 @@ xsQ xUj diA sGW -pmG +eMC nVy awV sGW @@ -250484,7 +249468,7 @@ tGn tGn teV mUA -ewH +xpH eJl mUA tGn @@ -250998,7 +249982,7 @@ tGn npO bGc qwy -rSu +ajs tDf mUA tGn @@ -252798,7 +251782,7 @@ tGn tGn tGn tGn -vFJ +pSl mzA tGn tGn @@ -253052,10 +252036,10 @@ dfp qfT ldq tGn -vFJ +pSl fvb fvb -uxD +tDf aGQ tGn tGn @@ -253823,10 +252807,10 @@ lvs uZc tGn qCv -jQK +pSl kYC mex -xJW +pSl pSl cHT cHT @@ -254594,11 +253578,11 @@ mms dYf tGn ajs -ryX +jPG fBa fBa fBa -lKh +jPG tGn tGn ucA @@ -255622,11 +254606,11 @@ uwG kVM tGn mwg -vKw +jPG wNH oxJ wNH -geL +jPG tGn tGn ucA @@ -257118,7 +256102,7 @@ qrd qrd qrd qrd -iEU +mLk qrd qrd sSB @@ -257405,7 +256389,7 @@ wpI kNT ufN lFa -scu +ufN dDF eLw nVl @@ -258152,7 +257136,7 @@ qrd hqR jmU jmU -iYA +sSB ejP qrd eoe @@ -258663,7 +257647,7 @@ qrd xRM hVI eir -dfA +hqR aea aVs iGh @@ -258923,7 +257907,7 @@ qrd sSB aaw lFw -kQo +sSB isU cdj eAi @@ -263033,11 +262017,11 @@ cIM kRw fKd csM -kgK +blF knk -bSj +fzw rws -akh +fzw sXX kLM fzw @@ -263547,13 +262531,13 @@ cIM kRw fKd ngr -quA +blF tjc -anW +fzw pdO -kCk +fzw ePH -bIk +wjm tXV iMN eIz @@ -263847,7 +262831,7 @@ biO piR qeX cvf -nko +pOn rIY lRh piR @@ -264832,14 +263816,14 @@ cIM kRw iMN kjp -kgK +blF mAJ fll hav mJy kKE -baa -fio +wjm +bTe dCW dCW dCW @@ -265389,7 +264373,7 @@ pOn pOn pOn pOn -oCe +pOn uKD rTv piR @@ -265855,10 +264839,10 @@ ucA ucA kRw kRw -tdB +cIM oxP xhC -kKG +cIM kRw aNz ciM @@ -266626,10 +265610,10 @@ ucA ucA kRw kRw -ssz +cIM cWY veA -ata +cIM kRw qgh ciM @@ -267664,7 +266648,7 @@ qjq eJc jOT nHf -aZI +cIM kRw kRw kRw @@ -268458,12 +267442,12 @@ sjH uqi uqi uqi -gKO +uqi kRO aYq aYq aYq -aqR +pOn pOn pOn pOn @@ -273333,11 +272317,11 @@ ucA ucA ucA ucA -xKt +ucA djc djc djc -dkn +ucA ucA ucA ucA @@ -305963,7 +304947,7 @@ yjN uxw aLb eGK -bJN +bNb gEB cmw cHz @@ -307270,7 +306254,7 @@ uIx rhJ rhJ rhJ -pTI +bxc rao iES voT @@ -309827,7 +308811,7 @@ wjj oKq bJV hWp -mdE +gxn uPX ogl czp @@ -310319,7 +309303,7 @@ xHe kqp dIQ dIQ -gmA +hto uxw jBa xHe @@ -313148,7 +312132,7 @@ bYl kiw exv wMU -fLX +fPd ixd bDn gwe @@ -313919,7 +312903,7 @@ sab vuB vuB vuB -hfE +vuB bep hnG pNa @@ -318334,7 +317318,7 @@ duZ vEa fXs fXs -uZG +tPS sOU ncB ncB @@ -319617,8 +318601,8 @@ sWo jvz wyv ycM -nXQ -nXQ +bGM +bGM ukr bzM ncB @@ -321162,7 +320146,7 @@ ycM noA noA noA -iZi +pze ncB ncB ucA @@ -325231,7 +324215,7 @@ wiu rem rNo wOt -blq +rNo rNo oHC oHC @@ -332713,11 +331697,11 @@ vyR vyR vyR oyh -pwH -hQT -ijJ +oyh hQT ilK +hQT +oyh oyh oyh oyh @@ -333741,11 +332725,11 @@ vyR vyR vyR vyR -qWn +oyh itT -gZG +qWn itT -gnj +oyh oyh oyh oyh @@ -335031,7 +334015,7 @@ oyh oyh acl acl -xUk +ucA ucA ucA ucA @@ -336799,7 +335783,7 @@ ucA ucA eEE cUq -qUV +bjb lzq ucA ucA @@ -338869,11 +337853,11 @@ ucA ucA ucA ucA -xKt +ucA djc djc djc -dkn +ucA ucA ucA ucA diff --git a/_maps/map_files/Oshan/oshan.dmm b/_maps/map_files/Oshan/oshan.dmm index b2813f5b8eab..2cd307c8336f 100644 --- a/_maps/map_files/Oshan/oshan.dmm +++ b/_maps/map_files/Oshan/oshan.dmm @@ -9,7 +9,7 @@ color = "#00ff00" }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "aah" = ( /turf/open/floor/plating/ocean, /area/ocean/generated_above) @@ -69,7 +69,6 @@ "abg" = ( /obj/machinery/light/directional/west, /obj/machinery/newscaster/directional/west, -/obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/table/reinforced, /obj/item/clothing/gloves/latex/nitrile, @@ -81,6 +80,7 @@ /area/station/medical/storage) "abD" = ( /obj/structure/disposalpipe/segment, +/obj/structure/chair/stool/directional/south, /turf/open/floor/plating, /area/station/maintenance/disposal) "abL" = ( @@ -115,9 +115,12 @@ "acE" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/medical/surgery/aft) +/area/station/medical/patients_rooms/room_a) "acI" = ( /obj/machinery/firealarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/wood, /area/station/cargo/miningoffice) "acS" = ( @@ -143,6 +146,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/airalarm/directional/west, /turf/open/floor/holofloor/dark, /area/station/science/cytology) "adf" = ( @@ -150,6 +154,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) +"adh" = ( +/obj/structure/table, +/obj/item/multitool/circuit{ + pixel_x = -8 + }, +/obj/item/multitool/circuit{ + pixel_x = -8 + }, +/obj/item/multitool/circuit{ + pixel_x = -8 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 + }, +/obj/item/analysis_bin, +/turf/open/floor/iron/white, +/area/station/science/circuits) "adj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -182,14 +203,13 @@ dir = 1 }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "adV" = ( /obj/machinery/airalarm/all_access{ dir = 4; pixel_x = 24 }, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /obj/structure/cable, /obj/machinery/light/small/directional/east, /turf/open/floor/iron, @@ -231,7 +251,7 @@ dir = 4 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "aej" = ( /turf/open/floor/plating, /area/station/cargo/warehouse) @@ -360,6 +380,10 @@ /area/station/engineering/atmos/hfr_room) "agP" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/iron/smooth, /area/station/commons/fitness/recreation) "agR" = ( @@ -380,6 +404,11 @@ /obj/structure/frame/computer, /turf/open/floor/plating, /area/station/service/electronic_marketing_den) +"ahg" = ( +/obj/effect/spawner/random/structure/grille, +/obj/machinery/light/small/maintenance/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/office) "ahh" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -418,6 +447,8 @@ "ahN" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/hop) "ahZ" = ( @@ -425,7 +456,7 @@ dir = 1 }, /obj/machinery/door/airlock/external{ - name = "Escape Pod Four"; + name = "Engineering Access"; space_dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -449,23 +480,20 @@ /obj/structure/chair/comfy, /turf/open/floor/wood, /area/station/commons/dorms) -"aiQ" = ( -/obj/item/grenade/barrier{ - pixel_x = -3; - pixel_y = 1 +"ain" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 }, +/obj/effect/turf_decal/trimline/blue/line, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/vending/wallmed/directional/north, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/lobby) +"aiQ" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 }, /obj/structure/closet/secure_closet/armory1, -/obj/item/clothing/suit/armor/bulletproof{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/item/clothing/suit/armor/riot{ - pixel_x = -3; - pixel_y = 2 - }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/security/armory) "aiV" = ( @@ -482,6 +510,11 @@ }, /turf/open/floor/plating, /area/station/science/xenobiology) +"aja" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/grass, +/area/station/service/hydroponics) "ajo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -508,7 +541,7 @@ /obj/machinery/door/airlock/security{ name = "Brig" }, -/obj/effect/mapping_helpers/airlock/access/all/security/entrance, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 4 }, @@ -524,7 +557,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/any/command/eva, -/obj/effect/landmark/navigate_destination, +/obj/effect/landmark/navigate_destination/eva, /turf/open/floor/mineral/titanium, /area/station/ai_monitored/command/storage/eva) "akv" = ( @@ -565,6 +598,7 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/unres, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/cryo) "amg" = ( @@ -579,10 +613,15 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "amz" = ( /obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den/gaming) "amG" = ( @@ -605,7 +644,7 @@ pixel_y = 1 }, /turf/open/floor/carpet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "anP" = ( /obj/effect/turf_decal/trimline/yellow, /turf/open/floor/iron/dark/textured, @@ -641,8 +680,19 @@ "apc" = ( /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/plating, /area/station/maintenance/port/central) +"apl" = ( +/obj/item/robot_suit, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/noslip{ + icon_state = "textured_white"; + color = "#999999" + }, +/area/station/science/robotics) "apo" = ( /obj/machinery/suit_storage_unit/cmo, /turf/open/floor/wood/parquet, @@ -651,6 +701,10 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"apA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/bar) "aqa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -679,12 +733,9 @@ /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ dir = 8 }, +/obj/item/stock_parts/cell, /turf/open/floor/iron/dark/textured_corner, /area/station/engineering/break_room) -"aqC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet/lone/star, -/area/station/service/chapel) "aqF" = ( /obj/structure/bodycontainer/morgue{ dir = 2 @@ -698,6 +749,14 @@ color = "#D381C9" }, /area/station/science/robotics) +"arl" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/carpet/purple, +/area/station/science/server) +"arO" = ( +/obj/structure/transit_tube/crossing/horizontal, +/turf/open/floor/plating/ocean, +/area/ocean) "arQ" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -748,7 +807,7 @@ "asA" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, -/area/station/command/bridge) +/area/station/maintenance/department/bridge) "asM" = ( /obj/structure/cable, /obj/machinery/plumbing/floor_pump/input/on/waste/directional/north, @@ -765,6 +824,10 @@ /obj/effect/turf_decal/trimline/green/line, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) +"asQ" = ( +/obj/structure/sign/warning/no_smoking, +/turf/closed/wall, +/area/station/science/genetics/cloning) "atn" = ( /obj/machinery/light/neon_lining{ dir = 4; @@ -790,14 +853,13 @@ dir = 4 }, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/command/heads_quarters/rd) "atS" = ( /obj/structure/table/wood, /obj/item/modular_computer/laptop, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "atX" = ( /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/pod/dark, @@ -828,8 +890,14 @@ /obj/effect/turf_decal/trimline/blue/line{ dir = 6 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/medical/morgue) +"auR" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/dark/textured, +/area/station/security/courtroom) "auY" = ( /obj/structure/rack, /obj/effect/turf_decal/tile/neutral, @@ -865,7 +933,11 @@ }, /obj/machinery/vending/wallmed/directional/west, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) +"avK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet, +/area/station/service/bar) "avO" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 5 @@ -888,6 +960,7 @@ dir = 1 }, /obj/structure/cable, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/command/bridge) "awg" = ( @@ -897,8 +970,14 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/science/robotics/mechbay) +/turf/open/floor/iron/white, +/area/station/science/circuits) +"awj" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) "awY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -934,9 +1013,7 @@ /turf/open/floor/iron/smooth, /area/station/science/genetics) "azK" = ( -/obj/machinery/mecha_part_fabricator{ - dir = 4 - }, +/obj/machinery/mecha_part_fabricator, /obj/effect/turf_decal/stripes/box, /turf/open/floor/noslip{ icon_state = "textured_white"; @@ -948,11 +1025,14 @@ /obj/item/seeds/corn, /obj/item/seeds/corn, /obj/item/seeds/corn, +/mob/living/basic/mothroach, /turf/open/floor/grass, /area/station/service/hydroponics) "azP" = ( /obj/structure/cable, /obj/effect/spawner/random/trash, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) "azT" = ( @@ -979,6 +1059,29 @@ /obj/machinery/light/directional/west, /turf/open/floor/wood, /area/station/command/heads_quarters/rd) +"aAy" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/white/filled/line{ + color = "#009dc4" + }, +/obj/effect/turf_decal/trimline/white/line{ + dir = 1; + color = "#009dc4" + }, +/obj/structure/sign/directions/evac/directional/south{ + pixel_y = -41 + }, +/obj/structure/sign/directions/supply/directional/south{ + pixel_y = -33; + layer = 3.3 + }, +/obj/structure/sign/directions/command/directional/south{ + layer = 3.2; + pixel_y = -25 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "aAK" = ( /obj/structure/window/spawner/directional/north, /obj/structure/window/spawner/directional/south, @@ -1023,11 +1126,15 @@ }, /obj/effect/turf_decal/trimline/blue/line, /obj/machinery/light/directional/north, +/obj/machinery/airalarm/directional/north, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "aCp" = ( /mob/living/basic/butterfly, /obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/iron/vaporwave, /area/station/service/library) "aDe" = ( @@ -1064,9 +1171,8 @@ /area/station/commons/fitness/recreation/entertainment) "aDB" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/no_smoking, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "aEw" = ( /obj/structure/sign/poster/official/high_class_martini, /turf/closed/wall, @@ -1288,18 +1394,23 @@ "aJj" = ( /obj/structure/cable, /obj/effect/spawner/random/trash/graffiti, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) "aJn" = ( /obj/effect/mapping_helpers/airlock/access/any/command/hop, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command/glass{ - name = "Head of Personel's office" + name = "Head of Personel's Office" }, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/hop) "aJy" = ( @@ -1313,11 +1424,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/engine, /area/station/cargo/miningoffice) -"aJU" = ( -/obj/structure/table/reinforced/rglass, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/hfr_room) "aKn" = ( /turf/closed/wall/r_wall, /area/station/commons/vacant_room/commissary) @@ -1328,6 +1434,7 @@ /obj/effect/turf_decal/stripes{ dir = 10 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, /area/station/science/robotics/lab) "aKN" = ( @@ -1335,7 +1442,7 @@ dir = 4 }, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "aKV" = ( /obj/structure/table/wood, /obj/effect/spawner/random/entertainment/gambling, @@ -1349,6 +1456,7 @@ /obj/effect/turf_decal/trimline/purple/filled/mid_joiner{ dir = 1 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white/textured_large, /area/station/science/robotics/lab) "aLI" = ( @@ -1413,8 +1521,17 @@ dir = 4 }, /obj/machinery/camera/autoname/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/textured, /area/station/medical/morgue) +"aOb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "aOq" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -1432,6 +1549,18 @@ color = "#D381C9" }, /area/station/science/robotics) +"aOF" = ( +/obj/effect/spawner/structure/window/reinforced/plasma, +/obj/structure/cable, +/obj/machinery/door/poddoor/shutters/window/preopen{ + name = "Prison Lockdown Shutters"; + id = "prisonshutters" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/security/brig) "aOI" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/purple/filled/warning{ @@ -1442,6 +1571,8 @@ req_access = list("robotics"); name = "Surgery" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/noslip{ icon_state = "textured_white"; color = "#999999" @@ -1540,19 +1671,6 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/sorting) -"aSf" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/station/commons/fitness/recreation/entertainment) -"aSn" = ( -/obj/structure/chair/stool/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "aSq" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -1737,6 +1855,7 @@ /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/medical/medbay/lobby) "aVb" = ( @@ -1753,6 +1872,7 @@ /obj/effect/turf_decal/trimline/green/line{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) "aVg" = ( @@ -1816,6 +1936,7 @@ /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/aft) "aWp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den/gaming) "aWJ" = ( @@ -1901,13 +2022,9 @@ /area/station/commons/fitness) "aYJ" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/start/scientist, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 4 - }, /turf/open/floor/iron/white, -/area/station/science/robotics/mechbay) +/area/station/science/circuits) "aYY" = ( /turf/open/floor/plating/ocean/pit, /area/ocean) @@ -1919,7 +2036,7 @@ dir = 10 }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "aZB" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/engine, @@ -1953,6 +2070,8 @@ id = "prisonshutters" }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/security/brig) "bak" = ( @@ -1988,6 +2107,15 @@ /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /turf/open/floor/plating/ocean, /area/ocean/generated_above) +"bbm" = ( +/obj/machinery/duct/industrial/waste, +/obj/effect/turf_decal/trimline/red/line, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "bbo" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -2018,6 +2146,8 @@ dir = 6 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/medical/morgue) "bbN" = ( @@ -2113,6 +2243,8 @@ color = "#009dc4"; dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) "bey" = ( @@ -2170,6 +2302,12 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/port/central) +"bgk" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/random/trash/graffiti, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "bgy" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/structure/cable, @@ -2183,6 +2321,7 @@ dir = 8 }, /obj/machinery/airalarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/miningoffice) "bgQ" = ( @@ -2196,6 +2335,9 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/iron/dark/textured, /area/station/security/courtroom) "bhD" = ( @@ -2339,9 +2481,7 @@ }, /area/station/science/robotics) "bkP" = ( -/obj/machinery/light/small/directional/east{ - dir = 1 - }, +/obj/machinery/light/small/maintenance/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "bkQ" = ( @@ -2360,7 +2500,7 @@ }, /obj/machinery/vending/wallmed/directional/south, /turf/open/floor/iron/white/textured, -/area/station/medical/surgery/aft) +/area/station/medical/patients_rooms/room_a) "blt" = ( /obj/structure/cable, /obj/machinery/light/small/directional/east{ @@ -2374,12 +2514,9 @@ name = "HoP Queue Shutters" }, /obj/machinery/door/firedoor, -/obj/machinery/door/firedoor/border_only, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) "blR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/machinery/door/poddoor/shutters/preopen{ dir = 8; @@ -2434,6 +2571,11 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"bmM" = ( +/obj/effect/turf_decal/tile/blue/diagonal_centre, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/diagonal, +/area/station/medical/medbay/lobby) "bmW" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners{ @@ -2442,6 +2584,8 @@ /obj/effect/turf_decal/tile/neutral/fourcorners{ color = "#009dc4" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, /area/station/commons/dorms) "bmY" = ( @@ -2499,6 +2643,7 @@ /obj/effect/turf_decal/trimline/green/line{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) "boz" = ( @@ -2557,6 +2702,22 @@ /obj/effect/turf_decal/trimline/brown, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/aft) +"bpJ" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/plumbing/floor_pump/input/on/waste/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) +"bpV" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/vaporwave, +/area/station/service/library) "bpX" = ( /obj/machinery/door/airlock/public/glass{ name = "Central Access" @@ -2567,6 +2728,7 @@ dir = 1 }, /obj/effect/turf_decal/trimline/purple/filled/warning, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "bqt" = ( @@ -2619,6 +2781,7 @@ "brz" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction/yjunction, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/aft) "bsd" = ( @@ -2657,9 +2820,7 @@ /area/station/engineering/atmos) "btf" = ( /obj/effect/landmark/start/geneticist, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/grass, /area/station/science/genetics) "btg" = ( @@ -2672,7 +2833,7 @@ "btu" = ( /obj/effect/turf_decal/siding/blue, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "btw" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2707,7 +2868,7 @@ }, /obj/machinery/light/directional/south, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "buF" = ( /obj/machinery/duct/industrial/waste, /obj/machinery/light/floor/has_bulb, @@ -2723,6 +2884,7 @@ dir = 4 }, /obj/machinery/holopad/secure, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, /area/station/security/warden) "bvp" = ( @@ -2732,6 +2894,21 @@ /obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron/dark/textured, /area/station/engineering/break_room) +"bvz" = ( +/obj/machinery/iv_drip, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/central) +"bvG" = ( +/obj/machinery/door/airlock/glass_large{ + name = "Waiting Room" + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/stairs, +/area/station/medical/medbay/lobby) "bvJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2766,7 +2943,7 @@ /area/station/hallway/secondary/service) "bwZ" = ( /obj/machinery/door/airlock/command/glass{ - name = "Bridge" + name = "Captain's Quarters" }, /obj/effect/mapping_helpers/airlock/access/all/command/general, /obj/structure/cable, @@ -2774,8 +2951,13 @@ id = "council blast"; name = "Council Blast Doors" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/command/heads_quarters/captain/private) +"bxs" = ( +/turf/closed/wall/r_wall, +/area/station/medical/psychology) "bxM" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -2820,6 +3002,9 @@ "byf" = ( /obj/structure/cable, /obj/effect/landmark/start/captain, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/carpet/purple, /area/station/command/heads_quarters/captain/private) "byh" = ( @@ -2830,7 +3015,7 @@ /area/station/engineering/atmos/office) "bys" = ( /obj/machinery/door/airlock/medical/glass{ - name = "Operating Storage Room" + name = "Medical Cold Room" }, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -2868,17 +3053,8 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"byK" = ( -/obj/structure/cable, -/obj/structure/table/reinforced/rglass, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "bzg" = ( /obj/structure/cable, -/obj/effect/spawner/random/structure/closet_maintenance, -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/maintenance, /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/plating, /area/station/maintenance/disposal) @@ -2901,6 +3077,27 @@ /obj/effect/landmark/start/captain, /turf/open/floor/carpet/purple, /area/station/command/heads_quarters/captain/private) +"bAw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/cargo/warehouse) +"bAJ" = ( +/obj/machinery/duct/industrial/waste, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/mid_joiner{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark/textured_edge{ + dir = 8 + }, +/area/station/hallway/primary/central) "bAN" = ( /obj/structure/closet/crate/coffin, /obj/machinery/camera/autoname/directional/north, @@ -3018,6 +3215,9 @@ "bCu" = ( /obj/machinery/light_switch/directional/west, /obj/effect/landmark/start/clown, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/eighties/red{ icon = 'goon/icons/turf/floors.dmi'; icon_state = "clown_carpet" @@ -3108,7 +3308,7 @@ dir = 4 }, /turf/open/floor/iron/dark/textured, -/area/station/maintenance/port/aft) +/area/station/security) "bDK" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -3150,6 +3350,8 @@ dir = 1 }, /obj/effect/turf_decal/trimline/red/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "bEC" = ( @@ -3216,7 +3418,7 @@ dir = 8 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "bGX" = ( /turf/open/floor/carpet/blue, /area/station/commons/fitness/recreation/entertainment) @@ -3272,11 +3474,12 @@ /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "bHH" = ( /obj/machinery/door/airlock/hydroponics/glass{ - name = "Hydroponics" + name = "Chicken Ranch" }, /obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, /obj/structure/cable, @@ -3291,7 +3494,6 @@ /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics/upper) "bHT" = ( -/obj/structure/table/wood, /obj/item/storage/fancy/cigarettes{ pixel_y = 7; pixel_x = -4 @@ -3307,6 +3509,7 @@ pixel_y = 2 }, /obj/item/book/manual/wiki/detective, +/obj/structure/table/wood, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) "bIa" = ( @@ -3385,6 +3588,10 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) +"bJx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/carpet/purple, +/area/station/command/heads_quarters/captain/private) "bJz" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -3409,7 +3616,7 @@ color = "#00ff00" }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "bKh" = ( /turf/closed/wall/r_wall, /area/station/medical/office) @@ -3432,6 +3639,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, /area/station/hallway/secondary/service) +"bKY" = ( +/obj/effect/mapping_helpers/airlock/access/all/medical/virology, +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/virology) "bLk" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall/r_wall, @@ -3448,11 +3666,20 @@ "bLp" = ( /obj/structure/table/wood, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "bLD" = ( /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/central) +"bLK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 6 + }, +/obj/structure/chair, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/lobby) "bLR" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -3560,6 +3787,7 @@ /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured, /area/station/science/robotics/lab) "bOO" = ( @@ -3623,7 +3851,7 @@ dir = 10 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "bPH" = ( /obj/machinery/conveyor/auto{ dir = 10 @@ -3655,6 +3883,7 @@ /obj/structure/cable, /obj/structure/table/wood, /obj/item/paper/pamphlet, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/hop) "bQC" = ( @@ -3679,8 +3908,14 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/ruin/space/ks13/engineering/secure_storage) +"bRO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/commons/dorms) "bRT" = ( /obj/structure/table/optable, /obj/structure/window/spawner/directional/east, @@ -3733,6 +3968,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "bSK" = ( @@ -3740,6 +3976,8 @@ dir = 4 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/vaporwave, /area/station/service/library) "bST" = ( @@ -3776,6 +4014,9 @@ /turf/open/floor/wood, /area/station/commons/lounge) "bTx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/wood, /area/station/command/heads_quarters/rd) "bTB" = ( @@ -3793,10 +4034,22 @@ dir = 1 }, /obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/machinery/door/airlock/public/glass, +/obj/machinery/door/airlock/public/glass{ + name = "Recovery B" + }, /obj/structure/cable, /turf/open/floor/iron/white/textured, -/area/station/medical/surgery/aft) +/area/station/medical/patients_rooms/room_b) +"bTZ" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners{ + color = "#009dc4" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners{ + color = "#009dc4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/showroomfloor, +/area/station/commons/dorms) "bUk" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -3809,6 +4062,13 @@ "bUu" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/science) +"bUA" = ( +/obj/effect/turf_decal/trimline/red/filled/warning, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/station/security/office) "bUM" = ( /turf/open/floor/grass, /area/station/medical/virology) @@ -3906,7 +4166,7 @@ /area/station/service/electronic_marketing_den) "bXE" = ( /obj/machinery/door/airlock/public/glass{ - name = "Central Access" + name = "Cargo Lobby" }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/brown/filled/warning{ @@ -3917,6 +4177,12 @@ }, /turf/open/floor/iron/dark/diagonal, /area/station/cargo/lobby) +"bYp" = ( +/obj/effect/turf_decal/trimline/red/filled/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/security/office) "bYt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -3954,12 +4220,24 @@ /obj/structure/disposalpipe/segment{ dir = 2 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/pod/dark, /area/station/security/warden) "bZS" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/cargo/storage) +"bZY" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/obj/structure/closet/crate/decorations, +/obj/effect/turf_decal/bot, +/obj/item/lightreplacer, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/main) "caj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ @@ -3976,6 +4254,7 @@ /area/station/service/kitchen) "cbc" = ( /obj/machinery/light/small/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/locker) "cbq" = ( @@ -3994,17 +4273,31 @@ dir = 9 }, /obj/effect/turf_decal/trimline/red/corner, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) "cbu" = ( /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"cbM" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/structure/cable/industrial, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/main) +"cbv" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/science/lobby) +"cbR" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/vaporwave, +/area/station/service/library) "cbS" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/open/floor/engine, @@ -4021,6 +4314,8 @@ dir = 6 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, /area/station/medical/pharmacy) "ccr" = ( @@ -4099,6 +4394,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"cdW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/textured, +/area/station/medical/office) "cdY" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -4152,6 +4451,11 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/wood, /area/station/commons/lounge) +"cfn" = ( +/obj/effect/spawner/random/structure/grille, +/obj/machinery/light/small/maintenance/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "cfz" = ( /obj/structure/lattice, /obj/structure/disposalpipe/segment{ @@ -4160,10 +4464,6 @@ }, /turf/open/floor/plating/ocean, /area/ocean) -"cfI" = ( -/obj/structure/cable, -/turf/open/floor/iron/showroomfloor, -/area/station/commons/toilet/locker) "cfO" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -4183,6 +4483,16 @@ /mob/living/basic/cockroach, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) +"cgN" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "che" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /obj/structure/cable/industrial, @@ -4253,7 +4563,6 @@ /area/station/maintenance/starboard/aft) "ckb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners{ color = "#009dc4" }, @@ -4283,6 +4592,7 @@ dir = 8; color = "#009dc4" }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) "ckl" = ( @@ -4322,16 +4632,14 @@ /turf/open/floor/plating, /area/station/science/lab) "ckX" = ( -/obj/structure/table/glass/plasmaglass, -/obj/item/ai_module/toy_ai{ - pixel_x = 5 - }, -/obj/item/ai_module/supplied/freeform, /obj/item/radio/intercom/directional/south{ broadcasting = 1; frequency = 1447; name = "Private Channel" }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/carpet/cyan, /area/station/ai_monitored/turret_protected/ai_upload) "ckZ" = ( @@ -4340,15 +4648,22 @@ dir = 6 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/hop) +"clh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/cargo/warehouse) "clw" = ( /obj/structure/disposalpipe/segment, /obj/effect/spawner/random/maintenance, /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) "cly" = ( -/obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 }, @@ -4356,8 +4671,9 @@ dir = 1 }, /obj/machinery/light/directional/east, +/obj/machinery/iv_drip, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "clC" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/egg_incubator, @@ -4395,6 +4711,9 @@ "cmX" = ( /obj/structure/cable, /obj/machinery/duct/industrial/waste, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "cne" = ( @@ -4402,7 +4721,6 @@ dir = 8 }, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) @@ -4413,7 +4731,7 @@ /obj/effect/turf_decal/trimline/blue/corner{ dir = 1 }, -/obj/structure/table/glass, +/obj/structure/table/reinforced/rglass, /obj/item/storage/backpack/duffelbag/med/surgery, /obj/machinery/defibrillator_mount/directional/south, /turf/open/floor/iron/white/textured, @@ -4468,6 +4786,8 @@ /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 1 }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "cpK" = ( @@ -4475,7 +4795,6 @@ dir = 4 }, /obj/structure/cable, -/obj/structure/table/reinforced/rglass, /turf/open/floor/iron/dark, /area/station/engineering/atmos) "cpM" = ( @@ -4509,7 +4828,6 @@ /area/station/tcommsat/server) "cqr" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/garbage, /turf/open/floor/iron/grimy, /area/station/service/theater/abandoned) "cqw" = ( @@ -4532,6 +4850,7 @@ /obj/effect/turf_decal/trimline/white/filled/warning{ color = "#009dc4" }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "csW" = ( @@ -4554,7 +4873,7 @@ dir = 5 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "cum" = ( /obj/structure/chair/comfy/carp, /obj/effect/landmark/event_spawn, @@ -4585,6 +4904,7 @@ desc = "As seen in your favourite Japanese cartoon."; name = "anime katana" }, +/obj/machinery/airalarm/directional/south, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den/gaming) "cvg" = ( @@ -4599,12 +4919,21 @@ /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "cvu" = ( /obj/structure/sink/kitchen/directional/east, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"cvx" = ( +/obj/effect/spawner/random/trash, +/obj/structure/cable, +/obj/machinery/light/small/maintenance/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "cvG" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/bot, @@ -4634,6 +4963,7 @@ dir = 1; color = "#009dc4" }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "cxm" = ( @@ -4641,10 +4971,10 @@ /obj/machinery/door/airlock/security{ name = "Customs Desk" }, -/obj/effect/mapping_helpers/airlock/access/any/security/maintenance, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "cxv" = ( @@ -4665,6 +4995,17 @@ /obj/structure/closet/secure_closet/atmospherics, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"cxZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "council blast"; + name = "Council Blast Doors" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/command/meeting_room/council) "cyd" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/effect/turf_decal/tile/dark_blue/opposingcorners{ @@ -4735,6 +5076,15 @@ /obj/effect/spawner/random/trash/graffiti, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"cAt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/airlock/public{ + name = "Common Room" + }, +/turf/open/floor/wood, +/area/station/commons/fitness/recreation/entertainment) "cAu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -4766,7 +5116,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 6 }, -/obj/structure/table/glass/plasmaglass, +/obj/structure/table, /obj/machinery/ecto_sniffer, /obj/machinery/light/small/directional/south{ pixel_y = 6 @@ -4797,6 +5147,12 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"cBn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/carpet/executive, +/area/station/command/meeting_room/council) "cBs" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/iron/vaporwave, @@ -4847,6 +5203,7 @@ dir = 1 }, /obj/structure/disposalpipe/segment, +/obj/effect/landmark/navigate_destination/aiupload, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) "cCH" = ( @@ -4952,7 +5309,7 @@ dir = 4 }, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "cFo" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -4984,8 +5341,9 @@ /obj/effect/turf_decal/trimline/white/filled/line{ color = "#00ff00" }, +/obj/structure/cable, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "cGk" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/tcoms, /obj/structure/cable, @@ -5021,6 +5379,13 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/entry) +"cHg" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "cHj" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, @@ -5036,6 +5401,8 @@ dir = 1; color = "#009dc4" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, /area/station/commons/dorms) "cHp" = ( @@ -5044,6 +5411,9 @@ dir = 1 }, /obj/structure/table/glass, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/mapping_helpers/apc/cell_10k, +/obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/command/bridge) "cHF" = ( @@ -5056,12 +5426,8 @@ /area/station/science/lobby) "cHQ" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 4 - }, /turf/open/floor/iron/white, -/area/station/science/robotics/mechbay) +/area/station/science/circuits) "cHZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -5072,6 +5438,7 @@ /obj/effect/turf_decal/trimline/blue/line{ dir = 10 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/textured, /area/station/medical/morgue) "cIs" = ( @@ -5097,6 +5464,13 @@ /obj/structure/cable, /turf/open/floor/carpet/purple, /area/station/science/server) +"cJK" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "cKa" = ( /obj/machinery/atmospherics/components/binary/crystallizer{ dir = 4 @@ -5124,6 +5498,24 @@ /obj/effect/spawner/random/trash/graffiti, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) +"cKS" = ( +/obj/machinery/duct/industrial/waste, +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 1 + }, +/obj/structure/sign/directions/security/directional/south{ + pixel_y = -33 + }, +/obj/structure/sign/directions/engineering/directional/south{ + pixel_y = -41 + }, +/obj/structure/sign/directions/evac/directional/south{ + pixel_y = -25; + layer = 3.2 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "cKY" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/effect/turf_decal/tile/dark_blue/opposingcorners{ @@ -5158,8 +5550,8 @@ }, /area/station/cargo/miningoffice) "cMb" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Medbay Lobby" +/obj/machinery/door/airlock/research/glass{ + name = "Genetics Lab" }, /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 4 @@ -5206,13 +5598,12 @@ /turf/open/floor/iron/dark/textured, /area/station/medical/morgue) "cOb" = ( -/obj/machinery/dna_scannernew, /obj/effect/turf_decal/tile/green{ dir = 8 }, /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "cOl" = ( /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark/textured, @@ -5270,8 +5661,10 @@ dir = 1 }, /obj/machinery/keycard_auth/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "cPD" = ( /obj/structure/cable, /obj/machinery/holopad, @@ -5279,6 +5672,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/service/cafeteria) +"cPI" = ( +/obj/structure/window/spawner/directional/west, +/turf/open/floor/iron/dark/telecomms, +/area/station/maintenance/disposal) "cPJ" = ( /obj/machinery/camera/directional/east, /obj/machinery/cryopod{ @@ -5289,11 +5686,20 @@ color = "#00ff00" }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "cQf" = ( /obj/machinery/light_switch/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/plating, /area/station/service/kitchen/kitchen_backroom) +"cQi" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/warehouse) "cQn" = ( /obj/machinery/light/directional/south, /obj/machinery/camera/directional/south, @@ -5301,11 +5707,6 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "cQI" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/chem_pack{ - pixel_x = 10; - pixel_y = 10 - }, /obj/item/storage/box/rxglasses{ pixel_x = -4; pixel_y = 8 @@ -5315,12 +5716,14 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/white/corner{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/reinforced/rglass, +/obj/item/reagent_containers/chem_pack{ + pixel_x = 10; + pixel_y = 10 + }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "cQM" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -5365,8 +5768,20 @@ }, /obj/effect/turf_decal/trimline/dark_blue/filled/warning, /obj/structure/cable/multilayer/connected, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, -/area/station/command/bridge) +/area/station/maintenance/department/bridge) +"cRm" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen"; + name = "Kitchen" + }, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/station/service/bar) "cRO" = ( /obj/machinery/camera/autoname/directional/west, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -5394,7 +5809,7 @@ dir = 8 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "cSp" = ( /obj/machinery/light/directional/east, /obj/structure/table, @@ -5424,33 +5839,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/auxiliary) -"cSD" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Chief Engineer's Office" - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/obj/structure/closet/secure_closet/engineering_electrical, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/effect/turf_decal/bot, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 7 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured_corner{ - dir = 8 - }, -/area/station/engineering/break_room) "cSR" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/iron, @@ -5525,12 +5913,12 @@ /area/station/service/kitchen/kitchen_backroom) "cUS" = ( /obj/effect/landmark/start/psychologist, -/obj/structure/chair{ - dir = 1 - }, /obj/effect/turf_decal/trimline/blue/line{ dir = 5 }, +/obj/structure/chair{ + dir = 1 + }, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) "cUU" = ( @@ -5543,8 +5931,8 @@ /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "cUY" = ( -/obj/machinery/light/small/directional/east, /obj/effect/spawner/random/structure/table_or_rack, +/obj/machinery/light/small/maintenance/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "cVA" = ( @@ -5604,12 +5992,15 @@ /area/station/maintenance/port/central) "cXs" = ( /obj/structure/cable, -/obj/machinery/door/airlock/external{ - name = "Escape Pod Four"; - space_dir = 4 - }, +/obj/machinery/door/airlock/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"cXE" = ( +/obj/machinery/plumbing/layer_manifold{ + buffer = 500 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "cXO" = ( /obj/effect/turf_decal/stripes{ dir = 8 @@ -5668,11 +6059,15 @@ /area/station/engineering/atmos) "cZm" = ( /obj/machinery/light/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/hop) "cZD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/carpet, /area/station/service/chapel/office) "cZZ" = ( @@ -5716,6 +6111,36 @@ /obj/effect/spawner/random/structure/closet_private, /turf/open/floor/wood/large, /area/station/security/checkpoint/customs) +"dbE" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Chief Engineer's Office" + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/structure/closet/secure_closet/engineering_electrical, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/effect/turf_decal/bot, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 7 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ + dir = 4 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 14 + }, +/turf/open/floor/iron/dark/textured_corner{ + dir = 8 + }, +/area/station/engineering/break_room) "dbI" = ( /obj/machinery/duct/industrial/waste, /obj/structure/disposalpipe/segment, @@ -5725,6 +6150,25 @@ /obj/effect/turf_decal/trimline/yellow/warning, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) +"dcc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/line, +/obj/structure/sign/directions/medical/directional/west{ + pixel_y = 32 + }, +/obj/structure/sign/directions/cryo/directional/west{ + layer = 3.2; + pixel_y = 40 + }, +/obj/structure/sign/directions/dorms/directional/west{ + pixel_y = 24 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "dck" = ( /obj/machinery/duct/industrial/waste, /obj/effect/turf_decal/trimline/yellow/line{ @@ -5807,6 +6251,13 @@ }, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) +"ddX" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/storage/tech) "ddY" = ( /obj/machinery/telecomms/broadcaster/preset_left, /obj/structure/cable, @@ -5819,6 +6270,9 @@ name = "Customs Desk" }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/security/checkpoint/supply) "deg" = ( @@ -5831,7 +6285,7 @@ dir = 4 }, /turf/open/floor/iron/white, -/area/station/science/robotics/mechbay) +/area/station/science/circuits) "dev" = ( /obj/structure/table/reinforced, /obj/item/flashlight, @@ -5898,11 +6352,11 @@ /area/station/tcommsat/server) "dgc" = ( /obj/machinery/door/airlock/maintenance{ - name = "CMO Maintenance" + name = "Psychology Maintenance" }, -/obj/effect/mapping_helpers/airlock/access/all/medical/cmo, +/obj/effect/mapping_helpers/airlock/access/all/medical/psychology, /turf/open/floor/plating, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "dgu" = ( /obj/structure/chair/sofa/right{ dir = 1 @@ -5959,7 +6413,7 @@ }, /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "dhA" = ( /obj/machinery/modular_computer/console/preset/id, /obj/machinery/light/directional/north, @@ -5978,13 +6432,11 @@ /turf/open/floor/iron, /area/station/security/checkpoint/science) "dhQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, /obj/structure/chair/sofa/left/brown{ dir = 1 }, /obj/effect/landmark/start/mime, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/service/theater/abandoned) "dhX" = ( @@ -6099,6 +6551,8 @@ color = "#52B4E9" }, /obj/effect/turf_decal/tile/blue/diagonal_centre, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/diagonal, /area/station/medical/medbay/lobby) "dky" = ( @@ -6137,6 +6591,14 @@ color = "#D381C9" }, /area/station/science/robotics) +"dle" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/aft) "dls" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6146,6 +6608,7 @@ /obj/effect/turf_decal/trimline/green/corner{ dir = 4 }, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "dlI" = ( @@ -6164,6 +6627,13 @@ /obj/structure/chair, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"dmg" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/purple, +/area/station/command/heads_quarters/captain/private) "dmj" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/trimline/white/filled/warning{ @@ -6210,18 +6680,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"dnj" = ( +"dna" = ( +/obj/machinery/duct/industrial/waste, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 }, -/obj/structure/table/glass, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 7 +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 }, -/obj/item/lightreplacer, -/obj/item/construction/plumbing/engineering, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/main) +/obj/machinery/door/firedoor, +/turf/open/floor/plastic, +/area/station/hallway/primary/central) "dnm" = ( /obj/structure/window/spawner/directional/south, /obj/effect/turf_decal/trimline/green/line{ @@ -6312,7 +6781,7 @@ id = "westcommissary"; name = "Privacy Shutters" }, -/turf/open/floor/plating, +/turf/open/floor/iron, /area/station/commons/vacant_room/commissary) "dpz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6407,6 +6876,7 @@ /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 }, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron/smooth, /area/station/science/genetics) "dqA" = ( @@ -6421,7 +6891,7 @@ /area/station/maintenance/starboard/central) "drc" = ( /obj/machinery/door/airlock/engineering/glass{ - name = "Engineering Foyer" + name = "Engineering Maintenance" }, /obj/machinery/door/poddoor/preopen{ id = "ceprivacy"; @@ -6438,7 +6908,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/table/glass/plasmaglass, +/obj/structure/table, /turf/open/floor/noslip{ icon_state = "textured_white"; color = "#999999" @@ -6450,10 +6920,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"drl" = ( -/obj/machinery/vending/boozeomat, -/turf/closed/wall/r_wall, -/area/station/security/warden) "drz" = ( /obj/structure/table/reinforced, /obj/machinery/cassette/adv_cassette_deck, @@ -6503,7 +6969,7 @@ }, /obj/effect/turf_decal/trimline/dark_blue/filled/warning, /turf/open/floor/iron/dark/textured, -/area/station/command/bridge) +/area/station/maintenance/department/bridge) "dsA" = ( /obj/machinery/camera/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners{ @@ -6514,18 +6980,15 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) +"dsB" = ( +/turf/closed/wall, +/area/station/commons/storage/mining) "dsO" = ( /obj/machinery/light/very_dim{ dir = 4 }, /obj/effect/decal/cleanable/dirt/dust, /obj/structure/rack, -/obj/item/clothing/suit/armor/riot/knight/yellow{ - name = "Engineering Knight armour" - }, -/obj/item/clothing/head/helmet/knight/yellow{ - name = "Engineering Knight helmet" - }, /turf/open/floor/iron/dark/textured, /area/station/engineering/main) "dtb" = ( @@ -6555,8 +7018,10 @@ /obj/effect/turf_decal/trimline/white{ color = "#00ff00" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "dtY" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -6597,11 +7062,25 @@ /obj/machinery/atmospherics/miner/oxygen, /turf/open/floor/engine/o2, /area/station/engineering/atmos) +"dvb" = ( +/obj/structure/curtain/cloth, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/service) "dvj" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /obj/machinery/meter, /turf/closed/wall/r_wall, /area/station/engineering/atmos) +"dvn" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/security/office) "dvM" = ( /obj/machinery/duct/industrial/waste, /obj/structure/disposalpipe/segment, @@ -6621,6 +7100,7 @@ /area/station/medical/surgery/theatre) "dwb" = ( /obj/effect/turf_decal/tile/green/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) "dwx" = ( @@ -6663,20 +7143,15 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"dyf" = ( -/obj/machinery/computer/cloning{ - dir = 1 - }, -/turf/open/floor/iron/white/textured, -/area/station/science/genetics) "dyl" = ( /obj/machinery/door/airlock{ - name = "Hydroponics Backroom" + name = "Service Hallway" }, /obj/effect/mapping_helpers/airlock/access/all/service/general, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, /turf/open/floor/iron/grimy, /area/station/service/hydroponics) "dys" = ( @@ -6754,6 +7229,11 @@ }, /turf/open/floor/iron/dark/textured, /area/station/cargo/sorting) +"dBb" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/purple, +/area/station/command/heads_quarters/captain/private) "dBe" = ( /obj/machinery/computer/teleporter{ dir = 8 @@ -6830,8 +7310,10 @@ /area/station/ai_monitored/turret_protected/ai_upload) "dCI" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "dCW" = ( /obj/machinery/duct/industrial/waste, /obj/structure/disposalpipe/segment{ @@ -6868,6 +7350,8 @@ dir = 8 }, /obj/machinery/newscaster/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/noslip{ icon_state = "textured_white"; color = "#D381C9" @@ -6882,7 +7366,7 @@ /area/station/science/ordnance/office) "dEa" = ( /obj/machinery/door/airlock/public/glass{ - name = "Art Gallery" + name = "Library" }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6911,11 +7395,12 @@ /obj/effect/landmark/start/medical_doctor, /obj/effect/turf_decal/trimline/blue/filled/line, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark/textured, /area/station/medical/morgue) "dFm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/mech_bay_recharge_port{ dir = 2 }, @@ -6963,6 +7448,8 @@ dir = 1 }, /obj/effect/turf_decal/trimline/purple/filled/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, /area/station/science/robotics/lab) "dGs" = ( @@ -6999,6 +7486,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "dGY" = ( @@ -7008,12 +7496,12 @@ /obj/item/compact_remote, /obj/machinery/light_switch/directional/south, /obj/effect/turf_decal/trimline/purple/filled/line, -/turf/open/floor/iron/dark, -/area/station/science/robotics/mechbay) +/turf/open/floor/iron/white, +/area/station/science/circuits) "dHt" = ( /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/stairs, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "dHJ" = ( /obj/structure/cable, /obj/structure/reagent_dispensers/wall/peppertank/directional/east, @@ -7031,12 +7519,9 @@ dir = 4; color = "#9FED58" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, -/area/station/command/bridge) -"dHZ" = ( -/obj/structure/table/reinforced/rglass, -/turf/open/floor/iron, -/area/station/engineering/atmos) +/area/station/command/meeting_room/council) "dIh" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -7054,7 +7539,7 @@ dir = 4 }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "dIv" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/purple/filled/mid_joiner{ @@ -7063,6 +7548,9 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron/white/textured_large, /area/station/science/robotics/lab) "dIW" = ( @@ -7079,15 +7567,10 @@ /mob/living/basic/chicken, /turf/open/misc/sandy_dirt, /area/station/service/hydroponics/upper) -"dJR" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/spawner/random/structure/table_or_rack, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) "dJU" = ( /obj/structure/window/spawner/directional/south, /obj/effect/turf_decal/trimline/purple/filled/line, -/obj/structure/table/glass/plasmaglass, +/obj/structure/table, /obj/item/storage/backpack/duffelbag/med/surgery, /turf/open/floor/noslip{ icon_state = "textured_white"; @@ -7100,7 +7583,6 @@ name = "Air to Distro" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/table/reinforced/rglass, /turf/open/floor/iron/dark, /area/station/engineering/atmos) "dKw" = ( @@ -7131,8 +7613,19 @@ /obj/machinery/light/small/directional/east, /obj/structure/cable, /obj/structure/reagent_dispensers/wall/peppertank/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/checkpoint/science) +"dLP" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/security/courtroom) "dLS" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner, /obj/effect/landmark/start/station_engineer, @@ -7146,10 +7639,11 @@ dir = 4 }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "dMc" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/locker) "dMe" = ( @@ -7167,7 +7661,7 @@ color = "#00ff00" }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "dMj" = ( /obj/structure/fans/tiny/forcefield{ dir = 8 @@ -7211,17 +7705,9 @@ /obj/effect/turf_decal/trimline/dark_blue/line{ dir = 4 }, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark/textured, /area/station/command/bridge) -"dMV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron/smooth, -/area/station/science/genetics) "dMY" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/iron/dark, @@ -7263,6 +7749,7 @@ dir = 9 }, /obj/effect/turf_decal/trimline/blue/corner, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "dOF" = ( @@ -7277,12 +7764,17 @@ /obj/effect/spawner/random/trash/graffiti, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"dOX" = ( +/mob/living/basic/goat/pete, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/service/kitchen/kitchen_backroom) "dPd" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 6 }, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "dPe" = ( /obj/machinery/grill, /obj/item/stack/sheet/mineral/coal/ten, @@ -7299,6 +7791,7 @@ /obj/effect/turf_decal/trimline/yellow/corner{ dir = 1 }, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) "dPU" = ( @@ -7313,7 +7806,7 @@ dir = 1 }, /turf/closed/wall, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "dQd" = ( /turf/open/floor/engine/plasma, /area/station/engineering/atmos) @@ -7352,7 +7845,7 @@ name = "Mender Moff" }, /turf/open/floor/carpet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "dRJ" = ( /obj/machinery/status_display/ai, /turf/closed/wall/r_wall, @@ -7417,8 +7910,8 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/science/robotics/mechbay) +/turf/open/floor/iron/white, +/area/station/science/circuits) "dTn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7539,6 +8032,8 @@ /area/station/engineering/atmos/hfr_room) "dWC" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/vaporwave, /area/station/service/library) "dWT" = ( @@ -7578,8 +8073,10 @@ /obj/effect/turf_decal/trimline/blue/warning{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "dXN" = ( /obj/machinery/status_display/ai, /obj/structure/table/glass, @@ -7608,6 +8105,7 @@ dir = 1; color = "#009dc4" }, +/obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "dYl" = ( @@ -7623,8 +8121,17 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/white/textured, /area/station/medical/storage) +"dYC" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/storage/tech) "dYT" = ( /turf/open/floor/wood, /area/station/command/heads_quarters/qm) @@ -7634,7 +8141,7 @@ dir = 1 }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "dZk" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/mineral/titanium, @@ -7652,7 +8159,7 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/white/textured, -/area/station/medical/surgery/aft) +/area/station/medical/patients_rooms/room_a) "dZw" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 4 @@ -7663,7 +8170,6 @@ /turf/open/floor/iron/dark/textured, /area/station/science/lobby) "dZx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/chair/comfy/shuttle/tactical{ dir = 8 }, @@ -7773,15 +8279,33 @@ }, /turf/open/floor/carpet, /area/station/medical/office) +"ecc" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/light/small/maintenance/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "ecd" = ( /obj/machinery/telecomms/processor/preset_two, /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"ecf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "eco" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/commons/lounge) "ecr" = ( @@ -7795,7 +8319,7 @@ }, /obj/effect/turf_decal/trimline/blue/warning, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "ecC" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -7824,6 +8348,7 @@ /area/station/security/office) "ecM" = ( /obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel{ dir = 8 }, @@ -7868,13 +8393,10 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, /area/station/medical/office) -"eeS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/table/reinforced/rglass, -/turf/open/floor/iron, -/area/station/engineering/atmos) "eeW" = ( /obj/structure/cable, /obj/structure/disposalpipe/trunk{ @@ -7885,7 +8407,7 @@ }, /obj/machinery/door/window/brigdoor/security/cell{ id = "Cell 2"; - name = "Cell 2" + name = "Perma Transfer" }, /obj/structure/window/reinforced/tinted/frosted{ dir = 4 @@ -7955,7 +8477,7 @@ }, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white, -/area/station/science/robotics/mechbay) +/area/station/science/circuits) "eha" = ( /obj/machinery/smartfridge/organ, /obj/machinery/light/directional/north, @@ -7999,7 +8521,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, -/obj/structure/table/reinforced/rglass, /turf/open/floor/iron/dark, /area/station/engineering/atmos) "eig" = ( @@ -8037,11 +8558,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"eji" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/siding/purple, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) "ejk" = ( /obj/item/storage/medkit/regular{ pixel_x = 3; @@ -8057,12 +8573,12 @@ pixel_y = -3 }, /obj/structure/table/reinforced, -/obj/machinery/light/directional/north, /obj/machinery/door/window/right/directional/south{ dir = 8; name = "First Aid Supplies"; req_access = list("medical") }, +/obj/machinery/light/directional/east, /turf/open/floor/iron/white/textured, /area/station/medical/storage) "ejr" = ( @@ -8071,7 +8587,6 @@ /area/station/service/bar) "ejy" = ( /obj/effect/turf_decal/tile/green/half/contrasted, -/obj/machinery/light/directional/north, /obj/structure/table/reinforced, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) @@ -8083,6 +8598,8 @@ /area/station/cargo/storage) "ekx" = ( /obj/structure/disposalpipe/junction, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "ekZ" = ( @@ -8129,7 +8646,7 @@ }, /obj/effect/turf_decal/trimline/dark_blue/filled/corner, /turf/open/floor/iron/dark/textured, -/area/station/command/bridge) +/area/station/maintenance/department/bridge) "elP" = ( /obj/structure/rack, /obj/item/storage/box/lights/mixed, @@ -8142,6 +8659,19 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/dark/textured, /area/station/commons/storage/primary) +"emg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/line{ + color = "#009dc4" + }, +/obj/effect/turf_decal/trimline/white/filled/line{ + color = "#009dc4"; + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "ems" = ( /obj/effect/turf_decal/stripes, /obj/structure/cable/industrial, @@ -8154,18 +8684,15 @@ /area/station/command/heads_quarters/cmo) "emU" = ( /obj/machinery/door/airlock/external{ - name = "Escape Pod Four"; + name = "Departures"; space_dir = 4 }, /turf/open/floor/engine, /area/station/hallway/secondary/exit/departure_lounge) "ena" = ( -/obj/machinery/portable_atmospherics/canister/plasma, -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) +/obj/machinery/artifact_xray, +/turf/open/floor/engine, +/area/station/science/explab) "enq" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -8178,7 +8705,7 @@ "enN" = ( /obj/effect/landmark/start/head_of_personnel, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "eoD" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/light/directional/east, @@ -8186,8 +8713,21 @@ /area/station/engineering/atmos) "eoW" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/stairs, /area/station/cargo/warehouse/upper) +"eoY" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_edge{ + dir = 8 + }, +/area/station/engineering/main) "epb" = ( /obj/machinery/firealarm/directional/south, /obj/machinery/camera/autoname/directional/south, @@ -8197,6 +8737,9 @@ /obj/effect/turf_decal/tile/purple/opposingcorners{ dir = 1 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron/white, /area/station/science/lab) "epv" = ( @@ -8224,6 +8767,9 @@ /area/station/hallway/primary/aft) "epC" = ( /obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/hop) "epG" = ( @@ -8274,11 +8820,17 @@ }, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) +"eqC" = ( +/obj/effect/turf_decal/trimline/red/filled/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/security/office) "eqM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "eqO" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8347,7 +8899,7 @@ }, /obj/machinery/stasis, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "esh" = ( /obj/structure/toilet{ dir = 4 @@ -8371,26 +8923,23 @@ color = "#009dc4"; dir = 9 }, +/obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "esx" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, /obj/structure/rack, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/locker) "esy" = ( -/obj/machinery/door/airlock/public/glass{ +/obj/structure/cable, +/obj/machinery/door/airlock/bathroom{ name = "Toilet" }, -/obj/structure/cable, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/auxiliary) "esB" = ( /obj/machinery/door/airlock/command/glass{ - name = "Bridge" + name = "Bridge Observation" }, /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/iron/dark/textured, @@ -8399,12 +8948,6 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/dark/textured, /area/station/engineering/storage/tech) -"esM" = ( -/obj/item/storage/secure/safe/directional/north, -/obj/machinery/light/small/directional/west, -/obj/machinery/suit_storage_unit/security, -/turf/open/floor/pod/dark, -/area/station/security/warden) "etx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8447,13 +8990,6 @@ /obj/effect/turf_decal/trimline/blue, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) -"euB" = ( -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/effect/turf_decal/siding/purple{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) "euD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /turf/open/floor/engine, @@ -8473,6 +9009,10 @@ }, /turf/open/floor/carpet/neon/simple/green/nodots, /area/station/commons/lounge) +"evJ" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/wood, +/area/station/commons/lounge) "evR" = ( /obj/structure/closet/secure_closet/security/sec, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -8552,11 +9092,12 @@ /obj/effect/turf_decal/trimline/red/filled/warning, /obj/machinery/door/airlock/security/glass{ id_tag = "outerbrig"; - name = "Brig" + name = "Security" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "brig-entrance" }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/security/office) "exF" = ( @@ -8598,6 +9139,8 @@ }, /obj/structure/table/wood, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/service/library) "exZ" = ( @@ -8645,6 +9188,8 @@ /obj/structure/disposalpipe/segment{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/science/lobby) "ezM" = ( @@ -8667,6 +9212,7 @@ color = "#009dc4"; dir = 1 }, +/obj/effect/spawner/random/vending/snackvend, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "eAI" = ( @@ -8703,6 +9249,15 @@ dir = 4 }, /area/station/service/chapel) +"eBn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/effect/spawner/random/structure/grille, +/obj/machinery/light/small/maintenance/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "eBo" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate, @@ -8718,7 +9273,7 @@ dir = 4 }, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "eBB" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -8726,6 +9281,12 @@ }, /turf/closed/wall/r_wall, /area/station/cargo/miningoffice) +"eBF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/station/commons/storage/mining) "eBX" = ( /mob/living/basic/cockroach, /turf/open/floor/plating, @@ -8739,10 +9300,6 @@ }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"eCk" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall/r_wall, -/area/station/commons/fitness/recreation/entertainment) "eCp" = ( /obj/machinery/door/airlock/command{ name = "Chief Medical Officer's Office" @@ -8756,6 +9313,8 @@ /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, /area/station/command/heads_quarters/cmo) "eCB" = ( @@ -8794,14 +9353,11 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos) "eDz" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Atmospherics Maintenance" - }, +/obj/machinery/door/airlock/maintenance, /turf/open/floor/iron/dark, /area/station/maintenance/department/electrical) "eDF" = ( /obj/structure/table, -/obj/machinery/infuser, /obj/effect/turf_decal/trimline/green/filled/line{ dir = 1 }, @@ -8819,7 +9375,7 @@ /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "eDI" = ( -/obj/structure/table/glass, +/obj/structure/table/reinforced/rglass, /obj/item/newspaper, /turf/open/floor/iron/white/textured, /area/station/medical/office) @@ -8828,7 +9384,7 @@ dir = 4 }, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "eDZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/duct/industrial/waste, @@ -8910,14 +9466,10 @@ dir = 1 }, /obj/effect/turf_decal/trimline/purple/warning, -/turf/open/floor/iron/dark/textured_edge/airless{ +/turf/open/floor/iron/dark/textured_edge{ dir = 1 }, /area/station/science/lobby) -"eGh" = ( -/obj/effect/landmark/bitrunning/station_reward_spawn, -/turf/open/floor/carpet/neon/simple/orange/nodots, -/area/station/bitrunning/den) "eGI" = ( /obj/machinery/rnd/production/protolathe/department/science, /obj/effect/turf_decal/siding/purple, @@ -8926,8 +9478,8 @@ /turf/open/floor/iron/dark/textured_edge, /area/station/science/lab) "eGM" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Toilet" +/obj/machinery/door/airlock/bathroom{ + name = "Shower" }, /turf/open/floor/iron/showroomfloor, /area/station/medical/pharmacy) @@ -8943,7 +9495,6 @@ /area/station/medical/pharmacy) "eGV" = ( /obj/machinery/duct/industrial/waste, -/obj/structure/extinguisher_cabinet/directional/north, /obj/effect/turf_decal/trimline/white/line{ color = "#009dc4" }, @@ -8951,6 +9502,18 @@ color = "#009dc4"; dir = 1 }, +/obj/structure/sign/directions/command/directional/west{ + pixel_x = 0; + pixel_y = 39 + }, +/obj/structure/sign/directions/supply/directional/west{ + pixel_x = 0; + pixel_y = 31 + }, +/obj/structure/sign/directions/security/directional/west{ + pixel_x = 0; + pixel_y = 23 + }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "eHA" = ( @@ -8978,6 +9541,7 @@ /obj/effect/turf_decal/trimline/yellow/line{ dir = 1 }, +/obj/machinery/firealarm/directional/south, /turf/open/floor/plastic, /area/station/hallway/primary/central) "eHF" = ( @@ -9012,7 +9576,7 @@ /obj/structure/table/wood, /obj/item/reagent_containers/cup/soda_cans/random, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "eIg" = ( /turf/open/floor/iron/stairs, /area/station/engineering/main) @@ -9069,7 +9633,7 @@ /area/station/security/office) "eJv" = ( /turf/closed/wall/r_wall, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "eJV" = ( /obj/structure/cable/industrial, /turf/open/floor/plating, @@ -9118,21 +9682,25 @@ "eKU" = ( /obj/machinery/duct/industrial/waste, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse/upper) "eKW" = ( /obj/effect/spawner/random/engineering/tool, /turf/open/floor/iron, /area/station/commons/storage/emergency/port) +"eLe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/bar) "eLw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/table/wood, /obj/machinery/computer/security/wooden_tv{ pixel_x = 3; pixel_y = 2 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) "eLx" = ( @@ -9157,6 +9725,9 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron/dark/textured, /area/station/security/lockers) "eMz" = ( @@ -9197,6 +9768,8 @@ /obj/effect/decal/cleanable/blood/tracks{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/noslip{ icon_state = "textured_white"; color = "#999999" @@ -9328,6 +9901,8 @@ }, /obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, /obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/storage/tech) "eQp" = ( @@ -9340,6 +9915,8 @@ color = "#009dc4"; dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) "eQt" = ( @@ -9417,7 +9994,6 @@ desc = "A monkey grade survival knife."; name = "monke knife" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/grass, /area/station/science/genetics) "eSx" = ( @@ -9487,9 +10063,6 @@ /area/station/commons/storage/emergency/starboard) "eTM" = ( /obj/structure/sink/kitchen/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/station/service/kitchen/kitchen_backroom) @@ -9499,6 +10072,13 @@ }, /turf/open/floor/engine/co2, /area/station/engineering/atmos) +"eTZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/line, +/obj/structure/chair, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/lobby) "eUj" = ( /obj/machinery/airalarm/directional/north, /obj/structure/closet/crate/freezer, @@ -9621,10 +10201,25 @@ /obj/machinery/door/poddoor/shutters/preopen{ name = "Medical Closure Shutters"; desc = "Fuck off we're closed."; - dir = 4 + dir = 4; + id = "medclosed" }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) +"eXP" = ( +/obj/machinery/duct/industrial/waste, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/white/filled/warning{ + color = "#009dc4" + }, +/obj/effect/turf_decal/trimline/white/warning{ + color = "#009dc4"; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "eXV" = ( /obj/effect/turf_decal/stripes{ dir = 10 @@ -9690,6 +10285,11 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"eYQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/circuits) "eZx" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/rack, @@ -9723,6 +10323,8 @@ id = "kitchen"; name = "Kitchen" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/bar) "eZW" = ( @@ -9762,6 +10364,18 @@ /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron/dark, /area/station/cargo/sorting) +"faZ" = ( +/obj/effect/turf_decal/trimline/white/filled/line{ + color = "#009dc4"; + dir = 4 + }, +/obj/effect/turf_decal/trimline/white/line{ + dir = 8; + color = "#009dc4" + }, +/obj/structure/sign/directions/evac/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central/fore) "fbb" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -9781,6 +10395,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "fbj" = ( @@ -9922,8 +10539,8 @@ /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/medical/coldroom) "fdQ" = ( -/obj/machinery/light/small/directional/east, /obj/structure/closet/firecloset/full, +/obj/machinery/light/small/maintenance/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "fep" = ( @@ -9932,6 +10549,11 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 9 }, +/obj/machinery/cell_charger{ + pixel_y = 6; + pixel_x = -3 + }, +/obj/item/stock_parts/cell, /turf/open/floor/iron/dark/textured, /area/station/commons/storage/primary) "fet" = ( @@ -9977,6 +10599,9 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/iron, /area/station/cargo/miningoffice) "ffD" = ( @@ -10052,6 +10677,7 @@ /obj/effect/turf_decal/tile/dark_red/fourcorners, /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/checkpoint/science) "fhp" = ( @@ -10098,17 +10724,12 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/brig) -"fig" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/showroomfloor, -/area/station/commons/toilet/locker) "fij" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) "fiu" = ( @@ -10177,7 +10798,7 @@ dir = 6 }, /turf/open/floor/iron/dark/textured, -/area/station/command/bridge) +/area/station/maintenance/department/bridge) "fku" = ( /obj/structure/cable, /obj/machinery/duct/industrial/waste, @@ -10189,6 +10810,7 @@ /area/station/command/heads_quarters/cmo) "flc" = ( /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) "flp" = ( @@ -10220,7 +10842,7 @@ /area/station/science/ordnance/office) "fnB" = ( /obj/machinery/door/airlock/mining/glass{ - name = "Mining Base" + name = "Mining Office" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10353,6 +10975,23 @@ /obj/item/key/janitor, /turf/open/floor/iron/dark, /area/station/service/janitor) +"fqA" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central/fore) +"fqK" = ( +/obj/machinery/duct/industrial/waste, +/obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/effect/turf_decal/trimline/blue/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/lobby) "fqR" = ( /obj/effect/turf_decal/stripes{ dir = 4 @@ -10378,7 +11017,7 @@ /area/station/commons/vacant_room/commissary) "frP" = ( /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "fsb" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 6 @@ -10428,17 +11067,52 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/service/janitor) +"ftw" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/circuits) "ftA" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/machinery/light/directional/west, -/obj/machinery/chem_heater/withbuffer{ - pixel_x = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = 2 + }, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = 2 + }, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = 2 + }, +/obj/item/clothing/glasses/science{ + pixel_y = 3 + }, +/obj/item/clothing/gloves/latex/nitrile, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, +/obj/item/toy/figure/chemist{ + pixel_y = 13; + pixel_x = 8 + }, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) +"ftQ" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/trimline/white{ + color = "#009dc4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "fue" = ( /turf/closed/wall, /area/station/service/abandoned_gambling_den/gaming) @@ -10447,6 +11121,13 @@ /obj/effect/spawner/random/trash/graffiti, /turf/open/floor/plating, /area/station/cargo/storage) +"fun" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "fuw" = ( /obj/structure/table/glass, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -10471,6 +11152,9 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"fuH" = ( +/turf/open/floor/iron/dark/textured, +/area/station/commons/storage/mining) "fuQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10497,7 +11181,7 @@ "fvF" = ( /obj/structure/filingcabinet/filingcabinet, /turf/open/floor/wood/parquet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "fvN" = ( /obj/machinery/duct/industrial/waste, /obj/structure/disposalpipe/segment{ @@ -10508,6 +11192,8 @@ dir = 1 }, /obj/effect/turf_decal/trimline/purple/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "fvR" = ( @@ -10633,10 +11319,11 @@ /turf/open/floor/engine, /area/station/commons/storage/emergency/starboard) "fyB" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/effect/turf_decal/siding/purple, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) +/obj/machinery/atmospherics/components/unary/artifact_heatingpad{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/explab) "fyP" = ( /turf/open/floor/carpet/red, /area/station/security/office) @@ -10703,6 +11390,8 @@ }, /obj/machinery/holopad, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/service/library) "fAO" = ( @@ -10730,10 +11419,11 @@ color = "#009dc4" }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) "fBH" = ( -/obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/trimline/dark_red/filled/end{ dir = 1 }, @@ -10741,6 +11431,11 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) +"fBO" = ( +/obj/machinery/duct/industrial/waste, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/textured, +/area/station/medical/surgery/theatre) "fBZ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -10756,6 +11451,8 @@ }, /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/service/library) "fCx" = ( @@ -10774,6 +11471,8 @@ invisibility = 101 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/ruin/space/ks13/engineering/secure_storage) "fCM" = ( @@ -10804,6 +11503,7 @@ /obj/effect/turf_decal/trimline/white/line{ color = "#009dc4" }, +/obj/structure/sign/directions/dorms/directional/north, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "fDX" = ( @@ -10825,6 +11525,8 @@ /obj/machinery/holopad/secure{ pixel_x = -15 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/vaporwave, /area/station/service/library) "fEP" = ( @@ -10856,10 +11558,18 @@ }, /obj/effect/landmark/start/research_director, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "fFI" = ( /turf/open/floor/carpet/executive, /area/station/commons/vacant_room/commissary) +"fFL" = ( +/obj/machinery/duct/industrial/waste, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "fFN" = ( /obj/machinery/power/turbine/core_rotor{ dir = 4; @@ -10908,8 +11618,8 @@ /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/science/robotics/mechbay) +/turf/open/floor/iron/white, +/area/station/science/circuits) "fGN" = ( /obj/structure/cable, /obj/effect/spawner/random/structure/grille, @@ -10960,6 +11670,7 @@ /obj/effect/turf_decal/trimline/purple/corner{ dir = 1 }, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "fHB" = ( @@ -10980,8 +11691,17 @@ /obj/structure/cable/layer3, /obj/structure/fans/tiny/forcefield, /obj/effect/base_turf_modifier/pit, +/obj/effect/landmark/navigate_destination/minisat_access_ai, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"fHK" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/security/courtroom) "fHN" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -11024,6 +11744,8 @@ color = "#009dc4"; dir = 5 }, +/obj/effect/spawner/random/vending/snackvend, +/obj/structure/sign/directions/evac/directional/east, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "fIV" = ( @@ -11090,6 +11812,7 @@ codes_txt = "patrol;next_patrol=Hall-13"; location = "Hall-12" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "fLc" = ( @@ -11097,6 +11820,8 @@ dir = 8 }, /obj/machinery/light/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/noslip{ icon_state = "textured_white"; color = "#D381C9" @@ -11125,13 +11850,19 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/dark/textured, /area/station/commons/storage/primary) -"fMn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 +"fMh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/eighties/red{ + icon = 'goon/icons/turf/floors.dmi'; + icon_state = "clown_carpet" }, +/area/station/service/theater) +"fMn" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/miningoffice) "fMs" = ( @@ -11165,6 +11896,16 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"fMQ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/secondary/exit/departure_lounge) +"fNc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/engine, +/area/station/science/explab) "fNr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate_empty, @@ -11184,7 +11925,8 @@ }, /obj/machinery/door/poddoor/shutters/preopen{ name = "Medical Closure Shutters"; - desc = "Fuck off we're closed." + desc = "Fuck off we're closed."; + id = "medclosed" }, /turf/open/floor/iron/dark/textured, /area/station/medical/office) @@ -11315,7 +12057,8 @@ /area/station/commons/toilet/locker) "fQm" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/storage/tech) "fQp" = ( @@ -11324,9 +12067,11 @@ dir = 8 }, /turf/open/floor/iron/dark/textured, -/area/station/maintenance/port/aft) +/area/station/security) "fQw" = ( -/obj/machinery/door/airlock/external, +/obj/machinery/door/airlock/external{ + name = "External Access" + }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, @@ -11336,6 +12081,12 @@ "fQG" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos/office) +"fQO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "fRb" = ( /obj/machinery/plumbing/floor_pump/input/on/waste/directional/west, /obj/structure/chair/wood{ @@ -11396,8 +12147,15 @@ /area/station/ai_monitored/turret_protected/ai_upload) "fSk" = ( /obj/structure/cable/layer3, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating/ocean, /area/ocean) +"fSr" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/central) "fSs" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11541,6 +12299,7 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, +/obj/effect/spawner/random/trash/graffiti, /turf/open/floor/plating, /area/station/maintenance/port/aft) "fXb" = ( @@ -11664,6 +12423,9 @@ /area/station/service/library) "fZe" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) "fZn" = ( @@ -11732,11 +12494,13 @@ dir = 5 }, /obj/machinery/light/floor/has_bulb, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) "gan" = ( -/turf/open/floor/engine, -/area/station/science/robotics/mechbay) +/obj/machinery/portable_atmospherics/canister/plasma, +/turf/open/floor/iron/white, +/area/station/science/circuits) "gap" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -11795,10 +12559,11 @@ /turf/open/floor/iron/dark/textured, /area/station/security/office) "gbk" = ( -/obj/structure/table/glass/plasmaglass, +/obj/structure/table, /obj/item/electronics/tracker, /obj/item/electronics, /obj/item/book/manual/wiki/grenades, +/obj/machinery/cell_charger, /turf/open/floor/plating, /area/station/maintenance/port/central) "gbq" = ( @@ -11861,20 +12626,16 @@ /turf/open/floor/iron/dark, /area/station/maintenance/starboard/aft) "gct" = ( -/obj/structure/bed/pod{ - desc = "An old medical bed, just waiting for replacement with something up to date."; - dir = 8; - name = "medical bed" - }, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 }, /obj/effect/turf_decal/trimline/blue/line{ dir = 8 }, -/obj/item/bedsheet/medical, +/obj/machinery/defibrillator_mount/directional/north, +/obj/machinery/stasis, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "gcz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners{ color = "#009dc4" @@ -11905,6 +12666,12 @@ /obj/item/book, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/hop) +"gdB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/telecomms, +/area/station/maintenance/disposal) "gdO" = ( /obj/machinery/duct/industrial/waste, /obj/structure/disposalpipe/segment{ @@ -11936,6 +12703,15 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured, /area/mine/storage/public) +"geQ" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/lobby) "geR" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -11946,18 +12722,23 @@ "geU" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, -/obj/machinery/light_switch/directional/west, +/obj/machinery/light_switch/directional/west{ + pixel_y = -8 + }, /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 8 }, /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 8 }, +/obj/machinery/airalarm/directional/west{ + pixel_y = 6 + }, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "geV" = ( /obj/machinery/smartfridge/extract/preloaded, -/turf/open/floor/iron, +/turf/closed/wall/r_wall, /area/station/science/xenobiology) "gfg" = ( /obj/machinery/airalarm/directional/north, @@ -11972,7 +12753,7 @@ dir = 1 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "gfA" = ( /obj/machinery/dna_scannernew, /obj/machinery/camera/directional/west, @@ -11996,7 +12777,7 @@ "gfV" = ( /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/wood/parquet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "ggj" = ( /obj/machinery/duct/industrial/waste, /obj/effect/turf_decal/trimline/white/filled/warning{ @@ -12022,7 +12803,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command/glass{ - name = "Head of Personel's office" + name = "Bridge Observation" }, /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -12035,16 +12816,25 @@ /obj/machinery/door/window/brigdoor/left/directional/north{ req_access = list("security") }, +/obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/security/checkpoint/supply) "ggV" = ( /mob/living/basic/crab, +/obj/machinery/light/small/maintenance/directional/east, /turf/open/floor/holofloor/beach/water, /area/station/maintenance/starboard/aft) "ghc" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall/r_wall, /area/station/maintenance/starboard/aft) +"ghh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/science/genetics) "ghj" = ( /obj/effect/turf_decal/stripes{ dir = 10 @@ -12061,6 +12851,9 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 5 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "ghz" = ( @@ -12099,10 +12892,6 @@ "giY" = ( /turf/closed/wall, /area/station/maintenance/starboard/fore) -"gks" = ( -/obj/machinery/light_switch/directional/south, -/turf/open/floor/plating, -/area/station/science/ordnance/storage) "gky" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/effect/turf_decal/tile/dark_blue/opposingcorners{ @@ -12145,11 +12934,15 @@ /obj/effect/turf_decal/trimline/purple/filled/mid_joiner{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, /area/station/science/robotics/lab) "glJ" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/red/filled/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/security/office) "glV" = ( @@ -12206,7 +12999,7 @@ /area/station/maintenance/starboard/central) "gnt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/security/lockers) "gnF" = ( @@ -12223,13 +13016,28 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "sci" }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/science/lobby) "gop" = ( /obj/machinery/light/directional/east, /turf/open/floor/bamboo, /area/station/commons/fitness) +"got" = ( +/obj/effect/turf_decal/trimline/brown/filled/warning{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/warehouse/upper) "gpa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/mineral/titanium/purple, /area/station/command/teleporter) "gpd" = ( @@ -12254,6 +13062,9 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/cargo/storage) +"gpO" = ( +/turf/closed/wall/r_wall, +/area/station/science/circuits) "gpW" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/left/directional/north{ @@ -12263,6 +13074,12 @@ }, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) +"gqd" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "gqv" = ( /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 6 @@ -12349,9 +13166,11 @@ dir = 1 }, /obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/machinery/door/airlock/public/glass, +/obj/machinery/door/airlock/public/glass{ + name = "Recovery A" + }, /turf/open/floor/iron/white/textured, -/area/station/medical/surgery/aft) +/area/station/medical/patients_rooms/room_a) "gtk" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -12434,6 +13253,7 @@ /obj/machinery/light/floor/has_bulb, /obj/structure/cable, /obj/effect/turf_decal/trimline/brown, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse/upper) "gvw" = ( @@ -12466,7 +13286,7 @@ dir = 5 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "gvZ" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -12475,6 +13295,9 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "gwh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron, /area/ruin/space/ks13/engineering/secure_storage) "gwr" = ( @@ -12496,6 +13319,17 @@ /obj/effect/spawner/random/structure/crate_loot, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"gwM" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_edge{ + dir = 4 + }, +/area/station/engineering/main) "gwO" = ( /turf/closed/wall/r_wall, /area/station/medical/medbay/lobby) @@ -12507,6 +13341,21 @@ /obj/effect/turf_decal/trimline/brown/line{ dir = 10 }, +/obj/structure/sign/directions/evac/directional/east{ + pixel_x = 64; + pixel_y = 32 + }, +/obj/structure/sign/directions/security/directional/east{ + pixel_y = 32 + }, +/obj/structure/sign/directions/command/directional/east{ + pixel_y = 40; + layer = 3.1 + }, +/obj/structure/sign/directions/medical/directional/north{ + pixel_y = 24; + pixel_x = 32 + }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/aft) "gxr" = ( @@ -12515,8 +13364,13 @@ /obj/structure/disposalpipe/junction{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"gxS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth, +/area/station/commons/fitness/recreation) "gyj" = ( /obj/structure/disposalpipe/trunk{ dir = 2 @@ -12527,7 +13381,7 @@ dir = 9 }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "gym" = ( /obj/machinery/medical_kiosk, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -12538,6 +13392,9 @@ }, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) +"gyr" = ( +/turf/closed/wall/r_wall, +/area/station/command/meeting_room/council) "gyA" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 4 @@ -12552,7 +13409,6 @@ /area/station/tcommsat/server) "gyG" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/structure/table/reinforced, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/cup/bottle/multiver{ pixel_x = 6 @@ -12563,6 +13419,7 @@ }, /obj/item/book/manual/wiki/grenades, /obj/item/book/manual/wiki/chemistry, +/obj/structure/table/reinforced, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) "gyH" = ( @@ -12595,7 +13452,13 @@ /obj/structure/drain, /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/noslip, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) +"gzD" = ( +/obj/structure/closet/secure_closet/miner, +/obj/machinery/camera/autoname/directional/north, +/obj/structure/sign/directions/lavaland/directional/north, +/turf/open/floor/engine, +/area/station/cargo/miningoffice) "gzE" = ( /obj/machinery/duct/industrial/waste, /obj/effect/turf_decal/trimline/white/line{ @@ -12620,6 +13483,7 @@ /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) "gzY" = ( @@ -12665,6 +13529,7 @@ /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "gAB" = ( @@ -12681,7 +13546,7 @@ invisibility = 101 }, /obj/machinery/door/airlock/public/glass{ - name = "Medbay Lobby" + name = "Operating Theatre" }, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -12706,6 +13571,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 4 }, +/obj/effect/landmark/navigate_destination/bar, /turf/open/floor/carpet, /area/station/service/bar) "gBj" = ( @@ -12714,12 +13580,6 @@ }, /turf/closed/wall/r_wall, /area/station/cargo/miningoffice) -"gBL" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/station/science/ordnance/office) "gCe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -12758,6 +13618,7 @@ codes_txt = "patrol;next_patrol=Hall-24"; location = "Hall-23" }, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "gDp" = ( @@ -12821,12 +13682,16 @@ /obj/effect/turf_decal/trimline/yellow/corner{ dir = 8 }, +/obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "gEe" = ( -/obj/machinery/door/airlock/maintenance, +/obj/machinery/door/airlock/maintenance{ + name = "Service Hallway" + }, /obj/effect/mapping_helpers/airlock/access/all/service/general, /obj/structure/cable, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/station/commons/storage/emergency/port) "gEr" = ( @@ -12835,11 +13700,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) +"gEz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/storage/tech) "gEE" = ( /obj/machinery/smartfridge, /obj/machinery/door/firedoor, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) +"gEJ" = ( +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/structure/closet_maintenance, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "gES" = ( /obj/machinery/duct/industrial/waste, /mob/living/basic/cockroach, @@ -12914,6 +13791,7 @@ /area/station/service/chapel/office) "gHM" = ( /obj/machinery/light/directional/south, +/obj/structure/cable, /turf/open/floor/bamboo, /area/station/commons/fitness) "gIh" = ( @@ -12933,6 +13811,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark/herringbone, /area/station/science/server) "gIs" = ( @@ -12943,6 +13822,7 @@ /area/station/maintenance/starboard/aft) "gIB" = ( /obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, /turf/open/floor/bamboo, /area/station/commons/fitness) "gIV" = ( @@ -12964,6 +13844,9 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 9 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "gJS" = ( @@ -12971,8 +13854,9 @@ dir = 1 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/parquet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "gJV" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/barricade/wooden/crude, @@ -13002,6 +13886,18 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) +"gLl" = ( +/obj/machinery/duct/industrial/waste, +/obj/effect/turf_decal/trimline/white/filled/line{ + color = "#00ff00" + }, +/obj/effect/turf_decal/trimline/white/line{ + dir = 1; + color = "#00ff00" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "gLw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13073,6 +13969,16 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/port/central) +"gMX" = ( +/obj/effect/turf_decal/tile/dark_red/fourcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/supply) +"gNF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/hop) "gNH" = ( /obj/effect/turf_decal/delivery, /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, @@ -13121,6 +14027,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"gPF" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/medical/patients_rooms/room_b) "gPH" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -13130,6 +14040,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/central) +"gPI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/carpet/executive, +/area/station/command/meeting_room/council) "gPJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13157,7 +14073,7 @@ name = "Psychology Office Fax Machine" }, /turf/open/floor/wood/parquet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "gQC" = ( /obj/effect/gibspawner/xeno/bodypartless, /obj/structure/spider/stickyweb, @@ -13225,6 +14141,10 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "sci" }, +/obj/effect/landmark/navigate_destination/research, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/science/lobby) "gTr" = ( @@ -13239,8 +14159,8 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/science/robotics/mechbay) +/turf/open/floor/iron/white, +/area/station/science/circuits) "gUb" = ( /turf/open/floor/wood, /area/station/security/detectives_office) @@ -13290,7 +14210,7 @@ "gVL" = ( /obj/machinery/door/airlock/medical/glass{ id_tag = "MedbayFoyer"; - name = "Medbay Clinic" + name = "Medbay Office" }, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -13303,7 +14223,7 @@ dir = 4 }, /turf/open/floor/iron/white/textured_large, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "gVR" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/trimline/brown/corner{ @@ -13359,6 +14279,15 @@ /obj/machinery/cassette/adv_cassette_deck, /turf/open/floor/iron, /area/station/service/library) +"gXg" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "gXl" = ( /obj/machinery/computer/mechpad{ dir = 1 @@ -13413,7 +14342,7 @@ /obj/effect/turf_decal/trimline/blue/corner{ dir = 4 }, -/obj/structure/table/glass, +/obj/structure/table/reinforced/rglass, /obj/item/storage/backpack/duffelbag/med/surgery, /obj/machinery/defibrillator_mount/directional/south, /turf/open/floor/iron/white/textured, @@ -13449,6 +14378,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/hallway/primary/central) "gYO" = ( @@ -13461,6 +14391,10 @@ /obj/effect/spawner/random/food_or_drink/seed_rare, /turf/open/floor/grass, /area/station/maintenance/starboard/upper) +"gYT" = ( +/obj/machinery/airalarm/directional/south, +/turf/open/floor/wood, +/area/station/commons/lounge) "gYV" = ( /obj/structure/disposalpipe/trunk{ dir = 4 @@ -13475,7 +14409,7 @@ dir = 4 }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "gYZ" = ( /obj/machinery/light/directional/north, /obj/structure/table/glass, @@ -13540,6 +14474,9 @@ }, /turf/open/floor/iron/dark/textured, /area/station/engineering/break_room) +"har" = ( +/turf/open/floor/grass, +/area/station/science/genetics) "haz" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -13560,7 +14497,9 @@ }, /obj/effect/turf_decal/trimline/purple/line, /obj/structure/cable, -/turf/open/floor/iron/dark/textured_edge/airless{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured_edge{ dir = 1 }, /area/station/science/lobby) @@ -13599,14 +14538,6 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron, /area/station/service/library) -"hbM" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/line, -/obj/machinery/vending/wallmed/directional/north, -/turf/open/floor/iron/white/textured, -/area/station/medical/medbay/lobby) "hcx" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -13623,9 +14554,9 @@ }, /obj/effect/turf_decal/trimline/purple/warning, /obj/structure/cable, -/turf/open/floor/iron/dark/textured_edge/airless{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured_edge, /area/station/science/lobby) "hcI" = ( /obj/machinery/light/directional/south, @@ -13643,6 +14574,10 @@ /obj/machinery/hypertorus/corner, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) +"hcZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/textured, +/area/station/medical/storage) "hdv" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/wood, @@ -13668,6 +14603,14 @@ /obj/structure/table/wood, /turf/open/floor/wood, /area/station/commons/lounge) +"hdR" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/mob/living/basic/cockroach, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "hee" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -13678,6 +14621,7 @@ /obj/effect/turf_decal/trimline/blue/line{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) "hef" = ( @@ -13692,6 +14636,12 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/atmos/office) +"heL" = ( +/obj/machinery/light_switch/directional/south, +/obj/effect/artifact_spawner, +/obj/structure/cable, +/turf/open/floor/engine, +/area/station/science/explab) "heN" = ( /obj/structure/fans/tiny/forcefield, /obj/structure/plasticflaps, @@ -13755,6 +14705,7 @@ invisibility = 101 }, /obj/effect/spawner/random/trash/graffiti, +/obj/machinery/light/small/maintenance/directional/south, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "hgK" = ( @@ -13801,7 +14752,7 @@ /area/station/service/kitchen/coldroom) "hhB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 + dir = 4 }, /obj/machinery/button/door/directional/west{ id = "robopriv"; @@ -14040,7 +14991,7 @@ /area/station/commons/fitness) "hoz" = ( /turf/closed/wall, -/area/station/medical/surgery/aft) +/area/station/medical/patients_rooms/room_a) "hpg" = ( /turf/open/floor/iron/dark/textured_large, /area/station/commons/storage/emergency/starboard) @@ -14062,7 +15013,7 @@ /turf/open/floor/plating, /area/station/security/office) "hrq" = ( -/obj/structure/table/glass/plasmaglass, +/obj/structure/table, /obj/item/assembly/flash/handheld{ pixel_x = 6; pixel_y = 13 @@ -14152,7 +15103,9 @@ /turf/open/floor/engine, /area/station/commons/storage/emergency/port) "htj" = ( -/obj/machinery/door/airlock/external, +/obj/machinery/door/airlock/external{ + name = "External Access" + }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, @@ -14221,6 +15174,7 @@ dir = 10 }, /obj/machinery/light/floor/has_bulb, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) "huL" = ( @@ -14285,9 +15239,15 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) +"hvP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/security/office) "hwj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/command/bridge) "hwr" = ( @@ -14314,7 +15274,9 @@ /turf/open/floor/plating/ocean, /area/ocean) "hwT" = ( -/obj/machinery/door/airlock/vault, +/obj/machinery/door/airlock/vault{ + name = "Secure Vault" + }, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) "hwW" = ( @@ -14363,6 +15325,12 @@ /obj/structure/barricade/wooden/crude, /turf/open/misc/grass/jungle, /area/station/maintenance/port/central) +"hxH" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/service/bar) "hxM" = ( /obj/machinery/door/airlock/public/glass{ name = "Central Access" @@ -14406,6 +15374,14 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/commons/fitness/recreation) +"hza" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "hzn" = ( /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 8 @@ -14472,7 +15448,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/disposal) "hAN" = ( @@ -14517,6 +15492,8 @@ /obj/structure/disposalpipe/junction/flip{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "hCt" = ( @@ -14582,7 +15559,7 @@ autoclose = 0; frequency = 1449; id_tag = "xeno_airlock_exterior"; - name = "Xenobiology Lab External Airlock" + name = "Test Subject Cell" }, /obj/effect/mapping_helpers/airlock/access/all/science/xenobio, /turf/open/floor/iron/dark/textured, @@ -14616,11 +15593,13 @@ /obj/machinery/door/airlock/maintenance{ name = "Security Maintenance" }, -/obj/effect/mapping_helpers/airlock/access/all/security/entrance, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 1 }, /obj/effect/turf_decal/trimline/red/filled/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/security/office) "hEP" = ( @@ -14723,6 +15702,8 @@ "hGz" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/service/theater/abandoned) "hGA" = ( @@ -14750,11 +15731,11 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/science/robotics/mechbay) +/turf/open/floor/iron/white, +/area/station/science/circuits) "hHc" = ( /obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, /turf/open/floor/iron/kitchen, @@ -14768,6 +15749,8 @@ dir = 10; color = "#009dc4" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/showroomfloor, /area/station/commons/dorms) "hHx" = ( @@ -14778,6 +15761,8 @@ /obj/effect/turf_decal/trimline/brown/warning{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse/upper) "hHy" = ( @@ -14862,15 +15847,15 @@ /turf/open/floor/mineral/titanium/blue, /area/station/ai_monitored/command/storage/eva) "hJi" = ( -/obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 5 }, /obj/effect/turf_decal/trimline/blue/corner{ dir = 8 }, +/obj/machinery/smartfridge/chemistry/preloaded, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "hJu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14882,7 +15867,7 @@ dir = 1 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "hJv" = ( /obj/machinery/duct/industrial/waste, /obj/effect/turf_decal/trimline/white/filled/warning{ @@ -14947,6 +15932,10 @@ /obj/machinery/door/poddoor/incinerator_atmos_aux, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"hLM" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/carpet, +/area/station/service/chapel) "hLW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14972,7 +15961,7 @@ /obj/machinery/light_switch/directional/west, /obj/item/folder/white, /turf/open/floor/iron/white/textured, -/area/station/medical/surgery/aft) +/area/station/medical/patients_rooms/room_a) "hMi" = ( /obj/effect/turf_decal/delivery, /obj/machinery/disposal/bin, @@ -15018,6 +16007,18 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"hMS" = ( +/obj/machinery/duct/industrial/waste, +/obj/effect/turf_decal/trimline/white/filled/line{ + color = "#00ff00" + }, +/obj/effect/turf_decal/trimline/white/line{ + dir = 1; + color = "#00ff00" + }, +/obj/structure/sign/directions/cryo/directional/south, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "hNe" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Engineering Warehouse" @@ -15028,6 +16029,7 @@ /area/station/engineering/main) "hNg" = ( /obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) "hNi" = ( @@ -15080,7 +16082,7 @@ /area/station/engineering/atmos) "hNZ" = ( /obj/machinery/door/airlock/virology/glass{ - name = "Isolation B" + name = "Isolation C" }, /obj/effect/mapping_helpers/airlock/access/all/medical/virology, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -15121,7 +16123,6 @@ /area/station/commons/vacant_room/commissary) "hOO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/table/reinforced/rglass, /turf/open/floor/iron, /area/station/engineering/atmos) "hPb" = ( @@ -15162,6 +16163,8 @@ }, /obj/machinery/door/firedoor, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den/gaming) "hPO" = ( @@ -15181,10 +16184,7 @@ /turf/open/floor/wood, /area/station/service/cafeteria) "hPR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/plating, /area/station/service/theater/abandoned) "hPT" = ( @@ -15197,6 +16197,7 @@ dir = 1 }, /obj/effect/turf_decal/siding/white, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/commons/lounge) "hQm" = ( @@ -15315,6 +16316,12 @@ /obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron/white/diagonal, /area/station/medical/medbay/lobby) +"hUa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/hop) "hUb" = ( /obj/machinery/light/directional/south, /obj/structure/table/wood, @@ -15351,7 +16358,7 @@ /area/station/hallway/secondary/exit/departure_lounge) "hVe" = ( /obj/machinery/door/airlock/research{ - name = "Robotics Lab" + name = "Circuit Lab" }, /obj/structure/disposalpipe/segment{ dir = 4 @@ -15366,7 +16373,19 @@ dir = 8 }, /turf/open/floor/iron/dark, -/area/station/science/robotics/mechbay) +/area/station/science/circuits) +"hVl" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/central) "hVI" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/random/trash/caution_sign, @@ -15440,11 +16459,8 @@ /turf/open/floor/wood, /area/station/service/lawoffice) "hXo" = ( -/obj/structure/table/glass, +/obj/structure/table/reinforced/rglass, /obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, /obj/item/clothing/glasses/hud/health{ pixel_y = 6 }, @@ -15457,8 +16473,11 @@ /obj/item/clothing/glasses/hud/health, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/clothing/glasses/hud/health{ + pixel_y = 6 + }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "hXz" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -15500,6 +16519,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/engineering/main) +"hYO" = ( +/turf/closed/wall, +/area/station/medical/medbay/aft) "hZe" = ( /obj/docking_port/stationary{ dir = 4; @@ -15591,7 +16613,7 @@ id = "westcommissary"; name = "Privacy Shutters" }, -/turf/open/floor/plating, +/turf/open/floor/iron, /area/station/commons/vacant_room/commissary) "iaV" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, @@ -15662,7 +16684,7 @@ /area/station/hallway/secondary/entry) "idm" = ( /obj/structure/disposaloutlet{ - name = "Prisoner Delivery" + name = "Disposals" }, /obj/structure/disposalpipe/trunk{ dir = 1 @@ -15688,6 +16710,10 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/office) +"ieE" = ( +/obj/structure/cable, +/turf/open/floor/bamboo, +/area/station/commons/fitness) "ieG" = ( /obj/structure/chair{ dir = 4 @@ -15721,6 +16747,11 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/aft) +"ifn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/grass, +/area/station/service/hydroponics) "ifv" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -15730,6 +16761,9 @@ "ifC" = ( /obj/machinery/light/small/directional/west, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron, /area/station/engineering/storage/tech) "ifE" = ( @@ -15794,7 +16828,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "ihB" = ( /obj/effect/turf_decal/stripes{ dir = 4 @@ -15839,6 +16873,12 @@ }, /turf/open/floor/plastic, /area/station/hallway/primary/central) +"iiN" = ( +/obj/effect/turf_decal/tile/blue/diagonal_centre, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/diagonal, +/area/station/medical/medbay/lobby) "iiO" = ( /obj/machinery/duct/industrial/waste, /obj/effect/turf_decal/trimline/dark_blue/filled/line{ @@ -15859,7 +16899,7 @@ dir = 4 }, /obj/machinery/door/airlock/medical/glass{ - name = "Cryogenics Bay" + name = "Medbay Central" }, /obj/effect/mapping_helpers/airlock/unres{ dir = 1 @@ -15870,7 +16910,7 @@ cycle_id = "medbay_lobby" }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "ijM" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/trimline/yellow/filled/corner, @@ -15888,8 +16928,15 @@ /obj/effect/spawner/structure/window, /obj/structure/cable, /obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/hallway/primary/central/fore) +"ikG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/central) "ikH" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -15961,7 +17008,7 @@ }, /obj/item/kirbyplants/random, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "imq" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -15995,7 +17042,7 @@ /area/station/engineering/atmos/hfr_room) "imE" = ( /obj/machinery/door/airlock/mining/glass{ - name = "Mining Base" + name = "Mining Office" }, /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -16050,6 +17097,10 @@ dir = 8 }, /area/station/command/bridge) +"inO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/chapel) "iok" = ( /mob/living/carbon/human/species/monkey, /obj/structure/flora/bush/jungle/b/style_random, @@ -16064,7 +17115,7 @@ "ipa" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "ipf" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -16100,6 +17151,8 @@ pixel_y = 36 }, /obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/vending/autodrobe, /turf/open/floor/plating, /area/station/service/theater/abandoned) "iqf" = ( @@ -16126,7 +17179,7 @@ /area/station/maintenance/starboard/upper) "iqr" = ( /obj/machinery/door/airlock/security{ - name = "Security Lounge" + name = "Security Break Room" }, /obj/effect/mapping_helpers/airlock/access/all/security/entrance, /obj/structure/cable, @@ -16163,16 +17216,18 @@ /turf/open/floor/iron, /area/station/engineering/atmos) "irq" = ( -/obj/structure/table/glass/plasmaglass, +/obj/structure/table, /obj/item/electronics, /obj/effect/mapping_helpers/burnt_floor, /obj/machinery/cell_charger, /obj/item/tape/random, /obj/item/taperecorder/empty, +/obj/machinery/airalarm/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/central) "iru" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/airalarm/directional/north, /turf/open/floor/wood, /area/station/service/bar/backroom) "irF" = ( @@ -16250,7 +17305,7 @@ /turf/open/floor/plastic, /area/station/hallway/primary/central) "itP" = ( -/obj/structure/table/glass/plasmaglass, +/obj/structure/table, /obj/effect/spawner/random/decoration/ornament, /turf/open/floor/plating, /area/station/maintenance/port/central) @@ -16295,6 +17350,8 @@ }, /obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, /area/station/science/robotics/lab) "iul" = ( @@ -16306,11 +17363,12 @@ dir = 1 }, /obj/effect/turf_decal/trimline/green/filled/warning, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/commons/lounge) "iut" = ( /turf/open/floor/wood/parquet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "iuY" = ( /obj/effect/turf_decal/tile/neutral/fourcorners{ color = "#009dc4" @@ -16322,6 +17380,8 @@ /area/station/ai_monitored/turret_protected/ai_upload) "iuZ" = ( /obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /turf/open/floor/mineral/titanium/purple, /area/station/command/teleporter) @@ -16378,6 +17438,8 @@ color = "#00ff00"; dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "iwF" = ( @@ -16499,6 +17561,9 @@ /area/station/engineering/atmos/hfr_room) "izt" = ( /obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) "iAd" = ( @@ -16575,8 +17640,9 @@ /obj/effect/spawner/random/food_or_drink/pizzaparty{ name = "pizza party spawner" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "iBM" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -16589,6 +17655,19 @@ /obj/effect/base_turf_modifier/pit, /turf/open/floor/engine, /area/station/ai_monitored/turret_protected/ai) +"iCW" = ( +/obj/machinery/duct/industrial/waste, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/warehouse/upper) "iDn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/start/assistant, @@ -16659,6 +17738,7 @@ /area/station/engineering/main) "iGc" = ( /obj/effect/landmark/start/roboticist, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/noslip{ icon_state = "textured_white"; color = "#999999" @@ -16728,7 +17808,7 @@ dir = 4 }, /turf/open/floor/iron/white/textured, -/area/station/medical/surgery/aft) +/area/station/medical/patients_rooms/room_a) "iHJ" = ( /obj/machinery/light/floor/has_bulb, /turf/open/floor/carpet, @@ -16781,6 +17861,8 @@ /obj/structure/railing{ dir = 4 }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/hydroponics/upper) "iJb" = ( @@ -16800,6 +17882,13 @@ /obj/machinery/air_sensor/incinerator_tank, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"iJt" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/aft) "iJH" = ( /obj/machinery/light/directional/north, /obj/structure/cable, @@ -16861,12 +17950,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics Monitoring" + name = "Atmospherics" }, /obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 8 }, +/obj/effect/landmark/navigate_destination/atmos, /turf/open/floor/plating, /area/station/engineering/atmos/hfr_room) "iLF" = ( @@ -16940,6 +18030,9 @@ "iMh" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Fuel Pipe to Incinerator" + }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "iMn" = ( @@ -16969,11 +18062,13 @@ dir = 1 }, /obj/effect/turf_decal/trimline/purple/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "iMz" = ( /turf/closed/wall, -/area/station/science/robotics/mechbay) +/area/station/science/circuits) "iMM" = ( /obj/structure/rack, /obj/item/tank/internals/emergency_oxygen/engi, @@ -16999,6 +18094,15 @@ /obj/item/wirecutters, /turf/open/floor/iron/dark/textured, /area/mine/storage/public) +"iNb" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/lobby) "iNn" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 5 @@ -17058,16 +18162,15 @@ /obj/machinery/vending/drugs, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) -"iPw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/table/reinforced/rglass, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "iPT" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /obj/structure/cable/industrial, /turf/open/floor/plating, /area/station/commons/fitness/recreation/entertainment) +"iPZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/smooth, +/area/station/commons/fitness/recreation) "iQd" = ( /obj/machinery/restaurant_portal/restaurant, /turf/open/floor/wood, @@ -17087,10 +18190,13 @@ /area/station/engineering/main) "iQE" = ( /obj/machinery/door/airlock/command/glass{ - name = "Bridge" + name = "Teleporter Room" }, /obj/effect/mapping_helpers/airlock/access/all/command/general, /obj/structure/cable, +/obj/effect/landmark/navigate_destination/teleporter, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/mineral/titanium/purple, /area/station/command/teleporter) "iQQ" = ( @@ -17119,8 +18225,15 @@ /obj/structure/disposaloutlet{ name = "Prisoner Delivery" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/security/brig) +"iRG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/textured_large, +/area/station/science/robotics/lab) "iSb" = ( /obj/effect/turf_decal/delivery, /obj/structure/cable, @@ -17167,13 +18280,16 @@ /obj/structure/table/wood, /obj/machinery/computer/security/wooden_tv, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "iTH" = ( /obj/structure/sign/departments/engineering, /turf/closed/wall/r_wall, /area/station/engineering/break_room) "iUi" = ( /obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/hop) "iUj" = ( @@ -17222,8 +18338,15 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, /area/station/medical/pharmacy) +"iWk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/main) "iWl" = ( /obj/machinery/vending/wardrobe/science_wardrobe, /obj/effect/turf_decal/tile/purple/opposingcorners{ @@ -17265,6 +18388,10 @@ }, /turf/open/floor/iron/dark/textured, /area/station/cargo/miningoffice) +"iWX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/textured_large, +/area/station/science/robotics/lab) "iWY" = ( /obj/structure/sink/directional/south, /obj/structure/mirror/directional/north, @@ -17363,7 +18490,7 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos) "jaz" = ( -/obj/structure/table/glass/plasmaglass, +/obj/structure/table, /obj/effect/spawner/random/mod/maint, /obj/effect/spawner/random/mod/maint, /obj/effect/spawner/random/special_lighter, @@ -17374,14 +18501,11 @@ /area/station/maintenance/port/central) "jaP" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 + dir = 1 }, /turf/open/floor/grass, /area/station/science/genetics) "jbk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, /obj/machinery/button/door{ desc = "Controls the shutters over the brig windows."; id = "prisonshutters"; @@ -17492,6 +18616,15 @@ icon_state = "clown_carpet" }, /area/station/service/theater) +"jdq" = ( +/mob/living/basic/clown{ + limb_destroyer = 1; + health = 200; + desc = "This clown was hired to entertain visitors."; + maxHealth = 200 + }, +/turf/open/ballpit, +/area/station/security/checkpoint/customs) "jdu" = ( /obj/structure/cable, /turf/open/floor/wood/large, @@ -17530,7 +18663,9 @@ /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) "jej" = ( -/obj/machinery/door/airlock/external, +/obj/machinery/door/airlock/external{ + name = "External Access" + }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, @@ -17558,17 +18693,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark/textured, /area/station/cargo/storage) -"jeT" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 6 - }, -/obj/item/book/manual/wiki/experimentor, -/turf/open/floor/iron/dark, -/area/station/science/robotics/mechbay) "jeZ" = ( /obj/structure/table/wood, /obj/machinery/camera/autoname/directional/south, @@ -17604,6 +18728,16 @@ /obj/effect/turf_decal/trimline/brown/line, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/aft) +"jgD" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron/smooth, +/area/station/science/genetics) "jgE" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -17615,21 +18749,6 @@ /turf/open/floor/iron/dark, /area/station/cargo/sorting) "jgI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/table/glass/plasmaglass, -/obj/machinery/button/door/directional/south{ - id = "aiload"; - name = "AI Upload Blast Door Control"; - pixel_y = 10; - req_access = list("command"); - pixel_x = -9 - }, -/obj/item/ai_module/toy_ai{ - pixel_x = 5 - }, -/obj/item/ai_module/supplied/freeform, /turf/open/floor/carpet/cyan, /area/station/ai_monitored/turret_protected/ai_upload) "jgV" = ( @@ -17648,12 +18767,6 @@ /obj/structure/liquid_pump, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos/office) -"jhr" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/mineral/titanium, -/area/station/ai_monitored/command/storage/eva) "jht" = ( /obj/machinery/teleport/hub, /turf/open/floor/mineral/titanium/purple, @@ -17704,7 +18817,7 @@ }, /obj/structure/cable, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "jiZ" = ( /obj/machinery/air_sensor/nitrogen_tank, /turf/open/floor/engine/n2, @@ -17725,11 +18838,22 @@ /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/aft) "jjf" = ( -/obj/structure/flora/bush/large/style_random, /obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/medical{ + pixel_y = 2 + }, +/obj/item/storage/belt/medical{ + pixel_y = 4 + }, +/obj/item/storage/belt/medical{ + pixel_y = 6 + }, +/obj/structure/table/reinforced/rglass, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "jjp" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -17744,7 +18868,7 @@ /area/station/engineering/main) "jjG" = ( /obj/machinery/door/airlock/public/glass{ - name = "Toilet" + name = "Shower" }, /obj/effect/turf_decal/trimline/blue/filled/warning, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -17764,7 +18888,8 @@ req_access = list("hop") }, /obj/machinery/door/window/brigdoor/right{ - dir = 4 + dir = 4; + name = "Head of Personnel's Desk" }, /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -17790,31 +18915,12 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) -"jkG" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/plasteel{ - amount = 15 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = 5; - pixel_y = 7 - }, -/obj/item/assembly/flash, -/obj/item/assembly/flash, -/obj/item/assembly/flash, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/item/binoculars{ - layer = 3.1 - }, -/obj/item/book/manual/wiki/experimentor, -/obj/item/book/manual/wiki/robotics_cyborgs, -/turf/open/floor/noslip{ - icon_state = "textured_white"; - color = "#D381C9" +"jkw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, -/area/station/science/robotics) +/turf/open/floor/iron/dark/textured, +/area/station/commons/storage/mining) "jkJ" = ( /obj/effect/spawner/random/trash, /turf/open/floor/engine, @@ -17824,6 +18930,10 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/wood, /area/station/hallway/secondary/service) +"jli" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/commons/storage/mining) "jln" = ( /obj/effect/turf_decal/tile/blue/diagonal_centre, /turf/open/floor/iron/white/diagonal, @@ -17892,6 +19002,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes, +/obj/structure/sign/directions/lavaland/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/central) "jnW" = ( @@ -17903,6 +19014,9 @@ /obj/item/wirecutters, /obj/item/cultivator, /obj/machinery/light_switch/directional/south, +/obj/item/grenade/chem_grenade/antiweed, +/obj/item/grenade/chem_grenade/antiweed, +/obj/item/grenade/chem_grenade/antiweed, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) "jnZ" = ( @@ -17912,7 +19026,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, -/area/station/science/robotics/mechbay) +/area/station/science/circuits) "jod" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -17933,6 +19047,10 @@ }, /turf/open/floor/iron/dark, /area/station/security/office) +"jpc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/executive, +/area/station/command/heads_quarters/hop) "jpe" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 @@ -17942,9 +19060,6 @@ /turf/open/floor/iron, /area/station/bitrunning/den) "jpm" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Theater - Backstage" - }, /obj/machinery/light/directional/south, /obj/effect/spawner/random/trash, /obj/structure/rack, @@ -17960,7 +19075,7 @@ /obj/machinery/light/directional/west, /obj/structure/table/wood, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "jpZ" = ( /obj/machinery/computer/security{ dir = 8 @@ -17996,10 +19111,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/locker) -"jrX" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating/ocean, -/area/ocean/generated_above) "jsj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -18037,7 +19148,22 @@ /obj/machinery/airalarm/directional/west, /obj/machinery/camera/directional/west, /turf/open/floor/wood/parquet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) +"jtj" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/mid_joiner{ + dir = 4 + }, +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/iron/dark/textured_edge{ + dir = 4 + }, +/area/station/hallway/primary/central) "jtn" = ( /obj/structure/disposalpipe/segment{ dir = 8 @@ -18067,6 +19193,7 @@ /area/station/cargo/storage) "jtJ" = ( /obj/machinery/light/directional/south, +/obj/machinery/firealarm/directional/south, /turf/open/floor/wood, /area/station/commons/lounge) "jtP" = ( @@ -18121,6 +19248,7 @@ /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron/white/textured, /area/station/medical/storage) "jve" = ( @@ -18181,6 +19309,7 @@ "jwu" = ( /obj/effect/turf_decal/trimline/blue/filled/warning, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/medical/morgue) "jwH" = ( @@ -18194,12 +19323,15 @@ /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/medical/medbay/lobby) "jwY" = ( /obj/effect/turf_decal/trimline/brown/filled/warning{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/cargo/storage) "jwZ" = ( @@ -18254,8 +19386,16 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/office) +"jze" = ( +/obj/effect/turf_decal/tile/blue/diagonal_centre, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/diagonal, +/area/station/medical/medbay/lobby) "jzj" = ( -/obj/machinery/door/airlock/external, +/obj/machinery/door/airlock/external{ + name = "Trench Elevator" + }, /obj/effect/mapping_helpers/airlock/access/all/supply/mining, /turf/open/floor/iron, /area/station/cargo/miningoffice) @@ -18280,6 +19420,7 @@ /mob/living/basic/cockroach{ name = "Manuel" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/cargo/warehouse) "jzK" = ( @@ -18294,9 +19435,6 @@ /obj/structure/sign/warning/fire/directional/east, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Fuel Pipe to Incinerator" - }, /obj/machinery/power/smes{ capacity = 9e+006; charge = 10000 @@ -18315,6 +19453,9 @@ /obj/effect/turf_decal/trimline/brown/filled/warning{ dir = 10 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron/dark/textured, /area/station/cargo/storage) "jAG" = ( @@ -18344,6 +19485,9 @@ dir = 4 }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/white/textured, /area/station/medical/storage) "jAQ" = ( @@ -18368,6 +19512,8 @@ /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, /area/station/science/robotics/lab) "jAZ" = ( @@ -18398,6 +19544,8 @@ /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/lobby) "jBn" = ( @@ -18413,6 +19561,10 @@ "jBo" = ( /turf/open/ballpit, /area/station/security/checkpoint/customs) +"jBt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "jBM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/spawner/structure/window/reinforced, @@ -18431,15 +19583,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/wood, /area/station/commons/dorms) -"jCm" = ( -/mob/living/simple_animal/hostile/retaliate/clown{ - limb_destroyer = 1; - health = 200; - desc = "This clown was hired to entertain visitors."; - maxHealth = 200 - }, -/turf/open/ballpit, -/area/station/security/checkpoint/customs) "jCp" = ( /obj/item/chair/stool, /turf/open/floor/eighties/red, @@ -18547,6 +19690,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/green/fourcorners, +/obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/science/genetics) "jFs" = ( @@ -18562,6 +19706,7 @@ /obj/effect/turf_decal/trimline/white/filled/warning{ color = "#009dc4" }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "jFx" = ( @@ -18581,6 +19726,21 @@ }, /turf/open/floor/mineral/titanium/yellow, /area/station/maintenance/starboard/aft) +"jFN" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/white/filled/line{ + color = "#009dc4" + }, +/obj/effect/turf_decal/trimline/white/line{ + dir = 1; + color = "#009dc4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "jFP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -18590,12 +19750,11 @@ /area/station/commons/storage/emergency/starboard) "jGE" = ( /obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/machinery/light/floor/has_bulb, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/titanium, /area/station/ai_monitored/command/storage/eva) "jGK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 }, @@ -18619,6 +19778,23 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/ai_monitored/command/storage/eva) +"jHb" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Fitness Backroom" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/bamboo, +/area/station/commons/fitness) +"jHc" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/station/science/lab) "jHe" = ( /obj/effect/turf_decal/tile/green/opposingcorners{ dir = 1 @@ -18630,7 +19806,7 @@ invisibility = 101 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "jHg" = ( /obj/structure/falsewall, /turf/open/floor/plating, @@ -18742,14 +19918,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/service/chapel) -"jKJ" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/engine, -/area/station/science/robotics/mechbay) "jKV" = ( /obj/machinery/light/directional/north, /obj/machinery/duct/industrial/waste, @@ -18814,7 +19982,7 @@ dir = 5 }, /turf/open/floor/iron/dark/textured, -/area/station/command/bridge) +/area/station/maintenance/department/bridge) "jLL" = ( /obj/effect/spawner/random/entertainment/arcade{ dir = 1 @@ -18835,6 +20003,19 @@ /obj/effect/turf_decal/trimline/green/line, /turf/open/floor/iron/dark, /area/station/service/cafeteria) +"jLW" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/line, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/aft) +"jLX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron, +/area/ruin/space/ks13/engineering/secure_storage) "jMb" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -18902,7 +20083,7 @@ /obj/structure/cable, /obj/structure/table/wood, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "jNH" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -18921,6 +20102,9 @@ }, /turf/open/floor/iron, /area/station/service/library) +"jNR" = ( +/turf/closed/wall, +/area/station/medical/patients_rooms/room_b) "jNS" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -18983,8 +20167,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "jPB" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -19023,6 +20208,8 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) "jQl" = ( @@ -19039,6 +20226,13 @@ codes_txt = "patrol;next_patrol=Hall-21"; location = "Hall-20" }, +/obj/structure/sign/directions/dorms/directional/north{ + pixel_x = -32 + }, +/obj/structure/sign/directions/cryo/directional/north{ + pixel_x = -32; + pixel_y = 41 + }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/aft) "jQW" = ( @@ -19063,6 +20257,10 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"jRs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/ruin/space/ks13/engineering/secure_storage) "jRC" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -19175,7 +20373,6 @@ /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos/office) "jTW" = ( -/obj/machinery/portable_atmospherics/canister/anesthetic_mix, /obj/effect/turf_decal/trimline/blue/filled/line, /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 @@ -19191,7 +20388,7 @@ /turf/open/floor/plating, /area/station/command/heads_quarters/rd) "jUx" = ( -/obj/structure/table/glass/plasmaglass, +/obj/structure/table, /obj/item/storage/belt/utility/full, /obj/item/stack/cable_coil, /obj/machinery/light/directional/south, @@ -19243,7 +20440,7 @@ dir = 4 }, /turf/open/floor/iron/white/textured, -/area/station/medical/surgery/aft) +/area/station/medical/patients_rooms/room_b) "jWt" = ( /obj/machinery/ocean_elevator{ elevator_id = "mineshaft"; @@ -19326,12 +20523,10 @@ /area/station/hallway/primary/central) "jYw" = ( /obj/structure/disposalpipe/segment, -/obj/structure/chair{ - dir = 1 - }, /obj/effect/turf_decal/trimline/blue/line{ dir = 1 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) "jYz" = ( @@ -19354,6 +20549,15 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"jYL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/noslip{ + icon_state = "textured_white"; + color = "#999999" + }, +/area/station/science/robotics) "jYT" = ( /obj/effect/turf_decal/stripes, /obj/structure/disposalpipe/segment{ @@ -19364,6 +20568,11 @@ /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron/dark, /area/station/cargo/sorting) +"jYZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth, +/area/station/commons/fitness/recreation) "jZb" = ( /obj/machinery/door/airlock/security{ name = "Interrogation" @@ -19436,14 +20645,16 @@ dir = 4 }, /turf/open/floor/iron/dark/textured, -/area/station/command/bridge) +/area/station/maintenance/department/bridge) "jZR" = ( /obj/effect/turf_decal/trimline/white/filled/warning{ dir = 10; color = "#00ff00" }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "jZT" = ( /obj/effect/turf_decal/tile/dark_red/fourcorners, /obj/structure/table/reinforced, @@ -19467,8 +20678,10 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "kam" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -19490,6 +20703,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 }, +/obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse) "kbi" = ( @@ -19525,14 +20739,6 @@ "kcP" = ( /turf/closed/wall, /area/station/commons/vacant_room/commissary) -"kda" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/structure/closet/crate/decorations, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/main) "kdi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -19587,6 +20793,7 @@ /obj/structure/chair/wood{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) "kep" = ( @@ -19594,6 +20801,13 @@ /obj/machinery/meter, /turf/closed/wall/r_wall, /area/station/engineering/atmos) +"ket" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/smooth, +/area/station/commons/fitness/recreation) "keB" = ( /obj/machinery/light/directional/west, /obj/machinery/status_display/ai/directional/west, @@ -19626,6 +20840,15 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"keZ" = ( +/obj/machinery/duct/industrial/waste, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/line, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/aft) "kfc" = ( /obj/structure/table/reinforced, /obj/structure/disposalpipe/segment{ @@ -19654,6 +20877,7 @@ /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 5 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, /area/station/medical/storage) "kfJ" = ( @@ -19685,6 +20909,10 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) +"kgf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/showroomfloor, +/area/station/commons/toilet/locker) "kgt" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 5 @@ -19728,7 +20956,7 @@ /area/station/service/lawoffice) "kgY" = ( /mob/living/simple_animal/pet/cat/cak, -/obj/structure/bed/dogbed/ian, +/obj/structure/bed/dogbed, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) "kha" = ( @@ -19762,6 +20990,8 @@ /obj/effect/turf_decal/trimline/purple/warning{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "kiG" = ( @@ -19815,9 +21045,7 @@ "kjZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/maintenance{ - name = "Atmospherics Maintenance" - }, +/obj/machinery/door/airlock/maintenance, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation/entertainment) "kkl" = ( @@ -19863,6 +21091,7 @@ /area/station/hallway/primary/central/fore) "klp" = ( /obj/effect/spawner/random/structure/crate_loot, +/obj/machinery/light/small/maintenance/directional/west, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) "klr" = ( @@ -19914,6 +21143,8 @@ /obj/effect/turf_decal/trimline/yellow/filled/mid_joiner{ dir = 1 }, +/obj/item/stock_parts/cell, +/obj/item/stock_parts/cell, /turf/open/floor/engine, /area/station/engineering/main) "kmp" = ( @@ -19929,6 +21160,10 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/cargo/sorting) +"kmr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "kmY" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -20019,6 +21254,14 @@ }, /turf/open/floor/iron/dark/herringbone, /area/station/science/server) +"kov" = ( +/obj/machinery/plumbing/disposer{ + buffer = 500; + disposal_rate = 50; + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "koN" = ( /obj/machinery/dna_scannernew, /obj/machinery/camera/autoname/directional/north, @@ -20075,6 +21318,8 @@ /area/station/maintenance/port/central) "kqQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/hydroponics/upper) "kqT" = ( @@ -20118,6 +21363,9 @@ /turf/open/floor/iron/dark, /area/station/service/chapel) "ksj" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/wood, /area/station/commons/dorms) "ksq" = ( @@ -20150,6 +21398,7 @@ pixel_x = -2; pixel_y = 4 }, +/obj/structure/cable, /turf/open/floor/carpet/purple, /area/station/command/heads_quarters/captain/private) "ksD" = ( @@ -20203,6 +21452,7 @@ dir = 1 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/cargo/miningoffice) "kto" = ( @@ -20251,7 +21501,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics Monitoring" + name = "Gas Trubine Hall" }, /obj/structure/cable, /turf/open/floor/iron, @@ -20274,7 +21524,7 @@ /area/station/security/detectives_office) "kvV" = ( /obj/machinery/door/airlock/public/glass{ - name = "Central Access" + name = "Cargo Lobby" }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/brown/filled/warning{ @@ -20480,12 +21730,17 @@ dir = 1; color = "#009dc4" }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "kBz" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 8 }, +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) "kBA" = ( @@ -20535,7 +21790,7 @@ /area/station/security/office) "kCz" = ( /obj/machinery/door/airlock{ - name = "Bar" + name = "Barkeep's Office" }, /obj/effect/mapping_helpers/airlock/access/all/service/bar, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20590,6 +21845,9 @@ dir = 4 }, /obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/iron/dark/textured, /area/station/security/office) "kDN" = ( @@ -20610,8 +21868,8 @@ /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) "kDX" = ( -/obj/machinery/light/small/directional/north, /obj/effect/spawner/random/structure/table_or_rack, +/obj/machinery/light/small/maintenance/directional/north, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "kEi" = ( @@ -20642,14 +21900,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/wood, /area/station/command/heads_quarters/rd) -"kFH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/hydroponics/upper) "kFT" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output{ dir = 1 @@ -20706,12 +21956,16 @@ /obj/effect/landmark/start/shaft_miner, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"kGo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/stairs{ + dir = 8 + }, +/area/station/cargo/miningoffice) "kGz" = ( /obj/effect/landmark/start/chaplain, /obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/lone/star, /area/station/service/chapel/office) "kGQ" = ( @@ -20908,6 +22162,9 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/warning{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron/dark/textured, /area/station/security/courtroom) "kKP" = ( @@ -20922,6 +22179,7 @@ codes_txt = "patrol;next_patrol=Hall-7"; location = "Hall-6" }, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) "kKW" = ( @@ -21010,6 +22268,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "kMl" = ( @@ -21022,7 +22281,6 @@ /turf/open/floor/iron/dark, /area/station/medical/virology) "kMm" = ( -/obj/structure/cable, /obj/structure/nestbox, /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -21031,6 +22289,7 @@ /area/station/service/hydroponics/upper) "kMx" = ( /obj/effect/spawner/random/structure/crate_loot, +/obj/machinery/light/small/maintenance/directional/south, /turf/open/floor/plating, /area/station/maintenance/starboard/central) "kNp" = ( @@ -21079,7 +22338,7 @@ /obj/effect/mapping_helpers/airlock/unres, /obj/machinery/door/airlock/mining/glass{ id_tag = "innercargo"; - name = "Cargo Bay" + name = "Cargo Auxiliary" }, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse/upper) @@ -21099,6 +22358,9 @@ /obj/structure/chair/office{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/hop) "kOz" = ( @@ -21116,16 +22378,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) -"kOM" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "kOR" = ( /obj/structure/table/wood, /obj/machinery/computer/records/medical/laptop{ @@ -21168,7 +22420,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 }, -/obj/structure/table/glass/plasmaglass, +/obj/structure/table, /obj/structure/disposalpipe/segment{ dir = 5 }, @@ -21189,7 +22441,6 @@ /turf/open/floor/iron/white/textured_large, /area/station/science/robotics/lab) "kPX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/showcase/machinery/tv/broken, /turf/open/floor/plating, /area/station/service/theater/abandoned) @@ -21214,7 +22465,7 @@ "kQM" = ( /obj/structure/table/wood, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "kRz" = ( /obj/structure/table/reinforced, /obj/machinery/door/poddoor/shutters/window/preopen{ @@ -21269,10 +22520,10 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor/border_only, /obj/machinery/door/airlock/glass_large{ name = "Head Of Personel Lobby" }, +/obj/effect/landmark/navigate_destination/hop, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) "kSs" = ( @@ -21293,6 +22544,15 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/commons/fitness/recreation/entertainment) +"kTf" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/aft) "kTr" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -21342,6 +22602,7 @@ dir = 9 }, /obj/effect/turf_decal/trimline/blue/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) "kUm" = ( @@ -21364,6 +22625,7 @@ /obj/structure/table/wood, /obj/item/gun/ballistic/shotgun/doublebarrel, /obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, /turf/open/floor/wood, /area/station/service/bar/backroom) "kUG" = ( @@ -21378,15 +22640,15 @@ /turf/open/floor/plating, /area/station/commons/toilet/locker) "kUS" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Toilet" - }, /obj/effect/mapping_helpers/airlock/access/all/science/general, /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 }, /obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/machinery/door/airlock/bathroom{ + name = "Toilet" + }, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) "kUY" = ( @@ -21419,9 +22681,8 @@ /obj/structure/table/wood, /obj/machinery/light/directional/north, /obj/item/multitool, -/obj/item/clothing/gloves/color/yellow, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "kVP" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/structure/table/reinforced/rglass, @@ -21445,10 +22706,18 @@ /obj/structure/extinguisher_cabinet/directional/west, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"kWi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/commons/fitness/recreation) "kWk" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/cargo/storage) "kWz" = ( @@ -21518,6 +22787,13 @@ }, /turf/open/floor/iron/white/textured_large, /area/station/science/robotics/lab) +"kXZ" = ( +/obj/machinery/plumbing/disposer{ + buffer = 500; + disposal_rate = 50 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "kYi" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, @@ -21543,6 +22819,8 @@ dir = 8; color = "#009dc4" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) "kZY" = ( @@ -21590,6 +22868,13 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) +"lbf" = ( +/obj/structure/cable/industrial, +/obj/machinery/power/terminal{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/engineering/main) "lbi" = ( /obj/effect/turf_decal/trimline/brown/corner, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -21609,7 +22894,7 @@ /turf/open/floor/iron/smooth, /area/station/commons/fitness/recreation) "lbA" = ( -/obj/structure/table/glass, +/obj/structure/table/reinforced/rglass, /turf/open/floor/iron/white/textured, /area/station/medical/office) "lca" = ( @@ -21671,6 +22956,39 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) +"leI" = ( +/obj/structure/table/reinforced, +/obj/item/stack/sheet/plasteel{ + amount = 15 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = 5; + pixel_y = 7 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/item/binoculars{ + layer = 3.1 + }, +/obj/item/book/manual/wiki/robotics_cyborgs, +/obj/item/assembly/flash/handheld{ + pixel_x = 6; + pixel_y = 13 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = 6; + pixel_y = 13 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = 6; + pixel_y = 13 + }, +/turf/open/floor/noslip{ + icon_state = "textured_white"; + color = "#D381C9" + }, +/area/station/science/robotics) "leR" = ( /obj/structure/rack, /obj/item/extinguisher/advanced, @@ -21701,6 +23019,8 @@ }, /obj/effect/turf_decal/tile/blue/diagonal_centre, /obj/machinery/pollution_scrubber, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/diagonal, /area/station/medical/medbay/lobby) "lfo" = ( @@ -21762,8 +23082,9 @@ /obj/structure/disposalpipe/junction{ dir = 2 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "lgp" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -21788,6 +23109,9 @@ dir = 8 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/central) "lgI" = ( @@ -21838,10 +23162,10 @@ dir = 5 }, /turf/open/floor/iron/dark/textured, -/area/station/maintenance/port/aft) +/area/station/security) "lhr" = ( /obj/machinery/door/airlock/engineering/glass{ - name = "Power Monitoring" + name = "Engineering Front Desk" }, /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 4 @@ -21859,17 +23183,19 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/entry) -"lhV" = ( -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/hydroponics/upper) "lia" = ( /obj/effect/decal/cleanable/chem_pile, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/noslip{ icon_state = "textured_white"; color = "#999999" }, /area/station/science/robotics) +"lij" = ( +/turf/open/floor/wood, +/area/station/service/hydroponics/upper) "liq" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -21877,6 +23203,7 @@ /obj/effect/decal/cleanable/blood/tracks{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/noslip{ icon_state = "textured_white"; color = "#999999" @@ -21930,6 +23257,15 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/service/electronic_marketing_den) +"ljN" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/science/genetics) "lkB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -21993,6 +23329,10 @@ /obj/item/storage/medkit/regular, /turf/open/floor/iron/dark/textured, /area/station/security/office) +"llL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/executive, +/area/station/command/meeting_room/council) "llX" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -22005,16 +23345,7 @@ dir = 8 }, /turf/open/floor/carpet, -/area/station/medical/medbay/central) -"lms" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Central Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/bamboo, -/area/station/commons/fitness) +/area/station/medical/psychology) "lmt" = ( /obj/structure/table/wood/fancy/red, /obj/item/food/spaghetti/security, @@ -22060,22 +23391,38 @@ }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/security/armory) -"loQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"loN" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/obj/structure/rack, -/turf/open/floor/iron/showroomfloor, -/area/station/commons/toilet/locker) +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "loV" = ( /obj/machinery/door/airlock/command/glass{ name = "Bridge" }, /obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/structure/cable, /turf/open/floor/mineral/titanium/white, /area/station/command/teleporter) +"lpa" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "lpf" = ( /obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/hop) "lpi" = ( @@ -22090,6 +23437,7 @@ /mob/living/basic/mouse/rat, /obj/effect/spawner/random/trash, /obj/effect/spawner/random/trash, +/obj/machinery/light/small/maintenance/directional/south, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) "lpu" = ( @@ -22097,12 +23445,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"lpX" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/robotics/mechbay) "lqa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, @@ -22146,6 +23488,12 @@ }, /turf/open/floor/plastic, /area/station/hallway/primary/central) +"lru" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/carpet/purple, +/area/station/command/heads_quarters/captain/private) "lrK" = ( /obj/effect/spawner/random/structure/crate_empty, /obj/effect/decal/cleanable/dirt, @@ -22253,6 +23601,8 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) "lul" = ( @@ -22348,9 +23698,12 @@ dir = 1 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "lwx" = ( /obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/eighties/red{ icon = 'goon/icons/turf/floors.dmi'; icon_state = "clown_carpet" @@ -22381,7 +23734,7 @@ /area/station/security/courtroom) "lxM" = ( /obj/machinery/door/airlock/public/glass{ - name = "Conveyor Access" + name = "Cryo" }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/white/filled/warning{ @@ -22391,8 +23744,9 @@ dir = 1; color = "#00ff00" }, +/obj/structure/cable, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "lxS" = ( /obj/machinery/gibber, /obj/machinery/light/small/directional/north, @@ -22404,6 +23758,7 @@ /turf/open/floor/carpet, /area/station/service/bar) "lyY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/eighties/red{ icon = 'goon/icons/turf/floors.dmi'; icon_state = "clown_carpet" @@ -22445,6 +23800,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/duct/industrial/waste, /obj/structure/cable, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Central" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + id_tag = "medlobby"; + cycle_id = "medbay_lobby" + }, +/obj/effect/landmark/navigate_destination/med, +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) "lzJ" = ( @@ -22515,6 +23882,9 @@ invisibility = 101 }, /obj/structure/cable, +/obj/effect/landmark/navigate_destination/tools, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/ruin/space/ks13/engineering/secure_storage) "lAh" = ( @@ -22528,6 +23898,7 @@ dir = 8; color = "#009dc4" }, +/obj/structure/sign/directions/evac/directional/east, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "lAm" = ( @@ -22559,8 +23930,9 @@ /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "lAP" = ( /obj/machinery/plumbing/floor_pump/input/on/waste/directional/north, /obj/machinery/light/floor/has_bulb, @@ -22595,6 +23967,15 @@ /obj/item/wrench, /turf/open/floor/iron, /area/ruin/space/ks13/engineering/secure_storage) +"lBA" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/mob/living/basic/sloth/citrus, +/turf/open/floor/wood, +/area/station/command/heads_quarters/qm) "lBX" = ( /obj/machinery/duct/industrial/waste, /obj/structure/cable, @@ -22625,17 +24006,27 @@ /obj/effect/turf_decal/trimline/white{ color = "#00ff00" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) +"lCr" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/lobby) "lCs" = ( /obj/machinery/light/directional/east, /turf/closed/wall, /area/station/commons/fitness) "lCz" = ( /obj/structure/sign/departments/chemistry/pharmacy, -/obj/machinery/vending/drugs, /turf/closed/wall/r_wall, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "lCD" = ( /obj/structure/cable, /obj/machinery/plumbing/floor_pump/input/on/waste/directional/west, @@ -22675,8 +24066,16 @@ "lDr" = ( /obj/effect/turf_decal/trimline/purple/filled/warning, /obj/effect/turf_decal/trimline/purple/filled/mid_joiner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, /area/station/science/robotics/lab) +"lDu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/hop) "lDH" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -22769,6 +24168,7 @@ dir = 4 }, /obj/structure/curtain/cloth/fancy, +/obj/machinery/door/firedoor, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "lFv" = ( @@ -22820,7 +24220,6 @@ dir = 10 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/scientist, /turf/open/floor/iron/dark, /area/station/engineering/atmos) "lGn" = ( @@ -22971,7 +24370,7 @@ dir = 1 }, /obj/machinery/door/airlock/medical/glass{ - name = "Cryogenics Bay" + name = "Medbay Central" }, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/effect/mapping_helpers/airlock/unres{ @@ -22985,9 +24384,9 @@ cycle_id = "medbay_lobby" }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "lJE" = ( -/obj/structure/table/glass/plasmaglass, +/obj/structure/table, /obj/item/electronics/airlock, /obj/item/electronics/airlock{ pixel_y = -3; @@ -23001,7 +24400,7 @@ /area/station/maintenance/port/central) "lJV" = ( /obj/machinery/door/airlock/external{ - name = "Escape Pod One" + name = "Departures" }, /turf/open/floor/engine, /area/station/hallway/secondary/exit/departure_lounge) @@ -23031,9 +24430,7 @@ /turf/open/floor/iron/dark, /area/station/service/chapel) "lKN" = ( -/obj/machinery/computer/arcade/orion_trail{ - dir = 4 - }, +/obj/machinery/airalarm/directional/west, /turf/open/floor/pod/dark, /area/station/security/warden) "lLc" = ( @@ -23049,13 +24446,6 @@ /obj/machinery/light/directional/south, /turf/closed/wall, /area/station/service/bar) -"lLl" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod Three"; - space_dir = 1 - }, -/turf/open/floor/engine, -/area/station/hallway/secondary/exit/departure_lounge) "lLz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -23067,6 +24457,7 @@ color = "#009dc4"; dir = 4 }, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "lLE" = ( @@ -23087,8 +24478,10 @@ }, /obj/effect/turf_decal/trimline/blue/corner, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "lMo" = ( /obj/structure/window/spawner/directional/south, /obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ @@ -23111,6 +24504,10 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) +"lNp" = ( +/obj/effect/landmark/start/prisoner, +/turf/open/floor/plating/ocean/pit, +/area/ocean) "lNA" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron/dark/textured, @@ -23175,6 +24572,7 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/miningoffice) "lOA" = ( @@ -23232,6 +24630,7 @@ /obj/item/food/baguette, /obj/item/reagent_containers/cup/glass/bottle/bottleofnothing, /obj/machinery/light/very_dim/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/service/theater/abandoned) "lQl" = ( @@ -23245,6 +24644,8 @@ name = "Central Access" }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/commons/fitness/recreation) "lQP" = ( @@ -23255,6 +24656,7 @@ /obj/effect/spawner/structure/window, /obj/structure/cable, /obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/hallway/primary/central) "lQT" = ( @@ -23333,8 +24735,10 @@ "lSW" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /obj/structure/cable/layer3, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, -/area/station/command/bridge) +/area/station/maintenance/department/bridge) "lSZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, @@ -23350,12 +24754,13 @@ dir = 1 }, /turf/open/floor/iron/dark/textured, -/area/station/command/bridge) +/area/station/maintenance/department/bridge) "lUn" = ( /obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, /obj/machinery/door/airlock{ name = "Hydroponics Backroom" }, +/obj/machinery/door/firedoor, /turf/open/floor/wood, /area/station/service/hydroponics) "lUo" = ( @@ -23413,13 +24818,11 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"lVG" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/structure/table/reinforced/rglass, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) +"lVP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/warehouse/upper) "lVR" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -23433,6 +24836,7 @@ /obj/effect/turf_decal/trimline/white/corner{ color = "#009dc4" }, +/obj/machinery/firealarm/directional/west, /turf/open/floor/plastic, /area/station/hallway/primary/central) "lWJ" = ( @@ -23448,7 +24852,6 @@ /area/station/hallway/primary/central) "lXc" = ( /obj/structure/cable, -/obj/machinery/plumbing/floor_pump/input/on/waste/directional/south, /obj/machinery/light/floor/has_bulb, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) @@ -23476,7 +24879,8 @@ /area/station/hallway/primary/central/fore) "lYf" = ( /obj/machinery/door/poddoor/shutters{ - id = "cargodoor" + id = "cargodoor"; + name = "Cargo Bay Shutters" }, /turf/open/floor/plating, /area/station/cargo/storage) @@ -23492,6 +24896,7 @@ codes_txt = "patrol;next_patrol=Hall-6"; location = "Hall-5" }, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "lZe" = ( @@ -23515,17 +24920,9 @@ /obj/structure/disposalpipe/junction{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/disposal) -"lZO" = ( -/obj/structure/cable/industrial, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating/ocean, -/area/ocean) "lZU" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction/flip{ @@ -23537,6 +24934,8 @@ /area/station/hallway/secondary/exit/departure_lounge) "mal" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/security/office) "mam" = ( @@ -23579,6 +24978,7 @@ name = "Surgical Supplies"; req_access = list("surgery") }, +/obj/item/clothing/neck/stethoscope, /turf/open/floor/iron/white/textured, /area/station/medical/surgery/theatre) "maA" = ( @@ -23606,7 +25006,7 @@ /obj/machinery/camera/autoname/directional/north, /obj/structure/closet/secure_closet/personal/patient, /turf/open/floor/iron/white/textured, -/area/station/medical/surgery/aft) +/area/station/medical/patients_rooms/room_b) "mbp" = ( /obj/effect/overlay/palmtree_r, /turf/open/floor/holofloor/beach, @@ -23659,6 +25059,7 @@ /area/station/maintenance/starboard/central) "mdi" = ( /obj/structure/curtain/cloth/fancy, +/obj/machinery/door/firedoor, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "mdl" = ( @@ -23672,9 +25073,6 @@ /turf/open/floor/wood, /area/station/commons/fitness/recreation/entertainment) "mdE" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, /mob/living/carbon/human/species/monkey, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/grass, @@ -23684,6 +25082,9 @@ /obj/machinery/door/airlock{ name = "Hydroponics Backroom" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/service/hydroponics) "mdW" = ( @@ -23705,10 +25106,6 @@ "meJ" = ( /turf/open/floor/plating/ocean, /area/ocean) -"meK" = ( -/obj/structure/table/reinforced/rglass, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "mfc" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -23774,7 +25171,7 @@ /obj/effect/mapping_helpers/airlock/unres, /obj/machinery/door/airlock/mining/glass{ id_tag = "innercargo"; - name = "Cargo Bay" + name = "Cargo Auxiliary" }, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse/upper) @@ -23783,6 +25180,14 @@ /obj/item/stack/sheet/iron, /turf/open/floor/eighties/red, /area/station/service/electronic_marketing_den) +"mgQ" = ( +/obj/machinery/door/airlock/external{ + name = "Trench Elevator" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/mining, +/obj/effect/landmark/navigate_destination/oshan/miningelevator, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "mgS" = ( /obj/machinery/light/directional/east, /turf/closed/wall, @@ -23793,6 +25198,12 @@ }, /turf/open/floor/engine, /area/station/commons/storage/emergency/starboard) +"mhd" = ( +/obj/machinery/light/small/maintenance/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "mhX" = ( /obj/machinery/power/terminal{ dir = 1 @@ -23812,6 +25223,15 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"min" = ( +/obj/machinery/duct/industrial/waste, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/line, +/obj/structure/sign/directions/upload/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/aft) "miu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -23853,25 +25273,25 @@ }, /turf/open/floor/plastic, /area/station/hallway/primary/central) -"mjN" = ( -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/engine, -/area/station/science/robotics/mechbay) +"mjA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/white/textured, +/area/station/medical/storage) "mjY" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction{ dir = 8 }, -/obj/effect/turf_decal/trimline/purple/filled/warning, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white, -/area/station/science/robotics/mechbay) +/area/station/science/circuits) "mko" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 }, /obj/effect/turf_decal/trimline/blue/filled/warning, /turf/closed/wall, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "mkv" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -23881,7 +25301,7 @@ /area/station/engineering/atmos) "mkE" = ( /obj/machinery/door/airlock/external{ - name = "Escape Pod Two"; + name = "Departures"; space_dir = 1 }, /turf/open/floor/engine, @@ -23908,19 +25328,12 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) -"mln" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/light/neon_lining{ - dir = 1; - icon_state = "pink2_1" - }, -/mob/living/simple_animal/sloth/citrus, -/turf/open/floor/wood, -/area/station/command/heads_quarters/qm) "mlu" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 8 }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/smooth, /area/station/science/genetics) "mlV" = ( @@ -23971,6 +25384,8 @@ dir = 4 }, /obj/structure/cable/layer3, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating/ocean, /area/ocean) "mnD" = ( @@ -24010,6 +25425,8 @@ invisibility = 101 }, /mob/living/basic/cockroach, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) "mnS" = ( @@ -24022,6 +25439,7 @@ /obj/effect/turf_decal/trimline/green/filled/warning{ dir = 1 }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "mnX" = ( @@ -24034,7 +25452,7 @@ /area/station/service/hydroponics) "moa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/lone/star, /area/station/service/chapel) "mog" = ( @@ -24063,7 +25481,7 @@ /area/station/medical/office) "moq" = ( /obj/machinery/door/airlock/security{ - name = "Brig Office" + name = "Warden's Office" }, /obj/effect/mapping_helpers/airlock/access/all/security/armory, /obj/structure/cable, @@ -24102,11 +25520,11 @@ }, /obj/effect/turf_decal/trimline/dark_blue/filled/warning, /turf/open/floor/iron/dark/textured, -/area/station/command/bridge) +/area/station/maintenance/department/bridge) "mqK" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/station/science/robotics/mechbay) +/area/station/science/circuits) "mqN" = ( /obj/structure/sink/directional/south, /obj/machinery/button/door/directional/north{ @@ -24168,6 +25586,7 @@ /obj/structure/disposalpipe/junction{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron/white/textured, /area/station/medical/storage) "mrM" = ( @@ -24182,6 +25601,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark/textured_edge, /area/station/science/lobby) "mrQ" = ( @@ -24222,23 +25642,12 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/warning, -/obj/machinery/door/airlock/medical/glass{ - name = "Cryogenics Bay" - }, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/duct/industrial/waste, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - id_tag = "medlobby"; - cycle_id = "medbay_lobby" - }, /obj/structure/cable, -/turf/open/floor/iron/dark/textured, -/area/station/medical/medbay/lobby) +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/central) "msT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -24365,6 +25774,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/machinery/duct/industrial/waste, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) "muW" = ( @@ -24381,14 +25791,6 @@ }, /turf/open/floor/iron/dark/textured_corner, /area/station/engineering/main) -"mvi" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "mvl" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -24406,6 +25808,13 @@ }, /turf/open/floor/plating/ocean, /area/ocean) +"mvv" = ( +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) "mvz" = ( /obj/structure/flora/ash/fireblossom, /turf/open/floor/fakebasalt, @@ -24418,6 +25827,10 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) +"mwm" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/station/medical/cryo) "mwr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -24450,7 +25863,7 @@ /area/station/medical/medbay/lobby) "mxq" = ( /obj/machinery/door/airlock/research{ - name = "Research Division Access" + name = "Robotics Lab" }, /obj/effect/mapping_helpers/airlock/access/all/science/robotics, /obj/structure/disposalpipe/segment{ @@ -24459,6 +25872,8 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "sci" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/stairs{ dir = 8 }, @@ -24479,6 +25894,7 @@ "myg" = ( /obj/machinery/holopad, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/neon/simple/green/nodots, /area/station/commons/lounge) "myr" = ( @@ -24486,6 +25902,22 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/commons/fitness/recreation/entertainment) +"myt" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Dorms" + }, +/obj/effect/turf_decal/trimline/white/filled/warning{ + dir = 1; + color = "#009dc4" + }, +/obj/effect/turf_decal/trimline/white/filled/warning{ + color = "#009dc4" + }, +/obj/effect/landmark/navigate_destination/dorms, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/commons/dorms) "mzD" = ( /obj/effect/spawner/random/structure/table_or_rack, /obj/structure/cable, @@ -24509,6 +25941,8 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/cargo/storage) "mAw" = ( @@ -24564,7 +25998,7 @@ /obj/structure/chair/sofa/left/brown, /obj/machinery/light_switch/directional/north, /turf/open/floor/carpet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "mBG" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/right/directional/south{ @@ -24588,6 +26022,9 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "mCi" = ( @@ -24629,7 +26066,8 @@ /obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/door/poddoor/shutters/preopen{ name = "Medical Closure Shutters"; - desc = "Fuck off we're closed." + desc = "Fuck off we're closed."; + id = "medclosed" }, /turf/open/floor/iron/dark/textured, /area/station/medical/office) @@ -24639,7 +26077,14 @@ pixel_x = -32 }, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) +"mDf" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "mDt" = ( /obj/structure/disposalpipe/segment, /obj/effect/spawner/random/trash/graffiti, @@ -24660,8 +26105,13 @@ invisibility = 101 }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"mEE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/central) "mFh" = ( /obj/effect/spawner/random/trash, /turf/open/floor/plating, @@ -24689,7 +26139,7 @@ /area/station/hallway/primary/central/fore) "mFK" = ( /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "mFX" = ( /obj/effect/mapping_helpers/burnt_floor, /obj/effect/spawner/random/entertainment/arcade, @@ -24721,6 +26171,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/break_room) +"mGI" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/station/command/meeting_room/council) "mGQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -24729,7 +26183,7 @@ dir = 10 }, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "mHp" = ( /obj/machinery/vending/cigarette, /obj/structure/disposalpipe/segment{ @@ -24748,6 +26202,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "mHN" = ( @@ -24837,6 +26292,12 @@ "mIB" = ( /turf/closed/wall, /area/station/service/kitchen/kitchen_backroom) +"mID" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/central) "mIK" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -24855,9 +26316,8 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 }, -/obj/machinery/iv_drip, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "mJW" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -24879,10 +26339,6 @@ /obj/item/food/pie/mimetart, /turf/open/floor/mineral/titanium/yellow, /area/station/maintenance/starboard/aft) -"mLg" = ( -/obj/machinery/camera/autoname/directional/east, -/turf/open/floor/engine, -/area/station/cargo/miningoffice) "mLp" = ( /obj/effect/turf_decal/trimline/white/filled/warning{ dir = 1; @@ -24891,8 +26347,10 @@ /obj/effect/turf_decal/trimline/white/warning{ color = "#00ff00" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "mLr" = ( /obj/structure/bookcase{ name = "Forbidden Knowledge" @@ -24964,7 +26422,7 @@ /turf/open/floor/engine, /area/station/engineering/main) "mMl" = ( -/obj/machinery/door/airlock/public/glass{ +/obj/machinery/door/airlock/bathroom{ name = "Toilet" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24995,6 +26453,7 @@ dir = 4; invisibility = 101 }, +/obj/structure/cable, /turf/open/floor/iron/white/textured, /area/station/medical/storage) "mMM" = ( @@ -25045,6 +26504,10 @@ }, /turf/open/floor/iron/dark/textured, /area/station/command/heads_quarters/qm) +"mNY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/hop) "mOh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25061,6 +26524,14 @@ }, /turf/open/floor/iron/dark/textured_corner, /area/station/hallway/primary/central) +"mOK" = ( +/obj/effect/turf_decal/tile/blue/diagonal_centre, +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white/diagonal, +/area/station/medical/medbay/lobby) "mOU" = ( /obj/structure/table/reinforced, /obj/item/wrench, @@ -25079,6 +26550,9 @@ dir = 9 }, /obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron/dark/textured, /area/station/security/office) "mPt" = ( @@ -25093,6 +26567,7 @@ /area/station/commons/toilet/auxiliary) "mPO" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/neon/simple/green/nodots, /area/station/commons/lounge) "mPQ" = ( @@ -25164,6 +26639,11 @@ }, /turf/open/floor/iron/dark/textured, /area/station/cargo/storage) +"mRQ" = ( +/obj/effect/turf_decal/tile/blue/diagonal_centre, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/diagonal, +/area/station/medical/medbay/lobby) "mSd" = ( /obj/structure/disposalpipe/segment{ dir = 8 @@ -25172,7 +26652,6 @@ /area/station/maintenance/starboard/aft) "mSi" = ( /obj/structure/cable, -/obj/machinery/plumbing/floor_pump/input/on/waste/directional/south, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -25185,6 +26664,7 @@ /obj/effect/turf_decal/trimline/purple/filled/mid_joiner{ dir = 8 }, +/obj/machinery/plumbing/floor_pump/input/on/waste/directional/south, /turf/open/floor/iron/dark/textured_edge{ dir = 8 }, @@ -25204,29 +26684,28 @@ /obj/structure/spider/stickyweb, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"mSV" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/mineral/titanium, +/area/station/ai_monitored/command/storage/eva) "mSX" = ( /obj/machinery/camera/directional/east, /obj/item/kirbyplants/random, /turf/open/floor/wood, /area/station/service/bar) +"mTb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/vaporwave, +/area/station/service/library) "mTo" = ( /obj/effect/turf_decal/stripes{ dir = 4 }, /turf/open/floor/engine, /area/station/engineering/atmos/office) -"mTt" = ( -/obj/machinery/shower/directional/north, -/obj/structure/curtain, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/machinery/door/window/left/directional/north{ - name = "shower" - }, -/obj/structure/drain, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/noslip, -/area/station/medical/treatment_center) "mTy" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/machinery/portable_atmospherics/scrubber, @@ -25244,6 +26723,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) +"mTE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/engine, +/area/station/science/explab) "mTI" = ( /obj/effect/spawner/random/structure/musician/piano/random_piano, /turf/open/floor/plating, @@ -25286,6 +26770,8 @@ /obj/structure/disposaloutlet{ name = "Prisoner Delivery" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "mUJ" = ( @@ -25308,6 +26794,15 @@ /obj/effect/landmark/start/cargo_technician, /turf/open/floor/iron/dark/textured, /area/station/cargo/storage) +"mVq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/trimline/brown, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/warehouse/upper) "mVu" = ( /obj/structure/table/wood, /obj/machinery/firealarm/directional/south, @@ -25331,6 +26826,14 @@ /obj/effect/spawner/random/trash, /turf/open/floor/iron, /area/station/maintenance/port/central) +"mVH" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "mWr" = ( /obj/machinery/duct/industrial/waste, /obj/structure/cable, @@ -25380,6 +26883,14 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/service/hydroponics) +"mWX" = ( +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/blue/diagonal_centre, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white/diagonal, +/area/station/medical/medbay/lobby) "mXx" = ( /obj/effect/turf_decal/trimline/white/filled/warning{ dir = 10; @@ -25411,6 +26922,9 @@ "mYo" = ( /obj/effect/landmark/start/assistant, /obj/effect/turf_decal/tile/blue/diagonal_centre, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron/white/diagonal, /area/station/medical/medbay/lobby) "mYB" = ( @@ -25463,6 +26977,8 @@ /obj/structure/cable, /obj/machinery/duct/industrial/waste, /obj/effect/spawner/random/trash, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/upper) "naf" = ( @@ -25511,6 +27027,7 @@ "nbb" = ( /obj/structure/chair/wood, /obj/effect/landmark/start/clown, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/eighties/red{ icon = 'goon/icons/turf/floors.dmi'; icon_state = "clown_carpet" @@ -25535,7 +27052,7 @@ color = "#00ff00" }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "nbw" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/yellow/filled/warning, @@ -25555,7 +27072,7 @@ /area/station/security/office) "nbU" = ( /obj/machinery/door/airlock/public/glass{ - name = "Central Access" + name = "Courtroom" }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/red/filled/warning{ @@ -25569,7 +27086,7 @@ dir = 4 }, /turf/closed/wall, -/area/mine/storage/public) +/area/station/commons/storage/mining) "nbY" = ( /obj/machinery/power/smes{ charge = 5e+006; @@ -25585,12 +27102,21 @@ /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"ncd" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/hfr_room) "ncf" = ( -/obj/machinery/duct/industrial/waste, /obj/effect/turf_decal/trimline/blue/line{ dir = 9 }, -/turf/open/floor/iron/white/textured, +/obj/structure/sign/warning/no_smoking, +/turf/closed/wall, /area/station/medical/medbay/lobby) "ncg" = ( /obj/effect/decal/cleanable/dirt, @@ -25677,7 +27203,7 @@ color = "#DE3A3A" }, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "nez" = ( /obj/structure/cable/industrial, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25706,6 +27232,8 @@ dir = 9 }, /obj/effect/turf_decal/trimline/yellow/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "neS" = ( @@ -25757,6 +27285,7 @@ /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "ngm" = ( @@ -25803,12 +27332,15 @@ /area/station/hallway/secondary/exit/departure_lounge) "nhl" = ( /obj/machinery/door/airlock/public/glass{ - name = "Central Access" + name = "Courtroom" }, /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 1 }, /obj/effect/turf_decal/trimline/red/filled/warning, +/obj/effect/landmark/navigate_destination/court, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/security/courtroom) "nhw" = ( @@ -25903,19 +27435,7 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) -"niS" = ( -/obj/structure/table/glass, -/obj/item/stack/medical/mesh, -/obj/effect/turf_decal/siding/white/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) "niT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, /obj/structure/window/reinforced/spawner, /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/table/reinforced, @@ -25998,6 +27518,8 @@ "nku" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/central) "nkF" = ( @@ -26006,14 +27528,7 @@ }, /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/white/textured, -/area/station/medical/surgery/aft) -"nkL" = ( -/obj/structure/table/reinforced/rglass, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/hfr_room) +/area/station/medical/patients_rooms/room_a) "nlf" = ( /obj/effect/turf_decal/tile/yellow, /obj/structure/window/reinforced/spawner/directional/east, @@ -26039,23 +27554,6 @@ /obj/item/reagent_containers/cup/glass/bottle/hooch, /turf/open/floor/iron/dark/textured, /area/station/engineering/main) -"nls" = ( -/obj/structure/closet/secure_closet/warden, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/flashlight/seclite, -/obj/item/gun/ballistic/automatic/pistol/paco, -/obj/item/ammo_box/magazine/m35/rubber{ - pixel_y = -3; - pixel_x = -8; - layer = 3.1 - }, -/obj/item/ammo_box/magazine/m35{ - pixel_y = 10; - pixel_x = -8; - layer = 3.1 - }, -/turf/open/floor/pod/dark, -/area/station/security/warden) "nlQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26137,6 +27635,7 @@ dir = 4; invisibility = 101 }, +/obj/structure/cable, /turf/open/floor/iron/white/textured, /area/station/medical/storage) "nnY" = ( @@ -26151,11 +27650,12 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/cargo/storage) "noF" = ( /turf/open/floor/carpet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "noG" = ( /obj/machinery/duct/industrial/waste, /obj/effect/turf_decal/trimline/purple/filled/warning{ @@ -26198,14 +27698,37 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/courtroom) +"npi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/filled/warning{ + dir = 6; + color = "#009dc4" + }, +/obj/effect/turf_decal/trimline/white/corner{ + color = "#009dc4"; + dir = 1 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central/fore) "npl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/purple/opposingcorners, +/obj/machinery/plumbing/floor_pump/input/on/waste/directional/west, /turf/open/floor/plastic, /area/station/hallway/primary/central) +"npU" = ( +/obj/effect/turf_decal/trimline/white/filled/line{ + color = "#00ff00"; + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/commons/storage/mining) "nqf" = ( /turf/open/floor/iron/white/textured, /area/station/medical/office) @@ -26228,6 +27751,7 @@ dir = 4 }, /obj/effect/landmark/start/scientist, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white/textured_large, /area/station/science/robotics/lab) "nqO" = ( @@ -26294,7 +27818,7 @@ dir = 4 }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "nsX" = ( /obj/effect/turf_decal/stripes{ dir = 5 @@ -26377,7 +27901,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "nuD" = ( /obj/machinery/computer/scan_consolenew, /obj/effect/turf_decal/tile/green/half/contrasted, @@ -26435,7 +27959,7 @@ color = "#00ff00" }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "nvL" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -26447,8 +27971,14 @@ /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, /area/station/medical/office) +"nvP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/storage) "nvY" = ( /obj/effect/turf_decal/sand, /turf/open/floor/plating/ocean, @@ -26458,8 +27988,11 @@ dir = 1 }, /obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/wood/parquet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "nwW" = ( /obj/machinery/duct/industrial/waste, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -26524,7 +28057,6 @@ /area/station/hallway/primary/central) "nxY" = ( /obj/machinery/light/directional/south, -/obj/structure/table/reinforced/rglass, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 }, @@ -26532,28 +28064,11 @@ /area/station/engineering/atmos/hfr_room) "nya" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/structure/table/reinforced, /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science, -/obj/item/clothing/gloves/latex/nitrile, -/obj/item/clothing/glasses/science{ - pixel_y = 3 - }, -/obj/item/toy/figure/chemist{ - pixel_y = 13; - pixel_x = 8 - }, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = 2 - }, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = 2 - }, -/obj/item/reagent_containers/cup/beaker/large{ - pixel_x = 2 +/obj/machinery/chem_heater/withbuffer{ + pixel_x = -4 }, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) @@ -26589,6 +28104,14 @@ /obj/item/book/manual/wiki/ordnance, /turf/open/floor/carpet/blue, /area/station/commons/fitness/recreation/entertainment) +"nzs" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central/fore) "nzt" = ( /obj/structure/table/reinforced, /obj/item/flashlight, @@ -26630,7 +28153,7 @@ dir = 6 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "nAn" = ( /mob/living/carbon/human/species/monkey, /obj/machinery/door/window/right/directional/south{ @@ -26690,6 +28213,8 @@ /obj/structure/cable, /obj/effect/turf_decal/trimline/red/filled/warning, /obj/effect/turf_decal/trimline/yellow/filled/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "nBU" = ( @@ -26698,14 +28223,15 @@ dir = 1; color = "#00ff00" }, +/obj/structure/cable, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "nBV" = ( /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/hop) "nCm" = ( /obj/machinery/door/airlock/command/glass{ - name = "Head of Personel's office" + name = "Head of Personel's Office" }, /obj/effect/mapping_helpers/airlock/access/any/command/hop, /obj/structure/cable, @@ -26752,10 +28278,8 @@ /turf/closed/wall, /area/station/maintenance/disposal) "nCX" = ( -/mob/living/simple_animal/hostile/retaliate/goat{ - name = "Pete" - }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/service/kitchen/kitchen_backroom) "nDg" = ( @@ -26879,13 +28403,14 @@ }, /obj/effect/turf_decal/trimline/blue/line, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "nGD" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/machinery/light/floor/has_bulb, /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/effect/turf_decal/trimline/yellow, +/obj/machinery/door/firedoor, /turf/open/floor/plastic, /area/station/hallway/primary/central) "nGM" = ( @@ -26894,6 +28419,14 @@ }, /turf/open/floor/wood, /area/station/service/lawoffice) +"nGX" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/plumbing/floor_pump/input/on/waste/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "nHa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26933,6 +28466,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/miningoffice) "nHZ" = ( @@ -26965,20 +28499,6 @@ /obj/effect/turf_decal/sand, /turf/open/floor/plating/ocean, /area/ocean) -"nIO" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Hole Access" - }, -/obj/machinery/duct/industrial/waste, -/obj/effect/turf_decal/trimline/white/filled/warning{ - color = "#009dc4" - }, -/obj/effect/turf_decal/trimline/white/filled/warning{ - dir = 1; - color = "#009dc4" - }, -/turf/open/floor/iron/dark/textured, -/area/station/hallway/primary/central) "nIT" = ( /obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ dir = 5 @@ -27010,6 +28530,7 @@ /obj/effect/turf_decal/trimline/blue/line{ dir = 5 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/medical/morgue) "nKd" = ( @@ -27051,8 +28572,14 @@ name = "Cabin 3" }, /obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/commons/dorms) +"nKs" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/carpet, +/area/station/service/bar) "nKI" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -27067,6 +28594,28 @@ /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /turf/open/floor/plating, /area/station/engineering/atmos) +"nKW" = ( +/obj/machinery/duct/industrial/waste, +/obj/effect/turf_decal/trimline/white/filled/warning{ + color = "#009dc4" + }, +/obj/effect/turf_decal/trimline/white/warning{ + color = "#009dc4"; + dir = 1 + }, +/obj/structure/sign/directions/science/directional/east{ + pixel_y = -41 + }, +/obj/structure/sign/directions/medical/directional/east{ + pixel_y = -33; + layer = 3.3 + }, +/obj/structure/sign/directions/engineering/directional/east{ + pixel_y = -25; + layer = 3.2 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "nLm" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -27094,7 +28643,7 @@ /area/station/engineering/main) "nLt" = ( /obj/machinery/door/airlock/medical/glass{ - name = "Operating Room" + name = "Operating Theatre" }, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/machinery/duct/industrial/waste, @@ -27107,12 +28656,19 @@ /obj/effect/mapping_helpers/airlock/unres{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, /area/station/medical/surgery/theatre) "nLI" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/atmos) +"nLO" = ( +/obj/effect/spawner/random/trash, +/obj/machinery/light/small/maintenance/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/central) "nLQ" = ( /obj/structure/table, /obj/item/kitchen/rollingpin, @@ -27136,6 +28692,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Chapel" }, +/obj/effect/landmark/navigate_destination/chapel, /turf/open/floor/iron/chapel{ dir = 8 }, @@ -27198,6 +28755,12 @@ /obj/machinery/plumbing/floor_pump/input/on/waste/directional/west, /turf/open/floor/iron, /area/station/cargo/warehouse/upper) +"nNY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/science/circuits) "nOf" = ( /obj/structure/cable, /turf/closed/wall, @@ -27209,6 +28772,7 @@ /area/station/engineering/atmos) "nOw" = ( /obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/hop) "nOy" = ( @@ -27237,15 +28801,19 @@ /obj/structure/sign/chalkboard_menu, /turf/closed/wall, /area/station/service/cafeteria) -"nPx" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 +"nPw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/filled/line{ + color = "#009dc4"; + dir = 1 }, -/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/trimline/white/line{ + color = "#009dc4" + }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, -/area/station/hallway/primary/central/fore) +/area/station/hallway/primary/central) "nPJ" = ( /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 6 @@ -27279,11 +28847,21 @@ "nQI" = ( /turf/closed/wall/r_wall, /area/station/science/lab) +"nRh" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/aft) "nRr" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/structure/disposalpipe/segment, /obj/machinery/camera/autoname/directional/east, /obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, /area/station/medical/pharmacy) "nRv" = ( @@ -27320,6 +28898,10 @@ "nTi" = ( /turf/closed/wall, /area/station/engineering/main) +"nTl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/purple, +/area/station/science/server) "nTC" = ( /obj/machinery/conveyor/auto{ dir = 1 @@ -27330,6 +28912,8 @@ /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/central) "nTR" = ( @@ -27340,6 +28924,10 @@ /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 }, +/obj/machinery/light/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) "nTW" = ( @@ -27352,7 +28940,7 @@ color = "#A46106" }, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "nUi" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -27384,7 +28972,7 @@ dir = 9 }, /turf/open/floor/iron/dark/textured, -/area/station/maintenance/port/aft) +/area/station/security) "nUw" = ( /obj/machinery/light_switch/directional/north, /obj/effect/turf_decal/trimline/dark_blue/filled/warning{ @@ -27416,6 +29004,7 @@ pixel_x = -1 }, /obj/structure/table, +/obj/machinery/firealarm/directional/west, /turf/open/floor/carpet, /area/station/service/bar) "nVh" = ( @@ -27475,10 +29064,10 @@ dir = 4 }, /turf/open/floor/iron/dark/textured, -/area/station/maintenance/port/aft) +/area/station/security) "nWK" = ( /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "nXd" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -27544,6 +29133,9 @@ /turf/open/floor/glass/reinforced, /area/station/engineering/main) "oas" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/iron/smooth, /area/station/commons/fitness/recreation) "oaR" = ( @@ -27562,6 +29154,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"obz" = ( +/obj/structure/cable, +/obj/machinery/power/smes/engineering, +/turf/open/floor/plating, +/area/station/engineering/main) "obQ" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -27587,7 +29184,7 @@ }, /obj/machinery/door/airlock/mining/glass{ id_tag = "innercargo"; - name = "Cargo Bay" + name = "Cargo Deliveries" }, /turf/open/floor/iron/dark/textured, /area/station/cargo/sorting) @@ -27692,6 +29289,8 @@ "oeO" = ( /obj/machinery/light/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/wood, /area/station/service/hydroponics/upper) "oeP" = ( @@ -27792,6 +29391,8 @@ /obj/effect/turf_decal/trimline/dark_blue/filled/warning{ dir = 1 }, +/obj/effect/landmark/navigate_destination/bridge, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/command/bridge) "ogA" = ( @@ -27845,6 +29446,14 @@ dir = 8 }, /area/station/engineering/main) +"ohP" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/stairs, +/area/station/medical/medbay/lobby) "oia" = ( /obj/item/radio/intercom/chapel/directional/west, /obj/machinery/light/small/directional/south, @@ -27860,6 +29469,7 @@ color = "#00ff00"; dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "oiy" = ( @@ -27897,6 +29507,13 @@ }, /turf/open/floor/carpet/neon/simple/green/nodots, /area/station/commons/lounge) +"oiL" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/security/courtroom) "oiN" = ( /obj/effect/spawner/random/vending/snackvend, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -28011,6 +29628,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) +"okY" = ( +/obj/effect/spawner/random/structure/grille, +/obj/machinery/light/small/maintenance/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "ols" = ( /turf/closed/wall, /area/station/medical/medbay/central) @@ -28033,11 +29655,7 @@ dir = 4 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) -"omn" = ( -/obj/machinery/rnd/experimentor, -/turf/open/floor/engine, -/area/station/science/robotics/mechbay) +/area/station/science/genetics/cloning) "omq" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -28062,13 +29680,15 @@ pixel_y = 14; pixel_x = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/plating, /area/station/service/theater/abandoned) "omO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, -/obj/structure/chair, /obj/effect/turf_decal/trimline/blue/line, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) @@ -28084,7 +29704,6 @@ }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/camera/autoname/directional/west, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/dark, @@ -28093,6 +29712,18 @@ /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron/dark/textured, /area/station/security/courtroom) +"onl" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/science/lab) "ont" = ( /obj/structure/fans/tiny/forcefield, /obj/machinery/door/poddoor/shutters{ @@ -28114,8 +29745,9 @@ /obj/effect/turf_decal/trimline/blue/warning{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "onJ" = ( /obj/machinery/vending/mechcomp, /obj/effect/turf_decal/tile/purple/opposingcorners{ @@ -28150,6 +29782,11 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"ooY" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/cable, +/turf/open/floor/mineral/titanium/purple, +/area/station/command/teleporter) "ope" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/supply/general, @@ -28211,7 +29848,7 @@ /area/station/hallway/secondary/exit/departure_lounge) "opS" = ( /turf/open/floor/iron/white, -/area/station/science/robotics/mechbay) +/area/station/science/circuits) "oqh" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/trimline/red/filled/warning{ @@ -28268,7 +29905,8 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "ort" = ( -/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/stairs{ dir = 4 }, @@ -28286,8 +29924,17 @@ dir = 4; color = "#00ff00" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) +"orI" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/aft) "orQ" = ( /obj/structure/disposalpipe/trunk{ dir = 4 @@ -28303,13 +29950,6 @@ /obj/effect/landmark/start/botanist, /turf/open/floor/carpet/neon/simple/green/nodots, /area/station/service/hydroponics) -"osy" = ( -/obj/structure/cable, -/obj/machinery/plumbing/floor_pump/input/on/waste/directional/east, -/obj/structure/disposalpipe/segment, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/dark/textured, -/area/station/hallway/primary/central) "osG" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -28354,9 +29994,10 @@ }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/any/medical/pharmacy, -/obj/effect/mapping_helpers/airlock/access/any/medical/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "otz" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -28403,6 +30044,10 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) +"oui" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/commons/storage/mining) "ouC" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/machinery/vending/wardrobe/chem_wardrobe, @@ -28437,7 +30082,7 @@ /area/station/service/chapel) "ouW" = ( /obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics Monitoring" + name = "Atmospherics" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /obj/structure/fans/tiny/forcefield, @@ -28471,6 +30116,7 @@ dir = 4 }, /obj/effect/turf_decal/trimline/purple/filled/mid_joiner, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark/textured_corner{ dir = 4 }, @@ -28505,6 +30151,9 @@ color = "#009dc4"; dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) "ovW" = ( @@ -28593,8 +30242,8 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/science/robotics/mechbay) +/turf/open/floor/iron/white, +/area/station/science/circuits) "oyo" = ( /obj/effect/spawner/structure/window, /obj/structure/cable, @@ -28649,11 +30298,7 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/mug/nanotrasen{ - pixel_y = 14; - pixel_x = -9 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, /area/station/security/warden) "ozO" = ( @@ -28667,7 +30312,7 @@ dir = 4 }, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "ozV" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, @@ -28704,6 +30349,8 @@ dir = 8 }, /obj/structure/window/reinforced/plasma/spawner/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "oAL" = ( @@ -28732,6 +30379,11 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"oBK" = ( +/obj/effect/spawner/random/structure/grille, +/obj/machinery/light/small/maintenance/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "oBO" = ( /obj/machinery/air_sensor/plasma_tank, /turf/open/floor/engine/plasma, @@ -28765,8 +30417,9 @@ /area/ocean/near_station_powered) "oDx" = ( /obj/machinery/light/directional/south, -/turf/open/floor/plating, -/area/station/science/ordnance/storage) +/obj/machinery/airalarm/directional/west, +/turf/open/floor/engine, +/area/station/science/explab) "oDQ" = ( /obj/structure/window/spawner/directional/west, /obj/effect/turf_decal/trimline/green/line{ @@ -28836,6 +30489,7 @@ /area/station/ai_monitored/turret_protected/ai) "oFm" = ( /obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/cargo/warehouse) "oFP" = ( @@ -28850,6 +30504,8 @@ "oGQ" = ( /obj/effect/decal/cleanable/blood/tracks, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/noslip{ icon_state = "textured_white"; color = "#999999" @@ -28868,6 +30524,13 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) +"oHw" = ( +/obj/structure/cable, +/obj/effect/spawner/random/trash/graffiti, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "oHx" = ( /obj/effect/turf_decal/trimline/neutral/filled/warning{ dir = 1 @@ -28913,7 +30576,6 @@ /area/station/cargo/sorting) "oIg" = ( /obj/structure/cable, -/obj/machinery/plumbing/floor_pump/input/on/waste/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -28929,8 +30591,20 @@ color = "#52B4E9" }, /obj/effect/turf_decal/tile/blue/diagonal_centre, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/diagonal, /area/station/medical/medbay/lobby) +"oII" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/aft) "oIJ" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -28942,6 +30616,8 @@ /area/station/security/brig) "oIY" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/red, /area/station/security/office) "oJo" = ( @@ -28979,8 +30655,9 @@ dir = 1 }, /obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "oKD" = ( /obj/effect/turf_decal/stripes{ dir = 1 @@ -28997,19 +30674,19 @@ /area/station/maintenance/starboard/central) "oMc" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/disposal/bin, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) "oMo" = ( /obj/structure/cable, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "oMw" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/security_space_law, @@ -29024,10 +30701,8 @@ pixel_x = 8; pixel_y = 16 }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "detective_shutters"; - name = "Detective's Office Shutters" +/obj/structure/window/reinforced/tinted/frosted{ + dir = 8 }, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) @@ -29038,7 +30713,7 @@ /obj/machinery/light/directional/north, /obj/item/storage/secure/safe/caps_spare/directional/west, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "oNt" = ( /obj/structure/table/wood, /turf/open/floor/carpet/executive, @@ -29054,7 +30729,7 @@ /area/station/security/checkpoint/customs) "oOg" = ( /obj/machinery/door/airlock/public/glass{ - name = "Chapel Office" + name = "Crematorium" }, /obj/effect/mapping_helpers/airlock/access/all/service/chapel_office, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29114,10 +30789,11 @@ /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "oQe" = ( -/obj/machinery/meter, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/machinery/power/terminal{ + dir = 1 + }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "oQn" = ( @@ -29205,11 +30881,17 @@ /obj/structure/cable, /obj/machinery/camera/autoname/directional/west, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "oSo" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine/co2, /area/station/engineering/atmos) +"oSP" = ( +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/command/meeting_room/council) "oTl" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/effect/turf_decal/delivery, @@ -29241,6 +30923,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "sci" }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/science/lobby) "oUd" = ( @@ -29367,7 +31050,7 @@ }, /obj/machinery/door/airlock/security/glass{ id_tag = "innerbrig"; - name = "Brig" + name = "Security Lounge" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "brig-entrance" @@ -29411,6 +31094,7 @@ /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/science/genetics) "oYc" = ( @@ -29467,6 +31151,7 @@ /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron, /area/station/security/checkpoint/science) "oZM" = ( @@ -29479,11 +31164,13 @@ /obj/machinery/holopad{ pixel_x = -16 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/science/lab) "oZR" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 + dir = 4 }, /turf/open/floor/noslip{ icon_state = "textured_white"; @@ -29589,6 +31276,8 @@ dir = 8; color = "#009dc4" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) "pds" = ( @@ -29601,7 +31290,8 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/door/poddoor/shutters/preopen{ name = "Medical Closure Shutters"; - desc = "Fuck off we're closed." + desc = "Fuck off we're closed."; + id = "medclosed" }, /obj/item/paper_bin{ pixel_x = -7; @@ -29624,7 +31314,7 @@ "pfg" = ( /obj/item/kirbyplants/random, /turf/open/floor/wood/parquet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "pfl" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/disposal/bin{ @@ -29662,6 +31352,8 @@ /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 8 }, +/obj/effect/landmark/navigate_destination/dockesc, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) "pgi" = ( @@ -29715,14 +31407,6 @@ /obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron, /area/ruin/space/ks13/engineering/secure_storage) -"pgT" = ( -/obj/effect/turf_decal/stripes{ - dir = 9 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/engine, -/area/station/science/robotics/mechbay) "pgX" = ( /turf/closed/wall/r_wall, /area/ocean) @@ -29754,11 +31438,14 @@ dir = 8 }, /obj/machinery/door/window/brigdoor/left{ - dir = 4 + dir = 4; + name = "Head of Personnel's Desk" }, /obj/machinery/door/firedoor/border_only{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/hop) "phI" = ( @@ -29780,6 +31467,15 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/entry) +"pie" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/aft) "piv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29789,6 +31485,7 @@ /obj/effect/turf_decal/trimline/red/corner{ dir = 4 }, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "piw" = ( @@ -29800,6 +31497,7 @@ color = "#009dc4"; dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/commons/dorms) "pjd" = ( @@ -29809,7 +31507,7 @@ /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /turf/open/floor/wood/parquet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "pjg" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -29819,6 +31517,10 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/science/xenobiology) +"pjC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/service/kitchen/kitchen_backroom) "pkl" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/blue/filled/warning, @@ -29834,6 +31536,8 @@ /obj/effect/turf_decal/trimline/white{ color = "#009dc4" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) "pkS" = ( @@ -29874,13 +31578,6 @@ dir = 8 }, /area/station/science/lobby) -"plq" = ( -/obj/structure/table/reinforced/rglass, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/hfr_room) "plr" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/line{ dir = 4 @@ -29903,6 +31600,8 @@ dir = 4 }, /obj/effect/landmark/start/head_of_personnel, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/hop) "plP" = ( @@ -29930,7 +31629,7 @@ dir = 10 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "pmk" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -29954,6 +31653,10 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/atmos/office) +"pmD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/textured_large, +/area/station/science/robotics/lab) "pmG" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 @@ -30007,6 +31710,8 @@ }, /obj/effect/turf_decal/trimline/purple/corner, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_corner, /area/station/science/lobby) "pnj" = ( @@ -30029,6 +31734,19 @@ /obj/structure/sign/poster/official/cleanliness, /turf/closed/wall, /area/station/service/kitchen) +"pnK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/filled/line{ + color = "#009dc4"; + dir = 1 + }, +/obj/effect/turf_decal/trimline/white/line{ + color = "#009dc4" + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "pnO" = ( /obj/structure/window/spawner/directional/west, /obj/machinery/vending/wardrobe/curator_wardrobe, @@ -30107,6 +31825,16 @@ }, /turf/open/floor/wood/large, /area/station/security/warden) +"ppf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/aft) "ppr" = ( /obj/structure/table, /obj/item/storage/box/monkeycubes{ @@ -30148,8 +31876,15 @@ dir = 8; color = "#00ff00" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) +"pqi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/rnd/server, +/turf/open/floor/circuit/telecomms/server, +/area/station/science/server) "pqp" = ( /turf/open/floor/iron/kitchen, /area/station/service/kitchen) @@ -30175,7 +31910,7 @@ dir = 10 }, /turf/open/floor/plating, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "pqT" = ( /obj/item/food/grown/banana, /turf/open/floor/grass, @@ -30218,6 +31953,8 @@ invisibility = 101 }, /obj/structure/cable/layer3, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating/ocean, /area/ocean/near_station_powered) "prW" = ( @@ -30230,7 +31967,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "pse" = ( /obj/structure/table/wood, /obj/machinery/camera/autoname/directional/south, @@ -30258,7 +31995,7 @@ /obj/structure/table/wood, /obj/machinery/light/directional/east, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "psy" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, @@ -30273,6 +32010,22 @@ }, /turf/open/floor/iron/dark/textured, /area/station/engineering/main) +"psH" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/warning{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/security/courtroom) +"pta" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation A" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/virology, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/medical/virology) "ptm" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -30355,8 +32108,16 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation/entertainment) +"pwr" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/science/lobby) "pww" = ( -/obj/machinery/door/airlock, /obj/machinery/door/firedoor, /obj/structure/cable, /obj/effect/turf_decal/trimline/brown/filled/warning{ @@ -30366,6 +32127,10 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/access/all/supply/general, +/obj/machinery/door/airlock/mining/glass{ + id_tag = "innercargo"; + name = "Cargo Bay" + }, /turf/open/floor/iron/dark/textured, /area/station/cargo/storage) "pwA" = ( @@ -30399,6 +32164,7 @@ "pxi" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, /area/station/medical/pharmacy) "pxo" = ( @@ -30413,6 +32179,7 @@ "pxZ" = ( /obj/machinery/plumbing/floor_pump/input/on/waste/directional/east, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, /area/station/medical/surgery/theatre) "pyr" = ( @@ -30452,6 +32219,17 @@ "pyJ" = ( /turf/open/floor/iron/dark/smooth_large, /area/station/service/electronic_marketing_den) +"pyK" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/lobby) "pyU" = ( /turf/closed/wall, /area/station/service/chapel/office) @@ -30461,16 +32239,19 @@ }, /turf/open/floor/carpet/neon/simple/white, /area/station/commons/dorms) -"pzs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/showroomfloor, -/area/station/commons/toilet/locker) "pzy" = ( /obj/structure/cable, /obj/effect/spawner/random/trash/graffiti, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"pzL" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/aft) "pzQ" = ( /obj/structure/table/glass, /obj/machinery/reagentgrinder{ @@ -30498,7 +32279,7 @@ "pzX" = ( /obj/structure/closet/crate, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "pAg" = ( /obj/machinery/computer/security/mining{ dir = 4 @@ -30509,6 +32290,7 @@ /obj/effect/spawner/structure/window, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/commons/lounge) "pAS" = ( @@ -30516,6 +32298,12 @@ /obj/structure/disposalpipe/junction/yjunction, /turf/open/floor/iron/dark/textured_large, /area/station/hallway/primary/central) +"pAV" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/random/trash, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) "pBO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -30594,6 +32382,7 @@ /obj/structure/railing{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/cargo/miningoffice) "pEb" = ( @@ -30648,6 +32437,8 @@ dir = 4 }, /obj/structure/window/reinforced/plasma/spawner/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "pFe" = ( @@ -30713,7 +32504,7 @@ }, /obj/machinery/light/directional/south, /turf/open/floor/wood/parquet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "pHe" = ( /obj/effect/turf_decal/stripes{ dir = 8 @@ -30776,6 +32567,8 @@ dir = 8 }, /obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/neon/simple/green/nodots, /area/station/commons/lounge) "pIc" = ( @@ -30783,7 +32576,7 @@ autoclose = 0; frequency = 1449; id_tag = "xeno_airlock_exterior"; - name = "Xenobiology Lab External Airlock" + name = "Xenobiology Lab" }, /obj/effect/mapping_helpers/airlock/access/all/science/xenobio, /obj/structure/cable, @@ -30840,8 +32633,9 @@ dir = 4; invisibility = 101 }, +/obj/structure/cable, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "pIW" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -30868,6 +32662,16 @@ /obj/effect/turf_decal/trimline/white/line{ color = "#009dc4" }, +/obj/structure/sign/directions/medical/directional/north{ + pixel_y = 31 + }, +/obj/structure/sign/directions/engineering/directional/north{ + pixel_y = 39; + layer = 3.3 + }, +/obj/structure/sign/directions/science/directional/north{ + pixel_y = 23 + }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "pJi" = ( @@ -31011,6 +32815,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/storage/emergency/port) +"pLM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/dorms) "pLQ" = ( /obj/machinery/vending/wardrobe/chap_wardrobe, /turf/open/floor/iron/dark, @@ -31019,6 +32830,9 @@ /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/security/armory) "pMC" = ( @@ -31033,11 +32847,23 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/central) +"pNk" = ( +/obj/effect/turf_decal/tile/green/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/structure/table, +/obj/item/healthanalyzer, +/obj/item/clothing/neck/stethoscope, +/obj/machinery/light_switch/directional/west, +/obj/item/folder/white, +/turf/open/floor/iron/white/textured, +/area/station/medical/patients_rooms/room_b) "pNw" = ( /obj/effect/landmark/start/psychologist, /obj/structure/chair/office/light, /turf/open/floor/wood/parquet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "pNB" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 @@ -31056,31 +32882,32 @@ }, /turf/open/floor/wood, /area/station/security/courtroom) +"pNT" = ( +/obj/machinery/duct/industrial/waste, +/obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/effect/turf_decal/trimline/blue/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/lobby) "pOc" = ( /obj/machinery/space_heater, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "pOj" = ( /obj/structure/safe, +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral/fourcorners{ + color = "#009dc4" + }, /obj/item/storage/secure/briefcase/riches, -/obj/item/storage/backpack/duffelbag/syndie/hitman, -/obj/item/card/id/advanced/silver/reaper, /obj/item/lazarus_injector, /obj/item/gun/energy/disabler, /obj/item/gun/ballistic/revolver/russian, /obj/item/ammo_box/a357, -/obj/item/clothing/neck/stethoscope, -/obj/item/book{ - desc = "An undeniably handy book."; - icon_state = "bookknock"; - name = "\improper A Simpleton's Guide to Safe-cracking with Stethoscopes" - }, -/obj/effect/turf_decal/bot_white/left, -/obj/effect/turf_decal/tile/neutral/fourcorners{ - color = "#009dc4" - }, /turf/open/floor/wood, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "pOm" = ( /obj/structure/chair/office/light{ dir = 8 @@ -31133,6 +32960,7 @@ /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 9 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/science/lobby) "pPk" = ( @@ -31164,15 +32992,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) -"pPD" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/obj/structure/closet/crate/rcd, -/obj/effect/turf_decal/bot, -/obj/machinery/light/no_nightlight/directional/east, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/main) "pPR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31362,14 +33181,6 @@ dir = 8 }, /area/station/engineering/main) -"pVF" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/engine, -/area/station/science/robotics/mechbay) "pVI" = ( /turf/open/floor/noslip{ icon_state = "textured_white"; @@ -31386,7 +33197,6 @@ /area/station/commons/storage/emergency/starboard) "pWD" = ( /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/command/heads_quarters/rd) "pWL" = ( @@ -31415,14 +33225,6 @@ /obj/machinery/duct/industrial/waste, /turf/open/floor/wood, /area/station/commons/lounge) -"pXk" = ( -/obj/machinery/door/airlock/research{ - name = "Ordnance Lab" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/general, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/ordnance/storage) "pXw" = ( /obj/structure/table/wood/fancy/royalblue, /obj/effect/spawner/random/decoration/statue{ @@ -31474,7 +33276,7 @@ dir = 1 }, /obj/effect/turf_decal/trimline/purple/line, -/turf/open/floor/iron/dark/textured_edge/airless{ +/turf/open/floor/iron/dark/textured_edge{ dir = 1 }, /area/station/science/lobby) @@ -31522,6 +33324,10 @@ /obj/machinery/light_switch/directional/north, /obj/item/storage/box/zipties, /obj/item/storage/box/coffeepack/robusta, +/obj/item/reagent_containers/cup/glass/mug/nanotrasen{ + pixel_y = 14; + pixel_x = -9 + }, /turf/open/floor/wood/large, /area/station/security/warden) "pZg" = ( @@ -31560,6 +33366,13 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/east, /turf/open/floor/wood, /area/station/commons/dorms) +"pZK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/maintenance/disposal) "pZL" = ( /obj/structure/cable/industrial, /obj/machinery/portable_atmospherics/scrubber, @@ -31648,21 +33461,11 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/sorting) -"qbI" = ( -/obj/machinery/door/airlock/research{ - name = "Ordnance Lab" - }, -/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, -/turf/open/floor/iron/dark/textured, -/area/station/science/xenobiology) "qbO" = ( /obj/effect/landmark/start/station_engineer, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, /obj/structure/chair/sofa/corp/right{ desc = "Looks like someone threw it out. Covered in donut crumbs."; name = "couch"; @@ -31681,6 +33484,7 @@ dir = 4 }, /obj/item/kirbyplants/random, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "qck" = ( @@ -31715,13 +33519,6 @@ dir = 8 }, /area/station/engineering/break_room) -"qco" = ( -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/engine, -/area/station/science/robotics/mechbay) "qdd" = ( /obj/machinery/light/small/directional/north, /obj/structure/chair/sofa/middle{ @@ -31730,14 +33527,16 @@ /obj/effect/turf_decal/tile/blue/diagonal_centre, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/diagonal, /area/station/medical/medbay/lobby) "qdj" = ( /obj/machinery/door/airlock{ - name = "Kitchen" + name = "Service Hallway" }, -/obj/effect/mapping_helpers/airlock/access/all/service/general, /obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "qdp" = ( @@ -31787,6 +33586,8 @@ /area/station/hallway/primary/central/fore) "qeN" = ( /obj/machinery/camera/autoname/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/commons/fitness/recreation) "qfa" = ( @@ -31801,6 +33602,8 @@ /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/cargo/storage) "qfx" = ( @@ -31819,12 +33622,17 @@ dir = 10 }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) "qfI" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/explab) "qfN" = ( /obj/structure/chair, /obj/effect/landmark/start/assistant, @@ -31842,6 +33650,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/noslip{ icon_state = "textured_white"; color = "#999999" @@ -31868,6 +33678,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/central) +"qgv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/noslip{ + icon_state = "textured_white"; + color = "#999999" + }, +/area/station/science/robotics) "qgH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -31892,7 +33710,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/medical/psychology, /turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "qhu" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/dark_blue/filled/warning{ @@ -31955,6 +33773,7 @@ "qiT" = ( /obj/effect/turf_decal/tile/blue/diagonal_centre, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/diagonal, /area/station/medical/medbay/lobby) "qiU" = ( @@ -31986,6 +33805,7 @@ /obj/structure/fluff/broken_flooring, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/service/theater/abandoned) "qkb" = ( @@ -32010,6 +33830,20 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"qlh" = ( +/obj/effect/turf_decal/trimline/white/filled/line{ + dir = 8; + color = "#009dc4" + }, +/obj/effect/turf_decal/trimline/white/line{ + dir = 4; + color = "#009dc4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/station/commons/dorms) "qli" = ( /obj/machinery/door/airlock/maintenance, /turf/open/floor/mineral/titanium/yellow, @@ -32029,23 +33863,13 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/structure/cable, /turf/open/floor/iron/white/textured, -/area/station/medical/surgery/aft) +/area/station/medical/patients_rooms/room_b) "qlS" = ( /obj/machinery/conveyor/auto/inside_corners{ dir = 10 }, /turf/open/floor/plating, /area/station/maintenance/port/central) -"qmb" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/science/robotics/mechbay) "qmg" = ( /obj/structure/chair/stool/bar/directional/east, /obj/effect/landmark/start/assistant, @@ -32135,13 +33959,14 @@ "qnI" = ( /turf/open/floor/carpet/orange, /area/station/engineering/break_room) +"qnK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/warehouse/upper) "qoj" = ( -/obj/machinery/portable_atmospherics/canister/plasma, -/obj/effect/turf_decal/siding/purple{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) +/obj/effect/artifact_spawner, +/turf/open/floor/engine, +/area/station/science/explab) "qov" = ( /obj/structure/cable, /obj/machinery/duct/industrial/waste, @@ -32168,17 +33993,6 @@ /obj/effect/turf_decal/trimline/red/filled/corner, /turf/open/floor/iron/smooth, /area/station/ai_monitored/security/armory) -"qoU" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/wood, -/area/station/commons/lounge) -"qoV" = ( -/turf/closed/wall/r_wall, -/area/station/science/ordnance/storage) "qpf" = ( /turf/closed/wall, /area/station/maintenance/starboard/upper) @@ -32212,10 +34026,7 @@ }, /area/station/engineering/main) "qqx" = ( -/obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/delivery_chute{ - dir = 4 - }, +/obj/structure/transit_tube/station/dispenser/reverse/flipped, /turf/open/floor/iron, /area/station/commons/fitness/recreation/entertainment) "qqB" = ( @@ -32248,6 +34059,8 @@ name = "Customs Desk" }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/checkpoint/science) "qrD" = ( @@ -32269,7 +34082,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/blue/filled/warning, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "qrP" = ( /obj/machinery/light/small/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -32334,6 +34147,17 @@ /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron/dark, /area/station/cargo/sorting) +"qsy" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/lab) "qsG" = ( /obj/structure/cable, /obj/machinery/door/airlock/research{ @@ -32348,6 +34172,9 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "sci" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/science/lobby) "qsX" = ( @@ -32396,6 +34223,9 @@ /obj/machinery/camera/autoname/directional/south, /obj/effect/turf_decal/trimline/red/filled/warning, /obj/effect/turf_decal/trimline/yellow/filled/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "qtW" = ( @@ -32431,8 +34261,14 @@ codes_txt = "patrol;next_patrol=Hall-4"; location = "Hall-3" }, +/obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"quj" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/central) "qus" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 @@ -32442,7 +34278,7 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos) "quy" = ( -/obj/machinery/light/small/directional/east, +/obj/machinery/light/small/maintenance/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "quS" = ( @@ -32478,6 +34314,7 @@ /obj/effect/turf_decal/trimline/green/filled/line{ dir = 10 }, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/aft) "qvE" = ( @@ -32485,7 +34322,7 @@ dir = 2 }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "qvJ" = ( /obj/machinery/computer/rdconsole{ dir = 8 @@ -32551,7 +34388,7 @@ "qxL" = ( /obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /obj/machinery/door/airlock{ - name = "Kitchen Access" + name = "The Goat Locker" }, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32601,9 +34438,15 @@ dir = 4 }, /area/station/service/chapel) +"qzW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/iron/dark/telecomms, +/area/station/maintenance/disposal) "qzX" = ( /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, -/obj/structure/table/reinforced/rglass, /turf/open/floor/iron/dark, /area/station/engineering/atmos) "qzY" = ( @@ -32611,10 +34454,11 @@ /obj/machinery/duct/industrial/waste, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/atmos/glass{ - name = "Distribution Loop" - }, /obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, +/obj/machinery/door/airlock/engineering{ + name = "Tech Storage" + }, +/obj/effect/landmark/navigate_destination/techstorage, /turf/open/floor/iron/dark/textured, /area/station/engineering/storage/tech) "qAb" = ( @@ -32668,10 +34512,26 @@ /area/station/maintenance/port/central) "qBz" = ( /obj/effect/turf_decal/tile/green/half/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) "qBI" = ( /obj/machinery/requests_console/directional/west, +/obj/structure/closet/secure_closet/warden, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/flashlight/seclite, +/obj/item/gun/ballistic/automatic/pistol/paco, +/obj/item/ammo_box/magazine/m35/rubber{ + pixel_y = -3; + pixel_x = -8; + layer = 3.1 + }, +/obj/item/ammo_box/magazine/m35{ + pixel_y = 10; + pixel_x = -8; + layer = 3.1 + }, /turf/open/floor/pod/dark, /area/station/security/warden) "qBL" = ( @@ -32763,7 +34623,7 @@ /area/station/science/lab) "qEi" = ( /turf/closed/wall/r_wall, -/area/station/science/robotics/mechbay) +/area/station/science/explab) "qEO" = ( /obj/machinery/door/airlock/public/glass{ name = "Central Access" @@ -32773,12 +34633,19 @@ dir = 1 }, /obj/effect/turf_decal/trimline/green/filled/warning, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/commons/lounge) +"qFo" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/grimy, +/area/station/hallway/secondary/service) "qFt" = ( /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured, /area/station/science/robotics/lab) "qGa" = ( @@ -32810,8 +34677,17 @@ /obj/effect/turf_decal/trimline/blue/line{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) +"qGL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "qGV" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -32820,6 +34696,13 @@ /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron/dark, /area/station/cargo/sorting) +"qHg" = ( +/obj/structure/cable/industrial, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/transit_tube/horizontal, +/turf/open/floor/plating/ocean, +/area/ocean) "qHw" = ( /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt/dust, @@ -32854,6 +34737,12 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/iron/dark/textured, /area/station/engineering/main) +"qHT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/grass, +/area/station/service/hydroponics) "qHU" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/turf_decal/bot, @@ -32894,6 +34783,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "sci" }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/science/lobby) "qJD" = ( @@ -32974,6 +34864,9 @@ /area/station/maintenance/starboard/aft) "qKV" = ( /obj/machinery/camera/autoname/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/mineral/titanium/purple, /area/station/command/teleporter) "qKX" = ( @@ -32994,10 +34887,6 @@ /obj/effect/turf_decal/trimline/blue/line, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) -"qLg" = ( -/obj/effect/spawner/random/trash/graffiti, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "qLF" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/effect/turf_decal/tile/dark_blue/opposingcorners{ @@ -33105,6 +34994,7 @@ dir = 5 }, /obj/item/kirbyplants/random, +/obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/aft) "qOc" = ( @@ -33157,6 +35047,16 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"qOQ" = ( +/obj/effect/turf_decal/tile/purple/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/lab) "qPi" = ( /obj/structure/cable/industrial, /obj/machinery/door/poddoor/preopen{ @@ -33174,7 +35074,7 @@ dir = 8 }, /turf/open/floor/iron/dark/textured, -/area/station/command/bridge) +/area/station/maintenance/department/bridge) "qPt" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/structure/sink/directional/east, @@ -33213,6 +35113,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"qQZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/noslip{ + icon_state = "textured_white"; + color = "#999999" + }, +/area/station/science/robotics) "qRn" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -33230,11 +35140,12 @@ /area/station/security/office) "qRt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) "qRz" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/light/small/directional/east, +/obj/machinery/light/small/maintenance/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) "qRD" = ( @@ -33270,24 +35181,6 @@ }, /turf/open/floor/iron/dark/textured_edge, /area/station/science/lobby) -"qRO" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/item/storage/belt/medical{ - pixel_y = 6 - }, -/obj/item/storage/belt/medical{ - pixel_y = 4 - }, -/obj/item/storage/belt/medical{ - pixel_y = 2 - }, -/obj/item/storage/belt/medical, -/turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) "qRY" = ( /turf/closed/wall, /area/station/cargo/miningoffice) @@ -33338,7 +35231,9 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/upper) "qTc" = ( -/obj/machinery/door/airlock/external, +/obj/machinery/door/airlock/external{ + name = "External Access" + }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, @@ -33387,6 +35282,9 @@ dir = 6 }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/iron/white/textured, /area/station/medical/storage) "qUe" = ( @@ -33429,6 +35327,12 @@ /obj/effect/turf_decal/tile/yellow/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"qWb" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Maintenance Garden" + }, +/turf/open/floor/grass, +/area/station/maintenance/starboard/upper) "qWf" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, @@ -33454,13 +35358,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/command/bridge) -"qWq" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/main) "qWx" = ( /obj/structure/table/wood, /obj/structure/desk_bell{ @@ -33484,6 +35381,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/disposal) +"qWK" = ( +/obj/machinery/duct/industrial/waste, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/textured, +/area/station/medical/surgery/theatre) "qXr" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -33521,6 +35424,8 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse/upper) "qYv" = ( @@ -33567,6 +35472,7 @@ /obj/effect/turf_decal/tile/purple/opposingcorners{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/science/lab) "qZA" = ( @@ -33608,6 +35514,11 @@ }, /turf/open/floor/iron/white/textured_large, /area/station/science/robotics/lab) +"raa" = ( +/obj/structure/cable, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "rab" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 9 @@ -33677,6 +35588,7 @@ /area/station/medical/medbay/lobby) "rbR" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/noslip{ icon_state = "textured_white"; color = "#D381C9" @@ -33703,6 +35615,8 @@ }, /obj/effect/mapping_helpers/airlock/access/all/service/library, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, /area/station/service/library) "rcT" = ( @@ -33754,13 +35668,11 @@ "rdy" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/machinery/light_switch/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/iron/white/textured, /area/station/medical/pharmacy) -"rdF" = ( -/obj/effect/turf_decal/tile/green/fourcorners, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark/textured, -/area/station/service/hydroponics) "rdL" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -33854,6 +35766,15 @@ /obj/effect/spawner/xmastree, /turf/open/floor/carpet/neon/simple/green/nodots, /area/station/commons/lounge) +"rhg" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white/textured, +/area/station/medical/office) "rhi" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/line{ dir = 8 @@ -33866,6 +35787,8 @@ /obj/structure/cable, /obj/effect/landmark/start/security_officer, /obj/effect/turf_decal/trimline/red/filled/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/security/office) "rht" = ( @@ -33904,10 +35827,13 @@ /obj/effect/turf_decal/trimline/blue/line{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) "rhO" = ( -/obj/machinery/door/airlock/external, +/obj/machinery/door/airlock/external{ + name = "External Access" + }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, @@ -33990,11 +35916,11 @@ /area/station/ai_monitored/security/armory) "riU" = ( /obj/machinery/door/airlock/research{ - name = "Ordnance Lab" + name = "Artifact Science Lab" }, /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/plating, -/area/station/science/ordnance/storage) +/area/station/science/explab) "riW" = ( /obj/machinery/camera/autoname/directional/east, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -34030,8 +35956,8 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 }, -/turf/open/floor/iron/dark, -/area/station/science/robotics/mechbay) +/turf/open/floor/iron/white, +/area/station/science/circuits) "rkn" = ( /turf/closed/wall, /area/station/cargo/warehouse) @@ -34075,8 +36001,9 @@ /obj/effect/turf_decal/siding/yellow{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "rmm" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34163,9 +36090,6 @@ }, /turf/open/floor/iron/dark/textured_edge, /area/station/science/lobby) -"rou" = ( -/turf/closed/wall/r_wall, -/area/station/medical/surgery/aft) "row" = ( /obj/machinery/ocean_elevator{ elevator_id = "mineshaft"; @@ -34220,6 +36144,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/central) +"rqi" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/storage) "rqk" = ( /obj/structure/closet/secure_closet/engineering_chief, /obj/item/storage/secure/briefcase, @@ -34235,6 +36167,12 @@ }, /turf/open/floor/carpet/orange, /area/station/command/heads_quarters/ce) +"rql" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) "rqz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34318,6 +36256,9 @@ /area/station/security/checkpoint/customs) "rsL" = ( /obj/effect/spawner/structure/window/reinforced/plasma, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) "rsO" = ( @@ -34349,7 +36290,7 @@ invisibility = 101 }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "rtr" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/machinery/portable_atmospherics/pump, @@ -34380,6 +36321,15 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"rua" = ( +/obj/effect/turf_decal/trimline/dark_blue/filled/warning{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/security/courtroom) "rur" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/closed/wall/r_wall, @@ -34394,6 +36344,21 @@ }, /turf/open/floor/engine, /area/station/commons/storage/emergency/starboard) +"ruM" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/mid_joiner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark/textured_edge{ + dir = 8 + }, +/area/station/science/lobby) "ruY" = ( /obj/machinery/conveyor/auto{ dir = 1 @@ -34489,12 +36454,6 @@ }, /turf/open/floor/engine, /area/station/engineering/main) -"rxw" = ( -/obj/machinery/duct/industrial/waste, -/obj/structure/disposalpipe/segment, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) "rxF" = ( /obj/effect/spawner/random/trash/moisture_trap, /turf/open/floor/plating, @@ -34527,6 +36486,9 @@ "ryk" = ( /obj/effect/turf_decal/tile/dark_red/fourcorners, /obj/structure/chair/office, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron, /area/station/security/checkpoint/science) "ryK" = ( @@ -34551,9 +36513,9 @@ /obj/effect/turf_decal/trimline/blue/line{ dir = 8 }, -/obj/machinery/stasis, +/obj/structure/table/reinforced/rglass, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "rzB" = ( /obj/effect/landmark/start/bartender, /obj/machinery/light/floor/has_bulb, @@ -34659,8 +36621,16 @@ id = "detective_shutters"; name = "Detective's Office Shutters" }, +/obj/effect/landmark/navigate_destination/det, /turf/open/floor/wood, /area/station/security/detectives_office) +"rCq" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/noslip{ + icon_state = "textured_white"; + color = "#999999" + }, +/area/station/science/robotics) "rCz" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -34680,6 +36650,15 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/entry) +"rCO" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "rCP" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, @@ -34723,6 +36702,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/command/bridge) "rDA" = ( @@ -34773,7 +36753,7 @@ /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/curtain, /turf/open/floor/noslip, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "rEC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -34874,19 +36854,21 @@ dir = 4 }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "rHY" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 }, /obj/effect/turf_decal/trimline/blue/warning, -/turf/closed/wall, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) "rId" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/parquet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "rIh" = ( /obj/effect/turf_decal/siding/blue{ dir = 4 @@ -34895,20 +36877,31 @@ dir = 8; color = "#486091" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "rIM" = ( /obj/effect/turf_decal/tile/blue/opposingcorners, -/obj/machinery/smartfridge/chemistry/preloaded, /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/smartfridge/chemistry/preloaded, /turf/closed/wall, /area/station/medical/pharmacy) "rIW" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/science/robotics/lab) +"rIX" = ( +/obj/machinery/plumbing/layer_manifold{ + buffer = 500; + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) +"rIY" = ( +/turf/closed/wall/r_wall, +/area/station/security) "rIZ" = ( /obj/structure/table/wood, /obj/item/clothing/ears/earmuffs, @@ -34934,9 +36927,8 @@ /turf/open/floor/bamboo, /area/station/commons/fitness) "rJc" = ( -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medbay Clinic" +/obj/machinery/door/airlock/research/glass{ + name = "Genetics Lab" }, /obj/effect/mapping_helpers/airlock/unres{ dir = 4 @@ -34956,7 +36948,7 @@ /obj/effect/mapping_helpers/airlock/access/any/medical, /obj/effect/mapping_helpers/airlock/access/any/science/genetics, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "rJn" = ( /obj/effect/turf_decal/bot, /obj/structure/disposalpipe/segment, @@ -35018,6 +37010,9 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "rKA" = ( @@ -35037,7 +37032,7 @@ }, /obj/effect/turf_decal/stripes, /obj/machinery/door/airlock/external{ - name = "Escape Pod Four"; + name = "Engineering Access"; space_dir = 4 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -35049,8 +37044,9 @@ "rKO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/stairs, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "rLb" = ( /obj/machinery/duct/industrial/waste, /obj/effect/turf_decal/trimline/blue/filled/warning, @@ -35060,6 +37056,7 @@ /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) "rLj" = ( +/obj/machinery/firealarm/directional/east, /turf/open/floor/wood, /area/station/hallway/secondary/service) "rLq" = ( @@ -35076,9 +37073,6 @@ /turf/open/floor/grass, /area/station/service/hydroponics) "rLM" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 }, @@ -35087,6 +37081,16 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) +"rMf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white/textured, +/area/station/medical/surgery/theatre) "rMw" = ( /obj/effect/spawner/structure/window, /obj/structure/cable, @@ -35130,7 +37134,7 @@ dir = 8 }, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "rNz" = ( /obj/machinery/door/airlock/security{ name = "Detective's Office" @@ -35216,6 +37220,7 @@ /area/station/engineering/main) "rOx" = ( /obj/effect/landmark/start/botanist, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/grass, /area/station/service/hydroponics) "rOB" = ( @@ -35230,7 +37235,7 @@ color = "#00ff00" }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "rOK" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -35354,6 +37359,12 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/dark/textured, /area/station/command/heads_quarters/hos) +"rSC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/smooth, +/area/station/commons/fitness/recreation) "rSO" = ( /obj/machinery/camera/autoname/directional/west, /obj/structure/tank_dispenser/oxygen, @@ -35464,12 +37475,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) -"rUX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/table/reinforced/rglass, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "rVh" = ( /obj/machinery/door/airlock/command{ name = "Research Director's Office" @@ -35489,6 +37494,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"rVE" = ( +/obj/machinery/byteforge, +/obj/effect/turf_decal/box, +/turf/open/floor/carpet/neon/simple/orange/nodots, +/area/station/bitrunning/den) "rWm" = ( /obj/machinery/light/floor/has_bulb, /obj/effect/turf_decal/trimline/brown, @@ -35518,9 +37528,6 @@ /turf/open/floor/engine, /area/station/engineering/main) "rWM" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Toilet" - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -35529,6 +37536,9 @@ /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 }, +/obj/machinery/door/airlock/bathroom{ + name = "Toilet" + }, /turf/open/floor/iron/showroomfloor, /area/station/science/lobby) "rXf" = ( @@ -35538,6 +37548,18 @@ "rXi" = ( /turf/closed/wall/r_wall, /area/station/cargo/storage) +"rXq" = ( +/obj/effect/turf_decal/tile/blue/diagonal_centre, +/obj/item/kirbyplants/random, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white/diagonal, +/area/station/medical/medbay/lobby) +"rXr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) "rXH" = ( /obj/structure/fans/tiny/forcefield, /obj/machinery/door/poddoor/massdriver_chapel, @@ -35579,7 +37601,7 @@ }, /obj/structure/bookcase/random/reference, /turf/open/floor/wood/parquet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "rZw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/duct/industrial/waste, @@ -35649,6 +37671,7 @@ dir = 1 }, /obj/effect/turf_decal/trimline/dark_blue/line, +/obj/structure/sign/directions/upload/directional/north, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/aft) "sbh" = ( @@ -35691,7 +37714,7 @@ dir = 6 }, /turf/open/floor/iron/dark/textured, -/area/station/maintenance/port/aft) +/area/station/security) "scY" = ( /obj/effect/turf_decal/trimline/white/filled/line{ color = "#009dc4" @@ -35736,9 +37759,6 @@ /turf/open/floor/engine, /area/station/science/robotics/lab) "seR" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Toilet" - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/all/science/general, @@ -35748,6 +37768,9 @@ /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 }, +/obj/machinery/door/airlock/bathroom{ + name = "Toilet" + }, /turf/open/floor/iron/showroomfloor, /area/station/science/lobby) "seY" = ( @@ -35762,7 +37785,7 @@ dir = 1 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "sfr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -35792,6 +37815,8 @@ color = "#009dc4"; dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) "sgm" = ( @@ -35823,11 +37848,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) -"sgQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/glass/reinforced, -/area/station/engineering/main) "shh" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -35918,6 +37938,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/grimy, /area/station/hallway/secondary/service) "skv" = ( @@ -35934,6 +37958,8 @@ dir = 1 }, /obj/effect/turf_decal/trimline/dark_blue/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "skJ" = ( @@ -35951,12 +37977,20 @@ /mob/living/basic/cockroach, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"sld" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) "sln" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/security/office) "slx" = ( @@ -35983,6 +38017,7 @@ name = "Kitchen" }, /obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination/kitchen, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "smf" = ( @@ -35992,6 +38027,7 @@ "smk" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, +/mob/living/basic/chicken/mime, /turf/open/floor/plating, /area/station/service/theater/abandoned) "smo" = ( @@ -36029,8 +38065,17 @@ /obj/effect/turf_decal/trimline/brown/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse/upper) +"snG" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white/textured, +/area/station/medical/pharmacy) "snH" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -36052,14 +38097,28 @@ /area/station/engineering/atmos) "som" = ( /obj/machinery/door/airlock/public/glass{ - name = "Chapel Office" + name = "Crematorium" }, /obj/effect/mapping_helpers/airlock/access/all/service/chapel_office, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/navigate_destination/incinerator, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"spi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/filled/line{ + color = "#009dc4" + }, +/obj/effect/turf_decal/trimline/white/line{ + dir = 1; + color = "#009dc4" + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central/fore) "spI" = ( /obj/machinery/duct/industrial/waste, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -36068,6 +38127,8 @@ /obj/effect/turf_decal/trimline/blue/warning{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, /area/station/medical/surgery/theatre) "sqk" = ( @@ -36087,9 +38148,6 @@ /turf/open/floor/carpet/executive, /area/station/security/warden) "sqA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 1 @@ -36097,6 +38155,8 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "sqP" = ( @@ -36114,7 +38174,15 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/spawner/random/trash/graffiti, +/obj/machinery/door/airlock/maintenance{ + name = "Disposal Access" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/obj/structure/cable, +/obj/effect/landmark/navigate_destination/disposals, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, /turf/open/floor/plating, /area/station/maintenance/disposal) "sri" = ( @@ -36203,10 +38271,19 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/stairs{ dir = 4 }, /area/station/security/warden) +"ssm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/executive, +/area/station/command/meeting_room/council) +"ssI" = ( +/obj/machinery/light/small/maintenance/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) "ssO" = ( /mob/living/basic/pet/fox/renault, /obj/structure/bed/dogbed/renault, @@ -36214,9 +38291,10 @@ /area/station/command/heads_quarters/captain/private) "ssP" = ( /obj/machinery/door/airlock/command/glass{ - name = "Bridge" + name = "Captain's Quarters" }, /obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/command/teleporter) "ssT" = ( @@ -36239,6 +38317,8 @@ /obj/machinery/power/apc/auto_name/directional/south, /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/trimline/purple/filled/mid_joiner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, /area/station/science/robotics/lab) "stw" = ( @@ -36276,7 +38356,7 @@ /obj/structure/window/spawner/directional/south, /obj/item/mmi, /obj/item/mmi, -/obj/structure/table/glass/plasmaglass, +/obj/structure/table, /turf/open/floor/noslip{ icon_state = "textured_white"; color = "#D381C9" @@ -36314,6 +38394,9 @@ /area/station/command/heads_quarters/hos) "svo" = ( /obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/carpet, /area/station/service/chapel/office) "svv" = ( @@ -36377,6 +38460,11 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/commons/fitness/recreation/entertainment) +"sxg" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/mineral/titanium, +/area/station/ai_monitored/command/storage/eva) "sxq" = ( /obj/effect/turf_decal/trimline/white/filled/warning{ dir = 5; @@ -36386,6 +38474,7 @@ dir = 9; color = "#009dc4" }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/showroomfloor, /area/station/commons/dorms) "sxv" = ( @@ -36434,10 +38523,8 @@ fax_name = "Detective's Office"; name = "Detective's Fax Machine" }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "detective_shutters"; - name = "Detective's Office Shutters" +/obj/structure/window/reinforced/tinted/frosted{ + dir = 8 }, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) @@ -36449,9 +38536,11 @@ /turf/open/floor/plating, /area/station/security/office) "syr" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/explab) "syv" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, @@ -36461,7 +38550,7 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/obj/structure/chair/stool/bar/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, /area/station/security/warden) "syJ" = ( @@ -36512,9 +38601,8 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 }, -/obj/machinery/iv_drip, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "sAA" = ( /obj/structure/cable/industrial, /turf/open/floor/iron/stairs, @@ -36533,7 +38621,7 @@ dir = 9 }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "sBe" = ( /obj/structure/table/wood, /obj/item/food/ready_donk/mac_n_cheese, @@ -36588,13 +38676,24 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/engineering/main) +"sCD" = ( +/obj/structure/cable, +/obj/machinery/plumbing/floor_pump/input/on/waste/directional/south, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/lobby) "sCJ" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"sCR" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/random/trash, +/obj/machinery/light/small/maintenance/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/starboard/aft) "sCS" = ( /obj/machinery/door/airlock/security{ - name = "Security Lounge" + name = "Security Locker Room" }, /obj/effect/mapping_helpers/airlock/access/all/security/entrance, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -36615,6 +38714,8 @@ color = "#009dc4"; dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) "sDD" = ( @@ -36682,7 +38783,8 @@ /area/station/hallway/secondary/exit/departure_lounge) "sFa" = ( /obj/machinery/door/poddoor/shutters{ - id = "cargodoor" + id = "cargodoor"; + name = "Warehouse Shutters" }, /turf/open/floor/plating, /area/station/cargo/warehouse) @@ -36702,7 +38804,7 @@ /area/station/command/heads_quarters/captain/private) "sFK" = ( /obj/machinery/door/airlock/command/glass{ - name = "Bridge" + name = "Conference Room" }, /obj/effect/mapping_helpers/airlock/access/all/command/general, /obj/machinery/door/poddoor/preopen{ @@ -36721,6 +38823,16 @@ icon_state = "boxing" }, /area/station/commons/fitness) +"sFS" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/science/circuits) "sFY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -36770,7 +38882,7 @@ /obj/structure/table/wood, /obj/machinery/camera/autoname/directional/east, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "sHt" = ( /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 8 @@ -36787,15 +38899,6 @@ color = "#D381C9" }, /area/station/science/robotics) -"sHI" = ( -/obj/machinery/button/door/directional/north{ - pixel_x = 7; - id = "wardbed"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/pod/dark, -/area/station/security/warden) "sHS" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -36821,6 +38924,7 @@ /area/station/maintenance/starboard/aft) "sJd" = ( /obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/commons/dorms) "sJj" = ( @@ -36865,6 +38969,7 @@ /obj/effect/turf_decal/trimline/blue/line{ dir = 4 }, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron/white/textured, /area/station/medical/surgery/theatre) "sJD" = ( @@ -36873,11 +38978,23 @@ }, /turf/open/floor/wood/large, /area/station/security/checkpoint/customs) +"sJJ" = ( +/obj/effect/spawner/random/structure/crate_loot, +/obj/machinery/light/small/maintenance/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) "sJM" = ( /obj/effect/spawner/random/maintenance, /obj/effect/spawner/random/structure/table_or_rack, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"sJN" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/aft) "sJO" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -36918,11 +39035,6 @@ /obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"sLa" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/wood, -/area/station/command/heads_quarters/rd) "sLg" = ( /obj/machinery/pdapainter/engineering, /turf/open/floor/carpet/orange, @@ -36989,22 +39101,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/cargo/storage) -"sMI" = ( -/obj/structure/table, -/obj/item/multitool/circuit{ - pixel_x = -8 - }, -/obj/item/multitool/circuit{ - pixel_x = -8 - }, -/obj/item/multitool/circuit{ - pixel_x = -8 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/station/science/robotics/mechbay) "sMY" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/item/chair/stool, @@ -37037,6 +39133,13 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) +"sOf" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/storage) "sOr" = ( /obj/machinery/light/directional/west, /obj/structure/tank_dispenser, @@ -37058,6 +39161,10 @@ color = "#009dc4" }, /obj/machinery/light/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) "sON" = ( @@ -37101,8 +39208,9 @@ name = "Pizza Cutter"; desc = "A military combat utility Pizza Cutter." }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "sQa" = ( /obj/machinery/duct/industrial/waste, /turf/open/floor/iron/dark/textured, @@ -37198,6 +39306,7 @@ pixel_x = -7; pixel_y = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/hop) "sSN" = ( @@ -37212,6 +39321,7 @@ invisibility = 101 }, /obj/structure/sign/departments/medbay/alt, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/hallway/primary/central) "sTc" = ( @@ -37226,7 +39336,7 @@ /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/aft) "sTq" = ( -/obj/structure/table/glass/plasmaglass, +/obj/structure/table, /obj/item/electronics/apc, /obj/item/electronics/apc, /turf/open/floor/plating, @@ -37320,9 +39430,8 @@ /turf/open/floor/iron/dark, /area/station/cargo/sorting) "sVq" = ( -/obj/structure/table/glass, +/obj/structure/table/reinforced/rglass, /obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/turf_decal/siding/white/corner, /obj/item/storage/box/gloves{ pixel_y = 8 }, @@ -37333,7 +39442,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "sVF" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -37365,6 +39474,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) +"sWn" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/mid_joiner{ + dir = 4 + }, +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/iron/dark/textured_edge{ + dir = 4 + }, +/area/station/hallway/primary/central) "sWz" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, @@ -37395,6 +39519,20 @@ }, /turf/closed/wall, /area/station/commons/vacant_room/commissary) +"sXz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/lobby) "sYe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37406,11 +39544,22 @@ }, /turf/open/floor/plastic, /area/station/hallway/primary/central) +"sYk" = ( +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos) "sYn" = ( /turf/open/floor/wood, /area/station/cargo/miningoffice) "sYR" = ( /obj/effect/turf_decal/stripes, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/engine, /area/station/science/robotics/lab) "sYY" = ( @@ -37483,7 +39632,7 @@ "tbj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, -/area/station/science/robotics/mechbay) +/area/station/science/circuits) "tbp" = ( /obj/machinery/light/directional/north, /turf/open/floor/bamboo, @@ -37545,6 +39694,9 @@ /obj/structure/railing, /turf/open/floor/wood, /area/station/commons/fitness/recreation/entertainment) +"tdm" = ( +/turf/open/floor/carpet/neon/simple/orange/nodots, +/area/station/bitrunning/den) "tdt" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -37559,6 +39711,8 @@ }, /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) "tdI" = ( @@ -37587,7 +39741,6 @@ /obj/structure/sign/poster/contraband/punch_shit{ pixel_y = 35 }, -/obj/effect/decal/cleanable/garbage, /obj/machinery/light/very_dim/directional/north, /turf/open/floor/iron, /area/station/service/theater/abandoned) @@ -37610,9 +39763,14 @@ /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "tfk" = ( -/obj/structure/chair/sofa/left{ - dir = 4; - color = "#486091" +/obj/structure/table/glass/plasmaglass, +/obj/item/ai_module/supplied/freeform, +/obj/machinery/button/door/directional/south{ + id = "aiload"; + name = "AI Upload Blast Door Control"; + pixel_y = 10; + req_access = list("command"); + pixel_x = -9 }, /turf/open/floor/carpet/cyan, /area/station/ai_monitored/turret_protected/ai_upload) @@ -37644,6 +39802,8 @@ /obj/effect/turf_decal/trimline/purple/filled/mid_joiner{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, /area/station/science/robotics/lab) "tgb" = ( @@ -37666,14 +39826,7 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/structure/closet/secure_closet/personal/patient, /turf/open/floor/iron/white/textured, -/area/station/medical/surgery/aft) -"tgz" = ( -/obj/machinery/duct/industrial/waste, -/obj/structure/disposalpipe/segment, -/obj/machinery/light/small/directional/east, -/obj/effect/spawner/random/trash/graffiti, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) +/area/station/medical/patients_rooms/room_a) "tgE" = ( /turf/open/floor/iron/stairs{ dir = 4 @@ -37704,6 +39857,8 @@ dir = 8 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/medical/morgue) "tgW" = ( @@ -37751,6 +39906,12 @@ /obj/item/storage/box/deputy, /turf/open/floor/iron/dark/textured, /area/station/security/office) +"tiP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/cargo/warehouse) "tiX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -37768,6 +39929,8 @@ dir = 6 }, /obj/effect/spawner/random/trash/graffiti, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/ordnance/office) "tjR" = ( @@ -37859,8 +40022,9 @@ /area/station/science/lobby) "tmA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "tmC" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 1 @@ -37882,15 +40046,6 @@ }, /turf/open/floor/plating, /area/station/science/xenobiology) -"tns" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/structure/disposaloutlet{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/office) "tnM" = ( /obj/machinery/light/directional/south, /obj/effect/spawner/random/engineering/tool, @@ -37900,15 +40055,6 @@ /obj/item/bikehorn/rubberducky/plasticducky, /turf/open/floor/plating/ocean, /area/station/commons/fitness/recreation/entertainment) -"toq" = ( -/obj/machinery/door/airlock/security{ - name = "Evidence Storage"; - id_tag = "wardbed" - }, -/obj/effect/mapping_helpers/airlock/access/all/security/armory, -/obj/machinery/door/firedoor, -/turf/open/floor/pod/dark, -/area/station/security/warden) "tor" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ @@ -37933,6 +40079,9 @@ dir = 1 }, /obj/effect/turf_decal/trimline/brown/filled/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse/upper) "tpd" = ( @@ -37961,9 +40110,10 @@ dir = 8 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "tqP" = ( /obj/structure/sink/kitchen/directional/west, +/obj/machinery/firealarm/directional/east, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "trd" = ( @@ -38010,11 +40160,8 @@ /turf/open/floor/iron/white/textured_large, /area/station/science/robotics/lab) "tsb" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod Four"; - space_dir = 4 - }, /obj/structure/cable, +/obj/machinery/door/airlock/maintenance, /turf/open/floor/plating, /area/station/engineering/main) "tso" = ( @@ -38028,6 +40175,22 @@ }, /turf/open/floor/iron/dark/textured, /area/station/cargo/storage) +"tsO" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/machinery/button/door/directional/west{ + id = "engiewindow"; + name = "Window Blinds"; + pixel_y = 22; + req_access = list("engineering"); + pixel_x = -22 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/break_room) "tto" = ( /obj/item/grown/bananapeel, /obj/machinery/door/airlock/maintenance, @@ -38052,7 +40215,7 @@ pixel_x = 16 }, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "ttR" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, @@ -38081,7 +40244,7 @@ /obj/effect/mapping_helpers/airlock/access/any/medical, /obj/effect/mapping_helpers/airlock/access/any/science/genetics, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "tuT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38116,7 +40279,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "tvt" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -38125,8 +40288,9 @@ /obj/effect/turf_decal/trimline/white/filled/line{ color = "#00ff00" }, +/obj/structure/cable, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "tvC" = ( /obj/effect/turf_decal/trimline/brown/warning{ dir = 8 @@ -38166,7 +40330,7 @@ /turf/closed/wall/r_wall, /area/station/cargo/miningoffice) "txs" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, /turf/open/floor/carpet/executive, @@ -38190,7 +40354,6 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/obj/structure/table/wood, /obj/effect/turf_decal/siding/wood{ dir = 1 }, @@ -38199,6 +40362,9 @@ dir = 1; name = "Kitchen" }, +/obj/machinery/smartfridge/drinks{ + icon_state = "boozeomat" + }, /turf/open/floor/carpet, /area/station/service/bar) "tym" = ( @@ -38222,6 +40388,7 @@ /area/station/security/office) "tza" = ( /obj/effect/landmark/start/head_of_personnel, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/hop) "tzf" = ( @@ -38234,11 +40401,7 @@ /turf/open/floor/wood, /area/station/commons/fitness/recreation/entertainment) "tzi" = ( -/obj/machinery/power/terminal, /obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 10 - }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) @@ -38249,9 +40412,6 @@ /turf/open/floor/wood, /area/station/commons/lounge) "tzt" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Central Access" - }, /obj/machinery/door/firedoor, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/supply/general, @@ -38261,6 +40421,12 @@ /obj/effect/turf_decal/trimline/brown/filled/warning{ dir = 8 }, +/obj/machinery/door/airlock/mining/glass{ + id_tag = "innercargo"; + name = "Cargo Warehouse" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse) "tzD" = ( @@ -38340,12 +40506,14 @@ /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, /turf/open/floor/iron/white/textured, -/area/station/medical/surgery/aft) +/area/station/medical/patients_rooms/room_b) "tBQ" = ( /turf/closed/wall, /area/station/medical/surgery/theatre) "tBV" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/eighties/red{ icon = 'goon/icons/turf/floors.dmi'; icon_state = "clown_carpet" @@ -38376,7 +40544,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "tCm" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 9 @@ -38390,8 +40558,9 @@ /obj/effect/turf_decal/siding{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "tCB" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -38516,9 +40685,6 @@ /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/hop) "tGs" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, /obj/structure/cable, /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -38609,6 +40775,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, /area/station/security/warden) "tIv" = ( @@ -38714,6 +40882,7 @@ dir = 1; color = "#009dc4" }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "tJY" = ( @@ -38758,6 +40927,10 @@ }, /turf/open/floor/plastic, /area/station/hallway/primary/central) +"tLw" = ( +/obj/machinery/light/small/maintenance/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/central) "tLz" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -38844,8 +41017,8 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/station/science/robotics/mechbay) +/turf/open/floor/iron/white, +/area/station/science/circuits) "tNI" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable/industrial, @@ -38976,8 +41149,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "tSc" = ( /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 10 @@ -39019,6 +41193,9 @@ /turf/open/floor/plastic, /area/station/hallway/primary/central) "tTb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/iron/dark, /area/station/commons/dorms) "tTe" = ( @@ -39032,6 +41209,9 @@ /area/station/commons/storage/emergency/starboard) "tTp" = ( /obj/machinery/light_switch/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "tTt" = ( @@ -39063,6 +41243,13 @@ }, /turf/open/floor/grass, /area/station/medical/virology) +"tVb" = ( +/obj/effect/turf_decal/trimline/red/filled/warning, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/security/office) "tVq" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -39070,6 +41257,7 @@ id = "council blast"; name = "Council Blast Doors" }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/command/bridge) "tVG" = ( @@ -39094,6 +41282,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "sci" }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/science/lobby) "tVQ" = ( @@ -39108,6 +41297,8 @@ }, /obj/effect/landmark/start/librarian, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/service/library) "tVX" = ( @@ -39168,6 +41359,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/science/lobby) "tXk" = ( @@ -39224,6 +41417,11 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"tYx" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/textured, +/area/station/medical/pharmacy) "tYA" = ( /turf/closed/wall, /area/station/hallway/primary/central) @@ -39271,6 +41469,16 @@ }, /turf/open/floor/bamboo, /area/station/commons/toilet/locker) +"tZu" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/lobby) "tZy" = ( /obj/structure/cable, /obj/structure/toilet{ @@ -39282,6 +41490,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "tZE" = ( @@ -39331,17 +41540,18 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/navigate_destination/janitor, /turf/open/floor/iron/dark, /area/station/service/janitor) "uby" = ( /obj/machinery/door/airlock/research{ - name = "Robotics Lab" + name = "Circuit Lab" }, /obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/iron/dark, -/area/station/science/robotics/mechbay) +/area/station/science/circuits) "ubI" = ( /obj/machinery/duct/industrial/waste, /obj/structure/extinguisher_cabinet/directional/east, @@ -39421,10 +41631,6 @@ /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) "udu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, /obj/machinery/dna_scannernew, /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 8 @@ -39455,25 +41661,26 @@ /obj/effect/turf_decal/trimline/red/filled/warning, /obj/machinery/door/airlock/security/glass{ id_tag = "outerbrig"; - name = "Brig" + name = "Security" }, /obj/effect/mapping_helpers/airlock/access/all/security/entrance, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "brig-entrance" }, +/obj/effect/landmark/navigate_destination/sec, /turf/open/floor/iron/dark/textured, /area/station/security/office) "udB" = ( /obj/machinery/door/airlock/maintenance{ name = "Security Maintenance" }, -/obj/effect/mapping_helpers/airlock/access/any/security/maintenance, /obj/effect/turf_decal/trimline/red/filled/warning, /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 1 }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, -/area/station/maintenance/port/aft) +/area/station/security) "udH" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/trimline/dark_blue/filled/line{ @@ -39485,6 +41692,7 @@ /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/entry) "udK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/mineral/titanium/white, /area/station/command/teleporter) "udR" = ( @@ -39536,8 +41744,10 @@ dir = 4; invisibility = 101 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "ueN" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -39560,7 +41770,7 @@ dir = 1 }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "ufI" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/west, @@ -39581,6 +41791,8 @@ "ufS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/tracks, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/noslip{ icon_state = "textured_white"; color = "#999999" @@ -39603,6 +41815,12 @@ /obj/machinery/disposal/bin, /turf/open/floor/plating, /area/station/maintenance/disposal) +"ugs" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/port/central) "ugA" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/trimline/red/filled/warning{ @@ -39653,7 +41871,7 @@ /area/station/engineering/main) "uhe" = ( /obj/machinery/door/airlock/public/glass{ - name = "Central Access" + name = "Cargo Lobby" }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/brown/filled/warning, @@ -39665,7 +41883,7 @@ "uhh" = ( /obj/machinery/door/airlock/medical/glass{ id_tag = "MedbayFoyer"; - name = "Medbay Clinic" + name = "Medbay Office" }, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/effect/turf_decal/trimline/blue/filled/warning{ @@ -39688,8 +41906,10 @@ dir = 4; invisibility = 101 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "uhr" = ( /obj/structure/cable, /obj/structure/table, @@ -39708,8 +41928,9 @@ /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 10 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "uhB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39740,6 +41961,9 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron/textured, /area/station/science/robotics/lab) "uic" = ( @@ -39844,6 +42068,9 @@ /area/station/command/heads_quarters/cmo) "umT" = ( /obj/effect/spawner/random/trash, +/obj/machinery/camera/directional/south{ + c_tag = "Theater - Backstage" + }, /turf/open/floor/iron, /area/station/commons/vacant_room/commissary) "umX" = ( @@ -39864,7 +42091,6 @@ }, /area/station/science/lab) "ung" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /obj/machinery/holopad, @@ -39882,10 +42108,8 @@ /turf/open/floor/engine, /area/station/engineering/main) "unl" = ( -/obj/machinery/portable_atmospherics/canister/plasma, -/obj/effect/turf_decal/siding/purple, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) +/turf/open/floor/engine, +/area/station/science/explab) "unx" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -39900,7 +42124,7 @@ }, /obj/effect/turf_decal/trimline/blue/line, /obj/machinery/light/directional/north, -/obj/structure/table/glass, +/obj/structure/table/reinforced/rglass, /obj/item/storage/backpack/duffelbag/med/surgery, /turf/open/floor/iron/white/textured, /area/station/medical/surgery/theatre) @@ -39944,6 +42168,7 @@ /obj/effect/spawner/structure/window, /obj/structure/cable, /obj/structure/sign/departments/medbay/alt, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/medical/medbay/lobby) "uoJ" = ( @@ -40027,17 +42252,6 @@ /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"uqw" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/disposal/delivery_chute{ - dir = 8; - name = "disposals chute"; - pixel_x = 5 - }, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/office) "uqy" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40084,6 +42298,19 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"urG" = ( +/obj/machinery/duct/industrial/waste, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/warehouse/upper) "urU" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 @@ -40249,6 +42476,11 @@ /obj/structure/closet/crate/wooden/toy, /turf/open/floor/bamboo, /area/station/commons/fitness) +"uws" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet, +/area/station/service/chapel) "uwI" = ( /obj/machinery/portable_atmospherics/canister/anesthetic_mix, /obj/effect/turf_decal/trimline/blue/filled/end{ @@ -40302,6 +42534,14 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"uye" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/machinery/smartfridge/organ, +/turf/closed/wall, +/area/station/medical/surgery/theatre) "uyh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40350,10 +42590,15 @@ /obj/machinery/telecomms/server/presets/engineering, /turf/open/floor/circuit, /area/station/tcommsat/server) -"uyC" = ( -/obj/effect/landmark/start/prisoner, -/turf/open/floor/plating/ocean/pit, -/area/ocean) +"uyO" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "council blast"; + name = "Council Blast Doors" + }, +/turf/open/floor/plating, +/area/station/command/meeting_room/council) "uyU" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/warning{ dir = 10 @@ -40378,6 +42623,11 @@ }, /turf/open/floor/iron/smooth, /area/station/science/genetics) +"uzF" = ( +/obj/effect/turf_decal/trimline/red/filled/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/security/office) "uzN" = ( /obj/effect/turf_decal/tile/neutral/fourcorners{ color = "#009dc4" @@ -40421,7 +42671,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/duct/industrial/waste, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "uAJ" = ( /obj/effect/turf_decal/trimline/yellow/warning{ dir = 4 @@ -40454,6 +42704,7 @@ /obj/structure/toilet, /obj/effect/decal/cleanable/blood/gibs/body, /obj/effect/mob_spawn/corpse/human/assistant, +/obj/machinery/light/small/maintenance/directional/north, /turf/open/floor/iron/white, /area/station/maintenance/starboard/upper) "uBI" = ( @@ -40479,11 +42730,7 @@ color = "#00ff00" }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) -"uCm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/grass, -/area/station/science/genetics) +/area/station/commons/storage/mining) "uCs" = ( /obj/structure/closet/crate/trashcart/filled, /turf/open/floor/plating, @@ -40558,13 +42805,10 @@ dir = 9 }, /obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, /obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/science/robotics/mechbay) +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron/white, +/area/station/science/circuits) "uDK" = ( /obj/machinery/light/directional/west, /obj/machinery/light_switch/directional/west, @@ -40572,10 +42816,10 @@ dir = 9 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "uDY" = ( /obj/machinery/door/airlock/command/glass{ - name = "Bridge" + name = "Conference Room" }, /obj/effect/mapping_helpers/airlock/access/all/command/general, /obj/machinery/door/poddoor/preopen{ @@ -40584,6 +42828,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/dark_blue/filled/warning, +/obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/command/bridge) "uEb" = ( @@ -40595,6 +42840,7 @@ color = "#009dc4"; dir = 1 }, +/obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "uEz" = ( @@ -40609,8 +42855,9 @@ /obj/effect/turf_decal/siding/red{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "uEF" = ( /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation/entertainment) @@ -40677,17 +42924,30 @@ /area/station/engineering/atmos) "uGl" = ( /obj/machinery/door/airlock/public/glass{ - name = "Medbay Lobby" + name = "Genetics" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/access/any/medical, /obj/effect/mapping_helpers/airlock/access/any/science/genetics, +/obj/structure/cable, /turf/open/floor/iron/white/textured, /area/station/science/genetics) +"uGq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plastic, +/area/station/hallway/primary/central) "uGB" = ( /obj/machinery/door/airlock/public/glass{ - name = "Central Access" + name = "Dorms" }, /obj/effect/turf_decal/trimline/white/filled/warning{ dir = 1; @@ -40699,7 +42959,9 @@ /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) "uGD" = ( -/obj/machinery/door/airlock/maintenance, +/obj/machinery/door/airlock/maintenance{ + name = "Forbidden Garden" + }, /turf/open/floor/grass, /area/station/maintenance/starboard/upper) "uGO" = ( @@ -40720,7 +42982,7 @@ dir = 1 }, /obj/machinery/door/airlock/external{ - name = "Escape Pod Four"; + name = "External Access"; space_dir = 4 }, /obj/machinery/duct/industrial/waste, @@ -40742,14 +43004,6 @@ }, /turf/open/floor/engine, /area/station/engineering/main) -"uHf" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/mob/living/basic/cockroach, -/turf/open/floor/plating, -/area/station/maintenance/disposal) "uHj" = ( /obj/machinery/computer/cargo/request{ dir = 8 @@ -40767,9 +43021,7 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmos) "uHW" = ( -/obj/machinery/smartfridge/drinks{ - icon_state = "boozeomat" - }, +/obj/machinery/vending/boozeomat, /turf/open/floor/carpet, /area/station/service/bar) "uIg" = ( @@ -40850,9 +43102,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/trimline/purple/filled/warning, /turf/open/floor/iron/white, -/area/station/science/robotics/mechbay) +/area/station/science/circuits) "uKm" = ( /obj/machinery/light/directional/north, /obj/machinery/duct/industrial/waste, @@ -40869,8 +43120,9 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/parquet, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "uKT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -40889,6 +43141,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "brig-entrance" }, +/obj/effect/landmark/navigate_destination/dockarrival, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/entry) "uLl" = ( @@ -40898,6 +43151,7 @@ dir = 5 }, /obj/effect/turf_decal/tile/green/fourcorners, +/obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/science/genetics) "uLu" = ( @@ -40925,6 +43179,8 @@ name = "Cabin 2" }, /obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/commons/dorms) "uLQ" = ( @@ -40956,6 +43212,8 @@ dir = 8 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse) "uMq" = ( @@ -40978,7 +43236,7 @@ color = "#00ff00" }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "uMD" = ( /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 1 @@ -40999,7 +43257,7 @@ dir = 8 }, /turf/closed/wall, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "uNu" = ( /obj/effect/turf_decal/stripes, /obj/structure/disposalpipe/segment, @@ -41032,7 +43290,7 @@ "uOF" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "uOL" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -41057,11 +43315,12 @@ }, /area/station/hallway/primary/central) "uOT" = ( -/obj/structure/chair/sofa/right{ - dir = 4; - color = "#486091" - }, /obj/machinery/light/directional/south, +/obj/structure/table/glass/plasmaglass, +/obj/item/ai_module/supplied/freeform, +/obj/item/ai_module/toy_ai{ + pixel_x = 5 + }, /turf/open/floor/carpet/cyan, /area/station/ai_monitored/turret_protected/ai_upload) "uPg" = ( @@ -41114,7 +43373,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/curtain/cloth, /turf/open/floor/plating, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "uQJ" = ( /obj/machinery/camera/autoname/directional/east, /turf/open/floor/wood, @@ -41193,13 +43452,6 @@ /obj/machinery/vending/wardrobe/det_wardrobe, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) -"uRV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/table/reinforced/rglass, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) "uRZ" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/white/filled/line{ @@ -41228,13 +43480,14 @@ /area/station/engineering/atmos) "uSv" = ( /obj/machinery/door/airlock/public/glass{ - name = "Art Gallery" + name = "Library" }, /obj/structure/cable, /obj/effect/turf_decal/trimline/green/filled/warning, /obj/effect/turf_decal/trimline/green/filled/warning{ dir = 1 }, +/obj/effect/landmark/navigate_destination/library, /turf/open/floor/iron/dark/textured, /area/station/service/library) "uSB" = ( @@ -41276,6 +43529,11 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"uTr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) "uTw" = ( /obj/structure/table/reinforced, /obj/machinery/door/window/right/directional/south{ @@ -41428,6 +43686,7 @@ pixel_y = 5 }, /obj/item/stack/cable_coil, +/obj/machinery/cell_charger, /turf/open/floor/iron, /area/ruin/space/ks13/engineering/secure_storage) "uVH" = ( @@ -41452,8 +43711,9 @@ /area/station/maintenance/disposal) "uXl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "uXv" = ( /obj/machinery/plumbing/floor_pump/input/on/waste/directional/west, /obj/effect/turf_decal/trimline/red/filled/warning{ @@ -41474,6 +43734,7 @@ /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /obj/effect/landmark/start/depsec/supply, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) "uYA" = ( @@ -41483,9 +43744,9 @@ /turf/open/floor/iron/dark/herringbone, /area/station/science/server) "uYE" = ( -/obj/machinery/portable_atmospherics/canister/plasma, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) +/obj/machinery/artifact_zapper, +/turf/open/floor/engine, +/area/station/science/explab) "uYL" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -41512,7 +43773,16 @@ color = "#00ff00" }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) +"uYY" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "uZa" = ( /obj/structure/falsewall, /turf/open/floor/iron/dark, @@ -41539,6 +43809,12 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) +"uZl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) "uZx" = ( /obj/structure/closet/secure_closet/personal/cabinet, /obj/effect/decal/cleanable/dirt, @@ -41577,8 +43853,7 @@ /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "vbD" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/west, /turf/open/floor/wood, /area/station/service/hydroponics/upper) "vbV" = ( @@ -41629,8 +43904,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/junction/flip, +/obj/structure/cable, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "vcU" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -41680,15 +43956,11 @@ /obj/effect/turf_decal/trimline/blue/warning{ dir = 4 }, -/turf/open/floor/iron/white/textured, -/area/station/medical/surgery/theatre) -"vdI" = ( -/obj/effect/turf_decal/tile/green/opposingcorners{ +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/obj/machinery/clonepod, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/medical/surgery/theatre) "vdW" = ( /obj/machinery/holopad, /turf/open/floor/eighties/red{ @@ -41778,6 +44050,9 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "vfe" = ( @@ -41791,8 +44066,8 @@ /turf/open/floor/mineral/bananium, /area/station/maintenance/starboard/aft) "vfK" = ( -/obj/machinery/light/small/directional/east, /obj/effect/spawner/random/trash, +/obj/machinery/light/small/maintenance/directional/east, /turf/open/floor/plating, /area/station/maintenance/port/aft) "vfM" = ( @@ -41800,6 +44075,7 @@ /obj/effect/turf_decal/trimline/brown/filled/warning{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/cargo/storage) "vfX" = ( @@ -41842,6 +44118,7 @@ /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/command/bridge) "vhv" = ( @@ -41863,7 +44140,7 @@ dir = 4 }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "vhO" = ( /obj/effect/turf_decal/stripes, /turf/open/floor/plating, @@ -41922,7 +44199,7 @@ dir = 9 }, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "vjj" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -41949,7 +44226,6 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 }, -/obj/item/banner/engineering, /turf/open/floor/iron/dark/textured, /area/station/engineering/main) "vju" = ( @@ -42006,6 +44282,10 @@ icon_state = "clown_carpet" }, /area/station/service/theater) +"vkH" = ( +/obj/structure/sign/directions/lavaland/directional/south, +/turf/open/floor/engine, +/area/station/cargo/miningoffice) "vkU" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 10 @@ -42039,15 +44319,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/command/bridge) -"vlt" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/disposaloutlet{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation/entertainment) "vlw" = ( /obj/machinery/camera/directional/east{ c_tag = "Atmospherics Tank - O2" @@ -42061,23 +44332,24 @@ /turf/open/floor/engine, /area/station/maintenance/port/central) "vlM" = ( -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, /obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) +/obj/machinery/portable_atmospherics/canister/plasma, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/science/explab) "vme" = ( /obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, /obj/machinery/door/airlock{ name = "Hydroponics Maintenance" }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark, /area/station/service/hydroponics) "vmt" = ( /obj/machinery/door/airlock/public/glass{ - name = "Central Access" + name = "Cargo Lobby" }, /obj/structure/disposalpipe/segment{ dir = 4; @@ -42090,6 +44362,7 @@ /obj/effect/turf_decal/trimline/brown/filled/warning{ dir = 4 }, +/obj/effect/landmark/navigate_destination/cargo, /turf/open/floor/iron/dark/diagonal, /area/station/cargo/lobby) "vmz" = ( @@ -42147,6 +44420,7 @@ codes_txt = "patrol;next_patrol=Hall-8"; location = "Hall-7" }, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "vnw" = ( @@ -42164,6 +44438,22 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation/entertainment) +"vnI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/filled/line{ + color = "#009dc4"; + dir = 1 + }, +/obj/effect/turf_decal/trimline/white/line{ + color = "#009dc4" + }, +/obj/structure/sign/directions/cryo/directional/east{ + pixel_x = 0; + pixel_y = 32 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "voj" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -42172,17 +44462,10 @@ /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/security/office) -"voC" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 6 - }, -/obj/structure/closet/crate/engineering, -/obj/effect/turf_decal/bot, -/obj/item/construction/plumbing/engineering, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/main) "voJ" = ( /obj/effect/spawner/random/entertainment/arcade{ dir = 1 @@ -42207,11 +44490,18 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/structure/cable, /obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"vqk" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/plumbing/floor_pump/input/on/waste/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central/fore) "vqB" = ( /obj/structure/rack, /obj/effect/turf_decal/tile/neutral, @@ -42225,6 +44515,17 @@ }, /turf/open/floor/iron/smooth, /area/station/commons/fitness/recreation) +"vqH" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/structure/closet/crate/rcd, +/obj/effect/turf_decal/bot, +/obj/machinery/light/no_nightlight/directional/east, +/obj/item/construction/plumbing/engineering, +/obj/item/construction/plumbing/engineering, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/main) "vrg" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/unres, @@ -42236,7 +44537,7 @@ color = "#00ff00" }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "vrl" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -42333,7 +44634,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "vrW" = ( /obj/effect/spawner/random/trash/graffiti, /obj/structure/cable/industrial, @@ -42344,6 +44645,9 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, /turf/open/floor/iron/dark, /area/station/science/lobby) "vsA" = ( @@ -42363,10 +44667,11 @@ /obj/machinery/door/poddoor/shutters/preopen{ name = "Medical Closure Shutters"; desc = "Fuck off we're closed."; - dir = 8 + dir = 8; + id = "medclosed" }, /turf/open/floor/plating, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "vsU" = ( /obj/machinery/duct/industrial/waste, /turf/open/floor/plating, @@ -42415,7 +44720,7 @@ /turf/open/floor/iron/textured, /area/station/science/robotics/lab) "vue" = ( -/obj/structure/table/glass/plasmaglass, +/obj/structure/table, /obj/machinery/computer/records/security/laptop, /turf/open/floor/plating, /area/station/maintenance/port/central) @@ -42508,6 +44813,8 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/science/lobby) "vwY" = ( @@ -42517,8 +44824,20 @@ /obj/structure/cable/industrial, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/transit_tube/station/dispenser/reverse/flipped{ + dir = 1 + }, /turf/open/floor/engine, /area/station/science/ordnance/office) +"vxI" = ( +/obj/machinery/duct/industrial/waste, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/line, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/aft) "vxO" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -42585,6 +44904,12 @@ "vzd" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/hos) +"vze" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/lobby) "vzp" = ( /obj/structure/cable, /turf/open/floor/circuit/green/telecomms/mainframe, @@ -42652,6 +44977,18 @@ /obj/item/assembly/igniter, /turf/open/floor/iron/dark/textured, /area/station/medical/pharmacy) +"vAO" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners{ + color = "#009dc4" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners{ + color = "#009dc4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/commons/dorms) "vBn" = ( /obj/structure/cable, /turf/open/floor/iron/dark/textured, @@ -42660,22 +44997,22 @@ /turf/open/floor/engine, /area/station/science/ordnance/office) "vBN" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Disposal Access" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/any/supply/maintenance, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/door/window/left/directional/east, /turf/open/floor/plating, /area/station/maintenance/disposal) "vBW" = ( /obj/structure/table/wood, +/obj/item/book{ + desc = "An undeniably handy book."; + icon_state = "bookknock"; + name = "\improper A Simpleton's Guide to Safe-cracking with Stethoscopes" + }, +/obj/item/clothing/neck/stethoscope, /turf/open/floor/wood, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "vCn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -42683,8 +45020,9 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "vCo" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 @@ -42756,10 +45094,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plastic, /area/station/hallway/primary/central) -"vFx" = ( -/obj/structure/cable, -/turf/open/floor/iron/white/textured, -/area/station/medical/storage) "vFQ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -42776,7 +45110,8 @@ /obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/door/poddoor/shutters/preopen{ name = "Medical Closure Shutters"; - desc = "Fuck off we're closed." + desc = "Fuck off we're closed."; + id = "medclosed" }, /turf/open/floor/iron/dark/textured, /area/station/medical/office) @@ -42828,6 +45163,13 @@ }, /turf/open/floor/plating/ocean, /area/ocean/near_station_powered) +"vIn" = ( +/obj/machinery/duct/industrial/waste, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/central) "vIv" = ( /obj/machinery/light/small/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -42898,17 +45240,16 @@ /area/station/maintenance/port/central) "vJL" = ( /obj/structure/table, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, /obj/item/food/pie/cream, /obj/effect/spawner/random/food_or_drink/cake_ingredients, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "vKu" = ( /obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/ordnance/storage) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/engine, +/area/station/science/explab) "vKv" = ( /obj/structure/window/reinforced/tinted/frosted{ dir = 4 @@ -42916,6 +45257,8 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/security/courtroom) "vKz" = ( @@ -42945,6 +45288,11 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"vKM" = ( +/obj/structure/transit_tube/horizontal, +/obj/effect/spawner/structure/window/reinforced/plasma, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation/entertainment) "vKX" = ( /obj/machinery/camera/directional/east{ c_tag = "Atmospherics Tank - Toxins" @@ -42958,6 +45306,13 @@ /obj/effect/mapping_helpers/airlock/access/any/security/general, /turf/open/floor/iron/dark/textured, /area/station/security/office) +"vLC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/artifact_spawner, +/turf/open/floor/engine, +/area/station/science/explab) "vLH" = ( /turf/closed/wall, /area/station/cargo/lobby) @@ -42986,7 +45341,7 @@ dir = 10 }, /turf/open/floor/iron/dark/textured, -/area/station/maintenance/port/aft) +/area/station/security) "vMy" = ( /turf/open/floor/iron/stairs, /area/station/service/chapel) @@ -43016,14 +45371,14 @@ /obj/effect/turf_decal/trimline/blue/line{ dir = 5 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, /area/station/medical/surgery/theatre) "vNG" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment, -/obj/structure/sign/warning/no_smoking, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "vOg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43037,10 +45392,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos/hfr_room) -"vOj" = ( -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/storage/tech) "vOt" = ( /obj/machinery/duct/industrial/waste, /obj/effect/turf_decal/trimline/dark_blue/filled/warning{ @@ -43065,15 +45416,6 @@ "vPb" = ( /turf/open/floor/circuit/telecomms/server, /area/station/science/server) -"vPp" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/dark/textured, -/area/station/hallway/primary/central/fore) "vPr" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -43087,7 +45429,7 @@ invisibility = 101 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "vPV" = ( /obj/structure/rack, /obj/effect/turf_decal/tile/neutral, @@ -43095,6 +45437,7 @@ spawn_loot_count = 2; spawn_loot_split = 1 }, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron/smooth, /area/station/commons/fitness/recreation) "vPZ" = ( @@ -43106,7 +45449,6 @@ "vQf" = ( /mob/living/carbon/human/species/monkey, /obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/grass, /area/station/science/genetics) "vQq" = ( @@ -43163,6 +45505,13 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"vSd" = ( +/obj/machinery/conveyor/auto{ + dir = 1 + }, +/obj/structure/sign/directions/lavaland/directional/east, +/turf/open/floor/engine, +/area/station/maintenance/port/central) "vSq" = ( /obj/machinery/light_switch/directional/north, /obj/effect/turf_decal/trimline/white/filled/line{ @@ -43174,7 +45523,7 @@ dir = 8 }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "vSw" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -43183,6 +45532,12 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) +"vSA" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/lobby) "vSD" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /obj/structure/cable, @@ -43255,9 +45610,9 @@ dir = 1 }, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "vUo" = ( -/obj/structure/table/glass, +/obj/structure/table/reinforced/rglass, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 }, @@ -43265,7 +45620,7 @@ dir = 8 }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "vUu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43394,6 +45749,8 @@ /obj/effect/turf_decal/trimline/brown/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse/upper) "vWP" = ( @@ -43402,6 +45759,13 @@ /mob/living/basic/cockroach, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"vWW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/noslip{ + icon_state = "textured_white"; + color = "#999999" + }, +/area/station/science/robotics) "vXa" = ( /turf/closed/wall/r_wall, /area/station/commons/storage/primary) @@ -43456,9 +45820,7 @@ /turf/open/floor/carpet, /area/station/service/chapel/office) "vYD" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 6 - }, +/obj/structure/window/reinforced/tinted/fulltile, /turf/open/floor/plating, /area/station/security/courtroom) "vYQ" = ( @@ -43508,6 +45870,10 @@ }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/security/armory) +"vZn" = ( +/obj/structure/cable, +/turf/open/floor/carpet/executive, +/area/station/command/meeting_room/council) "vZy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43530,8 +45896,8 @@ /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/science/robotics/mechbay) +/turf/open/floor/iron/white, +/area/station/science/circuits) "vZL" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2{ @@ -43564,12 +45930,12 @@ /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) "waM" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Toilet" - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, +/obj/machinery/door/airlock/bathroom{ + name = "Toilet" + }, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/auxiliary) "wbl" = ( @@ -43611,7 +45977,10 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, -/obj/machinery/light/very_dim/directional/north, +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark, /area/station/science/lobby) "wcc" = ( @@ -43641,6 +46010,14 @@ /obj/machinery/light/directional/north, /turf/open/floor/plating, /area/station/maintenance/department/electrical) +"wde" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "wdh" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1 @@ -43826,6 +46203,7 @@ /obj/effect/turf_decal/trimline/green/corner{ dir = 8 }, +/obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) "wha" = ( @@ -43889,13 +46267,11 @@ dir = 9 }, /turf/open/floor/iron/dark, -/area/station/science/robotics/mechbay) +/area/station/science/circuits) "wil" = ( /obj/machinery/duct/industrial/waste, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "wiA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43911,12 +46287,7 @@ /obj/machinery/duct/industrial/waste, /obj/structure/cable, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) -"wiK" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/plating, -/area/station/science/ordnance/storage) +/area/station/medical/medbay/central) "wjK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43933,6 +46304,8 @@ }, /obj/effect/turf_decal/tile/blue/opposingcorners, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, /area/station/medical/pharmacy) "wki" = ( @@ -43951,6 +46324,10 @@ /obj/structure/cable, /turf/closed/wall, /area/station/engineering/main) +"wkK" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/storage/tech) "wkS" = ( /obj/machinery/computer/station_alert{ dir = 1 @@ -43978,6 +46355,11 @@ }, /turf/open/floor/iron/textured, /area/station/science/robotics/lab) +"wlw" = ( +/obj/effect/spawner/random/trash/graffiti, +/obj/machinery/light/small/maintenance/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "wlx" = ( /turf/open/floor/iron/chapel{ dir = 4 @@ -44031,12 +46413,13 @@ dir = 1 }, /obj/effect/turf_decal/siding/white, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/commons/lounge) "wnf" = ( /obj/effect/turf_decal/stripes, /obj/machinery/door/airlock/external{ - name = "Escape Pod Four"; + name = "External Access"; space_dir = 4 }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -44108,10 +46491,9 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/trimline/purple/filled/corner, /turf/open/floor/iron/white, -/area/station/science/robotics/mechbay) +/area/station/science/circuits) "wpA" = ( /obj/machinery/ticket_machine/directional/south, /turf/open/floor/wood, @@ -44202,15 +46584,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"wrG" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured, -/area/station/hallway/secondary/exit/departure_lounge) "wrW" = ( /obj/effect/spawner/random/trash/bacteria, /obj/machinery/space_heater, @@ -44287,20 +46660,19 @@ /obj/effect/mapping_helpers/airlock/access/all/medical/psychology, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, -/area/station/medical/medbay/central) +/area/station/medical/psychology) "wtT" = ( -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, /obj/structure/disposalpipe/trunk{ dir = 1 }, /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/disposalpipe/segment, -/obj/machinery/medical_kiosk, +/obj/structure/table/reinforced/rglass, +/obj/item/stack/medical/mesh, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "wuf" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -44318,6 +46690,11 @@ }, /turf/open/floor/plating, /area/station/service/lawoffice) +"wus" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/warehouse) "wuL" = ( /obj/structure/falsewall, /turf/open/floor/plating, @@ -44328,7 +46705,7 @@ name = "Privacy Shutter" }, /obj/machinery/door/airlock/command/glass{ - name = "Chief Engineer" + name = "Chief Engineer's Office" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/ce, /turf/open/floor/iron, @@ -44389,6 +46766,11 @@ }, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) +"wxm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/hop) "wxy" = ( /obj/machinery/suit_storage_unit/standard_unit, /turf/open/floor/mineral/titanium/blue, @@ -44403,16 +46785,20 @@ /obj/effect/turf_decal/siding/purple{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "wxV" = ( /obj/structure/cable, /turf/open/floor/wood, /area/station/service/cafeteria) "wyd" = ( /obj/machinery/camera/autoname/directional/west, -/turf/open/floor/plating, -/area/station/science/ordnance/storage) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/explab) "wye" = ( /obj/structure/window/reinforced/tinted/frosted{ dir = 4 @@ -44468,6 +46854,7 @@ /obj/machinery/door/airlock/highsecurity{ name = "Secure Network Access" }, +/obj/effect/landmark/navigate_destination/tcomms, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) "wzI" = ( @@ -44493,6 +46880,8 @@ }, /obj/effect/turf_decal/tile/blue/diagonal_centre, /obj/machinery/pollution_scrubber, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/diagonal, /area/station/medical/medbay/lobby) "wAo" = ( @@ -44529,6 +46918,9 @@ /obj/effect/turf_decal/trimline/blue/filled/mid_joiner, /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron/white/textured, /area/station/medical/office) "wBl" = ( @@ -44563,6 +46955,8 @@ dir = 4 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/herringbone, /area/station/science/server) "wBL" = ( @@ -44571,6 +46965,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/hallway/secondary/exit/departure_lounge) "wBP" = ( @@ -44628,18 +47023,16 @@ color = "#00ff00" }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "wCH" = ( -/obj/machinery/defibrillator_mount/directional/north, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 5 }, /obj/effect/turf_decal/trimline/blue/corner{ dir = 8 }, -/obj/machinery/light/directional/east, /turf/closed/wall, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "wCJ" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /obj/structure/cable, @@ -44654,17 +47047,26 @@ name = "Security Maintenance" }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/security/entrance, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, /obj/effect/turf_decal/trimline/red/filled/warning, /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/security/office) "wDC" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/engine, /area/station/commons/storage/emergency/starboard) +"wDN" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white/textured, +/area/station/medical/medbay/lobby) "wDZ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -44690,6 +47092,7 @@ "wEk" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/command/bridge) "wEE" = ( @@ -44711,6 +47114,7 @@ "wEQ" = ( /obj/effect/turf_decal/tile/dark_red/fourcorners, /obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/checkpoint/science) "wEX" = ( @@ -44745,6 +47149,18 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating/ocean, /area/ocean) +"wFH" = ( +/obj/machinery/duct/industrial/waste, +/obj/effect/turf_decal/trimline/white/filled/line{ + color = "#009dc4" + }, +/obj/effect/turf_decal/trimline/white/line{ + dir = 1; + color = "#009dc4" + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) "wFP" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -44773,6 +47189,9 @@ "wHy" = ( /obj/machinery/light/small/directional/east, /obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, /turf/open/floor/iron, /area/station/engineering/storage/tech) "wId" = ( @@ -44796,7 +47215,7 @@ dir = 1 }, /obj/effect/turf_decal/trimline/purple/line, -/turf/open/floor/iron/dark/textured_edge/airless{ +/turf/open/floor/iron/dark/textured_edge{ dir = 1 }, /area/station/science/lobby) @@ -44833,6 +47252,15 @@ }, /turf/open/floor/iron/dark/textured, /area/station/command/bridge) +"wIK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/closed/wall/r_wall, +/area/station/medical/cryo) +"wJd" = ( +/obj/structure/cable, +/obj/machinery/light/small/maintenance/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "wJz" = ( /obj/effect/spawner/liquids_spawner{ reagent_list = list(/datum/reagent/ammonia/urine=400) @@ -44876,6 +47304,7 @@ dir = 9 }, /obj/effect/turf_decal/trimline/yellow/corner, +/obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "wKV" = ( @@ -44897,8 +47326,8 @@ "wLi" = ( /obj/effect/turf_decal/tile/dark_red/fourcorners, /obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/any/security/maintenance, /obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "wLp" = ( @@ -44916,6 +47345,9 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron/textured, /area/station/science/robotics/lab) "wMb" = ( @@ -44933,6 +47365,9 @@ dir = 10; color = "#009dc4" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "wMO" = ( @@ -44983,8 +47418,9 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "wOu" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/machinery/vending/wardrobe/jani_wardrobe, @@ -45163,6 +47599,8 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/noslip{ icon_state = "textured_white"; color = "#D381C9" @@ -45171,7 +47609,7 @@ "wRT" = ( /obj/effect/spawner/structure/window, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "wRU" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine/vacuum, @@ -45188,9 +47626,6 @@ "wSx" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, /obj/machinery/light/floor/has_bulb, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) @@ -45217,6 +47652,12 @@ }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"wTV" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/artifact_spawner, +/turf/open/floor/engine, +/area/station/science/explab) "wTY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/circuit/telecomms, @@ -45234,7 +47675,7 @@ /area/station/engineering/main) "wUi" = ( /obj/machinery/door/airlock/medical/glass{ - name = "Operating Room" + name = "Medical Cryogenics" }, /obj/effect/mapping_helpers/airlock/access/all/medical/general, /obj/machinery/duct/industrial/waste, @@ -45305,15 +47746,14 @@ /obj/item/flashlight/seclite, /turf/open/floor/iron/dark/textured_large, /area/station/commons/storage/emergency/starboard) -"wWb" = ( -/obj/structure/cable/industrial, -/obj/structure/disposalpipe/segment{ - dir = 9 +"wWz" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating/ocean, -/area/ocean) +/obj/structure/rack, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/warehouse) "wWE" = ( /obj/effect/mapping_helpers/airlock/access/any/command/hop, /obj/machinery/door/firedoor, @@ -45322,11 +47762,13 @@ name = "Council Blast Doors" }, /obj/machinery/door/airlock/command/glass{ - name = "Head of Personel's office" + name = "Head of Personel's Office" }, /obj/machinery/door/firedoor/border_only{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/hop) "wWR" = ( @@ -45343,6 +47785,13 @@ /obj/item/crowbar, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/entry) +"wXh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/closet/crate/decorations, +/obj/effect/turf_decal/bot, +/turf/open/floor/glass/reinforced, +/area/station/engineering/main) "wXn" = ( /obj/machinery/suit_storage_unit/mining, /obj/structure/disposalpipe/segment{ @@ -45394,8 +47843,10 @@ dir = 4; invisibility = 101 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "wYo" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, /obj/item/restraints/legcuffs/beartrap, @@ -45434,8 +47885,10 @@ dir = 1; color = "#00ff00" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "wZI" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -45443,6 +47896,15 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"wZM" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/aft) "wZN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -45457,13 +47919,17 @@ /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "wZR" = ( -/obj/machinery/medical_kiosk, /obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/turf_decal/siding/white, /obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment, +/obj/structure/table/reinforced/rglass, +/obj/item/reagent_containers/cup/bottle/epinephrine, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = 6 + }, +/obj/item/reagent_containers/syringe, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "wZW" = ( /obj/effect/mapping_helpers/airlock/access/all/supply/general, /obj/machinery/door/firedoor, @@ -45475,7 +47941,7 @@ }, /obj/machinery/door/airlock/mining/glass{ id_tag = "innercargo"; - name = "Cargo Bay" + name = "Cargo Deliveries" }, /turf/open/floor/iron/dark/textured, /area/station/cargo/sorting) @@ -45490,6 +47956,7 @@ /obj/item/defibrillator/loaded, /obj/effect/turf_decal/tile/blue/full, /obj/structure/window/spawner/directional/north, +/obj/item/defibrillator/loaded, /turf/open/floor/iron/white/textured, /area/station/medical/storage) "xae" = ( @@ -45508,6 +47975,9 @@ "xan" = ( /obj/effect/turf_decal/tile/dark_red/fourcorners, /obj/effect/landmark/start/depsec/medical, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron, /area/station/security/checkpoint/science) "xat" = ( @@ -45655,6 +48125,8 @@ /obj/effect/turf_decal/trimline/purple/filled/mid_joiner{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured_large, /area/station/science/robotics/lab) "xdL" = ( @@ -45681,23 +48153,21 @@ color = "#00ff00" }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) -"xdZ" = ( -/turf/open/floor/plating, -/area/station/science/ordnance/storage) -"xem" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/machinery/door/window/right/directional/north{ - dir = 8; - name = "Research Test Chamber"; - req_access = list("science") +/area/station/commons/storage/mining) +"xeg" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central) +"xem" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/engine, -/area/station/science/robotics/mechbay) +/turf/open/floor/iron/white, +/area/station/science/circuits) "xev" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/structure/chair/sofa/left{ @@ -45705,6 +48175,8 @@ }, /obj/effect/turf_decal/tile/blue/diagonal_centre, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/diagonal, /area/station/medical/medbay/lobby) "xeP" = ( @@ -45729,9 +48201,6 @@ }, /obj/structure/window/spawner/directional/south, /obj/effect/turf_decal/tile/green/half/contrasted, -/obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics Monitoring" - }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) "xeT" = ( @@ -45748,6 +48217,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/dark/textured, /area/station/medical/cryo) +"xfy" = ( +/obj/machinery/duct/industrial/waste, +/obj/effect/turf_decal/trimline/purple/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/mid_joiner{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark/textured_edge{ + dir = 8 + }, +/area/station/hallway/primary/central) "xfK" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -45768,24 +48253,6 @@ /obj/machinery/telecomms/processor/preset_four, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"xgZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/blue/corner, -/obj/machinery/door/airlock/medical/glass{ - name = "Cryogenics Bay" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/medical/general, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - id_tag = "medlobby"; - cycle_id = "medbay_lobby" - }, -/turf/open/floor/iron/dark/textured, -/area/station/medical/medbay/lobby) "xhq" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -45805,6 +48272,8 @@ /area/station/medical/surgery/theatre) "xhu" = ( /obj/machinery/light/floor/has_bulb, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/security/courtroom) "xhD" = ( @@ -45824,6 +48293,16 @@ }, /turf/open/floor/iron/dark/textured, /area/station/command/bridge) +"xhQ" = ( +/obj/effect/turf_decal/trimline/white/filled/line{ + color = "#00ff00" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark/textured, +/area/station/commons/storage/mining) "xhY" = ( /obj/machinery/telecomms/broadcaster/preset_right, /turf/open/floor/circuit, @@ -45840,13 +48319,12 @@ dir = 1 }, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "xiD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/cryo) "xiE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/start/geneticist, /obj/structure/chair/office/light{ dir = 8 @@ -45875,8 +48353,15 @@ color = "#00ff00"; dir = 1 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) +"xjP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/kitchen, +/area/station/service/kitchen) "xjU" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -45904,6 +48389,7 @@ "xkw" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, +/obj/effect/landmark/start/scientist, /turf/open/floor/iron/dark/textured, /area/station/science/cytology) "xkQ" = ( @@ -45924,16 +48410,23 @@ /obj/machinery/light/floor/has_bulb, /turf/open/floor/engine, /area/station/maintenance/port/central) +"xlk" = ( +/obj/machinery/light/small/maintenance/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "xlo" = ( /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 9 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/security/courtroom) "xlx" = ( /obj/structure/filingcabinet/employment, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "xlz" = ( /turf/closed/wall/r_wall, /area/station/cargo/sorting) @@ -46009,10 +48502,28 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/central) +"xmw" = ( +/obj/machinery/door/airlock/research{ + name = "Artifact Science Lab" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/general, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/science/explab) +"xmy" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/purple, +/area/station/science/server) "xmK" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /turf/open/floor/iron, /area/station/cargo/miningoffice) "xmS" = ( @@ -46023,6 +48534,8 @@ dir = 9; color = "#009dc4" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, /area/station/commons/dorms) "xmT" = ( @@ -46054,8 +48567,9 @@ /obj/effect/turf_decal/siding/blue{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/executive, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "xoE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46077,8 +48591,9 @@ dir = 8 }, /obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "xoP" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -46133,6 +48648,7 @@ dir = 8; color = "#009dc4" }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/secondary/exit/departure_lounge) "xqp" = ( @@ -46182,6 +48698,8 @@ /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/textured, /area/station/science/robotics/lab) "xrf" = ( @@ -46251,6 +48769,7 @@ color = "#009dc4"; dir = 8 }, +/obj/machinery/firealarm/directional/east, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central/fore) "xta" = ( @@ -46297,6 +48816,8 @@ dir = 8 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/herringbone, /area/station/science/server) "xtr" = ( @@ -46307,7 +48828,7 @@ /area/station/commons/lounge) "xtz" = ( /obj/machinery/door/airlock/command/glass{ - name = "Bridge" + name = "Conference Room" }, /obj/effect/mapping_helpers/airlock/access/all/command/general, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46316,6 +48837,7 @@ name = "Council Blast Doors" }, /obj/effect/turf_decal/trimline/dark_blue/filled/warning, +/obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/command/bridge) "xtA" = ( @@ -46339,8 +48861,18 @@ "xtE" = ( /obj/effect/turf_decal/tile/dark_red/fourcorners, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron/dark, /area/station/security/checkpoint/supply) +"xtU" = ( +/obj/effect/turf_decal/tile/green/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/opposingcorners, +/turf/open/floor/iron/white/textured, +/area/station/medical/patients_rooms/room_b) "xtZ" = ( /turf/closed/wall, /area/station/commons/toilet/restrooms) @@ -46420,15 +48952,18 @@ /obj/item/stock_parts/cell/high, /turf/open/floor/engine, /area/station/science/xenobiology) +"xvB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/stairs, +/area/station/service/chapel) "xvF" = ( /obj/effect/turf_decal/stripes/full, /turf/open/floor/engine, /area/station/commons/storage/emergency/starboard) "xvO" = ( /obj/machinery/door/airlock/maintenance{ - name = "Security Maintenance" + name = "Security Suit Storage" }, -/obj/effect/mapping_helpers/airlock/access/any/security/maintenance, /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 8 @@ -46442,6 +48977,7 @@ /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 8 }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/dark/textured, /area/station/security/brig) "xvP" = ( @@ -46489,11 +49025,6 @@ /obj/structure/cable, /turf/open/floor/plastic, /area/station/hallway/primary/central) -"xxc" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/spawner/random/structure/table_or_rack, -/turf/open/floor/plating, -/area/station/maintenance/starboard/central) "xxx" = ( /obj/structure/window/reinforced/tinted/frosted{ dir = 4 @@ -46507,6 +49038,11 @@ }, /turf/open/floor/iron/dark/textured, /area/station/security/courtroom) +"xxC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/chapel) "xxK" = ( /obj/machinery/door/airlock/public/glass{ name = "Medbay Lobby" @@ -46518,6 +49054,7 @@ /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 }, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "xxN" = ( @@ -46562,7 +49099,7 @@ req_access = list("genetics") }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "xyp" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 @@ -46591,6 +49128,7 @@ dir = 4; invisibility = 101 }, +/obj/structure/cable, /turf/open/floor/wood, /area/station/service/hydroponics/upper) "xzf" = ( @@ -46603,7 +49141,6 @@ /turf/open/floor/iron/white/textured, /area/station/medical/surgery/theatre) "xzj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/structure/sign/poster/quirk/festive{ pixel_y = 5; pixel_x = -32 @@ -46616,6 +49153,10 @@ "xzv" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/wood, /area/station/service/abandoned_gambling_den/gaming) "xzw" = ( @@ -46663,6 +49204,12 @@ /obj/machinery/light_switch/directional/south, /turf/open/floor/iron/dark/textured, /area/station/science/xenobiology) +"xAy" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) "xBe" = ( /obj/structure/bed/maint, /turf/open/floor/iron/grimy, @@ -46724,6 +49271,18 @@ "xCp" = ( /turf/closed/wall/r_wall, /area/ruin/space/ks13/engineering/secure_storage) +"xCw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/smooth, +/area/station/science/genetics) +"xCy" = ( +/turf/closed/wall, +/area/station/science/genetics/cloning) "xCE" = ( /obj/effect/turf_decal/stripes/asteroid/line, /obj/effect/turf_decal/sand/plating, @@ -46747,6 +49306,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"xDq" = ( +/obj/machinery/duct/industrial/waste, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 4 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/plastic, +/area/station/hallway/primary/central) "xDv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46766,6 +49336,7 @@ id = "council blast"; name = "Council Blast Doors" }, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/command/bridge) "xDT" = ( @@ -46829,6 +49400,10 @@ dir = 4 }, /area/station/science/lobby) +"xFs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet, +/area/station/service/chapel) "xFE" = ( /obj/machinery/newscaster/directional/south, /obj/structure/cable, @@ -46848,7 +49423,7 @@ }, /obj/effect/turf_decal/trimline/blue/filled/warning, /turf/open/floor/iron/white/textured, -/area/station/medical/medbay/central) +/area/station/medical/medbay/aft) "xGf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -46873,8 +49448,9 @@ /obj/effect/turf_decal/trimline/blue/warning{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "xGC" = ( /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, /turf/open/floor/engine, @@ -46882,7 +49458,7 @@ "xGJ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/engineering/glass{ - name = "Engineering Foyer" + name = "Engineering Break Room" }, /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /obj/effect/turf_decal/trimline/yellow/filled/warning{ @@ -46933,6 +49509,7 @@ }, /obj/machinery/camera/autoname/directional/north, /obj/effect/landmark/start/botanist, +/obj/machinery/firealarm/directional/north, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) "xIP" = ( @@ -46958,8 +49535,21 @@ pixel_x = 6; pixel_y = 2 }, -/turf/open/floor/plating, +/turf/open/floor/iron, /area/station/commons/vacant_room/commissary) +"xJx" = ( +/obj/machinery/cart, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/textured, +/area/station/cargo/storage) +"xJE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/ks13/engineering/secure_storage) "xJP" = ( /obj/machinery/duct/industrial/waste, /obj/effect/turf_decal/trimline/brown/filled/corner{ @@ -46969,6 +49559,7 @@ dir = 10 }, /obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/aft) "xJU" = ( @@ -47039,6 +49630,8 @@ name = "Theater Backstage" }, /obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet/neon/simple/green/nodots, /area/station/service/theater) "xKW" = ( @@ -47046,6 +49639,19 @@ /obj/structure/closet/l3closet/virology, /turf/open/floor/iron/dark, /area/station/medical/virology) +"xKZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/white/filled/line{ + color = "#009dc4" + }, +/obj/effect/turf_decal/trimline/white/line{ + dir = 1; + color = "#009dc4" + }, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/dark/textured, +/area/station/hallway/primary/central/fore) "xLh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -47076,6 +49682,8 @@ /obj/effect/turf_decal/trimline/brown/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/cargo/warehouse/upper) "xLW" = ( @@ -47162,6 +49770,13 @@ }, /turf/open/floor/elevator_shaft, /area/station/cargo/miningoffice) +"xMU" = ( +/obj/structure/cable, +/obj/effect/spawner/random/trash, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "xNb" = ( /obj/machinery/modular_computer/console/preset/engineering{ dir = 8 @@ -47190,6 +49805,10 @@ dir = 4 }, /area/station/hallway/primary/central) +"xNy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/circuits) "xNA" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/stripes/corner{ @@ -47214,6 +49833,7 @@ codes_txt = "patrol;next_patrol=Hall-17"; location = "Hall-16" }, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) "xOe" = ( @@ -47251,6 +49871,8 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/textured, /area/station/medical/office) "xPm" = ( @@ -47265,9 +49887,10 @@ dir = 4 }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "xPG" = ( /obj/effect/spawner/structure/window, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/commons/lounge) "xPK" = ( @@ -47294,7 +49917,7 @@ }, /obj/machinery/door/airlock/security/glass{ id_tag = "innerbrig"; - name = "Brig" + name = "Security Lounge" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "brig-entrance" @@ -47365,7 +49988,13 @@ dir = 8 }, /turf/open/floor/iron/dark/textured, -/area/station/maintenance/port/aft) +/area/station/security) +"xRR" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/office) "xRW" = ( /obj/structure/table, /obj/machinery/coffeemaker, @@ -47376,7 +50005,7 @@ dir = 4 }, /turf/open/floor/iron/white/textured, -/area/station/science/genetics) +/area/station/science/genetics/cloning) "xSo" = ( /obj/machinery/light/neon_lining{ icon_state = "pink2_1" @@ -47415,6 +50044,9 @@ /obj/effect/turf_decal/tile/neutral/fourcorners{ color = "#009dc4" }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, /turf/open/floor/iron/dark/textured, /area/station/engineering/storage/tech) "xTm" = ( @@ -47463,10 +50095,10 @@ /turf/open/floor/iron, /area/station/commons/storage/emergency/port) "xUd" = ( -/obj/machinery/door/airlock/public/glass{ +/obj/structure/cable, +/obj/machinery/door/airlock/bathroom{ name = "Toilet" }, -/obj/structure/cable, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) "xUe" = ( @@ -47522,7 +50154,9 @@ /obj/effect/turf_decal/trimline/green/filled/warning{ dir = 4 }, +/obj/effect/landmark/navigate_destination/hydro, /obj/effect/mapping_helpers/airlock/access/all/service/general, +/obj/machinery/door/firedoor, /turf/open/floor/iron/dark/textured, /area/station/service/hydroponics) "xUD" = ( @@ -47530,10 +50164,10 @@ /obj/machinery/duct/industrial/waste, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/atmos/glass{ - name = "Distribution Loop" +/obj/effect/mapping_helpers/airlock/access/all/engineering/tech_storage, +/obj/machinery/door/airlock/engineering{ + name = "Tech Storage" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron/dark/textured, /area/station/engineering/atmos/office) "xUS" = ( @@ -47575,6 +50209,7 @@ /obj/structure/cable/industrial, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/transit_tube/horizontal, /turf/open/floor/plating, /area/station/science/ordnance/office) "xWu" = ( @@ -47604,9 +50239,6 @@ }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"xXa" = ( -/turf/closed/wall, -/area/station/medical/treatment_center) "xXz" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 4 @@ -47660,7 +50292,7 @@ dir = 8 }, /turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) +/area/station/medical/medbay/central) "xZC" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/cable, @@ -47744,6 +50376,17 @@ /obj/effect/turf_decal/trimline/blue/line{ dir = 4 }, +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Central" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + id_tag = "medlobby"; + cycle_id = "medbay_lobby" + }, +/obj/effect/mapping_helpers/airlock/access/all/medical/general, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, /turf/open/floor/iron/white/textured, /area/station/medical/medbay/lobby) "ybO" = ( @@ -47761,6 +50404,11 @@ /obj/item/book/manual/wiki/engineering_hacking{ pixel_y = 3 }, +/obj/machinery/cell_charger{ + pixel_y = 6; + pixel_x = -3 + }, +/obj/item/stock_parts/cell, /turf/open/floor/iron/dark/textured, /area/station/commons/storage/primary) "ycc" = ( @@ -47780,6 +50428,8 @@ /obj/effect/turf_decal/trimline/purple/filled/warning{ dir = 5 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/science/lobby) "ycB" = ( @@ -47836,9 +50486,6 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"ydD" = ( -/turf/open/floor/pod/dark, -/area/station/security/warden) "ydH" = ( /obj/effect/turf_decal/siding/blue{ dir = 4 @@ -47848,7 +50495,7 @@ color = "#52B4E9" }, /turf/open/floor/wood/large, -/area/station/command/bridge) +/area/station/command/meeting_room/council) "yew" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -47875,6 +50522,11 @@ "yfp" = ( /turf/open/floor/holofloor/beach/coast_b, /area/station/service/library) +"yfJ" = ( +/obj/effect/spawner/random/structure/table_or_rack, +/obj/machinery/light/small/maintenance/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/starboard/central) "yfT" = ( /obj/machinery/duct/industrial/waste, /obj/structure/extinguisher_cabinet/directional/west, @@ -47888,6 +50540,10 @@ }, /turf/open/floor/iron/dark/textured, /area/station/hallway/primary/central) +"yfY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/vaporwave, +/area/station/service/library) "ygb" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, @@ -47914,7 +50570,6 @@ /turf/open/floor/iron/dark/textured, /area/station/command/bridge) "ygm" = ( -/obj/structure/table/reinforced/rglass, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 }, @@ -47922,7 +50577,6 @@ /area/station/engineering/atmos/hfr_room) "ygr" = ( /obj/structure/cable, -/obj/machinery/plumbing/floor_pump/input/on/waste/directional/north, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -47937,6 +50591,7 @@ dir = 1 }, /obj/structure/table/glass, +/obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark/textured, /area/station/command/bridge) "ygP" = ( @@ -47948,23 +50603,14 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark/textured, /area/station/security/lockers) +"ygT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/stairs, +/area/station/service/chapel) "ygU" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"yhc" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/cup/bottle/multiver{ - pixel_x = 6 - }, -/obj/item/reagent_containers/cup/bottle/epinephrine, -/obj/item/reagent_containers/syringe, -/obj/effect/turf_decal/siding/white/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white/textured, -/area/station/medical/treatment_center) "yhu" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -47974,6 +50620,7 @@ /area/station/maintenance/department/electrical) "yhH" = ( /obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/commons/lounge) "yhQ" = ( @@ -48005,13 +50652,14 @@ }, /turf/open/floor/iron/white/textured, /area/station/medical/storage) -"yiT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/smooth, -/area/station/science/genetics) +"yiJ" = ( +/obj/structure/cable, +/obj/effect/spawner/random/trash, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/upper) "yjL" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48053,6 +50701,8 @@ /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 1 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/security/office) "ykL" = ( @@ -48078,8 +50728,10 @@ color = "#00ff00"; dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured, -/area/mine/storage/public) +/area/station/commons/storage/mining) "ylf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -48106,16 +50758,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/commons/fitness/recreation/entertainment) -"ylE" = ( -/obj/structure/bed/double/pod{ - name = "Air Matress"; - dir = 4 - }, -/obj/item/bedsheet/hos/double{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/station/security/warden) "ylI" = ( /obj/effect/mapping_helpers/airlock/access/all/security/detective, /obj/machinery/door/airlock/maintenance{ @@ -59611,7 +62253,7 @@ vzH vzH rbo qNr -vMQ +sCR vCD gZg wbs @@ -59852,7 +62494,7 @@ hLd bIX oRY ieT -quy +ieT gIs ygU vMQ @@ -59864,7 +62506,7 @@ skN vMQ ygU xsd -qRz +ygU vMQ pYn ygU @@ -60368,7 +63010,7 @@ gEe sIf vgU luU -oRQ +dvb lDe bWz jwh @@ -60635,12 +63277,12 @@ sWk qxL cUN nCX -wvr -wvr +dOX +pjC aIS bSj ieT -iAJ +eBn gZg cwX hfr @@ -61647,13 +64289,13 @@ jtn uSV vme qBz -rdF +dwb nzU vrw hbh sIf kwP -jZq +qFo qdj pqp pqp @@ -61668,7 +64310,7 @@ sUE oyT fYK cbc -qNu +kgf qNu utN rta @@ -61916,16 +64558,16 @@ tBW pqp kam kam -pqp -jsA -pqp +jBt +cHg +jBt pqp pqp fbw eYH fYK rvH -pzs +kgf esx fYK iWY @@ -62175,15 +64817,15 @@ pBO pqp pqp jsA -pqp -pqp -pqp +jBt +jBt +xjP fbw eYH fYK rvH -fig -quS +kgf +qNu fYK fYK fYK @@ -62388,7 +65030,7 @@ xuc cNf xuc xuc -tgz +qZA xuc xuc pJO @@ -62398,7 +65040,7 @@ xuc qZA xuc cNf -rxw +xuc xuc qZA gib @@ -62417,8 +65059,8 @@ psy oUi vrw rXf -utm -rXf +ifn +aja rXf rXf rXf @@ -62439,8 +65081,8 @@ fbw lll fYK rvH -yjV -loQ +kgf +esx fYK mqN qNu @@ -62674,12 +65316,12 @@ jMP kMx vrw rXf -utm -utm -utm -utm -utm -utm +qHT +ifn +ifn +ifn +ifn +ifn dYl utm vde @@ -62697,7 +65339,7 @@ rss fYK dMc yjV -cfI +quS jBN jrV fQi @@ -62923,9 +65565,9 @@ rdt jMP cbu gES -uSV +cXE +kov cbu -uSV knN knN bFK @@ -63198,7 +65840,7 @@ dYl utm gEE pqp -pqp +kmr lGQ kam uuO @@ -63240,9 +65882,9 @@ vfM vfM jwY mAg -noq +rqi qfe -fKI +nvP kWk noq jAu @@ -63438,16 +66080,16 @@ rdt jMP vsU pVn -dJR pVn +yfJ jMP knN fXU mWP rXf -utm -rOx ePS +rOx +acc acc acc mnX @@ -63498,7 +66140,7 @@ ekq fKI iyv rWm -fKI +wCO rWm fKI rWm @@ -63726,7 +66368,7 @@ oWO oWO oWO pug -mnD +jHb kmY kmY lCs @@ -63755,7 +66397,7 @@ fKI fKI fKI jeA -jeA +xJx jeA qgp fKI @@ -64012,7 +66654,7 @@ fKI fKI fKI rWm -fKI +vYR rWm fKI iDO @@ -64184,11 +66826,11 @@ miY vwP vwP wki -ksj +bRO sBe vwP jCa -ksj +bRO sBe iPh pds @@ -64230,7 +66872,7 @@ aVb eFd kpQ pIL -pIL +hxH uHW hXP aVb @@ -64258,7 +66900,7 @@ kmp xfK xfK afI -yba +pzL aOq lOa mLC @@ -64268,7 +66910,7 @@ fKI fKI fKI slJ -pQD +sOf qOl jZW jZW @@ -64437,15 +67079,15 @@ wop weo vwP qtW -jJy +vAO vXi vwP aih -ksj +pLM iVc vwP pZJ -ksj +pLM iVc iPh rnM @@ -64487,9 +67129,9 @@ aVb tyd sHS pIL -pIL -pIL -lLc +apA +apA +cRm aVb mIS oWO @@ -64694,7 +67336,7 @@ wop pVn vwP qtW -jJy +bTZ fdq vwP vwP @@ -64709,25 +67351,25 @@ fue hPK fue fue -umh +vnI ins -pIW +aAy lQS sul -osy -wFP -wFP +wSx +bpJ +mVH wFP riK iKC -wFP +wde fku wFP vAr wFP -wFP +mVH iKC -vAr +ftQ pIW lQS dtY @@ -64745,7 +67387,7 @@ mfc ejr qrV qXP -pIL +eLe eZH mIS rqz @@ -64961,14 +67603,14 @@ beP beP sDA beP -beP +qlh beP eQp wAH uGB rRI -bBP -hJv +loN +nKW kBt oQa dpV @@ -64986,9 +67628,9 @@ kOZ kOZ uxR cUp -nIO +kBt kfX -wDZ +xeg jsj mWP eDF @@ -65000,9 +67642,9 @@ ufp aVb fGC pIL -pIL -pIL -pIL +nKs +avK +avK lLc mIS aVb @@ -65016,7 +67658,7 @@ sFP sFP sFP egP -rYQ +ieE dPH oHO afI @@ -65042,9 +67684,9 @@ eSW mLC czC gvn -oBZ -oBZ -oCO +lVP +qnK +mVq toG kxG kUi @@ -65205,7 +67847,7 @@ gXb gXb gXb gnk -xxc +pVn vwP vwP vwP @@ -65244,7 +67886,7 @@ dUJ dUJ dUJ dUJ -bmG +bbm wDZ ctX vrw @@ -65269,11 +67911,11 @@ hdv oWO vtb aYq -rYQ -rYQ -rYQ -rYQ -rYQ +ieE +ieE +ieE +ieE +ieE dPH tPb afI @@ -65286,7 +67928,7 @@ ehA rcZ kKC vLH -yba +jLW aOq lOa mLC @@ -65479,7 +68121,7 @@ tdt ovT fBG bec -uGB +myt fKV tYL keE @@ -65502,7 +68144,7 @@ oAL xtE dee bEp -wDZ +lpa tzU vrw wgZ @@ -65548,11 +68190,11 @@ bpu mVB kNY rbg +iCW nwW nwW nwW -nwW -nwW +urG nuV hZH gvn @@ -65715,7 +68357,7 @@ aah meJ meJ gXb -weo +cfn utg jMP wop @@ -65723,7 +68365,7 @@ uSV cbu uSV cbu -uSV +xlk pyU bak eFg @@ -65741,12 +68383,12 @@ xdL rfc nxP xwm -oas +jYZ agP -oas -oas -oas -oas +gxS +gxS +gxS +rSC tJY xwm pQj @@ -65756,10 +68398,10 @@ iku wOu dUJ uYy -xtE +gMX ggJ jYb -wDZ +rCO jsj vrw vrw @@ -65782,7 +68424,7 @@ oWO oWO oWO nOf -lms +mnD pug kmY kmY @@ -65813,7 +68455,7 @@ snh eoW qYg hHx -lrg +got lrg sEU iXo @@ -65995,10 +68637,10 @@ uFU vwP eso kdC -rfc -mWr +uYY +eXP lQt -agP +ket hyQ aJi lbq @@ -66251,16 +68893,16 @@ sJd jeZ vwP xEU -rfc +cJK kwp nxP xwm qeN -oas -oas -oas -oas -oas +kWi +iPZ +iPZ +iPZ +iPZ oas xwm pfl @@ -66292,19 +68934,19 @@ bTn bTn qEO qmM +sJN sTn sTn sTn sTn -sTn -sTn +iJt sTn sTn ltK qJW uUC hzM -sTn +iJt ngm sVJ sTn @@ -66534,7 +69176,7 @@ gxr uVv bMn lck -bMn +fFL kkW lca nDl @@ -66583,9 +69225,9 @@ vcU qaa pII aej -jkc -jkc -jkc +tiP +bAw +clh ipq rCP cHj @@ -66796,7 +69438,7 @@ tGW bMv ffP xPG -xVm +evJ xvp rnD bkr @@ -67021,7 +69663,7 @@ vwP vwP vwP vwP -xEU +emg kwp nxP wJX @@ -67054,13 +69696,13 @@ rCp eqZ eqZ eqZ -qoU +kAd hdM fJF xVm aKV hdM -xVm +gYT iWZ iWZ iWZ @@ -67089,7 +69731,7 @@ jfI gtt bMR qaa -mln +lBA jJI duv dYT @@ -67302,7 +69944,7 @@ syi cYd vjL xva -lhV +lij vbD iXX eqZ @@ -67316,7 +69958,7 @@ hxc hrr vMM vMM -xVm +xAy jtJ iWZ bPZ @@ -67339,11 +69981,11 @@ dpI iLj nHO bgA -xmK +mDf xmK twN -jfI -ngm +keZ +pie bMR qaa uAo @@ -67354,8 +69996,8 @@ exF qaa kaH jkc -txG -tLU +wus +cQi aej ygc rrZ @@ -67531,7 +70173,7 @@ vyk xZY lHt wlx -lHt +awj jSp lHt yke @@ -67559,8 +70201,8 @@ eig dJB hsV hld -vbD xrV +lij oeO eqZ gUb @@ -67595,13 +70237,13 @@ rzP kGm gPJ lOu -itp -cLN +rXr +kGo cLN twN -jfI -ngm -bMR +vxI +wZM +ppf qaa weQ uVd @@ -67779,9 +70421,9 @@ nLV nLV nLV hQv -uzV -vMy -uzV +vXy +ygT +xFs lfO uzV uzV @@ -67793,7 +70435,7 @@ gIZ nVx ukf umh -rfc +fun mWr nMK svH @@ -67816,7 +70458,7 @@ syi pwD ogA xyY -kFH +iIX iIX kqQ eqZ @@ -67846,8 +70488,8 @@ frv umT kcP ewC +ecf cDw -kOM itp itp sZV @@ -67858,7 +70500,7 @@ sYn mIK jfI fvY -mLx +oII hCB hCB hCB @@ -68038,7 +70680,7 @@ jnw lfO lfO nok -lfO +uws rFG isr isr @@ -68114,7 +70756,7 @@ pEa uhC mIK jfI -ngm +nRh mLx hCB eez @@ -68295,7 +70937,7 @@ ouR uzV oFd vMy -uzV +xFs eqX eqX eqX @@ -68345,10 +70987,10 @@ myg mPO sPD pHZ -bTn +auj xKG tBV -lyY +fMh fUE iWZ agR @@ -68382,7 +71024,7 @@ bNX bNX hJH hCB -hlS +wWz jkc aej fNr @@ -68552,8 +71194,8 @@ krP jnE jqD vMy -vXy -aqC +xxC +moa moa eCE eCE @@ -68564,8 +71206,8 @@ jSp oUo nLV umh -rfc -nxP +cJK +wFH wJX wJX wJX @@ -68598,9 +71240,9 @@ xRl hmD tDO evH +aSq kcH kcH -aSq jPs xVm iWZ @@ -68622,8 +71264,8 @@ kXk iSl wUo btg -eGh -eGh +tdm +rVE pEa wsx twN @@ -68809,7 +71451,7 @@ hQQ uzV bLn vMy -uzV +inO isr isr isr @@ -68817,19 +71459,19 @@ isr uzV uzV wlx -lHt +rql wlx nLV -umh -rfc -mLS -pkw +nPw +raa +gLl +dsB dMh vhM dIo uMu gYV -pkw +dsB bfN ttR ttR @@ -69066,7 +71708,7 @@ lKJ uzV uzV vMy -uzV +inO eqX eqX eqX @@ -69074,19 +71716,19 @@ eqX uzV uzV lHt -eBe +mvv pse nLV -umh +pnK kwp mLS -ahh +oui nvx -lel -lel -lel +eBF +fuH +fuH wCE -pkw +dsB xmh csW xCU @@ -69321,9 +71963,9 @@ bMU nLV nLV ise -uzV -vMy -uzV +hLM +xvB +inO uzV uzV uzV @@ -69335,15 +71977,15 @@ ecM eBe nLV jQZ -rfc +jgV iwy wZC mLp dtG -lel -lel +jli +jkw uCj -pkw +dsB xUe upR bva @@ -69386,7 +72028,7 @@ wdT wQd wdT ont -mLg +dGk hcx hcx dGk @@ -69411,9 +72053,9 @@ hwr xHE hCB qWE -yex -nCQ -nCQ +cPI +gdB +qzW bsn foL meJ @@ -69587,20 +72229,20 @@ iYr qzG lHt wlx -lHt -wlx +sld +uZl lHt nLV tXk rfc mLS -ahh +oui nvx amw aad xdP ufr -pkw +dsB bfN qOG aFY @@ -69618,7 +72260,7 @@ aFY jnL ruY ruY -ruY +vSd ruY fPg ruY @@ -69643,7 +72285,7 @@ wdT koQ jkJ twN -mAw +gzD xAh hcx mAw @@ -69656,7 +72298,7 @@ xBV xBV xBV fey -owJ +dle mLx hCB hzR @@ -69832,7 +72474,7 @@ meJ meJ kZY kZY -lDo +ecc hXX nLV nLV @@ -69849,15 +72491,15 @@ lHt rOB nLV umh -rfc +fun mLS -pkw +dsB vSq yle xix -pkw +dsB nbX -pkw +dsB dBx jOH kND @@ -69912,7 +72554,7 @@ uOT xBV aJc xBV -fey +min owJ mLx hCB @@ -69927,8 +72569,8 @@ hCB qWE yex vBN -cFV -qWE +pZK +fhw pqc meJ meJ @@ -70092,7 +72734,7 @@ kZY kZY axQ kZY -nRM +oBK nLV nLV nLV @@ -70108,11 +72750,11 @@ nLV umh rfc mLS -pkw -pkw +dsB +dsB orx -pkw -pkw +dsB +dsB mYB ttR xmh @@ -70184,8 +72826,8 @@ hCB fcd fEU miu -aSn -fhw +miu +gEJ pqc meJ meJ @@ -70365,7 +73007,7 @@ gGL vSI kwp mLS -pkw +dsB gyj pqf jZR @@ -70622,11 +73264,11 @@ tXC gAV rfc mLS -pkw +dsB xji lCm cGg -pkw +dsB fGs aFY aFY @@ -70695,10 +73337,10 @@ srI vbV wKX viq -fEU -qLg +yex +yex sqZ -uHf +nCQ pqc pqc okD @@ -70859,14 +73501,14 @@ meJ meJ meJ kZY -tAk +wlw oRN qpf mjl wjO aWJ qpf -tAk +wlw mFh eGM uUY @@ -70878,12 +73520,12 @@ hHy tXC wgD tYL -mLS -pkw +hMS +dsB adv tRB tvB -ahh +oui wXG ske ske @@ -70943,19 +73585,19 @@ xBV fey uSB mLx -rrB -rrB -rrB -rrB -rrB +okD +uvd +uvd +uvd +uvd uiQ kGQ wtN ejd -wtN -wtN +pAV +bgk fWA -llX +hdR tAz xmT aoV @@ -71139,8 +73781,8 @@ oij lxM nBU jZX -tvB -ahh +xhQ +oui vxY ske meJ @@ -71200,18 +73842,18 @@ xBV wgQ edn mLx -rrB -esM -ylE -nls -rrB +okD +uvd +uvd +uvd +uvd xuu wKX xcW viq fuz vfK -uvd +lju eSB tAz aBm @@ -71393,11 +74035,11 @@ tXC faF cbq mLS -pkw -adv +dsB +npU bJU rOJ -pkw +dsB wXG ske meJ @@ -71416,7 +74058,7 @@ meJ qRY qRY dGk -dGk +vkH mIK jQW rSO @@ -71457,18 +74099,18 @@ xBV fey owJ mLx -rrB -sHI -ydD -ydD -rrB -okD -okD -okD -okD -okD -okD okD +uvd +uvd +uvd +uvd +rIY +rIY +rIY +rIY +rIY +rIY +rIY llX wOn wOn @@ -71633,13 +74275,13 @@ kZY mFh bMU qpf +jNR +jNR +jNR hoz hoz hoz -hoz -hoz -hoz -rou +meC pUa pxi rdy @@ -71650,11 +74292,11 @@ rXT gAV wDZ mLS -ahh +oui uYW cPJ nbn -pkw +dsB wXG ske meJ @@ -71674,7 +74316,7 @@ gmy mXE dGk dGk -jzj +mgQ itp itp xMS @@ -71715,8 +74357,8 @@ fey uSB mLx rrB -toq -drl +rrB +rrB rrB rrB rrB @@ -71890,15 +74532,15 @@ fgS mFh oRN bzW -hoz +jNR jVF -hLY +pNk hoz iHd hLY -rou +meC xjX -tfm +tYx tfm gyG iip @@ -71907,11 +74549,11 @@ aES iyS wDZ mLS -pkw -pkw -pkw -pkw -pkw +dsB +dsB +dsB +dsB +dsB wXG kND meJ @@ -71969,7 +74611,7 @@ hSR dpE fSf fey -owJ +dle mLx rrB qfA @@ -71982,7 +74624,7 @@ bDw nWE bDw scA -okD +rIY gvZ uPB uPB @@ -72147,15 +74789,15 @@ djZ djZ kLL mog -hoz -nkF +jNR +xtU tBf hoz nkF bkR -rou +meC ouC -tfm +tYx qza qHJ nya @@ -72187,7 +74829,7 @@ meJ qRY qRY tpR -dGk +vkH mIK liB eYv @@ -72399,23 +75041,23 @@ nRM fiw mFh fgS -eJv -eJv -eJv +bxs +bxs +bxs dgc -eJv -hoz +bxs +jNR mbj qlJ hoz dZq tge -rou +meC mZI ccg nRr iVp -tfm +snG qza vAD gAV @@ -72655,19 +75297,19 @@ obQ ykG kLL fgS -eJv -eJv +bxs +bxs rZp jth iut gfV -hoz -acE +jNR +gPF bTW hoz gtg acE -rou +meC iPp wjP meC @@ -72771,9 +75413,9 @@ meJ fKl aYY aYY -uyC aYY -uyC +aYY +aYY aYY meJ meJ @@ -72918,7 +75560,7 @@ noF nuB pNw pHc -ols +hYO mJm jiC rNm @@ -72991,7 +75633,7 @@ meJ xeT uua aJy -aJy +sxg jGE fxu fxu @@ -73027,11 +75669,11 @@ kYB bBi fKl aYY +lNp +lNp aYY aYY aYY -aYY -uyC meJ meJ meJ @@ -73169,7 +75811,7 @@ fiw fgS tAk fgS -eJv +bxs mBv noF uKC @@ -73188,7 +75830,7 @@ oKa kUl hee rhL -hee +sXz sED eqz vrM @@ -73285,7 +75927,7 @@ meJ fKl aYY aYY -aYY +lNp aYY aYY aYY @@ -73426,7 +76068,7 @@ fiw fgS mFh tAk -eJv +bxs anf lmd gJS @@ -73437,8 +76079,8 @@ dHt eDM aKN eDM -eDM -eDM +orI +kTf ozO dPd xGb @@ -73523,7 +76165,7 @@ oIJ sGC xcM oAn -bai +aOF iRw kMk aWM @@ -73542,7 +76184,7 @@ meJ meJ fKl aYY -uyC +aYY aYY aYY meJ @@ -73683,7 +76325,7 @@ hrC mFh fgS mFh -eJv +bxs gQq pjd nwz @@ -73695,16 +76337,16 @@ jKo cMb uTw jKo -jKo +xCy rJc -jKo -jKo -jKo -jKo +xCy +xCy +xCy +asQ vSw pqz adf -dno +pyK kAH cIO hxF @@ -73763,8 +76405,8 @@ xeT aUq aJy aJy -jhr -wQa +uua +mSV wQa akj eDZ @@ -74014,13 +76656,13 @@ naN kBN sRh sRh -ewQ +lru sFB xeT gPX wxy wxy -qqT +aJy dKw hJe xeT @@ -74199,9 +76841,9 @@ kZY kZY jKo jMI -yiT pNB pNB +ljN ppr dqw xiE @@ -74271,7 +76913,7 @@ asA asA sRh qmF -ewQ +dBb qrW ssO bAP @@ -74458,16 +77100,16 @@ jKo nuD pFK azp -dMV -jFk -jFk +qqE +qqE +xCw jFk uLl -qqE +ghh oXY uGl lwu -vdI +sfe nWK jHe qrM @@ -74528,11 +77170,11 @@ asA mqy sRh iSe -ewQ +dBb ksz -qrW +ewQ ssP -gpa +ooY gpa gpa qKV @@ -74717,14 +77359,14 @@ uzB agf udu rkz -mlu +jgD mlu vxO bxR mBe aDe gfz -dyf +nWK sfe vPE omi @@ -74735,8 +77377,8 @@ vUu fUj rLb wBP -jln -vvq +bmM +rXq cIO xCU wXG @@ -74784,8 +77426,8 @@ asA elt lTN esB -qrW -ewQ +bJx +dmg bzC bAg bAP @@ -74992,7 +77634,7 @@ srT dno rLb pmN -jln +bmM jln cIO csW @@ -75039,7 +77681,7 @@ asA asA elt lTN -ddr +gyr sRh sRh bwZ @@ -75226,7 +77868,7 @@ wgJ kIP wuL jKo -uCm +har btf cAB jaP @@ -75237,12 +77879,12 @@ jyw aFI wro jKo -jKo -jKo +xCy +xCy gVL vsL -jKo -jKo +xCy +xCy nqU nqU xoE @@ -75295,8 +77937,8 @@ dGv asA elt lTN -tVq -ddr +uyO +gyr oMG mCV dCI @@ -75483,9 +78125,9 @@ kIP kIP uwI jKo -uCm +har vQf -cAB +har eSn jKo wId @@ -75503,7 +78145,7 @@ xIv sJt pdS pmR -dno +pyK kAH cIO dkr @@ -75551,12 +78193,12 @@ fXF dGv asA dsr -tVq -tVq +uyO +uyO oSe -dCI -frP +vZn frP +gPI enN frP bLp @@ -75808,12 +78450,12 @@ fXF dGv asA dsr -tVq +uyO pOj tCz -uXl -uXl -uXl +ssm +ssm +cBn uXl uXl uXl @@ -76004,7 +78646,7 @@ qAg met yaj bOO -jvq +fBO jWG jvq iNI @@ -76013,14 +78655,14 @@ sQl nvL kJN kJN -kJN +rhg boX vGh xys -dno -rLb -wBP -jln +lCr +pNT +bvG +iiN vvq cIO csW @@ -76065,7 +78707,7 @@ fXF jzn asA dsr -tVq +uyO vBW rlW viQ @@ -76261,23 +78903,23 @@ cIj jwu kUm kBH -jvq +fBO fZX pTU iNI -jvq +tBQ wMO eeA -nqf -nqf -nqf +cdW +cdW +cdW hWv vGh hsi -dno -rLb -pmN -jln +iNb +fqK +ohP +jze vvq cIO csW @@ -76322,8 +78964,8 @@ mnr prv lSW cQR -tVq -vBW +cxZ +oSP cPy vUj eIa @@ -76518,8 +79160,8 @@ auP dFj yaj xhq -jvq -fZX +qWK +rMf jvq sMv nhC @@ -76579,8 +79221,8 @@ fXF dGv asA dsr -tVq -vBW +uyO +mGI uEE vUj iTD @@ -76792,7 +79434,7 @@ mxp kAH cIO qdd -mYo +mWX lHg iya wXG @@ -76836,8 +79478,8 @@ fXF dGv asA dsr -tVq -vBW +uyO +mGI xoh eBt ydH @@ -77033,19 +79675,19 @@ tgU yaj dvQ nLt -dvQ +uye nhC nhC tBQ -xXa +ols uhh eXH -xXa -xXa +ols +uOF nqU bKh xoE -dno +pyK kAH cIO xev @@ -77093,11 +79735,11 @@ fXF dGv asA dsr -tVq -vBW +uyO +mGI wxK -tmA -tmA +llL +llL tmA tmA tmA @@ -77132,7 +79774,7 @@ ajQ ajQ gap lEA -iPl +bUA xvQ ajQ ajQ @@ -77296,10 +79938,10 @@ dLY nsM avv wYe -dLY +hVl ijh mFK -xgZ +mFK ybu pgJ dno @@ -77351,11 +79993,11 @@ dGv asA dsr pqN -tVq +uyO pzX frP frP -frP +tmA frP frP frP @@ -77389,7 +80031,7 @@ ubU ajQ gap lEA -iPl +uzF xvQ hmh teZ @@ -77562,8 +80204,8 @@ muE fUj rLb pmN -jln -vvq +mRQ +mOK cIO lGH wXG @@ -77608,11 +80250,11 @@ dGv asA jLK jZH -tVq -ddr +uyO +gyr kVN xlx -frP +tmA sHm atS psu @@ -77640,13 +80282,13 @@ voj oIY rhn wCS -rMy +dvn mal glJ hEN ykJ -lEA -iPl +hvP +bYp xvQ hmh teZ @@ -77803,7 +80445,7 @@ fDX xYW aZw mFK -wil +vIn rtb rEh sVq @@ -77866,7 +80508,7 @@ asA asA qPs jZH -ddr +gyr pla pla wWE @@ -77903,7 +80545,7 @@ dgP ajQ gap lEA -iPl +eqC xvQ hmh teZ @@ -78125,16 +80767,16 @@ asA qPs jZH ggI -pLb -pLb -pLb +gNF +hUa +hUa aJn iUi ahN lpf -pLb -pLb -pLb +wxm +mNY +lDu kKx iiO ydb @@ -78160,7 +80802,7 @@ ajQ ajQ ldm dDy -iPl +tVb xvQ ajQ ajQ @@ -78307,7 +80949,7 @@ meJ qSI fgS fgS -fDX +wIK jEo hBQ bUR @@ -78319,17 +80961,17 @@ nGo mFK pIN mFK -mTt -yhc -qRO -niS mFK mFK +mFK +mFK +mEE +ikG dYV uOF sdC -qUv -qLe +geQ +eTZ wvy rbq cIO @@ -78394,12 +81036,12 @@ pLb pLb knF iiO -ydb +vqk fZn vAv nUw -kKO -kKO +psH +rua kKO oNz wyJ @@ -78564,7 +81206,7 @@ meJ qSI mFh fgS -fDX +wIK fDX eXC bDK @@ -78577,17 +81219,17 @@ xGw onx dhy aZw -mFK +bvz mFK mFK mFK sAU cly uOF -hbM +sdC cUS -vUu -wvy +bLK +wDN kAH cIO ttR @@ -78640,7 +81282,7 @@ asA asA pla lHi -nBV +jpc pAg pla pla @@ -78651,7 +81293,7 @@ jjK sLP lFA iiO -eKB +nzs fZn vAv iBl @@ -78821,8 +81463,8 @@ meJ qSI fgS tAk -fDX -fDX +wIK +mwm fxR vZL jSQ @@ -78839,12 +81481,12 @@ gct rzA vUo esa -xXa -xXa -vSw -pqz -adf -wvy +ols +ols +ain +vSA +vze +sCD kAH cIO xCU @@ -79169,9 +81811,9 @@ mTC rhw nhl xlo -bgS -bgS -bgS +fHK +fHK +oiL bgS wQE aus @@ -79356,7 +81998,7 @@ xFE emO gym okd -okd +tZu rbQ dRj kKP @@ -79426,11 +82068,11 @@ nHg lkF nbU fXB -gPZ +dLP lxJ gPZ gPZ -onf +auR aus qiP lgI @@ -79856,8 +82498,8 @@ gTr vJu abg nTg -rvQ -ehz +lqs +hcZ kfA dYp jAN @@ -80111,10 +82753,10 @@ tAk mog gTr sXh -vFx -ehz -lqs ehz +mjA +rvQ +hcZ qhH veM ejk @@ -80394,7 +83036,7 @@ bfN lGH jOH mSq -csW +tLw qQx csW kND @@ -80708,7 +83350,7 @@ vHs viE mFJ ydb -iFe +spi gZg lpu tPb @@ -80888,7 +83530,7 @@ gzZ gzZ gsm gzZ -gzZ +wJd gzZ kOH gsm @@ -80901,7 +83543,7 @@ hil qpf aVv tJu -rfc +cJK nxP kJb xmh @@ -80964,13 +83606,13 @@ qqB xxX dGd tKo -nPx +nzs iFe gZg iax swe jRZ -jRZ +okY ieT xSw ieT @@ -81221,7 +83863,7 @@ kZZ pGM dGd tKo -ydb +prr iFe gZg tPb @@ -81701,7 +84343,7 @@ kND kND kND lGH -xCU +nLO xCU kND kND @@ -81929,7 +84571,7 @@ fho dLk qqU cph -rfc +fun ePC sri aVl @@ -82429,7 +85071,7 @@ fjQ kZY mFh fgS -uGD +qWb nDB nDB uGD @@ -82506,7 +85148,7 @@ eKC hmK qRJ txw -vPp +nzs iFe gqY iax @@ -82691,7 +85333,7 @@ fVA nDB qpf nRM -rdb +fOx rAT iEZ red @@ -82700,7 +85342,7 @@ omI xBe red jXE -rfc +cJK ePC sri wSA @@ -82709,7 +85351,7 @@ qFt uTz sri pDI -gwh +jRs erd pCS kqx @@ -82731,7 +85373,7 @@ gzx gzx ofk esC -ofk +wkK esC ofk bqD @@ -82763,7 +85405,7 @@ kAb voJ qRJ txw -ydb +lul iFe gZg tPb @@ -82966,7 +85608,7 @@ xqO aVl sri uVF -gwh +jLX pCS pCS lmD @@ -82992,7 +85634,7 @@ xTe oRs bGe esC -vOj +ofk fQG weu pMC @@ -83023,7 +85665,7 @@ txw ydb iFe gZg -plP +lpu mSd mjp hvz @@ -83203,9 +85845,9 @@ mFh fgS fgS fgS -fgS -fgS -rdb +mhd +rAT +fOx red ylj qjO @@ -83223,12 +85865,12 @@ xdH uYR sri xCP -gwh +xJE pCS iUI -bva -bva -apc +quj +fSr +mID apc nku nTH @@ -83243,8 +85885,8 @@ gzx sgm fQm eQj -ofk -esC +gEz +dYC wkq ylk wkq @@ -83280,7 +85922,7 @@ ukS pmk iFe gZg -lpu +cvx mSd gZg gZg @@ -83460,7 +86102,7 @@ fgS fgS mFh tAk -rdb +fOx cKF rdb red @@ -83475,8 +86117,8 @@ bTh ePC sri aLs -uQT -uQT +iWX +iRG ldf sri lBw @@ -83489,7 +86131,7 @@ bLD bLD nFB mSq -bLD +ugs fMF lGH rUo @@ -83505,7 +86147,7 @@ bhS tIV knM ifM -esC +ddX dzq fQG jgX @@ -83534,7 +86176,7 @@ jve qRJ qRJ uEb -ydb +prr wZN gZg tPb @@ -83717,7 +86359,7 @@ fgS fgS fgS mFh -rdb +fOx nRM nRM red @@ -83733,7 +86375,7 @@ ePC sri trR nqF -uQT +iRG sth sri nzt @@ -83746,7 +86388,7 @@ irq qHC qHC mSq -bLD +ugs lGH mSq lGH @@ -83972,9 +86614,9 @@ qSI nRM tAk ksI -fgS -fgS -rdb +kXZ +rIX +fOx fgS wdA wdA @@ -84043,7 +86685,7 @@ aQx kLx dXR jBo -jCm +jdq aIc rwN jMN @@ -84223,7 +86865,7 @@ aah aah aah aah -jrX +aah meJ qSI nRM @@ -84231,7 +86873,7 @@ hCQ fgS mFh fgS -rdb +fOx wdA wdA vPb @@ -84242,8 +86884,8 @@ hwz usF wdA qal -bBP -ePC +cgN +cKS sri sri rIW @@ -84294,7 +86936,7 @@ knd hpg fjx wfN -qeK +fqA pPR aQx kLx @@ -84306,7 +86948,7 @@ pQZ jMN gPk ydb -iFe +xKZ gZg lpu xDa @@ -84488,14 +87130,14 @@ kZY kZY fgS mFh -rdb +fOx wdA qQF adu xjU koq -jcU -jcU +arl +nTl ePQ wdA qal @@ -84514,10 +87156,10 @@ cOB wFP wFP wSx -wFP +hza oaW lDM -pIW +jFN lQS tzD tbT @@ -84562,7 +87204,7 @@ nnb qRJ qRJ eGV -ydb +lul qjb dtE dtE @@ -84752,21 +87394,21 @@ hPO lCl dao jcU -jcU +nTl oDm wdA qal -bBP +gXg kie dGq glH -uQT -uQT -uQT +iRG +iRG +iRG lDr dGq fvN -bBP +gXg gmj mwr mwr @@ -85002,24 +87644,24 @@ kZY kZY alo fgS -gzZ +iEZ wdA -qQF +pqi adu xjU iLR cJw -cJw +xmy uYA wdA -qal +dcc bBP ePC sri lmx uQT uQT -uQT +pmD rUq sri kxO @@ -85259,7 +87901,7 @@ meJ qSI qSI nRM -gzZ +iEZ wdA wdA vPb @@ -85270,7 +87912,7 @@ wBt toD wdA qal -bBP +loN ePC rIW qZY @@ -85280,7 +87922,7 @@ aKy bYC rIW gdO -bBP +nGX cUU uzj aqF @@ -85516,7 +88158,7 @@ meJ meJ qSI qSI -gzZ +iEZ wdA wdA wdA @@ -85541,8 +88183,8 @@ ygr hTR pEL kPf -pVI -pVI +rCq +qgv iGc lia dJU @@ -85556,9 +88198,9 @@ xcy lae vna sqk -sqk -sqk -sqk +xDq +dna +xDq jls itM sqk @@ -85773,7 +88415,7 @@ meJ meJ meJ qSI -gsm +oHw jyv lzK dWT @@ -85841,7 +88483,7 @@ tKo tKo lul dFp -nUk +faZ dmj dmj dmj @@ -86030,10 +88672,10 @@ meJ meJ meJ qSI -gzZ +iEZ jyv kFG -sLa +pWD pWD atI jUr @@ -86071,7 +88713,7 @@ xJU xJU xJU xwZ -xJU +uGq xJU fcw pWL @@ -86287,7 +88929,7 @@ aah meJ meJ qSI -sqV +xMU jyv aIO lxn @@ -86300,12 +88942,12 @@ iLS mOh mSi noG -hPb +bAJ uOM hPb hPb hPb -hPb +xfy hPb noG mnj @@ -86316,7 +88958,7 @@ mxq uzj uzj pVI -pVI +qQZ aET hnR gdp @@ -86348,7 +88990,7 @@ sdo sdo sdo pYC -kVT +npi jFs xst lAh @@ -86544,7 +89186,7 @@ aah aah meJ qSI -sqV +xMU jyv lHJ cum @@ -86573,12 +89215,12 @@ tXg uzj azK cWn -iSr +apl uND uTx gdp ham -aet +tsO qbO dit oiN @@ -86801,7 +89443,7 @@ aah aah meJ qSI -gzZ +iEZ jyv wmr qvJ @@ -86826,16 +89468,16 @@ thL vWn gSQ jBm -nYD +pwr uzj elf pVI -pVI +vWW tGa gqX gdp dCe -qnI +heQ heQ xlI heQ @@ -87058,13 +89700,13 @@ aah aah meJ qSI -gsm -qoV -qoV -qoV -qoV -qoV -qoV +oHw +qEi +qEi +qEi +qEi +qEi +qEi pYr roj reB @@ -87077,9 +89719,9 @@ xNg xNg xNg xNg -xNg +jtj qrD -xNg +sWn gvB lfh vwS @@ -87104,7 +89746,7 @@ gdp rmm pZA gdp -cSD +dbE xXz nfg gdp @@ -87315,13 +89957,13 @@ aah meJ meJ qSI -gzZ -qoV +iEZ +qEi ena qoj wyd oDx -qoV +qEi pYr pad pGv @@ -87344,7 +89986,7 @@ odL uzj dla pVI -pVI +vWW pVI pJi gdp @@ -87572,20 +90214,20 @@ aah meJ meJ qSI -gzZ -qoV +iEZ +qEi uYE unl +mTE vKu -vKu -pXk +xmw hcz bSw utj tGQ tGQ tGQ -tGQ +ruM tGQ tGQ tGQ @@ -87596,12 +90238,12 @@ fbb tGQ tSc oTY -jBm +cbv nYD uzj abe pVI -pVI +jYL pVI jUx qSp @@ -87829,13 +90471,13 @@ meJ meJ meJ qSI -gzZ -qoV +iEZ +qEi syr -eji -vKu -gks -qoV +unl +fNc +heL +qEi pYr vWo lBf @@ -87901,8 +90543,8 @@ sgI sWi ccr ccr -wrG -sWi +ccr +fMQ ucj xhD nSA @@ -88086,13 +90728,13 @@ meJ meJ meJ qSI -gsm -qoV +oHw +qEi qfI fyB -vKu -wiK -qoV +fNc +wTV +qEi plm xFc xFc @@ -88113,7 +90755,7 @@ qsG yci bCO uzj -jkG +leI sHH nnv vcJ @@ -88178,7 +90820,7 @@ uUD bpn kuO kuO -kuO +mTb cBs uUD rtO @@ -88343,13 +90985,13 @@ meJ meJ pgX kZY -sqV -qoV +xMU +qEi vlM -euB -xdZ -xdZ -qoV +qoj +fNc +vLC +qEi iMz mqK mqK @@ -88435,7 +91077,7 @@ uUD kuO kuO kuO -kuO +yfY kuO xQD nvY @@ -88600,19 +91242,19 @@ meJ meJ shF fgS -gzZ -kZY -qoV -qoV +iEZ +qEi +qEi +qEi riU -qoV -qoV +qEi +qEi wie hHb awg oyn vZG -sMI +adh iMz xTm qRN @@ -88630,7 +91272,7 @@ fgn jFx sGR pUQ -pUQ +sJJ pUQ qSp gaP @@ -88644,13 +91286,13 @@ xQn eMG tCB bQC -sgQ +wXh asg ssb -dnj cpM yab cTW +eoY jZd pHe jZd @@ -88689,7 +91331,7 @@ tVS fAx fCq rcQ -bSK +bpV bSK fEF dWC @@ -88857,13 +91499,13 @@ meJ meJ kZY kZY -sqV -gsm +yiJ +oHw azP +xRR +xRR fZe -fZe -fZe -qEi +gpO gTB opS egY @@ -88904,13 +91546,13 @@ eXg qSp jbU sCq -rvE xyp eIg aFk weN weN weN +weN bOT hNe ijg @@ -88949,7 +91591,7 @@ mcu drz uPl dji -dWC +cbR kuO xQD nvY @@ -89117,22 +91759,22 @@ kZY bzW mog eOA -eOA +ahg eOA aJj -qEi +gpO dSX wpd aYJ cHQ deg -jeT +sFS iMz qCK uSW nQI gCU -mzV +jHc mzV mzV eGI @@ -89161,10 +91803,10 @@ hvh wUb yam sCq -qWq -lSE +iWk eIg qqf +obz fKr fKr fKr @@ -89377,13 +92019,13 @@ imn imn imn azP -qEi +gpO tNa uKj -pgT -jKJ +opS +opS xem -qmb +ftw jRD jRD seR @@ -89395,7 +92037,7 @@ tqf eIQ wtH oZM -gWh +qsy gWh onJ nQI @@ -89418,10 +92060,10 @@ fFQ jvI poH auZ -cbM xKz sAA aBO +lbf ghz ghz ghz @@ -89637,9 +92279,9 @@ tjQ uby fGK mjY -qco -lpX -omn +xNy +xNy +eYQ gan jRD esh @@ -89652,7 +92294,7 @@ lsW htx pJH gWh -gWh +qOQ xaI tIn nQI @@ -89675,11 +92317,11 @@ dnr jvI cME rvE -rvE dLS eIg huL hUd +hUd trB hUd njm @@ -89891,12 +92533,12 @@ cwn fmR imn mnQ -qEi +gpO rjZ uDI -pVF -mjN -gan +opS +opS +nNY gan jRD cLF @@ -89910,7 +92552,7 @@ ifE uJS gWh qZv -gWh +onl iWl nQI lCJ @@ -89930,12 +92572,12 @@ fAb kdz wBn jvI -pPD +vqH iBn -kda -voC +bZY yab pVp +gwM wPi mty kKW @@ -90148,13 +92790,13 @@ poX jAR dDX nHn -qEi -qEi -qEi -qEi -qEi -qEi -qEi +gpO +gpO +gpO +gpO +gpO +gpO +gpO jRD jRD rWM @@ -90401,8 +93043,8 @@ meJ tWI eEF vwY -uqw -tns +cwn +cwn imn duo eUt @@ -90658,8 +93300,8 @@ meJ imn sjq xWl -gBL -gBL +imn +imn imn dma oBz @@ -90702,7 +93344,7 @@ nhJ hZm pDS dGs -dGs +ssI aBy wAo snT @@ -90875,10 +93517,10 @@ meJ meJ dNM rVs -wLh +aOb iMh -rVs -rVs +qGL +uTr cAb gYs jXk @@ -90914,9 +93556,9 @@ aah meJ meJ meJ +qHg +nez nez -lZO -lZO ltk ltk wJN @@ -91171,9 +93813,9 @@ aah aah aah meJ +arO meJ -pHU -lZO +nez meJ meJ pHU @@ -91428,9 +94070,9 @@ aah aah aah aah +arO meJ -pHU -lZO +nez meJ meJ etN @@ -91685,9 +94327,9 @@ aah aah aah meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -91942,9 +94584,9 @@ aah aah aah meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -92199,9 +94841,9 @@ aah aah meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -92456,9 +95098,9 @@ aah aah meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -92713,9 +95355,9 @@ aah meJ meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -92970,9 +95612,9 @@ aah meJ meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -93227,9 +95869,9 @@ aah meJ meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -93484,9 +96126,9 @@ aah meJ meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -93741,9 +96383,9 @@ aah meJ meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -93998,9 +96640,9 @@ aah meJ meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -94255,9 +96897,9 @@ meJ meJ meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -94512,9 +97154,9 @@ meJ meJ meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -94729,7 +97371,7 @@ aah aah aah sks -uoJ +sYk lvw lvw kYi @@ -94769,9 +97411,9 @@ meJ meJ meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -95026,9 +97668,9 @@ dKR dKR meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -95278,14 +97920,14 @@ sLx sLx sLx sLx -plq +sLx ygm dKR meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -95345,7 +97987,7 @@ meJ tSn emU tSn -lLl +mkE tSn uKm lZu @@ -95540,9 +98182,9 @@ owl dKR meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -95759,9 +98401,9 @@ aah nLI aSy lvw -dHZ +lvw hOO -eeS +tJx tJx tJx wOE @@ -95770,8 +98412,8 @@ wRh tuT vzP cBt -uRV -rUX +vzP +nhV ehZ nhV foO @@ -95797,9 +98439,9 @@ hqe dKR meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -96016,9 +98658,9 @@ aah nLI uoJ lvw -dHZ -dHZ -dHZ +lvw +lvw +lvw lvw lvw lvw @@ -96027,21 +98669,21 @@ qVK gvw qax qkb -meK qax -lVG +qax +iAR aRd xOe xMG dqb cKp coH -coH +gqd coH cmI coH rDh -coH +fQO vus hQt jfu @@ -96054,9 +98696,9 @@ hqe aKv meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -96271,7 +98913,7 @@ aah aah aah nLI -mvi +uoJ wNL wNL wNL @@ -96284,7 +98926,7 @@ rfV bpc tEL sZc -byK +tEL tEL cpK xLh @@ -96311,9 +98953,9 @@ hqe aKv meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -96530,9 +99172,9 @@ aah nLI kdT wNL -dHZ -dHZ -dHZ +lvw +lvw +lvw lvw lvw cQn @@ -96541,9 +99183,9 @@ sks gvw qax qkb -meK +qax uTc -lVG +iAR aRd nlQ iGA @@ -96568,9 +99210,9 @@ hqe aKv meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -96787,9 +99429,9 @@ aah nLI kdT wNL -dHZ -dHZ -dHZ +lvw +lvw +lvw lvw lvw lZJ @@ -96799,7 +99441,7 @@ gvw qax kgQ qzX -iPw +aRd dKs aRd nlQ @@ -96825,9 +99467,9 @@ hqe aKv meJ meJ +arO meJ -pHU -lZO +nez meJ meJ etN @@ -97071,20 +99713,20 @@ vkl mWz dfe vOg -coH +gqd aLI aLI lPT tgE tgE coH -aJU +hqe aKv meJ -foJ -jDJ -uCz -lZO +meJ +arO +meJ +nez meJ meJ etN @@ -97317,7 +99959,7 @@ swM eWH hhi jfa -qbI +fxe cvJ bAT qkx @@ -97331,17 +99973,17 @@ vmY tVG tVG sQT +ncd qmU qmU qmU -nkL nxY aKv uxK -aSf uxK +vKM uxK -lZO +nez meJ meJ etN @@ -97595,10 +100237,10 @@ aKv aKv aKv sUG -vlt +acm qqx -eCk -wWb +uxK +nez meJ meJ etN @@ -98617,7 +101259,7 @@ myr myr fMs fMs -fMs +cAt fMs tdl qyh @@ -98865,7 +101507,7 @@ gAb lQT fxe teK -sxa +rsS rsS nvs rsS @@ -100670,7 +103312,7 @@ kMl aTV qSk qSk -tCc +bKY hPj hPj hPj @@ -100923,7 +103565,7 @@ xdh iok bfx tZO -hNZ +pta bfx tZO hNZ diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index c96e55fd0c57..23162c70e2c1 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -1853,10 +1853,6 @@ /obj/item/paper/guides/jobs/security/labor_camp, /turf/open/floor/iron, /area/station/security/brig) -"gU" = ( -/obj/effect/landmark/bitrunning/station_reward_spawn, -/turf/open/floor/circuit/green, -/area/station/bitrunning/den) "gW" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/radiation/rad_area/directional/north, @@ -1882,6 +1878,10 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron, /area/station/construction) +"ip" = ( +/obj/machinery/byteforge, +/turf/open/floor/circuit/green, +/area/station/bitrunning/den) "is" = ( /obj/structure/sign/warning/vacuum/external/directional/east, /turf/open/floor/iron, @@ -3223,7 +3223,7 @@ aa aa aa pl -gU +Lq Lq RW nk @@ -3315,8 +3315,8 @@ aa aa aa pl -gU Lq +ip RW nk pl diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index d37877d5bee6..dca8bf3e5d03 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -2,36 +2,112 @@ "aa" = ( /turf/open/space/basic, /area/space) +"ab" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/machinery/camera/autoname/directional/north{ + network = list("nukie") + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"ac" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) "ad" = ( /turf/open/space, /area/space) -"ag" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Chief Engineer" +"ae" = ( +/obj/structure/railing/wood{ + dir = 1 + }, +/obj/structure/hedge, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) +"af" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"ah" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 10 + }, +/obj/structure/sign/poster/contraband/energy_swords{ + pixel_x = -32 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"ai" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/red, +/obj/item/toy/nuke{ + pixel_x = -5; + pixel_y = 1 + }, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) +"aj" = ( +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"ak" = ( +/obj/machinery/door/airlock/centcom{ + name = "CentCom Logistics" }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/effect/mapping_helpers/airlock/access/any/admin/general, -/obj/effect/mapping_helpers/airlock/access/any/engineering/ce, -/turf/open/floor/iron/dark/diagonal, -/area/centcom/central_command_areas/evacuation) +/turf/open/floor/iron, +/area/centcom/central_command_areas/admin) "al" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/entertainment/money_large, /obj/structure/closet/crate/mail/full, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) +"am" = ( +/obj/structure/fake_stairs/stone{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) +"an" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/light/floor/has_bulb, +/obj/structure/chair/stool/bar/directional/south, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/borbop) +"ao" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/kitchen) "ap" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 9 +/obj/structure/sign/poster/contraband/energy_swords{ + pixel_y = 32 }, -/obj/effect/turf_decal/siding/wideplating/dark{ +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"aq" = ( +/obj/effect/turf_decal/siding/green/end{ dir = 4 }, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/wood, -/area/centcom/central_command_areas/fore) +/obj/structure/railing/wood, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) "ar" = ( /obj/structure/chair/office{ dir = 8 @@ -41,18 +117,9 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) "as" = ( -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supplypod) -"at" = ( -/obj/machinery/door/airlock/centcom{ - name = "Thunderdome Backstage" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/machinery/light/directional/east, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "au" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/iron/fifty, @@ -70,64 +137,103 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, -/area/centcom/central_command_areas/admin) +/area/centcom/central_command_areas/ferry) "av" = ( -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, +/obj/machinery/light/cold/directional/south, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/tdome/observation) +/area/centcom/syndicate_mothership/control) "aw" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/centcom/tdome/observation) +"ax" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/effect/turf_decal/siding/dark/corner{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ +/turf/open/floor/iron/dark/corner{ dir = 1 }, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) -"ax" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"aB" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 +/area/centcom/central_command_areas/hall) +"ay" = ( +/obj/structure/aquarium, +/turf/open/floor/carpet/neon/simple/cyan, +/area/centcom/central_command_areas/admin) +"az" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"aD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/effect/turf_decal/siding/dark{ + dir = 8 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/vending/imported/mothic, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) +"aA" = ( +/obj/structure/fake_stairs/stone{ dir = 1 }, -/obj/machinery/computer/monitor{ +/turf/open/floor/stone, +/area/centcom/central_command_areas/hall) +"aB" = ( +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range_checkpoint_control) +"aC" = ( +/obj/effect/turf_decal/siding/dark{ dir = 1 }, -/obj/structure/cable, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) +/obj/effect/turf_decal/siding/dark, +/obj/machinery/oven/range, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) +"aD" = ( +/obj/structure/flora/tree/dead/style_random, +/obj/structure/flora/grass/both/style_random, +/obj/structure/railing, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "aE" = ( -/obj/structure/sign/poster/contraband/clown{ - pixel_y = 3 +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/fore) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"aF" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark/corner, +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"aG" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/trimline/blue, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"aH" = ( +/obj/machinery/computer/operating{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) "aI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/south, /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) +"aJ" = ( +/turf/closed/indestructible/fakeglass, +/area/centcom/central_command_areas/borbop) "aK" = ( /obj/structure/table/reinforced, /obj/item/stack/package_wrap, @@ -138,7 +244,7 @@ dir = 1 }, /turf/open/floor/iron, -/area/centcom/central_command_areas/admin) +/area/centcom/central_command_areas/ferry) "aL" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -152,18 +258,41 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) "aM" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/stove, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"aP" = ( -/obj/structure/chair{ +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood/corner{ dir = 1 }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"aN" = ( +/turf/open/floor/carpet, +/area/centcom/wizard_station) +"aO" = ( +/obj/structure/window/plasma/spawner/directional/east, +/obj/structure/window/plasma/spawner/directional/north, +/obj/machinery/clonepod{ + desc = "A seemingly older and different piece of technology that was capable of near perfect clones over much longer timeframes than now almost completely banned cloning vat technology.
The glass dome seems to be dirty and frosted over, obscuring the contents of the vat. The status and operating panel seems to have been hijacked, a familiar 'card' connected to its operations interface."; + name = "biovat" + }, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) +"aP" = ( +/obj/structure/hedge, +/obj/structure/railing/wood{ + dir = 4 + }, +/obj/effect/turf_decal/tile/orange/diagonal_edge, +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) +"aQ" = ( +/turf/open/floor/iron/smooth, +/area/centcom/syndicate_mothership/control) "aR" = ( /obj/item/kirbyplants{ icon_state = "plant-22" @@ -173,6 +302,29 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"aS" = ( +/obj/structure/table/reinforced/plasmarglass, +/obj/item/book/manual/wiki/tcomms{ + name = "How to Become a Billionaire"; + desc = "Huh... I don't think any of us expected there to be a totally legit guide to this." + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/misc/grass, +/area/centcom/central_command_areas/admin) +"aT" = ( +/obj/vehicle/ridden/scooter/skateboard{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/centcom/wizard_station) +"aU" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 9 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/medical) "aV" = ( /obj/structure/table/wood, /obj/item/clipboard, @@ -180,11 +332,18 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"aW" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/carpet/purple, +/area/centcom/central_command_areas/admin) "aX" = ( -/obj/machinery/clonepod/experimental, -/obj/effect/turf_decal/trimline/blue/filled/warning, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/trimline/green/line, +/obj/structure/reagent_dispensers/watertank/high, +/obj/structure/railing/wood, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) "aZ" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/table/reinforced, @@ -193,6 +352,13 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) +"ba" = ( +/obj/structure/railing/wood{ + dir = 4 + }, +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/borbop) "bb" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -207,42 +373,56 @@ /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) "bc" = ( -/obj/effect/turf_decal/siding/blue/corner, -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/structure/fence/cut/medium{ + dir = 4 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "bd" = ( -/obj/machinery/door/window/brigdoor{ - base_state = "rightsecure"; - icon_state = "rightsecure"; - name = "Thunderdome Booth"; - req_access = list("cent_captain") +/obj/structure/flora/rock/pile/style_random, +/obj/structure/railing{ + dir = 1 }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "be" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark, +/obj/structure/sink/directional/south, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) "bf" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/food_machine, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"bg" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/machinery/camera/autoname/directional/west{ + network = list("nukie") + }, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) +"bg" = ( +/obj/machinery/light/cold/directional/east, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "bh" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/circuit/green, -/area/centcom/central_command_areas/supply) +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 10 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) "bi" = ( -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "bj" = ( /obj/structure/table/reinforced, /obj/item/storage/box/zipties, @@ -252,51 +432,105 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) -"bk" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 +"bl" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, -/obj/machinery/door/airlock/security/glass{ - name = "Central Command Brig" +/obj/structure/chair/wood{ + dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/any/security/entrance, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "bm" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, /obj/effect/turf_decal/tile/green, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) -"bp" = ( -/obj/item/trash/sosjerky, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) -"bu" = ( -/obj/effect/turf_decal/stripes/line{ +"bo" = ( +/obj/effect/turf_decal/siding/green{ dir = 8 }, -/obj/effect/turf_decal/trimline/dark_red/filled/warning{ - dir = 8 +/obj/machinery/vending/cigarette, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) +"bp" = ( +/obj/structure/closet/secure_closet/ert_engi, +/obj/structure/sign/directions/engineering{ + pixel_y = 24 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) +"bq" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/siding/dark{ + dir = 10 }, -/obj/effect/turf_decal/trimline/dark_red/warning{ +/obj/effect/turf_decal/siding/dark/corner{ dir = 4 }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"br" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) +"bs" = ( +/obj/structure/railing, +/turf/open/floor/catwalk_floor/iron_smooth{ + initial_gas_mix = "TEMP=2.7" + }, +/area/centcom/syndicate_mothership) +"bt" = ( +/obj/structure/sign/poster/contraband/gorlex_recruitment{ + pixel_y = 32 + }, +/turf/open/floor/iron/dark/textured_half{ + dir = 8 + }, +/area/centcom/syndicate_mothership/control) +"bu" = ( +/obj/structure/dresser, +/obj/structure/noticeboard/directional/south, /turf/open/floor/iron/smooth_half{ dir = 1 }, -/area/centcom/central_command_areas/prison) +/area/centcom/syndicate_mothership/control) +"bv" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"bw" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) "bx" = ( -/turf/open/floor/iron/goonplaque{ - desc = "This is a plaque commemorating the thunderdome and all those who have died at its pearly blast doors." +/obj/effect/turf_decal/siding/dark{ + dir = 4 }, -/area/centcom/tdome/observation) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"by" = ( +/turf/open/floor/iron/smooth_edge{ + dir = 4 + }, +/area/centcom/syndicate_mothership/control) "bA" = ( /obj/structure/table/reinforced, /obj/item/storage/medkit/regular{ @@ -319,123 +553,173 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/armory) "bB" = ( -/obj/item/storage/box/handcuffs, -/obj/item/crowbar/red, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"bD" = ( -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ +/obj/structure/table/glass/plasmaglass, +/obj/item/storage/pill_bottle{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/storage/pill_bottle{ + pixel_x = -8; + pixel_y = 6 + }, +/obj/item/storage/pill_bottle, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"bC" = ( +/obj/effect/turf_decal/loading_area{ dir = 8 }, +/obj/structure/fake_stairs/wood/directional/east, /turf/open/floor/iron, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/supply) +"bD" = ( +/obj/machinery/telecomms/allinone/nuclear, +/turf/open/floor/circuit/red/telecomms, +/area/centcom/central_command_areas/admin) "bE" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +/obj/effect/turf_decal/trimline/green/corner{ + dir = 4 }, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line{ - dir = 8 +/obj/effect/turf_decal/trimline/green{ + pixel_x = -16; + pixel_y = -16 }, /turf/open/floor/iron/dark, -/area/centcom/tdome/administration) -"bG" = ( -/obj/machinery/computer/security{ - dir = 8 +/area/centcom/central_command_areas/botany) +"bF" = ( +/obj/effect/turf_decal/siding/dark/end{ + dir = 1 }, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin) +"bG" = ( +/obj/machinery/light/cold/directional/south, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "bH" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/armory) -"bJ" = ( -/obj/machinery/light/directional/north, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"bK" = ( -/obj/item/toy/cattoy, -/obj/item/storage/box/hug/medical{ - pixel_y = 8; - pixel_x = -8 - }, -/obj/structure/table/reinforced/rglass, -/obj/machinery/light/directional/west, -/turf/open/floor/carpet/cyan, -/area/centcom/central_command_areas/control) -"bL" = ( -/obj/machinery/door/airlock/centcom{ - name = "CentCom Security" +"bI" = ( +/obj/structure/closet/secure_closet/ert_com, +/obj/structure/sign/directions/command{ + pixel_y = 24 }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) +"bJ" = ( /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 4 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 +/obj/machinery/light/cold/directional/east, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"bK" = ( +/obj/structure/centcom_teleporter/admin_offices, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin) +"bL" = ( +/obj/structure/noticeboard/directional/east, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/any/security/general, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, +/obj/structure/centcom_teleporter/cargo, /turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/area/centcom/central_command_areas/supply) "bM" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/pale/style_random, -/turf/open/misc/asteroid, -/area/centcom/tdome/administration) +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/evacuation) "bN" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation/ship) -"bP" = ( -/obj/machinery/door/window/brigdoor{ - base_state = "rightsecure"; - name = "CentCom Stand"; - req_access = list("cent_captain") +"bO" = ( +/obj/machinery/door/airlock/centcom{ + dir = 4; + name = "Ook's Streamer Den" }, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/mapping_helpers/airlock/access/any/admin/captain, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"bS" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/mob_spawn/corpse/human/clown, -/turf/open/indestructible/dark, +/area/centcom/central_command_areas/admin) +"bP" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) +"bQ" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/landmark/prisonwarp, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/prison/cells) -"bT" = ( +"bR" = ( +/obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/vending/wardrobe/sec_wardrobe, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/obj/structure/railing, +/turf/open/lava/plasma/ice_moon, +/area/centcom/syndicate_mothership/control) +"bS" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) +"bT" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/plating/icemoon, +/area/centcom/syndicate_mothership/control) "bU" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/vending/boozeomat, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"bV" = ( +/obj/structure/fence/door/opened, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"bX" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) +"bY" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/machinery/vending/imported/tizirian, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) +"bZ" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/vending/wardrobe/science_wardrobe, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) "ca" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/pale/style_random, -/obj/machinery/light/directional/west, -/turf/open/misc/asteroid, -/area/centcom/tdome/administration) +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "cb" = ( /obj/item/storage/briefcase{ pixel_x = -3; @@ -448,18 +732,40 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"cc" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/hydroponics/constructable{ + self_growing = 1; + self_sustaining = 1; + sustaining_precent = 100; + multi = 15 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) "cd" = ( -/obj/structure/sink/directional/east, -/obj/structure/mirror/directional/west, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/machinery/rnd/production/protolathe/department/science, +/turf/open/floor/circuit/green, +/area/centcom/central_command_areas/admin) +"ce" = ( +/obj/structure/railing/wood{ + dir = 1 + }, +/obj/structure/hedge, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/borbop) "cg" = ( /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/evacuation) "ch" = ( -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin_hangout) "ci" = ( /obj/effect/turf_decal/tile/neutral/full, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -482,12 +788,18 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) "ck" = ( -/obj/machinery/door/airlock/centcom{ - name = "Thunderdome" +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/structure/sign/poster/contraband/fun_police{ + pixel_x = -32 + }, +/obj/machinery/light/cold/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_bombthreat) "cl" = ( /obj/structure/bed/roller, /obj/machinery/iv_drip, @@ -499,30 +811,32 @@ /turf/open/floor/iron/white, /area/centcom/central_command_areas/evacuation/ship) "cm" = ( -/obj/structure/closet/secure_closet/ert_engi, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/fireaxecabinet/directional/north, -/turf/open/floor/iron, -/area/centcom/central_command_areas/armory) +/obj/effect/turf_decal/siding/green/corner, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/botany) "cn" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/centcom/central_command_areas/briefing) "co" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"cq" = ( -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/railing/wood{ dir = 1 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/structure/railing/wood{ + dir = 8 + }, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin_hangout) +"cp" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"cq" = ( +/obj/structure/railing/wood, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin_hangout) "cr" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -530,69 +844,111 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) +"cs" = ( +/obj/machinery/modular_computer/console/preset/id/centcom, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) "ct" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/airlock/security/glass{ - name = "Central Command Courtroom" +/obj/effect/turf_decal/siding/dark{ + dir = 9 }, -/obj/effect/mapping_helpers/airlock/access/any/security/court, -/turf/open/floor/iron, -/area/centcom/central_command_areas/courtroom) +/obj/effect/turf_decal/siding/dark/corner, +/obj/structure/sign/painting/large/library{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"cu" = ( +/obj/structure/organ_creator, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) +"cv" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "cw" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"cx" = ( /obj/structure/table/wood, -/obj/item/folder/red, -/obj/item/lighter, -/obj/machinery/firealarm/directional/south, +/obj/item/storage/fancy/donut_box, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/camera, -/obj/item/storage/photo_album, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) -"cA" = ( -/obj/item/storage/box/emps{ - pixel_x = 3; - pixel_y = 3 +/area/centcom/central_command_areas/ferry) +"cy" = ( +/obj/effect/turf_decal/siding/dark/corner{ + dir = 8 }, -/obj/item/storage/box/flashbangs, -/obj/item/grenade/c4/x4, -/obj/item/grenade/c4/x4, -/obj/item/grenade/c4/x4, -/obj/structure/table/reinforced, -/obj/item/clothing/ears/earmuffs, -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/effect/turf_decal/siding/dark{ + dir = 5 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) -"cD" = ( -/obj/structure/table/wood, -/obj/item/folder/red, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/restraints/handcuffs, -/obj/item/assembly/flash/handheld, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) -"cG" = ( -/obj/structure/table/wood/fancy/red, -/obj/item/storage/cans/sixsoda, -/obj/structure/sign/painting/library_secure{ - pixel_x = 32 +/turf/open/floor/iron/dark/corner{ + dir = 8 }, -/turf/open/floor/iron/kitchen/diagonal, -/area/centcom/central_command_areas/fore) -"cI" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 +/area/centcom/central_command_areas/hall) +"cz" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) -"cJ" = ( -/obj/docking_port/stationary{ - dir = 4; +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "War Room" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/textured_large, +/area/centcom/syndicate_mothership/control) +"cA" = ( +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"cB" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"cC" = ( +/obj/structure/closet/crate/bin, +/obj/structure/light_prism, +/turf/open/floor/plating/abductor, +/area/centcom/central_command_areas/admin) +"cE" = ( +/obj/structure/fake_stairs/wood/directional/north, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"cF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/closet/secure_closet/hydroponics{ + locked = 0 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) +"cG" = ( +/obj/machinery/vending/clothing, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"cH" = ( +/obj/structure/table/wood/fancy/purple, +/obj/machinery/computer/records/medical/laptop, +/turf/open/floor/plating/abductor, +/area/centcom/central_command_areas/admin) +"cI" = ( +/obj/machinery/door/airlock/centcom{ + name = "Abraxis' Office" + }, +/obj/effect/mapping_helpers/airlock/access/any/admin/captain, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) +"cJ" = ( +/obj/docking_port/stationary{ + dir = 4; dwidth = 1; height = 5; name = "recovery ship"; @@ -602,34 +958,63 @@ /turf/open/space/basic, /area/space) "cK" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/basic/frog, -/turf/open/indestructible/dark, -/area/centcom/central_command_areas/prison/cells) +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) "cL" = ( -/obj/item/gun/energy/pulse/carbine/loyalpin, -/obj/item/flashlight/seclite, /obj/structure/table/reinforced, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/effect/turf_decal/siding/red{ + dir = 8 }, -/obj/item/storage/box/fish_debug, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) +/obj/item/storage/fancy/donut_box, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) +"cM" = ( +/obj/structure/chair/sofa/middle/brown{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/admin) +"cN" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/landmark/prisonwarp, +/obj/effect/turf_decal/siding/dark/corner, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/prison/cells) "cO" = ( -/obj/structure/fans/tiny, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) +/obj/structure/statue/uranium/nuke, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "cP" = ( /obj/structure/window/reinforced/survival_pod/spawner/directional/north, /turf/open/floor/plating, /area/centcom/central_command_areas/evacuation/ship) +"cQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/wood/fancy/black, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"cR" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 10 + }, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) "cS" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/structure/railing/wood{ + dir = 8 + }, +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) "cT" = ( /obj/machinery/power/port_gen/pacman, /obj/structure/cable, @@ -639,26 +1024,64 @@ }, /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) -"cW" = ( -/obj/structure/table/wood, -/obj/machinery/reagentgrinder{ - desc = "Used to grind things up into raw materials and liquids."; - pixel_y = 5 +"cU" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"cY" = ( -/obj/machinery/icecream_vat, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"cZ" = ( -/obj/effect/turf_decal/tile/green/half/contrasted{ +/obj/item/kirbyplants{ + icon_state = "plant-22"; + pixel_x = -4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"cV" = ( +/obj/effect/turf_decal/siding/wood{ dir = 1 }, +/obj/effect/turf_decal/siding/wood, +/obj/item/kirbyplants{ + icon_state = "plant-22"; + pixel_x = -4 + }, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"cW" = ( +/obj/effect/gibspawner/human/bodypartless, +/obj/structure/fans/tiny/invisible, /turf/open/floor/iron, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/admin) +"cX" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"cY" = ( +/obj/structure/fake_stairs/wood/directional/east, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"cZ" = ( +/obj/structure/chair/wood/wings{ + dir = 8 + }, +/turf/open/floor/wood, +/area/centcom/wizard_station) +"da" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) "db" = ( /obj/structure/table/wood, /obj/item/folder/red, @@ -668,36 +1091,107 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) "dc" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom{ - dir = 8 - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/centcom/central_command_areas/fore) +/obj/machinery/door/window/right/directional/west, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range) "dd" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/iron, -/area/centcom/central_command_areas/admin) +/area/centcom/central_command_areas/ferry) "de" = ( /obj/effect/landmark/start/new_player, /turf/closed/indestructible/start_area, /area/misc/start) -"di" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/structure/noticeboard/directional/south, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, +"df" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/vending/wardrobe/hydro_wardrobe, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, /area/centcom/tdome/observation) +"dg" = ( +/obj/machinery/atmospherics/components/trinary/mixer, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"dh" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) +"di" = ( +/turf/open/floor/iron/stairs/old, +/area/centcom/syndicate_mothership/control) "dj" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/kitchen/diagonal, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/structure/chair/stool/directional/east, +/obj/effect/landmark/start/nukeop, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) +"dk" = ( +/obj/structure/table/reinforced/plastitaniumglass{ + name = "Andrea's Desk" + }, +/obj/item/paper_bin, +/obj/item/pen/fourcolor, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) +"dl" = ( +/turf/closed/indestructible/fakeglass, +/area/centcom/central_command_areas/medical) "dm" = ( -/turf/open/floor/wood, -/area/centcom/tdome/administration) +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window"; + opacity = 1 + }, +/obj/structure/table/reinforced/plasmarglass, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/item/assembly/signaler{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/assembly/signaler{ + pixel_x = 2; + pixel_y = 5 + }, +/obj/item/assembly/timer{ + pixel_x = 12; + pixel_y = -9 + }, +/obj/item/assembly/timer{ + pixel_x = 15 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -6; + pixel_y = -4 + }, +/obj/item/assembly/signaler{ + pixel_x = 5; + pixel_y = 10 + }, +/obj/item/assembly/timer{ + pixel_x = 18; + pixel_y = 5 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) "dn" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -713,12 +1207,38 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) "dp" = ( -/obj/structure/chair{ +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/centcom/syndicate_mothership/control) +"dq" = ( +/obj/structure/railing/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/obj/structure/table/wood/fancy/black, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"dr" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 }, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) +/obj/structure/table/glass/plasmaglass, +/obj/item/folder/white, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/machinery/light/cold/directional/west, +/obj/item/stack/spacecash/c200{ + pixel_y = 17 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"dt" = ( +/obj/structure/window/reinforced/tinted/frosted, +/obj/structure/closet/mini_fridge, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/admin) "dv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 @@ -730,66 +1250,124 @@ }, /area/centcom/central_command_areas/evacuation/ship) "dw" = ( -/obj/machinery/shower/directional/west, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/effect/turf_decal/tile/orange/diagonal_edge, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "dx" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) +/area/centcom/central_command_areas/ferry) "dy" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/structure/crate_loot, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "dz" = ( -/obj/item/clipboard, -/obj/structure/table/reinforced, -/obj/item/detective_scanner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 +/obj/effect/turf_decal/trimline/green/corner{ + dir = 8 }, -/obj/structure/cable, -/obj/item/storage/box/ids{ - pixel_x = 6; - pixel_y = 12 +/obj/effect/turf_decal/trimline/green{ + pixel_x = 16; + pixel_y = 16 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) -"dG" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks{ +/area/centcom/central_command_areas/botany) +"dA" = ( +/obj/structure/railing/wood{ + dir = 1 + }, +/obj/structure/railing/wood{ dir = 8 }, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/borbop) +"dB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/plasma, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"dC" = ( +/obj/machinery/modular_computer/console/preset/id/centcom{ + dir = 8 + }, +/turf/open/floor/carpet/purple, +/area/centcom/central_command_areas/admin) +"dD" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"dE" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/curtain/cloth/fancy, +/turf/open/indestructible/event/plating, +/area/centcom/central_command_areas/kitchen) +"dF" = ( +/obj/structure/table/reinforced, +/obj/item/syndicatedetonator{ + desc = "This gaudy button can be used to instantly detonate syndicate bombs that have been activated on the station. It is also fun to press." + }, +/turf/open/floor/carpet, +/area/centcom/syndicate_mothership/control) "dH" = ( -/obj/structure/sign/painting/library{ - pixel_y = -32 +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/turf/open/floor/wood, -/area/centcom/tdome/administration) +/obj/structure/tank_dispenser, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) "dI" = ( -/obj/machinery/vending/hydroseeds{ - default_price = 0; - extra_price = 0 +/obj/structure/closet/crate/freezer{ + name = "pantry crate" }, -/turf/open/floor/wood, -/area/centcom/tdome/observation) +/obj/structure/sign/poster/contraband/moffuchis_pizza{ + pixel_y = -32 + }, +/obj/item/reagent_containers/condiment/rice{ + pixel_y = 12 + }, +/obj/item/reagent_containers/condiment/rice{ + pixel_y = 12 + }, +/obj/item/reagent_containers/condiment/saltshaker, +/obj/item/reagent_containers/condiment/peppermill, +/obj/item/food/grown/wheat, +/obj/item/food/grown/wheat, +/obj/item/reagent_containers/condiment/sugar, +/obj/item/reagent_containers/condiment/sugar, +/obj/item/food/grown/soybeans, +/obj/item/food/grown/soybeans, +/obj/item/food/grown/vanillapod, +/obj/item/food/grown/vanillapod, +/obj/item/food/grown/herbs, +/obj/item/food/grown/herbs, +/obj/item/food/grown/cocoapod, +/obj/item/food/grown/cocoapod, +/obj/item/food/grown/aloe, +/obj/item/food/grown/coffee, +/obj/item/food/grown/coffee, +/turf/open/floor/plastic, +/area/centcom/syndicate_mothership/expansion_fridgerummage) "dJ" = ( -/obj/machinery/button/door/indestructible{ - id = "thunderdomehea"; - name = "Heavy Supply Control" +/obj/structure/punching_bag, +/obj/effect/turf_decal/siding/dark{ + dir = 9 }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/obj/effect/turf_decal/siding/dark/corner, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "dK" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/wood/corner, @@ -801,43 +1379,56 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) "dL" = ( -/obj/effect/turf_decal/loading_area, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/structure/chair/sofa/bench{ + dir = 4 + }, +/obj/machinery/light/cold/directional/west, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/titanium, +/area/centcom/syndicate_mothership/control) +"dN" = ( +/obj/machinery/door/airlock{ + icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; + name = "Game Room" + }, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "dO" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/simple_animal/pet/gondola, -/turf/open/indestructible/dark, -/area/centcom/central_command_areas/prison/cells) +/obj/structure/railing/wood{ + dir = 4 + }, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/ghost_spawn) +"dP" = ( +/obj/machinery/dna_scannernew, +/turf/open/floor/circuit/telecomms, +/area/centcom/central_command_areas/admin) "dQ" = ( -/obj/structure/sign/poster/contraband/tipper_cream_soda{ - pixel_y = 35 +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin) +"dR" = ( +/obj/structure/punching_bag, +/obj/effect/turf_decal/siding/dark{ + dir = 1 }, -/obj/machinery/griddle, -/turf/open/floor/iron/kitchen/herringbone, -/area/centcom/central_command_areas/fore) -"dV" = ( -/obj/structure/table/wood, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/storage/box/lethalshot, -/obj/item/ammo_casing/shotgun/pulverizer, -/obj/item/ammo_casing/shotgun/pulverizer, -/obj/item/ammo_casing/shotgun/pulverizer, -/obj/item/ammo_casing/shotgun/pulverizer, -/obj/item/ammo_casing/shotgun/pulverizer, -/obj/item/ammo_casing/shotgun/pulverizer, -/obj/item/ammo_casing/shotgun/pulverizer, -/obj/item/ammo_casing/shotgun/pulverizer, -/obj/item/ammo_casing/shotgun/pulverizer, -/obj/item/ammo_casing/shotgun/pulverizer, -/obj/item/ammo_casing/shotgun/pulverizer, -/obj/item/ammo_casing/shotgun/pulverizer, -/obj/item/storage/backpack/duffelbag/syndie/ammo/shotgun, -/obj/item/gun/ballistic/shotgun/bulldog/unrestricted, -/obj/item/holosign_creator/robot_seat/bar, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"dS" = ( +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/botany) +"dT" = ( +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) +"dU" = ( +/obj/structure/closet/crate/bin, +/turf/open/misc/grass, +/area/centcom/central_command_areas/admin) "dW" = ( /obj/item/radio{ pixel_x = 5; @@ -854,34 +1445,35 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) "dX" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "dY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/dark_red/line, -/turf/open/floor/iron/tgmcemblem{ - dir = 9 - }, -/area/centcom/central_command_areas/prison) +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/landmark/navigate_destination/centcom/borbop, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/borbop) "dZ" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +/obj/effect/turf_decal/siding/dark{ + dir = 5 }, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"ea" = ( +/obj/structure/railing/wrestling, +/turf/open/floor/iron/smooth_large{ + icon = 'goon/icons/turf/floors.dmi'; + icon_state = "boxing" + }, +/area/centcom/central_command_areas/hall) +"eb" = ( +/obj/structure/sink/kitchen/directional/south, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "ec" = ( /obj/structure/railing{ dir = 4; @@ -897,98 +1489,171 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) -"ef" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" +"ed" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 5 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) +/obj/effect/turf_decal/siding/dark/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/borbop) +"ee" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"ef" = ( +/obj/structure/fence/cut/medium, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"eg" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/rag, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "ei" = ( -/obj/effect/turf_decal/siding/blue, -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"el" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/chem_recipe_debug, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 +/obj/machinery/griddle, +/obj/structure/sign/poster/contraband/syndiemoth{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"ej" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/borbop) +"ek" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair/wood{ + dir = 8 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "em" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/obj/machinery/chem_mass_spec, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "en" = ( -/obj/item/storage/box/ids{ - pixel_x = 3; - pixel_y = 3 +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 }, -/obj/item/storage/box/silver_ids, -/obj/structure/table/reinforced, -/obj/machinery/newscaster/directional/north, -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"eo" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/machinery/computer/security/wooden_tv, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin) "ep" = ( /obj/machinery/power/shuttle_engine/heater, /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/evacuation/ship) +"eq" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/hall) "er" = ( -/obj/structure/chair/sofa/corp/corner{ +/obj/structure/filingcabinet/medical, +/turf/open/floor/carpet, +/area/centcom/syndicate_mothership/control) +"es" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ dir = 8 }, -/turf/open/floor/iron/kitchen/diagonal, -/area/centcom/central_command_areas/fore) +/turf/open/floor/carpet/executive, +/area/centcom/central_command_areas/admin) "et" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/directions/engineering{ - desc = "A sign that shows there are doors here. There are doors everywhere!"; - icon_state = "doors"; - name = "WARNING: BLAST DOORS" +/obj/effect/turf_decal/siding/green{ + dir = 6 }, -/turf/open/floor/plating, -/area/centcom/central_command_areas/courtroom) -"ex" = ( -/obj/structure/chair/sofa/corp/right{ +/obj/structure/hedge, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) +"eu" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 }, -/turf/open/floor/iron/kitchen/diagonal, -/area/centcom/central_command_areas/fore) +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"ev" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"ew" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) +"ex" = ( +/obj/machinery/hydroponics/constructable, +/turf/open/floor/mineral/titanium/tiled, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "ey" = ( /obj/structure/flora/bush/leavy, /obj/effect/decal/cleanable/cobweb, /turf/open/floor/grass, /area/centcom/central_command_areas/evacuation/ship) "ez" = ( -/obj/effect/turf_decal/siding/wideplating/dark, -/obj/effect/turf_decal/siding/wideplating/dark{ +/obj/machinery/button/door/directional/south{ + desc = "Looks like the elevator is under maintenance.."; + name = "Elevator Button" + }, +/turf/open/floor/iron/smooth_half{ dir = 1 }, -/obj/structure/railing{ +/area/centcom/syndicate_mothership/control) +"eA" = ( +/obj/effect/turf_decal/siding/dark{ dir = 1 }, -/turf/open/floor/wood, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/siding/dark/corner, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin) "eB" = ( -/obj/structure/bookcase/random, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark, +/obj/structure/sign/painting/library{ + pixel_x = 32 + }, +/obj/structure/fans/tiny/invisible, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/carpet/green, /area/centcom/central_command_areas/admin) +"eC" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/drinks, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/borbop) "eD" = ( -/obj/machinery/door/airlock/centcom{ - name = "Administrative Office" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, +/obj/effect/gibspawner/human/bodypartless, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/plating, /area/centcom/central_command_areas/admin) "eE" = ( /obj/structure/table/reinforced, @@ -1003,82 +1668,64 @@ "eF" = ( /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/briefing) +"eG" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "eH" = ( -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/ferny/style_random, -/turf/open/floor/iron{ - icon_state = "asteroid5"; - name = "plating" - }, -/area/centcom/tdome/administration) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/engine/vacuum, +/area/centcom/syndicate_mothership/expansion_bombthreat) "eI" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood, +/obj/structure/railing/wood{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin_hangout) +"eJ" = ( +/obj/structure/flora/tree/pine/style_random, +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "eK" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/pale/style_random, -/obj/machinery/light/directional/south, -/turf/open/misc/asteroid, -/area/centcom/central_command_areas/evacuation) -"eM" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"eN" = ( -/obj/structure/table/wood, -/obj/structure/plaque/static_plaque/golden{ - pixel_y = 32 +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, -/obj/item/clothing/accessory/lawyers_badge{ - desc = "A badge of upmost glory."; - name = "thunderdome badge" +/obj/structure/hedge, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"eL" = ( +/obj/structure/destructible/cult/item_dispenser/altar{ + desc = "An altar dedicated to the Wizard Federation." }, -/turf/open/floor/iron/grimy, -/area/centcom/tdome/observation) +/obj/item/knife/ritual, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"eM" = ( +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/syndicate_mothership/control) +"eN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) "eO" = ( -/obj/structure/table/wood, -/obj/item/clipboard, -/obj/item/folder/blue, -/obj/item/melee/chainofcommand, -/obj/item/stamp/captain, -/obj/machinery/newscaster{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "eP" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/effect/mob_spawn/corpse/human/intern, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) -"eQ" = ( -/obj/machinery/newscaster{ - pixel_x = -32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/dark_red/filled/warning{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 4 - }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/centcom/central_command_areas/prison) +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/curtain/cloth/fancy, +/turf/open/indestructible/event/plating, +/area/centcom/central_command_areas/borbop) "eR" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -1086,24 +1733,36 @@ /turf/open/floor/stone, /area/centcom/central_command_areas/evacuation/ship) "eS" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/centcom/central_command_areas/hall) +"eT" = ( +/obj/structure/flora/tree/jungle/style_3, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"eU" = ( /obj/structure/table/wood, -/obj/item/folder, -/obj/item/pen/red, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/paper_bin, +/obj/item/pen/fourcolor, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"eT" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 6 - }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/area/centcom/central_command_areas/admin) "eV" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/security_space_law, /obj/item/taperecorder, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/briefing) +"eW" = ( +/obj/structure/closet/secure_closet, +/turf/open/floor/mineral/titanium/white, +/area/centcom/central_command_areas/admin) "eX" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -1117,6 +1776,9 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/ferry) +"eZ" = ( +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_bombthreat) "fa" = ( /obj/machinery/status_display/evac/directional/south, /obj/effect/turf_decal/tile/green{ @@ -1124,14 +1786,37 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) +"fc" = ( +/turf/open/floor/wood, +/area/centcom/wizard_station) "fd" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 +/obj/machinery/light/directional/north, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"fe" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/obj/structure/table/reinforced, -/obj/effect/spawner/random/engineering/material_rare, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"ff" = ( +/obj/structure/table/wood, +/obj/machinery/recharger, +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/ferry) +"fg" = ( +/obj/machinery/stasis{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) +"fh" = ( +/obj/structure/flora/bush/large/style_3, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/grass, +/area/centcom/central_command_areas/botany) "fi" = ( /obj/structure/chair/office{ dir = 8 @@ -1147,36 +1832,86 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/armory) "fk" = ( -/obj/machinery/vending/cigarette, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"fm" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/centcom/central_command_areas/evacuation) +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"fl" = ( +/obj/machinery/door/airlock/centcom{ + dir = 4; + name = "Softie's Office" + }, +/obj/effect/mapping_helpers/airlock/access/any/admin/captain, +/turf/open/floor/carpet/purple, +/area/centcom/central_command_areas/admin) +"fn" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/machinery/vending/wardrobe/jani_wardrobe, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/centcom/central_command_areas/hall) "fo" = ( -/turf/open/floor/iron/smooth, -/area/centcom/central_command_areas/prison) +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/space_cube{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"fp" = ( +/obj/structure/fake_stairs/wood/directional/south, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"fq" = ( +/obj/structure/railing/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/wood/fancy/black, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) "fs" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced/indestructible, -/turf/open/floor/plating, -/area/centcom/central_command_areas/ferry) +/obj/structure/flora/tree/pine/style_random, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"fu" = ( +/obj/structure/hedge, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) "fv" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" +/obj/effect/turf_decal/siding/dark{ + dir = 8 }, -/obj/machinery/newscaster/directional/west, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/siding/dark/corner, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/admin) "fw" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) +"fx" = ( +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "fy" = ( /obj/structure/signpost/salvation{ icon = 'icons/obj/structures.dmi'; @@ -1194,51 +1929,30 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) -"fA" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) "fB" = ( -/obj/item/radio{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/radio{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/radio, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"fD" = ( +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/borbop) "fE" = ( -/obj/structure/chair, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/machinery/stasis, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) "fF" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Backup Emergency Escape Shuttle" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/mapping_helpers/airlock/access/any/engineering/external, -/turf/open/floor/iron, -/area/centcom/tdome/administration) -"fG" = ( -/obj/machinery/door/airlock/silver{ - name = "Bathroom" +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"fH" = ( +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/white, -/area/centcom/central_command_areas/admin) +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/borbop) "fI" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/decal/cleanable/dirt, @@ -1247,33 +1961,67 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) +"fJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) "fK" = ( -/obj/structure/sign/painting/library{ - pixel_y = -32 +/obj/structure/table/wood, +/obj/item/retractor, +/obj/machinery/light/directional/north, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"fL" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 }, -/obj/structure/sign/painting/library{ - pixel_x = -32 +/obj/machinery/door/puzzle/keycard/syndicate_chem, +/obj/structure/fans/tiny, +/turf/open/floor/iron/smooth_half{ + dir = 4 }, -/turf/open/floor/wood, -/area/centcom/tdome/administration) +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"fM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/trinary/filter{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) "fN" = ( -/obj/structure/closet/crate/bin, -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/smoke{ + pixel_y = 31 + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "fO" = ( -/obj/machinery/oven, -/turf/open/floor/iron/kitchen/herringbone, -/area/centcom/central_command_areas/fore) +/obj/machinery/door/poddoor/shutters/indestructible/preopen{ + id = "CC_firing_range_checkpoint" + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range) "fP" = ( -/obj/structure/sink/directional/west, -/obj/structure/mirror/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 +/obj/structure/table/wood/fancy, +/obj/item/storage/photo_album, +/obj/machinery/light/directional/south, +/turf/open/floor/carpet, +/area/centcom/wizard_station) +"fQ" = ( +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark{ + dir = 1 }, -/turf/open/floor/iron/white, -/area/centcom/central_command_areas/admin) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) "fR" = ( /obj/item/food/egg/rainbow{ desc = "I bet you think you're pretty clever... well you are."; @@ -1281,11 +2029,24 @@ }, /turf/open/space/basic, /area/space) +"fS" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) "fT" = ( /obj/structure/lattice, /obj/structure/window/reinforced/spawner/directional/north, /turf/open/space/basic, /area/space/nearstation) +"fU" = ( +/obj/machinery/modular_computer/console/preset/id/centcom, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/admin) "fV" = ( /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) @@ -1299,20 +2060,36 @@ "fX" = ( /turf/closed/indestructible/start_area, /area/misc/start) +"fY" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "fZ" = ( /obj/effect/landmark/ctf, /turf/open/space/basic, /area/space) "ga" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/flora/bush/pointy/style_random, -/obj/machinery/light/directional/south, -/turf/open/floor/grass, -/area/centcom/tdome/administration) +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"gb" = ( +/obj/machinery/door/airlock{ + icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; + name = "Cockpit" + }, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"gc" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/vending/wardrobe/bar_wardrobe, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) "gd" = ( /obj/machinery/door/airlock/highsecurity, /obj/effect/turf_decal/tile/neutral/full, @@ -1327,26 +2104,22 @@ /obj/machinery/door/airlock/maintenance_hatch, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/evacuation/ship) +"gf" = ( +/obj/structure/table/wood, +/obj/machinery/computer/records/security/laptop, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "gg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/filled/warning{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 8 - }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/centcom/central_command_areas/prison) +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) "gh" = ( -/obj/machinery/door/airlock/centcom{ - name = "Thunderdome Administration" +/obj/structure/sign/poster/contraband/revolver{ + pixel_y = -32 }, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "gi" = ( /obj/docking_port/stationary{ dir = 4; @@ -1371,46 +2144,92 @@ /obj/effect/decal/cleanable/wrapping, /turf/open/floor/grass, /area/centcom/central_command_areas/evacuation/ship) +"gk" = ( +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) "gl" = ( -/obj/structure/filingcabinet/security, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/area/centcom/central_command_areas/medical) "gm" = ( -/obj/structure/table/wood, -/obj/item/storage/dice, -/turf/open/floor/iron/grimy, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/closet/syndicate/personal, +/obj/machinery/camera/autoname/directional/west{ + network = list("nukie") + }, +/obj/item/stack/spacecash/c20, +/obj/effect/turf_decal/tile/red/full, +/turf/open/floor/iron/dark/textured_half, +/area/centcom/syndicate_mothership/control) +"go" = ( +/obj/structure/closet, +/turf/open/floor/circuit/telecomms, /area/centcom/central_command_areas/admin) -"gn" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen/fourcolor, -/obj/machinery/light/directional/south, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) "gp" = ( -/obj/structure/table/wood, -/obj/item/storage/box/drinkingglasses, -/obj/item/reagent_containers/cup/glass/bottle/whiskey{ - pixel_y = 5 +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 }, -/obj/machinery/light/directional/south, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"gq" = ( +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/obj/structure/railing, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"gr" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/chair/stool/bar/directional/north, /turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/area/centcom/central_command_areas/kitchen) "gs" = ( -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/structure/railing/wood, +/obj/structure/table/reinforced, +/obj/item/toy/sword, +/obj/item/toy/sword, +/obj/item/toy/sword, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/obj/item/clothing/mask/animal/pig{ + pixel_x = -8 + }, +/obj/item/clothing/mask/animal/small/bear{ + pixel_y = 8; + pixel_x = 9 + }, +/obj/item/clothing/mask/animal/horsehead{ + pixel_y = 7; + pixel_x = -7 + }, +/obj/item/clothing/mask/animal/cowmask{ + pixel_y = -5; + pixel_x = 9 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "gt" = ( /obj/effect/landmark/mafia_game_area, /turf/open/space/basic, @@ -1418,118 +2237,186 @@ "gu" = ( /turf/closed/indestructible/splashscreen, /area/misc/start) -"gw" = ( -/obj/structure/table/reinforced, -/obj/item/grenade/c4{ - pixel_x = 6 +"gv" = ( +/obj/structure/chair/sofa/left{ + dir = 8 }, -/obj/item/grenade/c4{ - pixel_x = -4 +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"gw" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 }, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/central_command_areas/armory) +/obj/structure/table/optable, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/mineral/titanium/tiled/blue, +/area/centcom/syndicate_mothership/control) "gx" = ( -/obj/effect/turf_decal/tile/red/opposingcorners, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ +/obj/structure/chair/sofa/corp/left{ dir = 1 }, -/obj/structure/chair/stool/bar/directional{ - dir = 4 +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/turf/open/floor/iron, +/turf/open/floor/wood/large, /area/centcom/tdome/observation) "gy" = ( -/obj/machinery/shower/directional/east, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark{ dir = 1 }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/machinery/vending/wardrobe/gene_wardrobe, +/turf/open/floor/iron/dark/side, +/area/centcom/central_command_areas/hall) "gz" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/directions/medical, -/turf/open/floor/plating, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/siding/blue/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/medical) "gA" = ( -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 3 +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 }, -/obj/item/storage/secure/briefcase, -/obj/structure/table/wood, -/obj/structure/noticeboard/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/structure/flora/rock/pile/style_random, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"gB" = ( +/obj/structure/table/reinforced/plastitaniumglass{ + name = "Andrea's Desk" + }, +/obj/machinery/computer/security/wooden_tv, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) "gC" = ( -/obj/machinery/door/window/brigdoor{ - base_state = "rightsecure"; - name = "CentCom Stand" +/obj/effect/turf_decal/weather/snow/corner{ + dir = 9 }, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/turf/open/misc/ice/icemoon, +/area/centcom/syndicate_mothership/control) "gD" = ( -/obj/structure/bookcase/random, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/structure/table/wood, +/obj/item/mod/control/pre_equipped/chrono{ + desc = "It smells freshly laundered." + }, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/carpet/green, /area/centcom/central_command_areas/admin) "gE" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/machinery/light/floor/has_bulb, +/obj/structure/flora/tree/jungle/style_3, +/turf/open/floor/grass, +/area/centcom/central_command_areas/admin_hangout) "gF" = ( /obj/structure/filingcabinet/medical, /obj/machinery/status_display/ai/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) -"gI" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +"gG" = ( +/obj/structure/fake_stairs/wood/directional/south, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"gH" = ( +/obj/item/stack/cannonball, +/turf/open/misc/grass, /area/centcom/central_command_areas/admin) +"gJ" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"gK" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/glass/modglass/small{ + pixel_y = 19; + pixel_x = -7 + }, +/obj/item/reagent_containers/cup/glass/modglass{ + pixel_y = 7; + pixel_x = 9 + }, +/obj/item/reagent_containers/cup/glass/modglass/large{ + pixel_x = 1; + pixel_y = 17 + }, +/obj/item/reagent_containers/cup/glass/modglass/small{ + pixel_y = 11; + pixel_x = -5 + }, +/obj/item/reagent_containers/cup/glass/modglass{ + pixel_y = 18; + pixel_x = 10 + }, +/obj/item/reagent_containers/cup/glass/modglass/small{ + pixel_y = 9; + pixel_x = 1 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/borbop) +"gL" = ( +/turf/closed/indestructible/fakeglass, +/area/centcom/central_command_areas/botany) +"gM" = ( +/obj/effect/baseturf_helper/asteroid/snow, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"gN" = ( +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" + }, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "gO" = ( /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/briefing) +"gP" = ( +/obj/effect/baseturf_helper/asteroid/snow, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"gQ" = ( +/obj/structure/chair/comfy/carp{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "gR" = ( -/obj/item/wrench, -/obj/item/restraints/handcuffs, -/obj/item/assembly/flash/handheld, -/obj/structure/table/wood, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/light/floor/has_bulb, +/obj/structure/mannequin, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/area/centcom/central_command_areas/hall) "gS" = ( /obj/structure/sign/warning/secure_area, /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/ferry) "gT" = ( -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/structure/fake_stairs/wood/directional/west, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "gU" = ( -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/floor/plating/icemoon, +/area/centcom/syndicate_mothership/control) "gV" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/trimline/dark_red/filled/line, -/obj/effect/turf_decal/trimline/dark_red/line{ - dir = 1 - }, -/turf/open/floor/iron/tgmcemblem{ - dir = 6 - }, -/area/centcom/central_command_areas/prison) +/turf/closed/wall/mineral/diamond, +/area/centcom/syndicate_mothership/control) +"gW" = ( +/obj/structure/table/rolling, +/obj/item/reagent_containers/cup/glass/bottle/juice/tomatojuice, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "gX" = ( /obj/structure/table/reinforced, /obj/item/storage/lockbox/loyalty, @@ -1538,26 +2425,49 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) -"hb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 6 +"gY" = ( +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/evacuation) +"gZ" = ( +/obj/structure/hedge, +/obj/structure/railing/wood, +/obj/structure/railing/wood{ + dir = 8 }, -/obj/effect/turf_decal/trimline/dark_red/corner{ +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"ha" = ( +/obj/structure/railing/wood{ dir = 1 }, -/turf/open/floor/iron/smooth_corner{ +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"hb" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"hc" = ( +/obj/structure/railing/wood{ dir = 1 }, -/area/centcom/central_command_areas/prison) +/obj/structure/railing/wood{ + dir = 8 + }, +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) "hd" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen/fourcolor, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "he" = ( /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 4 @@ -1565,62 +2475,62 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) "hf" = ( -/obj/machinery/door/airlock/centcom{ - name = "Thunderdome Backstage" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/flora/rock/icy/style_random{ + pixel_x = -7 }, -/obj/effect/mapping_helpers/airlock/access/any/admin/bar, -/obj/effect/mapping_helpers/airlock/access/any/service/bar, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "hg" = ( -/obj/structure/table/wood/fancy/red, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "cafe_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/effect/spawner/random/food_or_drink/refreshing_beverage, -/turf/open/floor/iron/kitchen/herringbone, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/trimline/green/line{ + dir = 9 + }, +/obj/machinery/vending/hydronutrients, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"hh" = ( +/obj/structure/railing/wood, +/obj/structure/railing/wood{ + dir = 1 + }, +/obj/machinery/coffeemaker/impressa, +/obj/structure/table/reinforced, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin_hangout) "hi" = ( -/obj/item/storage/medkit/regular, -/obj/structure/table, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood{ dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) +/obj/structure/railing/wood, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) +"hj" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/indestructible/hotelwood, +/area/centcom/central_command_areas/admin) "hk" = ( -/obj/machinery/suit_storage_unit/industrial, -/obj/item/mod/control/pre_equipped/responsory/medic, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/effect/decal/remains/xeno/larva, +/turf/open/floor/grass, +/area/centcom/wizard_station) "hm" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/pale/style_random, -/obj/machinery/light/directional/north, -/turf/open/misc/asteroid, -/area/centcom/central_command_areas/evacuation) -"hn" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/siding/blue, +/obj/effect/turf_decal/siding/blue/corner{ dir = 1 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/structure/railing/wood, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) +"hn" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/structure/chair/sofa/bench/right, +/obj/structure/sign/poster/contraband/donut_corp{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/stone, +/area/centcom/syndicate_mothership/control) "ho" = ( /obj/structure/table/wood, /obj/item/folder/red, @@ -1630,153 +2540,302 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"hp" = ( +/obj/machinery/ntnet_relay{ + name = "Ook's Modem"; + is_operational = 0; + desc = "A very complex router and transmitter capable of connecting electronic devices together. Did Ook somehow steal this hunk of junk from NT or something??" + }, +/turf/open/misc/grass, +/area/centcom/central_command_areas/admin) "hq" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/flora/bush/pointy/style_random, -/obj/structure/railing{ - dir = 4 +/obj/item/cardboard_cutout, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/centcom/wizard_station) +"hr" = ( +/obj/structure/table/wood/fancy/green{ + name = "Head Intern Desk" }, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) +/obj/item/paper_bin, +/obj/item/pen/fourcolor, +/obj/structure/window/plasma/spawner/directional/east, +/turf/open/indestructible/hotelwood, +/area/centcom/central_command_areas/admin) "ht" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +/obj/structure/table/reinforced, +/obj/machinery/camera/autoname/directional/east{ + network = list("nukie") }, -/obj/effect/turf_decal/tile/green{ - dir = 8 +/obj/structure/noticeboard/directional/east, +/obj/item/folder/red, +/obj/item/stack/spacecash/c20{ + pixel_y = 9 }, +/obj/item/assembly/flash/handheld, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/tdome/observation) -"hv" = ( -/obj/structure/table/reinforced, -/obj/machinery/microwave{ - desc = "Cooks and boils stuff, somehow."; - pixel_x = -3; - pixel_y = 5 +/area/centcom/syndicate_mothership/control) +"hw" = ( +/obj/structure/chair/office{ + dir = 4 }, -/obj/machinery/barsign/all_access/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/admin) "hx" = ( /obj/machinery/photocopier, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/briefing) +"hy" = ( +/obj/structure/table/wood, +/obj/item/phone{ + desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/mask/cigarette/cigar/cohiba{ + pixel_x = 6 + }, +/obj/item/clothing/mask/cigarette/cigar/havana{ + pixel_x = 2 + }, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = 4.5 + }, +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/ferry) "hz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) -"hE" = ( -/obj/structure/chair/comfy/black, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 +"hA" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/misc/grass, +/area/centcom/central_command_areas/admin) +"hB" = ( +/obj/structure/fans/tiny/invisible, +/turf/open/floor/iron, +/area/centcom/central_command_areas/admin) +"hC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/grimy, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"hD" = ( +/turf/open/floor/carpet/royalblue, /area/centcom/central_command_areas/admin) +"hE" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/kirbyplants{ + icon_state = "plant-22"; + pixel_x = -4 + }, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "hG" = ( -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/ferny/style_random, -/turf/open/floor/iron{ - dir = 6; - icon_state = "asteroid8"; - name = "sand" +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/rebels_unite{ + pixel_y = -32 }, -/area/centcom/central_command_areas/fore) +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "hH" = ( /turf/open/floor/holofloor/hyperspace, /area/space) +"hI" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "hJ" = ( -/obj/machinery/computer/security/telescreen, -/obj/structure/table/reinforced, -/obj/machinery/light/directional/north, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"hN" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/public/glass{ - name = "ThunderDome" +/obj/machinery/door/poddoor/incinerator_ordmix{ + id = "syn_ordmix_vent" }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"hP" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"hS" = ( -/obj/machinery/barsign/all_access/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/restaurant_portal/bar, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"hT" = ( -/obj/machinery/vending/boozeomat{ - pixel_x = 32 +/turf/open/floor/engine/vacuum, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"hK" = ( +/obj/structure/table/wood/fancy/green{ + name = "Head Intern Desk" }, -/turf/open/floor/wood, +/obj/item/clipboard, +/turf/open/indestructible/hotelwood, /area/centcom/central_command_areas/admin) -"hW" = ( -/obj/structure/chair/office, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/prison) -"hY" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/handcuffs, -/obj/item/crowbar/red, -/obj/item/crowbar/power, -/obj/item/storage/belt/security/full, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) -"ia" = ( -/obj/structure/chair/comfy/brown{ +"hL" = ( +/obj/structure/flora/tree/jungle/style_3, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/grass, +/area/centcom/central_command_areas/ghost_spawn) +"hM" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"hO" = ( +/obj/structure/railing/corner, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"hP" = ( +/obj/structure/chair/office/light{ dir = 8 }, -/turf/open/floor/iron/grimy, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"hQ" = ( +/obj/structure/railing/wood{ + dir = 1 + }, +/obj/structure/railing/wood{ + dir = 4 + }, +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"hR" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/pizzabox/infinite, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/mineral/titanium/white, /area/centcom/central_command_areas/admin) +"hS" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/east, +/obj/machinery/hydroponics/constructable, +/turf/open/floor/mineral/titanium/tiled, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"hT" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window"; + opacity = 1 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/end, +/turf/open/floor/mineral/titanium/tiled, +/area/centcom/syndicate_mothership/control) +"hV" = ( +/obj/effect/landmark/navigate_destination/centcom/boxing, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/hall) +"hX" = ( +/obj/machinery/light/floor/has_bulb, +/obj/item/kirbyplants{ + icon_state = "plant-22"; + pixel_x = -4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/borbop) +"hZ" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 8 + }, +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) +"ia" = ( +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "ib" = ( -/obj/structure/bookcase/random, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) +/obj/machinery/door/poddoor/shuttledock{ + checkdir = 1; + name = "Syndicate Blast Door"; + turftype = /turf/open/misc/asteroid/snow + }, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) +"ic" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"id" = ( +/obj/structure/table/wood, +/obj/item/book/granter/sign_language, +/turf/open/floor/carpet/purple, +/area/centcom/central_command_areas/admin) "ie" = ( -/obj/item/soap/nanotrasen, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/structure/table/wood/fancy/royalblue, +/obj/effect/spawner/random/decoration/statue{ + spawn_loot_chance = 50 + }, +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "if" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/statue/bananium/clown, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "pizzatime"; - name = "Pizza Time Shutters"; - desc = "People who take escape pods over the shuttle don't get to visit centcom's pizza tower..." - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/centcom/central_command_areas/fore) +/obj/structure/flora/grass/both/style_random, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "ig" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" +/obj/structure/chair/office{ + dir = 4 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin) "ih" = ( -/obj/structure/bookcase/random, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/smooth_half, +/area/centcom/syndicate_mothership/control) +"ii" = ( +/obj/effect/turf_decal/siding/green{ + dir = 8 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/botany) +"ij" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supply) "ik" = ( /turf/open/misc/ashplanet/wateryrock{ initial_gas_mix = "o2=22;n2=82;TEMP=293.15"; @@ -1784,125 +2843,115 @@ }, /area/awaymission/errorroom) "il" = ( -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/prison) -"im" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/effect/turf_decal/siding/dark{ + dir = 10 }, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 5 +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 }, -/obj/effect/turf_decal/trimline/dark_red/corner{ - dir = 8 +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) +"in" = ( +/obj/item/kirbyplants{ + icon_state = "plant-22"; + pixel_x = -4 }, -/turf/open/floor/iron/smooth_corner{ - dir = 8 +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/area/centcom/central_command_areas/prison) -"in" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/control) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) "io" = ( -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) "ip" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/siding/wood{ dir = 9 }, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 9 +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/evacuation) +"iq" = ( +/obj/machinery/computer/records/security/laptop{ + dir = 4 }, -/obj/effect/turf_decal/trimline/dark_red/corner, -/turf/open/floor/iron/smooth_corner, -/area/centcom/central_command_areas/prison) +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/circuit/telecomms, +/area/centcom/central_command_areas/admin) "ir" = ( -/turf/closed/indestructible/fakeglass, -/area/centcom/central_command_areas/prison/cells) +/obj/machinery/shower/directional/south, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/freezer, +/area/centcom/syndicate_mothership/control) "is" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/closet/crate/bin{ + pixel_x = 1; + pixel_y = 20; + density = 0 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin) "it" = ( -/obj/structure/table/reinforced, -/obj/item/crowbar/red, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/clothing/mask/gas, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/recharger, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/obj/structure/railing/wood, +/obj/structure/flora/bush/grassy/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) "iu" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/centcom/central_command_areas/control) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) "iv" = ( -/obj/structure/table/reinforced, -/obj/item/radio{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/radio{ - pixel_x = -5; - pixel_y = 5 +/obj/machinery/door/airlock/centcom{ + dir = 4 }, -/obj/item/radio, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/recharger, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range) "iw" = ( -/obj/structure/table/reinforced, -/obj/item/storage/lockbox/loyalty, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/obj/structure/table/glass/plasmaglass, +/obj/item/plunger{ + pixel_x = -9; + pixel_y = 15 + }, +/obj/item/construction/plumbing, +/obj/item/reagent_containers/dropper{ + pixel_x = 5; + pixel_y = 14 + }, +/obj/structure/noticeboard/directional/west, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "ix" = ( -/obj/item/storage/box/emps{ - pixel_x = 3; - pixel_y = 3 +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/light/floor/has_bulb, +/obj/structure/sign/painting/library_secure{ + pixel_x = -32 }, -/obj/item/storage/box/flashbangs, -/obj/item/grenade/c4/x4, -/obj/item/grenade/c4/x4, -/obj/item/grenade/c4/x4, -/obj/structure/table/reinforced, -/obj/item/clothing/ears/earmuffs, -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/recharger, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) -"iy" = ( -/obj/structure/table/reinforced, -/obj/item/restraints/handcuffs/cable/zipties, -/obj/item/assembly/flash/handheld, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/recharger, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) "iz" = ( -/obj/structure/table/reinforced, -/obj/item/storage/fancy/donut_box, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/status_display/evac/directional/north, +/obj/machinery/washing_machine, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/area/centcom/syndicate_mothership/control) +"iA" = ( +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/admin_hangout) "iB" = ( -/turf/closed/indestructible/fakedoor{ - name = "CentCom Cell" - }, -/area/centcom/central_command_areas/prison/cells) +/obj/machinery/power/shuttle_engine/propulsion, +/turf/open/floor/plating/airless, +/area/centcom/wizard_station) "iC" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks/beer{ @@ -1922,45 +2971,43 @@ /turf/open/floor/wood/tile, /area/centcom/central_command_areas/evacuation/ship) "iD" = ( -/obj/structure/closet/secure_closet/security, -/obj/item/storage/belt/security/full, -/obj/item/gun/ballistic/automatic/wt550, -/obj/item/clothing/head/helmet/swat/nanotrasen, -/obj/item/crowbar/red, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/effect/spawner/random/contraband/armory, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin) "iE" = ( -/obj/structure/closet/secure_closet/security, -/obj/item/storage/belt/security/full, -/obj/item/gun/ballistic/automatic/wt550, -/obj/item/clothing/head/helmet/swat/nanotrasen, -/obj/item/crowbar/red, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/table/wood, +/obj/item/pizzabox, +/obj/item/storage/crayons{ + pixel_x = -2; + pixel_y = 5 }, -/obj/effect/spawner/random/contraband/armory, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/obj/item/storage/crayons{ + pixel_x = 2; + pixel_y = 5 + }, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) "iF" = ( /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/supply) "iG" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wideplating/dark{ +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"iH" = ( +/obj/structure/railing/wood{ dir = 4 }, -/turf/open/floor/wood, -/area/centcom/central_command_areas/fore) -"iH" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/prison) +/obj/structure/hedge, +/obj/effect/turf_decal/tile/orange/diagonal_edge, +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "iI" = ( /obj/structure/flora/tree/palm{ icon_state = "palm2" @@ -1969,43 +3016,23 @@ /turf/open/floor/grass, /area/centcom/central_command_areas/evacuation/ship) "iJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 9 +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 4 }, -/obj/effect/turf_decal/trimline/dark_red/corner, -/turf/open/floor/iron/smooth_corner, -/area/centcom/central_command_areas/prison) +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "iK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/obj/structure/flora/tree/dead/style_random, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "iL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "iM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/dark_red/corner{ - dir = 8 - }, -/turf/open/floor/iron/smooth_corner{ - dir = 8 - }, -/area/centcom/central_command_areas/prison) +/obj/machinery/door/airlock/centcom, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/medical) "iN" = ( /obj/machinery/status_display/supply, /turf/closed/indestructible/riveted, @@ -2015,20 +3042,16 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "iP" = ( -/obj/effect/turf_decal/loading_area{ - dir = 4 +/obj/structure/closet/cardboard, +/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6{ + pixel_x = 32 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) "iQ" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/effect/spawner/random/engineering, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/structure/punching_bag, +/turf/open/floor/carpet, +/area/centcom/wizard_station) "iR" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 @@ -2036,52 +3059,39 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "iS" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/mech_bay_recharge_port{ - dir = 2 - }, -/turf/open/floor/plating, -/area/centcom/central_command_areas/supply) -"iT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) -"iU" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/structure/railing{ dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "iV" = ( -/obj/structure/closet/secure_closet/security, -/obj/item/storage/belt/security/full, -/obj/item/gun/ballistic/automatic/wt550, -/obj/item/clothing/head/helmet/swat/nanotrasen, -/obj/item/crowbar/red, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/spawner/random/contraband/armory, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership) "iW" = ( -/obj/structure/closet/secure_closet/security, -/obj/item/storage/belt/security/full, -/obj/item/gun/ballistic/automatic/wt550, -/obj/item/clothing/head/helmet/swat/nanotrasen, -/obj/item/crowbar/red, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/siding/dark{ dir = 10 }, -/obj/effect/spawner/random/contraband/armory, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 + }, +/obj/machinery/vending/wardrobe/medi_wardrobe, +/turf/open/floor/iron/dark/side{ + dir = 10 + }, +/area/centcom/central_command_areas/hall) "iX" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/centcom/central_command_areas/supply) +"iY" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/structure/chair/sofa/bench/right{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "iZ" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 @@ -2089,18 +3099,11 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "ja" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/airlock/security/glass{ - name = "Central Command Brig" - }, -/obj/effect/mapping_helpers/airlock/access/any/security/entrance, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/obj/effect/mapping_helpers/airlock/access/any/service/lawyer, -/turf/open/floor/iron, -/area/centcom/central_command_areas/courtroom) +/obj/machinery/light/directional/east, +/obj/structure/railing/wood, +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) "jb" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external, @@ -2116,84 +3119,39 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) -"jd" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "XCCQMLoad2"; - pixel_x = 6 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) "je" = ( -/obj/machinery/button/door/indestructible{ - id = "thunderdome"; - name = "Main Blast Doors Control" - }, -/obj/structure/table/reinforced, -/obj/machinery/light/directional/south, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) -"jf" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/obj/effect/spawner/random/engineering/canister, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) -"jg" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/west, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"jf" = ( +/obj/machinery/light/floor/has_bulb, +/obj/machinery/hydroponics/constructable/helper, +/obj/effect/turf_decal/trimline/green/line{ dir = 8 }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 4 - }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/centcom/central_command_areas/prison) +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"jg" = ( +/obj/machinery/vending/wardrobe/engi_wardrobe, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "jh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/computer/camera_advanced{ + dir = 4 }, -/obj/machinery/vending/liberationstation, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/obj/structure/fans/tiny/invisible, +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/admin) "ji" = ( -/obj/machinery/vending/security, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/structure/fireaxecabinet/directional/south, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/obj/machinery/computer/camera_advanced, +/turf/open/floor/wood, +/area/centcom/wizard_station) "jj" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 8 - }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/centcom/central_command_areas/prison) +/obj/structure/flora/tree/pine/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "jk" = ( /obj/machinery/door/poddoor{ id = "XCCQMLoaddoor2"; @@ -2238,11 +3196,10 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "jo" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/item/soap/homemade, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/centcom/wizard_station) "jp" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/food_or_drink/pizzaparty, @@ -2254,12 +3211,9 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "jq" = ( -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/obj/structure/table, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/item/food/meat/slab/corgi, +/turf/open/floor/grass, +/area/centcom/wizard_station) "jr" = ( /obj/machinery/door/airlock/external/ruin{ name = "Supply Shuttle" @@ -2283,131 +3237,97 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "ju" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/filingcabinet/filingcabinet, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/structure/table/wood/poker, +/obj/item/toy/figure/wizard, +/turf/open/floor/carpet, +/area/centcom/wizard_station) "jv" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_red/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_red/line{ +/obj/effect/turf_decal/trimline/green/line{ dir = 5 }, -/turf/open/floor/iron/smooth_corner{ - dir = 8 - }, -/area/centcom/central_command_areas/prison) +/obj/machinery/vending/hydroseeds, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) "jw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/flora/rock/pile/style_random, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "jx" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, +/obj/effect/landmark/start/nukeop_leader, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/area/centcom/syndicate_mothership/control) "jy" = ( -/obj/machinery/button/door/indestructible{ - id = "XCCQMLoaddoor"; - layer = 4; - name = "Loading Doors"; - pixel_x = -27; - pixel_y = -5 - }, -/obj/machinery/button/door/indestructible{ - id = "XCCQMLoaddoor2"; - layer = 4; - name = "Loading Doors"; - pixel_x = -27; - pixel_y = 5 - }, -/obj/machinery/computer/cargo{ - dir = 4 +/obj/machinery/door/airlock/hatch{ + name = "Tool Closet" }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/mineral/titanium/yellow, +/area/centcom/syndicate_mothership/control) "jz" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 8 +/obj/machinery/door/airlock{ + icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; + name = "Study" }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 4 - }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/centcom/central_command_areas/prison) +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "jA" = ( /obj/structure/fans/tiny/invisible, /turf/open/floor/holofloor/hyperspace, /area/space) "jB" = ( -/obj/structure/noticeboard/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 8 - }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/centcom/central_command_areas/prison) +/obj/structure/sign/plaques/kiddie/badger{ + desc = "A list of names is engraved on this plaque. 'May their heroic sacrifices inspire your bravery' is carved at the bottom."; + name = "\improper Operative Remembrance Plaque"; + pixel_y = 27 + }, +/obj/structure/bed/dogbed/cayenne, +/mob/living/basic/carp/pet/cayenne, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/iron/smooth, +/area/centcom/syndicate_mothership/control) "jC" = ( /obj/structure/chair/comfy/shuttle/tactical{ dir = 1 }, /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) -"jD" = ( -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) "jE" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/structure/railing/wood{ dir = 1 }, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) "jF" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/trimline/dark_red/filled/corner, -/obj/effect/turf_decal/trimline/dark_red/line{ - dir = 9 +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/door/poddoor/shutters/indestructible{ + name = "Subterrainian Cargo Lift" }, -/turf/open/floor/iron/smooth_corner, -/area/centcom/central_command_areas/prison) +/turf/open/floor/iron/dark/textured_half, +/area/centcom/syndicate_mothership/control) "jG" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) -"jH" = ( -/obj/effect/turf_decal/stripes/corner{ +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/obj/machinery/computer/pandemic, +/obj/structure/noticeboard/directional/north, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"jH" = ( +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership) "jI" = ( /obj/machinery/door/poddoor{ id = "XCCQMLoaddoor"; @@ -2453,103 +3373,183 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) -"jM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) "jN" = ( -/obj/structure/closet/wardrobe/cargotech, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/structure/flora/tree/dead/style_random, +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "jO" = ( -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supplypod) +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp, +/turf/open/floor/carpet, +/area/centcom/syndicate_mothership/control) "jP" = ( -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "XCCQMLoad"; - pixel_x = 6 +/obj/structure/hedge, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/admin) +"jQ" = ( +/obj/effect/turf_decal/siding/green{ + dir = 5 }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) +"jR" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 9 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) -"jQ" = ( -/obj/structure/closet/secure_closet/quartermaster, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/effect/turf_decal/siding/dark/corner, +/obj/structure/sign/painting/library_secure{ + pixel_x = -32 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"jS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "jT" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/directional/north, -/obj/machinery/computer, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) -"jU" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/computer, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/obj/structure/sink/directional/west, +/obj/structure/mirror/directional/east, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "jV" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 4 +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 }, -/obj/effect/turf_decal/trimline/dark_red/warning{ +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) +"jW" = ( +/obj/machinery/computer/records/medical, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) +"jX" = ( +/obj/structure/table/wood/fancy/black, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/borbop) +"jZ" = ( +/obj/structure/railing/wood, +/obj/structure/railing/wood{ dir = 8 }, -/turf/open/floor/iron/smooth_half{ +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"ka" = ( +/turf/open/floor/stone, +/area/centcom/central_command_areas/admin_hangout) +"kb" = ( +/obj/effect/turf_decal/siding/green/corner{ dir = 1 }, -/area/centcom/central_command_areas/prison) +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) "kc" = ( -/obj/machinery/hydroponics/constructable/helper, -/turf/open/floor/carpet/neon/simple/black/nodots, -/area/centcom/tdome/observation) +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/smooth_half, +/area/centcom/syndicate_mothership/control) "kd" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 9 + }, +/obj/structure/sign/poster/contraband/gorlex_recruitment{ + pixel_y = 32 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"ke" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 8 + }, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) +"kf" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "kg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/structure/closet/crate/secure/freezer/pizza, -/obj/item/grenade/spawnergrenade/clown, -/obj/item/grenade/spawnergrenade/clown, -/obj/item/grenade/spawnergrenade/clown, -/obj/item/grenade/spawnergrenade/clown, -/obj/item/grenade/spawnergrenade/clown, -/obj/item/grenade/spawnergrenade/clown, -/obj/item/grenade/spawnergrenade/clown, -/obj/item/grenade/spawnergrenade/clown, -/obj/item/grenade/spawnergrenade/clown, -/obj/item/grenade/spawnergrenade/clown, -/obj/item/grenade/spawnergrenade/clown, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/trimline/green/corner, +/obj/effect/turf_decal/trimline/green{ + pixel_y = 16; + pixel_x = -16 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) "kh" = ( -/obj/machinery/telecomms/allinone/nuclear, -/turf/open/indestructible/hierophant, +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/trimline/green/line{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"ki" = ( +/obj/structure/table/wood/fancy/purple, +/obj/machinery/computer/records/security/laptop, +/obj/item/spellbook_charge/debug, +/turf/open/floor/plating/abductor, /area/centcom/central_command_areas/admin) -"kj" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ +"kk" = ( +/obj/effect/turf_decal/siding/wood/corner{ dir = 8 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) -"kp" = ( -/turf/open/floor/circuit/green, -/area/centcom/central_command_areas/supply) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) +"kl" = ( +/obj/structure/chair/sofa/right/brown{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/admin) +"km" = ( +/turf/closed/wall/mineral/wood, +/area/centcom/syndicate_mothership/control) +"kn" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/microwave, +/turf/open/floor/carpet/executive, +/area/centcom/central_command_areas/admin) +"ko" = ( +/obj/item/storage/toolbox/fishing, +/turf/open/floor/carpet/neon/simple/cyan, +/area/centcom/central_command_areas/admin) +"kq" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/glass/bottle/lizardwine{ + pixel_x = 11; + pixel_y = 12 + }, +/obj/item/reagent_containers/cup/glass/bottle/kahlua{ + pixel_y = 16; + pixel_x = 1 + }, +/obj/item/reagent_containers/cup/glass/waterbottle/tea/mushroom{ + pixel_y = 14; + pixel_x = -7 + }, +/obj/item/reagent_containers/cup/glass/waterbottle/tea/strawberry{ + pixel_x = 10; + pixel_y = 8 + }, +/obj/item/reagent_containers/cup/glass/waterbottle/tea/nip{ + pixel_y = 8; + pixel_x = 1 + }, +/obj/item/reagent_containers/cup/glass/waterbottle/tea/astra{ + pixel_y = 8; + pixel_x = -7 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/borbop) "kr" = ( /obj/effect/turf_decal/tile/neutral/full, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -2558,247 +3558,230 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) -"kt" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/ghost_spawn) -"kx" = ( -/obj/structure/filingcabinet/medical, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, +"ks" = ( +/obj/effect/spawner/random/trash/garbage, +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/structure/fans/tiny/invisible, +/obj/machinery/light/very_dim/directional, /turf/open/floor/iron, -/area/centcom/central_command_areas/prison) -"ky" = ( -/obj/structure/filingcabinet/security, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/area/centcom/central_command_areas/admin) +"ku" = ( +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"kv" = ( +/obj/machinery/door/airlock/centcom{ + name = "Waffles' Den" }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) -"kz" = ( -/obj/item/clipboard, -/obj/item/folder/red, -/obj/item/stamp/denied{ - pixel_x = 3; - pixel_y = 3 +/obj/effect/mapping_helpers/airlock/access/any/admin/captain, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) +"kw" = ( +/obj/effect/turf_decal/siding/green{ + dir = 10 }, -/obj/item/stamp, -/obj/structure/table/wood, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/botany) +"kz" = ( +/obj/machinery/door/airlock/maintenance/external{ + name = "Bunk Room 1" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/catwalk_floor/iron, +/area/centcom/syndicate_mothership/control) "kA" = ( -/obj/structure/chair/comfy/brown, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) +/turf/closed/indestructible/iron, +/area/centcom/syndicate_mothership/control) "kB" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/obj/machinery/vending/boozeomat, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/control) "kC" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/item/kirbyplants{ - icon_state = "plant-21" +/obj/structure/railing/wood{ + dir = 1 }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) "kD" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) +/obj/structure/table/rolling, +/obj/item/reagent_containers/condiment/soymilk, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "kE" = ( -/obj/structure/chair, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) -"kF" = ( /obj/structure/table/wood, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/item/paper_bin, -/obj/item/pen/fourcolor, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) -"kG" = ( -/obj/structure/chair/comfy/brown{ - color = "#596479" - }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) +/obj/item/pai_card, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) +"kF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/iron/smooth, +/area/centcom/syndicate_mothership/control) "kH" = ( -/obj/structure/table/wood, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/item/clipboard, -/obj/item/folder/blue, -/obj/item/stamp/law, -/obj/item/banhammer{ - force = -10; - name = "Hammer of Justice"; - desc = "Divine Judgement." - }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) "kI" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) -"kK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/dark_red/line, -/turf/open/floor/iron/tgmcemblem{ - dir = 1 - }, -/area/centcom/central_command_areas/prison) -"kN" = ( -/obj/structure/table/reinforced/rglass, -/obj/item/paper/pamphlet/centcom/visitor_info, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"kR" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/admin/storage) -"kS" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/siding/dark{ dir = 8 }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 8 +/obj/effect/turf_decal/siding/dark{ + dir = 4 }, -/obj/effect/turf_decal/trimline/dark_red/warning{ +/turf/open/floor/iron/dark/side{ dir = 4 }, -/turf/open/floor/iron/smooth_half{ +/area/centcom/central_command_areas/hall) +"kK" = ( +/turf/closed/indestructible/fakedoor{ + name = "BUNKER 4337" + }, +/area/centcom/syndicate_mothership) +"kL" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/end{ dir = 1 }, -/area/centcom/central_command_areas/prison) -"kT" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/handcuffs, -/obj/item/crowbar/red, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/bodycontainer/morgue{ + dir = 2 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) -"kU" = ( +/turf/open/floor/mineral/titanium/tiled, +/area/centcom/syndicate_mothership/control) +"kM" = ( +/obj/structure/railing/wood, /obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/reagentgrinder, +/obj/effect/turf_decal/trimline/green/line, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"kN" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 10 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/medical) +"kO" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"kP" = ( +/obj/structure/closet/secure_closet/armory1, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range_checkpoint_control) +"kQ" = ( +/obj/structure/closet/secure_closet/armory3, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range_checkpoint_control) +"kS" = ( +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/hall) +"kT" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/closet/crate/freezer{ + name = "fruits and veggies freezer" + }, +/obj/item/food/grown/potato, +/obj/item/food/grown/potato, +/obj/item/food/grown/tomato, +/obj/item/food/grown/tomato, +/obj/item/food/grown/pineapple, +/obj/item/food/grown/pineapple, +/obj/item/food/grown/cherries, +/obj/item/food/grown/cherries, +/obj/item/food/grown/citrus/orange, +/obj/item/food/grown/citrus/orange, +/obj/item/food/grown/bell_pepper, +/obj/item/food/grown/bell_pepper, +/obj/item/food/grown/chili, +/obj/item/food/grown/chili, +/obj/item/food/grown/parsnip, +/obj/item/food/grown/parsnip, +/obj/item/food/grown/redbeet, +/obj/item/food/grown/redbeet, +/obj/item/food/grown/watermelon, +/obj/item/food/grown/watermelon, +/obj/item/food/grown/peas, +/obj/item/food/grown/peas, +/obj/item/food/grown/onion, +/obj/item/food/grown/onion, +/obj/item/food/grown/eggplant, +/obj/item/food/grown/eggplant, +/obj/item/food/grown/banana, +/obj/item/food/grown/banana, +/obj/item/food/grown/apple, +/obj/item/food/grown/apple, +/turf/open/floor/plastic, +/area/centcom/syndicate_mothership/expansion_fridgerummage) +"kU" = ( +/turf/closed/indestructible/opsglass, +/area/centcom/syndicate_mothership/expansion_bombthreat) "kV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ +/obj/item/food/meat/slab/xeno, +/turf/open/floor/grass, +/area/centcom/wizard_station) +"kW" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/table/wood/fancy/royalblack, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/kitchen) +"kX" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) +"kY" = ( +/obj/effect/turf_decal/siding/wideplating{ dir = 4 }, -/obj/effect/turf_decal/trimline/dark_red/warning{ +/obj/effect/turf_decal/siding/wideplating{ dir = 8 }, -/turf/open/floor/iron/smooth_half{ - dir = 1 +/obj/machinery/door/airlock/titanium{ + name = "Experiments Wing Decontamination" }, -/area/centcom/central_command_areas/prison) -"kX" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen/fourcolor, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) -"kY" = ( -/obj/structure/table/wood, -/obj/item/clipboard, -/obj/item/folder/blue, -/obj/item/stamp/law, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) -"kZ" = ( -/obj/effect/turf_decal/siding/blue/corner{ +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/smooth_half{ dir = 8 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/area/centcom/syndicate_mothership/control) +"kZ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/titanium, +/area/centcom/syndicate_mothership/control) "la" = ( -/obj/machinery/door/window/brigdoor{ - base_state = "rightsecure"; - name = "CentCom Stand"; - req_access = list("cent_captain") +/obj/effect/gun_check_blocker{ + dir = 4 }, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range) "lb" = ( -/obj/structure/table/wood, -/obj/machinery/door/window, -/obj/item/radio/intercom{ - desc = "Talk smack through this."; - syndie = 1 - }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) -"lc" = ( -/obj/structure/table/wood, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/item/gavelblock, -/obj/item/gavelhammer, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) -"ld" = ( -/obj/structure/table/wood, -/obj/item/radio/intercom{ - desc = "Talk smack through this."; - syndie = 1 - }, -/obj/machinery/door/window/brigdoor{ - base_state = "rightsecure"; - name = "CentCom Stand"; - req_access = list("captain") - }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) "le" = ( -/obj/structure/table/wood, -/obj/structure/window/reinforced/spawner/directional/east, -/obj/item/megaphone, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) -"lf" = ( -/obj/machinery/door/window/brigdoor{ - base_state = "rightsecure"; - name = "CentCom Stand"; - req_access = list("cent_captain") - }, -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) +/obj/effect/turf_decal/box, +/obj/structure/punching_bag, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "lg" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/chair/comfy/shuttle/tactical{ @@ -2806,93 +3789,182 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) -"ln" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +"lh" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/vending/cigarette, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"li" = ( +/obj/machinery/light/floor/has_bulb, +/obj/item/kirbyplants{ + icon_state = "plant-22"; + pixel_x = -4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/borbop) +"lj" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/centcom/syndicate_mothership/control) +"lk" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 4; + pixel_x = -4 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin_hangout) +"lm" = ( +/obj/structure/window/plasma/spawner/directional/north, +/obj/structure/window/plasma/spawner/directional/west, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) "lo" = ( /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "lp" = ( -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/obj/structure/table/reinforced, -/obj/effect/spawner/random/bureaucracy/stamp, -/obj/effect/spawner/random/bureaucracy/stamp, -/obj/effect/spawner/random/bureaucracy/stamp, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/structure/fake_stairs/wood/directional/east, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "lq" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "lr" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/door/airlock/bananium/glass{ - desc = "People who take escape pods over the shuttle don't get to visit centcom's pizza tower..."; - name = "Peppino Pizza" - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/centcom/central_command_areas/fore) -"ls" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/firing_range_checkpoint_control) "lt" = ( +/obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/railing{ dir = 6 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/turf/open/lava/plasma/ice_moon, +/area/centcom/syndicate_mothership/control) "lu" = ( -/obj/structure/table/reinforced, -/obj/item/wrench, -/obj/item/restraints/handcuffs, -/obj/item/assembly/flash/handheld, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) -"lv" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight/seclite, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/railing/wood{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) "lw" = ( -/obj/structure/chair/comfy/brown{ - buildstackamount = 0; - dir = 1 +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"lx" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window"; + opacity = 1 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 6 + }, +/obj/structure/table/reinforced/plasmarglass, +/obj/item/reagent_containers/cup/bottle/epinephrine, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = 6 + }, +/obj/item/reagent_containers/syringe{ + pixel_y = 15 + }, +/turf/open/floor/mineral/titanium/tiled/blue, +/area/centcom/syndicate_mothership/control) "ly" = ( -/obj/effect/turf_decal/stripes/line, +/obj/machinery/status_display/evac/directional/west, +/obj/machinery/light/directional/west, +/obj/structure/railing/wood{ + dir = 1 + }, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supplypod) -"lG" = ( -/obj/structure/table/wood/fancy/royalblue, -/obj/structure/window/spawner/directional/south, -/obj/machinery/door/window{ - dir = 8; - name = "Secure Art Exhibition"; - req_access = list("library") +/area/centcom/central_command_areas/evacuation) +"lz" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership) +"lA" = ( +/obj/structure/railing/wood, +/obj/structure/railing/wood{ + dir = 4 }, -/obj/structure/sign/painting/library_secure{ - pixel_x = 32 +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/ghost_spawn) +"lB" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/door/airlock/glass_large{ + name = "Disembarkents" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/smooth_half{ + dir = 4 + }, +/area/centcom/syndicate_mothership/control) +"lC" = ( +/obj/effect/turf_decal/siding/dark/corner, +/obj/effect/turf_decal/siding/dark{ + dir = 9 }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) +"lD" = ( +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/structure/table/wood/fancy/royalblue, /obj/effect/spawner/random/decoration/statue{ spawn_loot_chance = 50 }, -/turf/open/floor/carpet/royalblue, -/area/centcom/tdome/administration) +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) +"lE" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"lF" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin) +"lG" = ( +/obj/structure/showcase/machinery/rng, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"lH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"lI" = ( +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/borbop) "lJ" = ( /obj/machinery/door/airlock/centcom{ name = "Shuttle Control Office" @@ -2911,85 +3983,99 @@ /obj/effect/mapping_helpers/airlock/access/any/admin/general, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) -"lL" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/prison) "lM" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "pizzatime"; - name = "Pizza Time Shutters"; - desc = "People who take escape pods over the shuttle don't get to visit centcom's pizza tower..." - }, -/obj/structure/statue/bananium/clown, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/centcom/central_command_areas/fore) -"lN" = ( -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/ferny/style_random, -/turf/open/floor/iron{ - dir = 6; - icon_state = "asteroid8"; - name = "sand" - }, -/area/centcom/central_command_areas/control) -"lO" = ( -/obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/item/folder/red, -/obj/item/pen/red, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/toilet{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/turf/open/floor/iron/white, +/area/centcom/wizard_station) +"lN" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "lP" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/handcuffs, -/obj/item/crowbar/red, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) -"lR" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"lQ" = ( +/obj/machinery/computer/records/medical/laptop, +/obj/structure/table/wood, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/area/centcom/central_command_areas/admin) +"lR" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/landmark/start/nukeop, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) "lS" = ( /obj/structure/fans/tiny/invisible, /turf/open/floor/holofloor/hyperspace, /area/centcom/central_command_areas/supplypod/supplypod_temp_holding) "lT" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 8 +/obj/effect/turf_decal/siding/green{ + dir = 5 }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 1 +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/botany) +"lU" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"lW" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/machinery/camera/autoname/directional/south{ + network = list("nukie") }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"lV" = ( -/obj/structure/chair{ - dir = 8 +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"lX" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/borbop) +"lY" = ( +/obj/structure/table/reinforced, +/obj/item/paper/fluff/stations/centcom/disk_memo{ + pixel_x = -6; + pixel_y = -7 }, -/obj/item/radio/intercom{ - desc = "Talk smack through this."; - pixel_x = -32; - syndie = 1 +/obj/item/taperecorder{ + pixel_y = 15 }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) -"lW" = ( -/obj/structure/chair{ +/obj/item/stack/spacecash/c50, +/turf/open/floor/carpet, +/area/centcom/syndicate_mothership/control) +"lZ" = ( +/obj/effect/turf_decal/siding/blue{ dir = 8 }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/medical) +"ma" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/wooden_tv, +/obj/machinery/light/small/directional/east, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/admin) +"mb" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"mc" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/obj/effect/turf_decal/siding/dark/corner, +/obj/structure/table/reinforced, +/obj/item/food/dough, +/obj/item/food/dough, +/obj/item/food/dough, +/obj/item/food/dough, +/obj/item/food/dough, +/obj/item/food/dough, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) "md" = ( /obj/machinery/computer/shuttle/labor, /obj/effect/turf_decal/stripes/line{ @@ -3008,6 +4094,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/evacuation/ship) +"mg" = ( +/obj/effect/landmark/navigate_destination/centcom/hydro, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) +"mh" = ( +/obj/structure/bed, +/obj/item/bedsheet/centcom, +/obj/item/toy/plush/lizard_plushie/green, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/admin) "mi" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 1 @@ -3015,29 +4111,27 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "mj" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 5 }, -/obj/effect/spawner/random/engineering/atmospherics_portable, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "mk" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/directions/engineering{ - desc = "A sign that shows there are doors here. There are doors everywhere!"; - icon_state = "doors"; - name = "WARNING: BLAST DOORS" +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/turf/open/floor/plating, -/area/centcom/central_command_areas/control) -"ml" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"ml" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/evacuation) "mm" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/entertainment/money_medium, @@ -3045,38 +4139,110 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "mn" = ( -/obj/structure/table/wood, -/obj/item/radio/intercom{ - desc = "Talk smack through this."; - syndie = 1 +/obj/machinery/camera/autoname/directional/south{ + network = list("nukie") }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) -"mo" = ( -/obj/structure/table/wood, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) -"ms" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/syndicate_mothership/control) +"mp" = ( +/obj/structure/chair/wood{ + dir = 4 }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/centcom/tdome/administration) -"mu" = ( -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 8 +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"mq" = ( +/obj/structure/table/reinforced/plastitaniumglass{ + name = "Andrea's Desk" }, -/turf/open/floor/iron/dark/diagonal, -/area/centcom/central_command_areas/evacuation) +/obj/item/storage/fancy/cigarettes/cigpack_robustgold, +/obj/item/storage/fancy/cigarettes/cigpack_robustgold, +/obj/item/storage/fancy/cigarettes/cigpack_robustgold, +/obj/item/lighter/skull, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) +"mr" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) +"mt" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave{ + pixel_y = 3 + }, +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/borbop) +"mu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/syndicate_mothership/control) +"mw" = ( +/turf/closed/indestructible/fakeglass, +/area/centcom/central_command_areas/firing_range_checkpoint_control) +"mx" = ( +/obj/machinery/power/shuttle_engine/heater{ + resistance_flags = 3 + }, +/obj/structure/window/reinforced/spawner/directional/north{ + color = "#008000"; + resistance_flags = 3 + }, +/turf/open/lava/airless, +/area/centcom/wizard_station) "my" = ( /obj/effect/turf_decal/bot, /obj/structure/closet/crate/medical, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) +"mz" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/structure/table/glass/plasmaglass, +/obj/item/reagent_containers/syringe{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = -2; + pixel_y = 13 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = 1; + pixel_y = 14 + }, +/obj/machinery/light/cold/directional/north, +/obj/item/reagent_containers/dropper{ + pixel_x = -4; + pixel_y = -6 + }, +/obj/item/storage/box/monkeycubes{ + pixel_x = -6; + pixel_y = 5 + }, +/obj/item/reagent_containers/cup/bottle/formaldehyde{ + pixel_x = 8; + pixel_y = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"mA" = ( +/obj/machinery/computer/records/medical{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) "mB" = ( /obj/item/kirbyplants{ icon_state = "plant-10" @@ -3085,25 +4251,24 @@ /obj/structure/sign/clock/directional/north, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) +"mC" = ( +/obj/structure/table/wood/fancy/royalblack, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/kitchen) "mD" = ( /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/ferry) "mE" = ( -/obj/structure/chair/comfy/brown{ - color = "#66b266"; - dir = 1 - }, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) -"mF" = ( -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/brown/half/contrasted{ +/obj/structure/chair/office{ dir = 4 }, -/obj/effect/spawner/random/vending, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/area/centcom/syndicate_mothership/control) +"mF" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "mG" = ( /obj/machinery/computer/cargo{ dir = 4 @@ -3132,103 +4297,53 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) -"mJ" = ( -/obj/structure/noticeboard/directional/east, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) "mK" = ( -/obj/structure/table, -/obj/item/clipboard, -/obj/item/stack/package_wrap, -/obj/item/stack/cable_coil, -/obj/item/hand_labeler, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) +/obj/machinery/light/cold/directional/east, +/obj/item/kirbyplants/random, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "mL" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 +/obj/machinery/light/small/red/directional/west, +/obj/structure/sign/poster/contraband/soviet_propaganda{ + pixel_x = -32 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) +/obj/item/stack/sheet/cardboard/fifty, +/turf/open/floor/mineral/titanium/yellow, +/area/centcom/syndicate_mothership/control) "mM" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) -"mN" = ( -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "mO" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron/dark/textured_half{ + dir = 8 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) +/area/centcom/syndicate_mothership/control) +"mP" = ( +/obj/structure/hedge, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "mQ" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/flora/bush/generic/style_random, -/turf/open/floor/grass, -/area/centcom/central_command_areas/control) +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/kitchen) "mR" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"mS" = ( -/obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/item/folder/red, -/obj/item/pen/red, -/obj/machinery/button/door/indestructible{ - id = "XCCsec3"; - name = "XCC Shutter 3 Control"; - pixel_x = -24; - pixel_y = 24 +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"mS" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/camera/autoname/directional/east{ + network = list("nukie") }, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "mT" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/machinery/button/door/indestructible{ - id = "XCCsecdepartment"; - layer = 3; - name = "CC Security Checkpoint Control"; - pixel_x = 24; - pixel_y = 24 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/turf/open/floor/circuit/red/off, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "mU" = ( /obj/structure/flora/tree/palm, /obj/item/toy/plush/beeplushie{ @@ -3237,30 +4352,50 @@ }, /turf/open/floor/grass, /area/centcom/central_command_areas/evacuation/ship) +"mV" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "mW" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/west, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/trimline/green, +/obj/effect/turf_decal/siding/green/end{ + dir = 1 }, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"mX" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/centcom/tdome/administration) +/obj/effect/turf_decal/tile/dark_blue/diagonal_centre, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/botany) "mY" = ( -/obj/structure/chair{ +/obj/structure/table/wood, +/obj/item/gun/magic/wand{ + desc = "Used in emergencies to reignite magma engines."; + max_charges = 0; + name = "wand of emergency engine ignition" + }, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"mZ" = ( +/obj/effect/turf_decal/siding/dark{ dir = 1 }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) -"na" = ( -/obj/structure/chair{ - dir = 8 +/obj/effect/turf_decal/siding/dark, +/obj/structure/sign/painting/large/library{ + dir = 1; + pixel_y = -65 }, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "nb" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 8 @@ -3279,30 +4414,69 @@ /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) "nc" = ( -/obj/effect/spawner/random/entertainment/arcade{ +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark, +/obj/structure/sign/painting/large/library{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"nd" = ( +/obj/structure/chair/wood{ dir = 4 }, -/turf/open/floor/eighties/red{ - icon = 'goon/icons/turf/floors.dmi'; - icon_state = "clown_carpet" +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"ne" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark/end, +/obj/machinery/vending/hydronutrients, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"nf" = ( +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 10 }, -/area/centcom/central_command_areas/fore) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) +"ng" = ( +/obj/structure/railing/wood, +/obj/structure/railing/wood{ + dir = 8 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"nh" = ( +/obj/structure/railing/wood, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) "ni" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/red/fourcorners, +/obj/item/fish/chasm_crab, +/obj/structure/fans/tiny/invisible, /turf/open/floor/iron, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/admin) "nj" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/item/kirbyplants{ + icon_state = "plant-22" + }, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/ferry) "nk" = ( -/obj/structure/flora/bush/pale/style_random, -/obj/structure/flora/bush/generic/style_random, -/obj/structure/flora/bush/flowers_yw/style_random, -/turf/open/floor/grass, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) "nl" = ( /obj/machinery/computer/security/mining{ dir = 4 @@ -3325,88 +4499,100 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "no" = ( -/obj/structure/plasticflaps/opaque, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/machinery/camera/autoname/directional/east{ + network = list("nukie") + }, +/obj/structure/closet/crate/cardboard/mothic, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "np" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"nq" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner{ dir = 8 }, -/obj/machinery/door/airlock/security/glass{ - name = "Central Command Courtroom" +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) +"ns" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin_hangout) +"nt" = ( +/obj/machinery/vending/wardrobe/chem_wardrobe, +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/any/security/court, -/obj/effect/mapping_helpers/airlock/access/any/service/lawyer, -/turf/open/floor/iron, -/area/centcom/central_command_areas/courtroom) -"nr" = ( -/obj/structure/chair{ - dir = 8 +/turf/open/floor/iron/dark/side{ + dir = 1 }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 +/area/centcom/central_command_areas/hall) +"nu" = ( +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 }, -/obj/structure/sign/painting/library_secure{ - pixel_x = 32 +/obj/structure/flora/tree/pine/style_random, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"nv" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) -"nw" = ( -/obj/machinery/vending/hydronutrients{ - default_price = 0 +/obj/structure/railing/wood{ + dir = 1 }, -/turf/open/floor/wood, -/area/centcom/tdome/observation) -"nx" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/warning{ - dir = 4 +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) +"nw" = ( +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/structure/table/wood/fancy/royalblue, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) +"ny" = ( +/obj/machinery/computer/operating{ + dir = 8 }, /turf/open/floor/iron/dark, -/area/centcom/tdome/administration) -"nA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) +/area/centcom/central_command_areas/medical) +"nz" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 6 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) "nB" = ( /obj/structure/filingcabinet/filingcabinet, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/ferry) "nC" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 +/obj/structure/railing/wood{ + dir = 1 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"nD" = ( -/obj/effect/landmark/thunderdome/observe, -/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/hall) +"nD" = ( +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "nE" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "pizzatime"; - name = "Pizza Time Shutters"; - desc = "People who take escape pods over the shuttle don't get to visit centcom's pizza tower..." +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"nF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/centcom/central_command_areas/fore) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) "nG" = ( /obj/machinery/computer/security/mining{ dir = 1 @@ -3417,114 +4603,152 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) -"nJ" = ( -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +"nH" = ( +/obj/structure/urinal/directional/north, +/turf/open/floor/iron/white, +/area/centcom/wizard_station) +"nI" = ( +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "nK" = ( -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/control) "nL" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/red/corner{ dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) +/obj/item/stack/spacecash/c1{ + pixel_y = 12 + }, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "nM" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/shutters/preopen{ - name = "XCC Security Checkpoint Shutters"; - id = "XCCsecdepartment" +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"nN" = ( +/obj/structure/railing/wood{ + dir = 8 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) -"nS" = ( -/obj/structure/bookcase/random, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/railing/wood{ + dir = 1 + }, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/ghost_spawn) +"nO" = ( +/obj/structure/cannon{ + dir = 4; + desc = "Resort to the cannon at the top of the stairs loaded with GRAPESHOT!" + }, +/turf/open/misc/grass, +/area/centcom/central_command_areas/admin) +"nP" = ( +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/area/centcom/tdome/observation) +"nR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) +"nS" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/syndicate_mothership/control) "nT" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/trimline/dark_red/filled/line, -/obj/effect/turf_decal/trimline/dark_red/line{ - dir = 1 +/obj/item/kirbyplants/random, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/centcom/syndicate_mothership/control) +"nU" = ( +/obj/machinery/vending/boozeomat, +/turf/open/floor/carpet/executive, +/area/centcom/central_command_areas/admin) +"nX" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/dark{ + dir = 8 }, -/turf/open/floor/iron/tgmcemblem, -/area/centcom/central_command_areas/prison) -"nV" = ( -/obj/structure/chair{ +/obj/effect/turf_decal/siding/dark{ dir = 4 }, /obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/brown/half/contrasted{ +/turf/open/floor/iron/dark/side{ dir = 8 }, -/obj/structure/sign/painting/large/library{ - dir = 8; - pixel_x = -28 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) -"nW" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"nX" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) +/area/centcom/central_command_areas/hall) "nY" = ( -/obj/machinery/computer/prisoner/management{ +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/red{ dir = 1 }, +/obj/machinery/recharger, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) +"nZ" = ( +/obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 5 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) -"nZ" = ( -/obj/machinery/computer/security{ - dir = 1 +/obj/structure/fluff/tram_rail{ + pixel_y = 17 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/fluff/tram_rail, +/obj/structure/railing{ + dir = 10 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/turf/open/lava/plasma/ice_moon, +/area/centcom/syndicate_mothership/control) "oa" = ( -/obj/machinery/computer/records/security{ - dir = 1 +/obj/machinery/light/cold/directional/south, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"ob" = ( +/obj/structure/closet/secure_closet/armory2, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range_checkpoint_control) +"oc" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/door/window/left/directional/east, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 6 }, +/obj/item/pen{ + pixel_x = 1; + pixel_y = 8 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/central_command_areas/prison) -"ob" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ +/area/centcom/syndicate_mothership/control) +"od" = ( +/obj/structure/railing/wood{ dir = 1 }, -/obj/structure/table/reinforced, -/obj/effect/spawner/random/engineering/material, -/obj/effect/spawner/random/engineering/material_cheap, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/structure/railing/wood{ + dir = 8 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) "oe" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/centcom/central_command_areas/ferry) +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) "of" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 4 @@ -3536,54 +4760,75 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) +"og" = ( +/obj/structure/railing, +/turf/open/floor/iron/stairs/old{ + dir = 8; + initial_gas_mix = "TEMP=2.7" + }, +/area/centcom/syndicate_mothership) "oh" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen/fourcolor, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) +/obj/machinery/shower/directional/south, +/obj/structure/drain, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "oi" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"oj" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ +/obj/structure/railing/wood, +/obj/structure/railing/wood{ dir = 8 }, -/turf/open/floor/iron, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin_hangout) +"ok" = ( +/obj/structure/fight_button, +/obj/machinery/light/floor/has_bulb, +/obj/effect/landmark/navigate_destination/centcom/duelbutton, +/turf/open/floor/wood/large, /area/centcom/tdome/observation) +"ol" = ( +/obj/structure/hedge, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"om" = ( +/obj/effect/grand_rune/finale, +/obj/structure/chair/old, +/turf/open/floor/plating/abductor, +/area/centcom/central_command_areas/admin) "on" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 2; - height = 8; - name = "Backup Shuttle Dock"; - roundstart_template = /datum/map_template/shuttle/emergency/backup; - shuttle_id = "backup_away"; - width = 8 +/obj/effect/turf_decal/siding/green{ + dir = 4 }, -/turf/open/space/basic, -/area/space) +/obj/structure/table/glass, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) "oo" = ( -/obj/structure/table/wood, -/obj/item/taperecorder, -/obj/item/storage/box/handcuffs, -/obj/item/flashlight/seclite, -/obj/structure/noticeboard/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) +/obj/structure/fake_stairs/wood/directional/north, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "op" = ( -/obj/structure/sink/directional/west, -/obj/structure/mirror/directional/east, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/structure/window/reinforced/spawner/directional/north{ + color = "#008000"; + resistance_flags = 3 + }, +/turf/open/lava, +/area/centcom/wizard_station) +"oq" = ( +/obj/structure/railing/wood, +/obj/structure/fake_stairs/wood/directional/west, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"or" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) "os" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -3618,84 +4863,98 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "ow" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 +/obj/structure/table/wood/fancy, +/obj/item/storage/dice{ + icon_state = "magicdicebag" }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) -"ox" = ( -/obj/structure/table, -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) +/turf/open/floor/carpet, +/area/centcom/wizard_station) "oy" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 +/obj/machinery/vending/wardrobe/curator_wardrobe, +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark{ + dir = 1 }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 +/turf/open/floor/iron/dark/side{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) +/area/centcom/central_command_areas/hall) +"oz" = ( +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/obj/structure/flora/rock/icy/style_random, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "oA" = ( /obj/structure/closet/crate/bin, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) -"oB" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/vending/wardrobe/cent_wardrobe, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) -"oC" = ( -/obj/effect/spawner/random/medical/memeorgans, -/obj/effect/spawner/random/medical/supplies, -/obj/structure/closet/crate/freezer, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) "oD" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/turf/closed/indestructible/opsglass, +/area/centcom/syndicate_mothership/control) "oE" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "oF" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/griddle, +/obj/machinery/door/airlock/centcom, +/obj/effect/mapping_helpers/airlock/access/any/admin/captain, /turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/firing_range_checkpoint_control) +"oG" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) "oH" = ( -/obj/machinery/shower/directional/east, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) -"oI" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 }, -/turf/open/floor/iron, -/area/centcom/tdome/administration) +/obj/structure/table/glass/plasmaglass, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = -2; + pixel_y = 13 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = 1; + pixel_y = 14 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = 4; + pixel_y = 15 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/item/reagent_containers/cup/bottle/radium{ + pixel_x = -8; + pixel_y = 9 + }, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"oI" = ( +/obj/structure/table/wood, +/obj/item/clothing/suit/wizrobe/magusred, +/obj/item/clothing/head/wizard/magus, +/obj/item/staff, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "oJ" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -3737,19 +4996,37 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "oP" = ( -/obj/structure/chair{ - dir = 4 +/obj/structure/table/reinforced/plastitaniumglass, +/obj/structure/showcase/machinery/tv{ + desc = "Static fills the screen. If you can find the VCR, you might be able to watch those old Heist Movies again."; + name = "\improper Static Filled Tube(TM) Television" }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 +/obj/structure/sign/poster/contraband/rip_badger{ + pixel_x = 32 }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/central_command_areas/fore) +/area/centcom/syndicate_mothership/control) "oQ" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/cold/directional/south, +/obj/structure/chair/greyscale{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"oS" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"oT" = ( +/obj/structure/table/wood, +/obj/machinery/fax, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "oU" = ( /obj/structure/closet/emcloset, /obj/item/tank/internals/emergency_oxygen/engi, @@ -3764,18 +5041,28 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) "oV" = ( -/obj/structure/table/wood, -/obj/item/storage/secure/briefcase{ - pixel_x = 5; - pixel_y = 5 +/obj/structure/sign/poster/contraband/free_drone{ + pixel_y = 32 }, -/obj/item/storage/lockbox/medal, -/obj/machinery/newscaster{ - pixel_x = 32 +/turf/open/floor/iron/dark/textured_half{ + dir = 8 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) +/area/centcom/syndicate_mothership/control) +"oW" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"oX" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/machinery/door/airlock/hatch{ + name = "Gangway" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "oY" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -3785,19 +5072,28 @@ }, /turf/open/floor/stone, /area/centcom/central_command_areas/evacuation/ship) -"pa" = ( -/obj/machinery/door/airlock/centcom{ - name = "Shuttle Control Office" +"oZ" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) +"pa" = ( +/obj/item/kirbyplants/random, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/syndicate_mothership/control) +"pb" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/grass, +/area/centcom/wizard_station) "pc" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/courtroom) +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "pd" = ( /obj/item/clipboard, /obj/item/stamp/denied{ @@ -3809,29 +5105,40 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) +"pe" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/donut_box, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/carpet/purple, +/area/centcom/central_command_areas/admin) "pf" = ( -/obj/structure/table/reinforced, -/obj/item/crowbar/red, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) +/obj/structure/chair/sofa/left/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "pg" = ( -/obj/structure/table/reinforced, -/obj/item/restraints/handcuffs/cable/zipties, -/obj/item/assembly/flash/handheld, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) +/obj/structure/flora/bush/large/style_3, +/turf/open/floor/grass, +/area/centcom/central_command_areas/botany) "ph" = ( -/obj/machinery/computer/cloning{ - dir = 1 +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/structure/lattice/catwalk, +/obj/structure/fluff/tram_rail{ + pixel_y = 17 + }, +/obj/structure/fluff/tram_rail, +/obj/structure/railing{ dir = 6 }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/turf/open/lava/plasma/ice_moon, +/area/centcom/syndicate_mothership/control) +"pi" = ( +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "pj" = ( /obj/structure/chair/office{ dir = 8 @@ -3841,6 +5148,17 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) +"pk" = ( +/obj/item/kirbyplants{ + icon_state = "plant-05"; + pixel_y = 20; + pixel_x = 10 + }, +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/admin) "pl" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -3859,23 +5177,64 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "pm" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/directional/south, -/obj/machinery/status_display/evac/directional/south, +/obj/structure/flora/rock/pile/style_random, +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"pn" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/machinery/door/window/right/directional/east, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/central_command_areas/prison) -"pr" = ( -/obj/structure/chair, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/tile/green/half/contrasted{ +/area/centcom/syndicate_mothership/control) +"po" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"pp" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) +"pq" = ( +/obj/structure/railing/wood{ dir = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"ps" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/area/centcom/tdome/observation) +"pr" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/bottle/beer{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/item/toy/cards/deck/syndicate{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/effect/spawner/random/aimodule/syndicate, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) +"ps" = ( +/obj/machinery/air_sensor{ + chamber_id = "nukiebase"; + name = "syndicate ordnance gas sensor" + }, +/turf/open/floor/engine/vacuum, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"pt" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/fax, +/turf/open/floor/circuit/telecomms, +/area/centcom/central_command_areas/admin) "pu" = ( /obj/item/food/spaghetti/copypasta{ name = "Spaghetti Code"; @@ -3883,21 +5242,51 @@ }, /turf/open/ai_visible, /area/centcom/ai_multicam_room) +"pv" = ( +/obj/effect/rune/narsie, +/obj/structure/chair/comfy/carp{ + dir = 1 + }, +/turf/open/floor/plating/abductor, +/area/centcom/central_command_areas/admin) "pw" = ( -/obj/effect/turf_decal/tile/blue/half/contrasted, -/obj/machinery/vending/imported/yangyu, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"pA" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/brown/half/contrasted{ +/obj/effect/turf_decal/trimline/blue, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/medical) +"px" = ( +/obj/machinery/door/airlock/centcom, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"py" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/borbop) +"pz" = ( +/obj/effect/turf_decal/siding/wood{ dir = 4 }, -/obj/machinery/computer/mech_bay_power_console{ +/obj/effect/turf_decal/siding/wood{ dir = 8 }, -/turf/open/floor/circuit/green, -/area/centcom/central_command_areas/supply) +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" + }, +/obj/structure/railing/wood{ + dir = 8 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"pA" = ( +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "pB" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -3917,11 +5306,22 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/ert) "pE" = ( -/obj/structure/chair/comfy/black{ +/obj/effect/turf_decal/siding/thinplating_new/dark/corner, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ dir = 8 }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"pF" = ( +/obj/machinery/door/airlock/centcom{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/admin/captain, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range_checkpoint_control) +"pG" = ( +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/hall) "pH" = ( /obj/structure/flora/tree/palm{ icon_state = "palm2" @@ -3929,10 +5329,10 @@ /turf/open/floor/grass, /area/centcom/central_command_areas/evacuation/ship) "pI" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/machinery/shower/directional/north, +/obj/structure/drain, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "pJ" = ( /obj/docking_port/stationary{ dir = 8; @@ -3944,41 +5344,61 @@ }, /turf/open/space/basic, /area/space) -"pL" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 +"pK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) -"pM" = ( -/obj/structure/bookcase/random, -/obj/machinery/light/directional/north, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/firing_range) "pN" = ( -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/evacuation) "pO" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/pale/style_random, -/turf/open/floor/grass, -/area/centcom/central_command_areas/control) -"pP" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 +/obj/structure/table/glass/plasmaglass, +/obj/item/pen{ + pixel_x = 9; + pixel_y = 18 }, -/obj/structure/table/reinforced, -/obj/effect/spawner/random/decoration, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/structure/sign/poster/contraband/syndiemoth{ + pixel_x = -32 + }, +/obj/item/storage/box/beakers{ + pixel_x = -4; + pixel_y = 17 + }, +/obj/item/storage/box/syringes{ + pixel_x = 4; + pixel_y = 17 + }, +/obj/item/assembly/igniter{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/assembly/igniter{ + pixel_x = 7; + pixel_y = 1 + }, +/obj/item/assembly/igniter{ + pixel_x = 7; + pixel_y = -3 + }, +/obj/item/assembly/timer{ + pixel_x = -6; + pixel_y = 3 + }, +/obj/item/assembly/timer{ + pixel_x = -6; + pixel_y = -1 + }, +/obj/item/assembly/timer{ + pixel_x = -6; + pixel_y = -5 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "pQ" = ( /obj/structure/table/reinforced, /obj/machinery/door/firedoor, @@ -3994,6 +5414,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/ferry) +"pS" = ( +/obj/structure/rack, +/obj/item/clothing/ears/earmuffs{ + pixel_x = 6; + pixel_y = 3 + }, +/obj/item/clothing/ears/earmuffs{ + pixel_y = 7 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range) "pT" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -4020,9 +5451,11 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/ert) "pY" = ( -/obj/structure/table/reinforced, -/turf/open/floor/carpet/executive, -/area/centcom/tdome/administration) +/obj/structure/frame/computer{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership) "pZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -4030,54 +5463,100 @@ /obj/structure/closet/emcloset, /turf/open/floor/iron/dark/smooth_large, /area/centcom/central_command_areas/evacuation/ship) -"qc" = ( -/obj/item/book/manual/wiki/security_space_law, -/obj/item/taperecorder, +"qa" = ( +/obj/machinery/computer/records/security/laptop, /obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/area/centcom/central_command_areas/admin) +"qb" = ( +/obj/item/stack/spacecash/c20, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"qc" = ( +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "qd" = ( -/obj/machinery/button/door/indestructible{ - id = "thunderdomegen"; - name = "General Supply Control" +/obj/structure/rack, +/obj/item/gun/energy/laser/practice{ + pixel_x = 2; + pixel_y = 5 + }, +/obj/item/gun/energy/laser/practice{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/item/gun/energy/laser/practice{ + pixel_x = 2; + pixel_y = -2 }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line, /turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/area/centcom/central_command_areas/firing_range) +"qe" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/machinery/fax{ + fax_name = "Cmdr. Abraxis"; + name = "Abraxis' Fax Machine" + }, +/turf/open/floor/mineral/titanium/white, +/area/centcom/central_command_areas/admin) "qf" = ( -/obj/structure/chair/comfy/black{ - dir = 4 +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "qg" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/structure/flora/tree/dead/style_random, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "qh" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen/fourcolor, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"qk" = ( -/obj/effect/turf_decal/tile/green/half/contrasted{ +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"qi" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/item/kirbyplants{ + icon_state = "plant-22"; + pixel_x = -4 + }, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"qj" = ( +/obj/structure/flora/grass/both/style_random, +/obj/structure/flora/tree/dead/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"qk" = ( +/obj/machinery/shuttle_manipulator, +/turf/open/floor/circuit/red, +/area/centcom/syndicate_mothership/control) "ql" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin/storage) +/obj/structure/flora/grass/both/style_random, +/obj/structure/flora/rock/pile/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"qm" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/machinery/computer/records/security/laptop, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/mineral/titanium/white, +/area/centcom/central_command_areas/admin) "qn" = ( /obj/structure/filingcabinet/filingcabinet, /obj/machinery/airalarm/directional/south, @@ -4109,92 +5588,96 @@ /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/evacuation/ship) "qq" = ( -/obj/structure/sign/warning/no_smoking, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/admin) +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "qr" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 8 - }, +/obj/machinery/light/small/directional/south, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/central_command_areas/fore) +/area/centcom/syndicate_mothership/control) "qs" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green/half/contrasted, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) -"qt" = ( -/obj/effect/turf_decal/tile/green/half/contrasted, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/siding/thinplating_new/dark/corner, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "qu" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/green/anticorner/contrasted, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) -"qv" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/closed/indestructible/riveted, -/area/centcom/tdome/administration) +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/structure/table/wood/fancy/royalblue, +/obj/effect/spawner/random/decoration/statue{ + spawn_loot_chance = 50 + }, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" + }, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "qw" = ( -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/ferny/style_random, -/turf/open/floor/iron{ - icon_state = "asteroid5"; - name = "plating" - }, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) +"qx" = ( +/obj/structure/window/plasma/spawner/directional/east, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) "qy" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/flora/bush/generic/style_random, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) -"qz" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/flora/bush/pointy/style_random, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) +/obj/structure/flora/rock/icy/style_random{ + pixel_x = -7 + }, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "qA" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/flora/bush/pointy/style_random, -/obj/machinery/light/directional/north, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "qB" = ( -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/flora/bush/lavendergrass/style_random, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/beaker/bluespace, +/obj/item/reagent_containers/cup/beaker/bluespace, +/obj/item/reagent_containers/cup/beaker/bluespace, +/obj/item/reagent_containers/cup/beaker/bluespace, +/obj/item/reagent_containers/cup/beaker/bluespace, +/obj/item/reagent_containers/cup/beaker/bluespace, +/obj/item/reagent_containers/cup/beaker/bluespace, +/obj/item/reagent_containers/cup/beaker/bluespace, +/obj/item/reagent_containers/cup/beaker/bluespace, +/obj/item/reagent_containers/cup/beaker/bluespace, +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/obj/machinery/door/window/right/directional/south, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) "qC" = ( -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/machinery/light/directional/north, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) -"qD" = ( -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/flora/bush/lavendergrass/style_random, -/mob/living/basic/butterfly, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) +/obj/machinery/door/window/survival_pod{ + dir = 8; + name = "Toilet Door"; + opacity = 1 + }, +/obj/structure/window/reinforced/survival_pod/spawner/directional/north{ + name = "Frosted Window"; + opacity = 1 + }, +/obj/structure/toilet/greyscale{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"qE" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/medical) "qF" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -4206,80 +5689,110 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/ert) "qH" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) -"qI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/vending/wardrobe/jani_wardrobe, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supplypod) +/area/centcom/tdome/observation) "qK" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/fight_button, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"qM" = ( +/turf/open/floor/glass/reinforced, /area/centcom/tdome/observation) -"qL" = ( -/obj/machinery/door/airlock/centcom{ - name = "CentCom Security" +"qN" = ( +/obj/structure/table/wood/fancy/purple, +/obj/item/paper_bin, +/obj/item/pen/fourcolor, +/obj/item/scrying, +/obj/item/mod/control/pre_equipped/enchanted, +/turf/open/floor/plating/abductor, +/area/centcom/central_command_areas/admin) +"qO" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/access/any/security/armory, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/obj/structure/closet/secure_closet/hydroponics{ + locked = 0 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) +"qQ" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) "qR" = ( /obj/structure/sign/nanotrasen, /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/ferry) "qS" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/access/any/supply/general, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/obj/machinery/door/airlock/centcom{ - name = "CentCom Logistics" +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/machinery/atmospherics/components/trinary/filter/flipped, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) "qT" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/public/glass{ - name = "CentCom" - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/kitchen) "qU" = ( -/obj/effect/turf_decal/siding/wideplating/dark, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 1 +/obj/structure/fence, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"qV" = ( +/obj/machinery/chem_master/condimaster{ + desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; + name = "HoochMaster Deluxe" }, -/obj/machinery/door/window/brigdoor{ - dir = 1; - desc = "WARNING, Nanotrasen declines any responsibility for clown related injury, enter at your own risk"; - name = "Clown Hole (DANGER)" +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark{ + dir = 1 }, -/turf/open/floor/wood, -/area/centcom/central_command_areas/fore) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/borbop) "qW" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/flowers_yw/style_random, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) +/turf/open/floor/engine/vacuum, +/area/centcom/syndicate_mothership/expansion_bombthreat) "qX" = ( -/obj/structure/fluff/arc, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) +/obj/structure/chair/wood/wings, +/turf/open/floor/carpet, +/area/centcom/wizard_station) "qY" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/centcom/central_command_areas/hall) +"qZ" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin) +"ra" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "rb" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -4287,15 +5800,73 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/ert) "rc" = ( -/obj/structure/chair{ +/obj/structure/dresser, +/obj/structure/noticeboard/directional/north, +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/centcom/syndicate_mothership/control) +"rd" = ( +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"re" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/syndicate_mothership/control) +"rf" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"rg" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/table/glass, +/obj/item/reagent_containers/cup/glass/mug/tea{ + pixel_y = -1; + pixel_x = -7 + }, +/obj/item/reagent_containers/cup/glass/mug/tea{ + pixel_y = -1; + pixel_x = -7 + }, +/obj/item/reagent_containers/cup/glass/mug/tea{ + pixel_y = 6; + pixel_x = 8 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/borbop) +"rh" = ( +/obj/structure/light_prism, +/turf/open/floor/plating/abductor, +/area/centcom/central_command_areas/admin) +"ri" = ( +/obj/structure/railing/wood{ dir = 8 }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"rj" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) "rk" = ( -/turf/open/floor/wood, -/area/centcom/central_command_areas/courtroom) +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/syndicate_mothership/control) +"rl" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) "rm" = ( /obj/machinery/computer/shuttle/labor, /obj/effect/turf_decal/stripes/line{ @@ -4310,64 +5881,89 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) -"rs" = ( -/obj/effect/landmark/prisonwarp, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/bed/pod{ - dir = 4 +"ro" = ( +/obj/structure/window/reinforced/tinted/frosted, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/admin) +"rp" = ( +/obj/effect/turf_decal/stripes/box, +/obj/machinery/shower/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"rq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/item/pillow/clown, -/obj/item/bedsheet/clown, -/turf/open/indestructible/dark, -/area/centcom/central_command_areas/prison/cells) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) +"rr" = ( +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) +"rs" = ( +/obj/structure/rack, +/obj/item/restraints/handcuffs/cable/pink, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "rt" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) +/obj/machinery/computer/shuttle, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "ru" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) "rv" = ( -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"rw" = ( -/obj/machinery/vending/snack, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/door/airlock/hatch{ + name = "Workout Room" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/smooth_half{ + dir = 4 + }, +/area/centcom/syndicate_mothership/control) "rx" = ( /obj/structure/table/reinforced, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/taperecorder, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/obj/item/knife/combat/survival{ + pixel_x = 7; + pixel_y = 17 + }, +/obj/item/reagent_containers/cup/glass/bottle/rum{ + pixel_x = -5; + pixel_y = 17 + }, +/obj/structure/sign/poster/contraband/red_rum{ + pixel_x = 32 + }, +/obj/machinery/recharger, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "ry" = ( -/obj/structure/toilet{ - dir = 4 +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 }, -/obj/machinery/light/directional/west, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron/white, -/area/centcom/central_command_areas/admin) +/turf/open/misc/ice/icemoon, +/area/centcom/syndicate_mothership/control) "rz" = ( /obj/effect/turf_decal/siding/wood/corner, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/evacuation/ship) +"rA" = ( +/turf/open/floor/iron/smooth_half{ + dir = 1 + }, +/area/centcom/syndicate_mothership/control) "rB" = ( /obj/structure/table/reinforced, /obj/item/storage/fancy/donut_box, @@ -4375,21 +5971,23 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) "rC" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, -/turf/open/floor/iron/kitchen/diagonal, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/trimline/red, +/obj/effect/turf_decal/box/corners, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/trimline/red, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"rE" = ( +/obj/structure/table/reinforced, +/obj/item/radio, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range_checkpoint_control) "rF" = ( -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/ferny/style_random, -/turf/open/floor/iron{ - dir = 6; - icon_state = "asteroid8"; - name = "sand" +/obj/structure/chair/sofa/right{ + dir = 8 }, -/area/centcom/central_command_areas/supply) +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) "rG" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/filingcabinet{ @@ -4401,122 +5999,154 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) -"rH" = ( -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/ferny/style_random, -/obj/machinery/light/directional/east, -/turf/open/floor/iron{ - icon_state = "asteroid5"; - name = "plating" - }, -/area/centcom/central_command_areas/fore) -"rI" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/shutters/preopen{ - name = "XCC Checkpoint 3 Shutters"; - id = "XCCsec3" - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) "rJ" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/flora/bush/generic/style_random, -/obj/machinery/light/directional/west, -/turf/open/floor/grass, -/area/centcom/central_command_areas/fore) +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/components/tank/nitrogen, +/turf/open/space/basic, +/area/space/nearstation) "rK" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/flora/bush/pointy/style_random, -/turf/open/floor/grass, -/area/centcom/central_command_areas/control) -"rM" = ( -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) -"rN" = ( -/obj/machinery/newscaster{ - pixel_x = -32 +/obj/structure/sign/poster/contraband/cc64k_ad, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/control) +"rL" = ( +/obj/effect/turf_decal/siding/green{ + dir = 10 }, -/obj/effect/turf_decal/tile/red/half/contrasted{ +/obj/structure/hedge, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) +"rM" = ( +/obj/effect/turf_decal/siding/green{ dir = 8 }, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"rS" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/structure/chair/sofa/bamboo/right{ dir = 4 }, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 4 +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) +"rN" = ( +/obj/machinery/door/window/survival_pod{ + name = "Frosted Door"; + opacity = 1 + }, +/turf/open/floor/iron/freezer, +/area/centcom/syndicate_mothership/control) +"rO" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/closet/syndicate/personal, +/obj/effect/turf_decal/tile/red/full, +/turf/open/floor/iron/dark/textured_half, +/area/centcom/syndicate_mothership/control) +"rP" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 1 }, -/obj/effect/turf_decal/trimline/dark_red/line{ - dir = 8 +/obj/structure/railing/wood, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/medical) +"rQ" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/table/reinforced, +/obj/machinery/reagentgrinder{ + pixel_y = 20; + pixel_x = -5 }, -/turf/open/floor/iron/smooth_half{ +/obj/item/reagent_containers/cup/glass/shaker{ + pixel_y = 11; + pixel_x = 9 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_y = 7; + pixel_x = -5 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/borbop) +"rR" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/hedge, +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/effect/turf_decal/siding/dark/corner{ dir = 1 }, -/area/centcom/central_command_areas/prison) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/borbop) +"rS" = ( +/obj/machinery/vending/cola, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "rT" = ( -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) +/turf/open/lava/plasma/ice_moon, +/area/centcom/syndicate_mothership/control) "rU" = ( -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) +/obj/effect/baseturf_helper/asteroid/snow, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "rV" = ( -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/falsewall/reinforced, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/plating, +/area/centcom/central_command_areas/admin) +"rW" = ( +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/obj/effect/turf_decal/siding/dark/corner, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"rX" = ( +/obj/structure/railing/wood{ + dir = 4 + }, /turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) +/area/centcom/central_command_areas/hall) "rY" = ( /obj/structure/sign/warning/secure_area, /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/armory) "rZ" = ( -/obj/machinery/shower/directional/west, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/structure/curtain/cloth/fancy, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/admin_hangout) "sa" = ( -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 1 +/obj/effect/turf_decal/siding/wood, +/obj/structure/table/wood/fancy/black, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" }, -/obj/effect/turf_decal/trimline/yellow/warning, -/turf/open/floor/iron/dark/diagonal, -/area/centcom/central_command_areas/evacuation) -"sb" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 5; + pixel_x = 5 }, -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) -"sc" = ( -/obj/structure/table/wood, -/obj/structure/plaque/static_plaque/golden{ - pixel_y = 32 +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 5; + pixel_x = -6 }, -/obj/item/clothing/accessory/medal/silver{ - pixel_y = 5 +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"sb" = ( +/obj/structure/fake_stairs/wood/directional/north, +/obj/structure/railing/wood{ + dir = 8 }, -/turf/open/floor/iron/grimy, -/area/centcom/tdome/observation) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"sc" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/chair/sofa/corp/right, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) "sd" = ( /obj/machinery/door/airlock/centcom{ name = "Orbital Drop Pod Loading" @@ -4524,35 +6154,75 @@ /obj/effect/mapping_helpers/airlock/access/any/admin/general, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) +"se" = ( +/obj/structure/table/reinforced, +/obj/item/storage/belt/utility/full/engi, +/turf/open/floor/circuit/green, +/area/centcom/central_command_areas/admin) "sf" = ( -/obj/effect/spawner/random/entertainment/arcade{ +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"sg" = ( +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/light/directional/west, -/obj/structure/sign/painting/large/library{ - dir = 8; - pixel_x = -28 +/obj/structure/railing{ + dir = 10 }, -/turf/open/floor/eighties/red{ - icon = 'goon/icons/turf/floors.dmi'; - icon_state = "clown_carpet" +/turf/open/lava/plasma/ice_moon, +/area/centcom/syndicate_mothership/control) +"sh" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/mineral/titanium/white, +/area/centcom/central_command_areas/admin) +"si" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/light/cold/directional/west, +/obj/item/seeds/cannabis{ + pixel_y = 8 + }, +/obj/item/cultivator{ + pixel_x = -6; + pixel_y = 11 + }, +/turf/open/floor/mineral/titanium/tiled, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"sj" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/area/centcom/central_command_areas/fore) +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"sk" = ( +/obj/effect/baseturf_helper/asteroid/snow, +/turf/closed/indestructible/rock/snow, +/area/centcom/syndicate_mothership) +"sl" = ( +/obj/structure/closet/gimmick/tacticool, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range_checkpoint_control) "sm" = ( /obj/machinery/light/directional/south, /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) -"sn" = ( -/obj/machinery/suit_storage_unit/industrial, -/obj/item/mod/control/pre_equipped/responsory/medic, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 +"so" = ( +/obj/effect/turf_decal/siding/green{ + dir = 9 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) "sq" = ( /obj/machinery/computer/shuttle/white_ship{ dir = 4 @@ -4624,11 +6294,29 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"sy" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 10 + }, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "sz" = ( -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/closet/emcloset, +/obj/item/stack/spacecash/c100, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"sA" = ( +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/structure/mirror/directional/south, +/turf/open/floor/iron/dark/side, +/area/centcom/central_command_areas/hall) "sB" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 8 @@ -4642,11 +6330,21 @@ /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) "sC" = ( -/obj/effect/turf_decal/tile/green/half/contrasted{ +/obj/structure/table/reinforced, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range) +"sD" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "sE" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, @@ -4656,114 +6354,117 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) +"sG" = ( +/obj/effect/turf_decal/siding/green, +/obj/effect/turf_decal/siding/green/corner{ + dir = 1 + }, +/obj/structure/railing/wood, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) "sH" = ( -/obj/machinery/computer/security/telescreen, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/door/airlock/centcom, /turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/borbop) +"sI" = ( +/turf/open/floor/carpet, +/area/centcom/central_command_areas/admin) "sJ" = ( -/obj/machinery/vending/coffee, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/hall) "sK" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 +/obj/machinery/door/airlock/centcom{ + dir = 4; + name = "Glyphee's Secret Office" }, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/obj/effect/mapping_helpers/airlock/access/any/admin/captain, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/admin) "sL" = ( -/obj/machinery/door/airlock/centcom{ - name = "CentCom Security" +/obj/effect/decal/cleanable/blood/splatter, +/mob/living/basic/creature{ + name = "Experiment 35b" }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/turf/open/floor/grass, +/area/centcom/wizard_station) +"sM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/obj/effect/mapping_helpers/airlock/access/any/security, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "sN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/machinery/light/cold/directional/west, +/obj/structure/closet/crate/cardboard, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) +"sP" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/dark{ + dir = 8 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"sO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/effect/turf_decal/siding/dark{ + dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"sP" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark/side{ + dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/area/centcom/central_command_areas/hall) "sQ" = ( -/obj/structure/chair, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/turf/closed/indestructible/fakeglass{ + color = "#008000" }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/area/centcom/wizard_station) "sR" = ( -/obj/structure/chair, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/structure/railing/wood, +/obj/structure/table/reinforced, +/obj/item/storage/medkit/tactical, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) "sS" = ( -/obj/structure/table, -/obj/item/toy/katana, -/obj/item/toy/plush/carpplushie, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"sT" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/siding/dark{ dir = 5 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"sU" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/effect/turf_decal/siding/dark/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "sV" = ( /obj/machinery/door/poddoor/shuttledock, /obj/effect/turf_decal/delivery, +/obj/structure/fans/tiny, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) -"sY" = ( -/obj/machinery/door/airlock/centcom{ - name = "CentCom Supplypod Loading" +"sW" = ( +/obj/structure/table/wood, +/obj/item/bikehorn/golden{ + pixel_x = -8; + pixel_y = 8 }, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"sY" = ( +/obj/structure/table/reinforced, +/obj/machinery/vending/medical, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) +/area/centcom/central_command_areas/medical) "sZ" = ( -/obj/structure/window/reinforced/tinted/frosted{ - dir = 1 - }, -/obj/machinery/sleeper, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/structure/railing/corner{ + dir = 4 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/structure/flora/tree/dead/style_random, +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "ta" = ( /obj/machinery/light/floor/has_bulb, /turf/closed/indestructible/fakeglass, @@ -4775,44 +6476,73 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"tc" = ( +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/smooth, +/area/centcom/syndicate_mothership/control) "td" = ( /obj/structure/sign/departments/drop, /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/ferry) -"tg" = ( -/obj/structure/chair{ +"te" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair/wood{ + dir = 4 + }, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"tf" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "XCCQMLoad2"; + pixel_x = 6 + }, +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/obj/structure/railing{ dir = 1 }, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/green/half/contrasted, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"tg" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/structure/chair/sofa/bench/left, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/stone, +/area/centcom/syndicate_mothership/control) "th" = ( -/obj/structure/sign/poster/contraband/clown{ - pixel_y = -29 +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 6 }, -/turf/open/floor/eighties/red{ - icon = 'goon/icons/turf/floors.dmi'; - icon_state = "clown_carpet" +/obj/structure/extinguisher_cabinet/directional/east, +/obj/structure/sign/poster/contraband/gorlex_recruitment{ + pixel_y = -32 }, -/area/centcom/central_command_areas/fore) +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "ti" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supplypod) -"tj" = ( -/obj/item/sbeacondrop/clownbomb, -/mob/living/simple_animal/hostile/retaliate/clown{ - limb_destroyer = 1 - }, -/turf/open/ballpit, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/pump/on, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"tk" = ( +/obj/effect/turf_decal/trimline/blue, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) "tl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/centcom/wizard_station) "tm" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 8 @@ -4898,162 +6628,207 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) +"tv" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) +"tw" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin_hangout) +"tx" = ( +/obj/structure/chair/sofa/corp{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin_hangout) "ty" = ( /obj/structure/filingcabinet/security, /obj/machinery/status_display/evac/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"tz" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/item/kirbyplants{ + icon_state = "plant-22"; + pixel_x = -4 + }, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" + }, +/obj/machinery/barsign/all_access/directional/north, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) "tA" = ( /obj/machinery/atmospherics/components/tank/air, /obj/effect/turf_decal/stripes/white/line, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) +"tB" = ( +/obj/machinery/computer/records/security, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) "tC" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/centcom{ - name = "Thunderdome VIP" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/any/command/general, -/turf/open/floor/iron, -/area/centcom/tdome/administration) -"tF" = ( -/obj/machinery/door/airlock/centcom{ - name = "Thunderdome Locker Room" +/obj/machinery/vending/wardrobe/science_wardrobe, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"tE" = ( +/obj/structure/sign/poster/contraband/masked_men{ + pixel_x = 32 }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/machinery/chem_dispenser/fullupgrade, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "tG" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 +/obj/structure/railing{ + dir = 6 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/floor/catwalk_floor/iron_smooth{ + initial_gas_mix = "TEMP=2.7" + }, +/area/centcom/syndicate_mothership) "tH" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/glass_large{ - name = "Thunderdome Administration" +/obj/effect/turf_decal/siding/dark{ + dir = 10 }, -/turf/open/floor/iron, -/area/centcom/tdome/administration) +/obj/structure/hedge, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "tI" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/directions/engineering{ - desc = "A sign that shows there are doors here. There are doors everywhere!"; - icon_state = "doors"; - name = "WARNING: BLAST DOORS" - }, -/turf/open/floor/plating, -/area/centcom/central_command_areas/fore) -"tJ" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/machinery/deepfryer, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/kitchen) "tK" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/kitchen) "tL" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"tM" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 +/obj/effect/turf_decal/siding/wood{ + dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"tM" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/railing/corner, +/turf/open/floor/plating/icemoon, +/area/centcom/syndicate_mothership/control) "tN" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 +/obj/structure/chair/sofa/bench/left{ + dir = 8 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/titanium, +/area/centcom/syndicate_mothership/control) "tO" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"tR" = ( +/obj/structure/lattice/catwalk, /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 6 }, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 8 +/obj/structure/fluff/tram_rail{ + pixel_y = 17 + }, +/obj/structure/fluff/tram_rail, +/obj/structure/railing{ + dir = 9 }, -/obj/effect/turf_decal/trimline/dark_red/line{ +/turf/open/lava/plasma/ice_moon, +/area/centcom/syndicate_mothership/control) +"tP" = ( +/obj/structure/fence, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"tQ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/general/hidden{ dir = 4 }, -/turf/open/floor/iron/smooth_half{ - dir = 1 +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"tU" = ( +/turf/closed/indestructible/fakeglass, +/area/centcom/central_command_areas/firing_range) +"tV" = ( +/obj/machinery/atmospherics/pipe/smart/simple/general/visible, +/turf/closed/indestructible/opsglass, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"tW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/area/centcom/central_command_areas/prison) -"tS" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin) +"tX" = ( +/obj/structure/chair/comfy{ dir = 8 }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"tT" = ( -/obj/effect/turf_decal/siding/yellow{ +/turf/open/floor/carpet/neon/simple/cyan, +/area/centcom/central_command_areas/admin) +"tY" = ( +/obj/structure/railing/wood{ dir = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"tU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/structure/fake_stairs/wood/directional/west, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"tZ" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window"; + opacity = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"tV" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"tW" = ( -/turf/open/indestructible/hierophant/two, -/area/centcom/central_command_areas/admin) -"ub" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 9 +/obj/structure/table/reinforced/plasmarglass, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 }, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 10 +/obj/item/transfer_valve{ + pixel_x = 5 }, -/obj/structure/railing{ - dir = 1 +/obj/item/transfer_valve, +/obj/item/transfer_valve{ + pixel_x = -5 }, -/turf/open/floor/wood, -/area/centcom/central_command_areas/fore) +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"ua" = ( +/obj/structure/curtain/cloth/fancy, +/turf/closed/indestructible/fakeglass, +/area/centcom/central_command_areas/admin) +"ub" = ( +/obj/machinery/vending/wardrobe/det_wardrobe, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "uc" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/obj/structure/fake_stairs/wood/directional/west, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "ud" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -5061,30 +6836,46 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, /area/centcom/central_command_areas/evacuation/ship) +"ue" = ( +/obj/structure/chair/sofa/corp/right, +/turf/open/floor/mineral/titanium/white, +/area/centcom/central_command_areas/admin) "uf" = ( -/turf/closed/indestructible/riveted, -/area/centcom/tdome/administration) -"ug" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) -"uh" = ( -/obj/structure/chair/comfy/black{ +/obj/effect/turf_decal/siding/wood/corner{ dir = 1 }, -/turf/open/floor/iron/grimy, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"uh" = ( +/turf/open/floor/carpet/purple, /area/centcom/central_command_areas/admin) -"uj" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/flora/bush/generic/style_random, -/turf/open/floor/grass, -/area/centcom/central_command_areas/prison) -"um" = ( -/obj/machinery/computer/communications{ +"ui" = ( +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/borbop) +"uj" = ( +/obj/structure/hedge, +/obj/structure/railing/wood, +/obj/structure/railing/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"uk" = ( +/turf/open/misc/grass, +/area/centcom/central_command_areas/admin) +"ul" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/iron, +/area/centcom/central_command_areas/admin) +"um" = ( +/obj/machinery/computer/communications{ dir = 1 }, /obj/effect/turf_decal/stripes/line{ @@ -5092,16 +6883,41 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) -"up" = ( -/obj/structure/table/wood, -/obj/item/storage/briefcase, -/obj/effect/turf_decal/tile/neutral/fourcorners, +"un" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window"; + opacity = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"uo" = ( +/obj/structure/fans/tiny/invisible, +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/admin) +"uq" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/chair/stool/bar/directional/south, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/area/centcom/central_command_areas/borbop) +"ur" = ( +/obj/machinery/modular_computer/console/preset/id/centcom{ + dir = 4; + desc = "A specialized console to connect to gaming computers to be able to broadcast live. Seriously, where does Ook find this stuff?" + }, +/obj/structure/fans/tiny/invisible, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/admin) "us" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/effect/turf_decal/siding/blue{ + dir = 6 + }, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) "ut" = ( /obj/docking_port/stationary{ dir = 8; @@ -5113,42 +6929,51 @@ }, /turf/open/space/basic, /area/space) +"uu" = ( +/obj/structure/table/wood, +/obj/machinery/computer/records/medical/laptop, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/admin) "uv" = ( -/obj/effect/turf_decal/tile/red/opposingcorners, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - dir = 1 - }, -/obj/structure/chair/stool/bar/directional{ - dir = 8 +/obj/machinery/door/airlock/centcom{ + dir = 4; + name = "Glyphee's Garbage Dump" }, +/obj/structure/fans/tiny/invisible, /turf/open/floor/iron, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/admin) "uw" = ( -/obj/structure/chair/office, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/storage/medkit/regular, +/obj/item/storage/medkit/brute{ + pixel_y = 5; + pixel_x = 5 + }, +/obj/item/storage/medkit/fire{ + pixel_y = 5; + pixel_x = -4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) "ux" = ( -/obj/machinery/modular_computer/console/preset/id/centcom{ +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/obj/machinery/button/door/indestructible{ - id = "XCCcustoms1"; - layer = 3.5; - name = "CC Customs 1 Control"; - pixel_x = 8; - pixel_y = -24 +/obj/structure/hedge, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"uy" = ( +/obj/structure/chair/wood{ + dir = 8 }, -/obj/machinery/button/door/indestructible{ - id = "XCCcustoms2"; - layer = 3.5; - name = "CC Customs 2 Control"; - pixel_x = -8; - pixel_y = -24 +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) "uz" = ( /obj/docking_port/stationary{ dir = 4; @@ -5162,40 +6987,68 @@ /turf/open/space, /area/space) "uA" = ( -/obj/structure/chair{ +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) +"uC" = ( +/obj/structure/railing/wood, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/ghost_spawn) +"uD" = ( +/obj/structure/table/wood, +/obj/machinery/computer/records/medical/laptop, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) +"uE" = ( +/obj/structure/hedge, +/obj/structure/railing/wood, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/trimline/green/line, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"uF" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/railing/wood{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin_hangout) "uG" = ( -/obj/effect/turf_decal/siding/yellow, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/turf/closed/indestructible/opsglass, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "uH" = ( /obj/effect/turf_decal/stripes/line, /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/supply) -"uK" = ( -/obj/machinery/processor, -/obj/effect/turf_decal/stripes/end, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"uM" = ( -/obj/machinery/chem_master/condimaster{ - name = "HoochMaster 2000" +"uI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +/obj/machinery/vending/donksofttoyvendor, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"uJ" = ( +/obj/effect/turf_decal/siding/green/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/botany) +"uM" = ( +/obj/structure/sign/poster/contraband/free_key, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/control) "uN" = ( -/obj/structure/closet/secure_closet/contraband/heads, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "uO" = ( /obj/machinery/door/airlock/centcom{ name = "Shuttle Control Office" @@ -5205,133 +7058,237 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) "uP" = ( -/obj/item/flashlight/lamp, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) +/obj/structure/railing/wood{ + dir = 1 + }, +/obj/structure/railing/wood{ + dir = 4 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/borbop) +"uQ" = ( +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/hall) "uR" = ( -/turf/open/floor/iron/kitchen/diagonal, -/area/centcom/central_command_areas/fore) -"uV" = ( -/obj/item/paper_bin, -/obj/item/pen/fourcolor, -/obj/structure/table/reinforced, -/obj/machinery/light/directional/east, -/obj/machinery/newscaster/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/fluff/tram_rail{ + pixel_y = 17 + }, +/obj/structure/fluff/tram_rail, +/turf/open/lava/plasma/ice_moon, +/area/centcom/syndicate_mothership/control) +"uS" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/trimline/green/line, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) -"uX" = ( -/obj/machinery/shower/directional/east, -/obj/effect/turf_decal/tile/green{ +/area/centcom/central_command_areas/botany) +"uT" = ( +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark{ dir = 1 }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) -"uY" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/flora/bush/leavy/style_random, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) +"uU" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin_hangout) +"uV" = ( +/obj/effect/decal/remains/xeno, /turf/open/floor/grass, -/area/centcom/central_command_areas/ferry) +/area/centcom/wizard_station) +"uW" = ( +/obj/structure/table/wood, +/obj/item/clothing/suit/wizrobe/magusblue, +/obj/item/clothing/head/wizard/magus, +/obj/item/staff, +/obj/structure/mirror/magic{ + pixel_y = 28 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"uX" = ( +/obj/structure/railing/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) "uZ" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/flora/bush/pointy/style_random, -/turf/open/floor/grass, -/area/centcom/central_command_areas/ferry) +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/obj/structure/hedge, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "va" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/flora/bush/generic/style_random, -/turf/open/floor/grass, -/area/centcom/central_command_areas/ferry) +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) "vb" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/flora/bush/pointy/style_random, +/obj/effect/turf_decal/siding/purple, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"vc" = ( +/obj/item/food/meat/slab/human/mutant/lizard, /turf/open/floor/grass, -/area/centcom/central_command_areas/ferry) +/area/centcom/wizard_station) "vd" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/folder/red, -/obj/item/pen/red, -/obj/machinery/door/window/brigdoor{ - base_state = "rightsecure"; - dir = 1; - icon_state = "rightsecure"; - name = "CentCom Customs"; - req_access = list("cent_captain") +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 }, -/obj/machinery/door/window, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "ve" = ( -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) "vf" = ( -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/structure/sign/painting/library{ + pixel_x = 32 + }, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/admin) "vg" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 +/obj/machinery/vending/wardrobe/sec_wardrobe, +/obj/effect/turf_decal/siding/dark{ + dir = 9 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/effect/turf_decal/siding/dark/corner, +/turf/open/floor/iron/dark/side{ + dir = 9 + }, +/area/centcom/central_command_areas/hall) "vh" = ( -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"vi" = ( +/obj/machinery/vending/clothing, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"vj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/obj/machinery/barsign/all_access/directional/north, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) "vk" = ( -/turf/open/floor/carpet/cyan, -/area/centcom/central_command_areas/control) -"vo" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/shower/directional/south, -/obj/structure/curtain, -/obj/machinery/door/window/brigdoor/left/directional/south{ - name = "Shower" +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood{ + dir = 1 }, -/obj/item/soap/deluxe, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron/white, -/area/centcom/central_command_areas/admin) +/obj/structure/railing/wood{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) +"vl" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 1 + }, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) +"vm" = ( +/obj/item/kirbyplants{ + icon_state = "plant-21" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/ferry) +"vn" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical/old, +/obj/structure/sign/poster/contraband/pwr_game{ + pixel_y = 32 + }, +/turf/open/floor/mineral/titanium/yellow, +/area/centcom/syndicate_mothership/control) +"vp" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "vq" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/chair/comfy/brown, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) +"vr" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"vs" = ( +/obj/structure/table/wood/fancy/green{ + name = "Intern Desk" + }, +/obj/item/paper_bin, +/obj/item/pen/fourcolor, +/turf/open/indestructible/hotelwood, +/area/centcom/central_command_areas/admin) "vt" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/kitchen) "vu" = ( -/obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 10 }, -/obj/machinery/door/airlock/security{ - name = "Central Command Legal Affairs" +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"vv" = ( +/obj/structure/showcase/wizard, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"vw" = ( +/obj/effect/landmark/prisonwarp, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/prison/cells) +"vx" = ( +/turf/open/floor/carpet/neon/simple/cyan, +/area/centcom/central_command_areas/admin) +"vy" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark/end, +/obj/machinery/vending/hydroseeds{ + slogan_delay = 700 }, -/obj/effect/mapping_helpers/airlock/access/any/security/court, -/obj/effect/mapping_helpers/airlock/access/any/service/lawyer, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"vz" = ( +/obj/machinery/door/poddoor/shutters/cc/xcc, +/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, -/area/centcom/central_command_areas/courtroom) +/area/centcom/central_command_areas/ferry) "vA" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/directions/engineering{ @@ -5379,7 +7336,7 @@ /area/centcom/central_command_areas/ferry) "vF" = ( /obj/machinery/door/airlock/centcom{ - name = "Administrative Office" + name = "AdminLand" }, /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -5387,164 +7344,206 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) "vG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/obj/machinery/door/poddoor/shutters/cc/xcc, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/structure/closet/secure_closet/hydroponics{ + locked = 0 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) "vH" = ( -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/green{ - dir = 1 +/obj/machinery/vending/snack, +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"vI" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/structure/table/wood, +/obj/machinery/fax, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "vJ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) -"vM" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/diagonal, -/area/centcom/central_command_areas/evacuation) -"vO" = ( -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"vP" = ( +"vK" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/supply) +"vL" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/door/poddoor/shutters/preopen{ - name = "XCC Customs 2 Shutters"; - id = "XCCcustoms2" +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"vM" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/structure/table/glass/plasmaglass, +/obj/structure/reagent_dispensers/wall/virusfood/directional/north, +/obj/item/clothing/gloves/latex, +/obj/item/healthanalyzer{ + pixel_y = 3 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/item/plant_analyzer, +/obj/item/clothing/glasses/science, +/obj/item/reagent_containers/spray/chemsprayer/bioterror{ + pixel_x = -6; + pixel_y = 10 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"vN" = ( +/obj/structure/railing/wood, +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/watering_can/advanced, +/obj/item/reagent_containers/cup/watering_can/advanced, +/obj/item/reagent_containers/cup/watering_can/advanced, +/obj/item/reagent_containers/cup/watering_can/advanced, +/obj/item/reagent_containers/cup/watering_can/advanced, +/obj/item/reagent_containers/cup/watering_can/advanced, +/obj/effect/turf_decal/trimline/green/line, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"vO" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"vP" = ( +/obj/structure/flora/bush/large/style_3, +/turf/open/floor/grass, +/area/centcom/central_command_areas/medical) "vQ" = ( -/obj/structure/table, -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/expansion_bombthreat) "vR" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) "vS" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"vT" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) "vU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Frosted Window"; + opacity = 1 }, -/obj/machinery/door/poddoor/shutters/preopen{ - name = "XCC Customs 1 Shutters"; - id = "XCCcustoms1" +/obj/item/soap/syndie, +/obj/structure/sign/poster/contraband/got_wood{ + pixel_x = 32 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/turf/open/floor/iron/freezer, +/area/centcom/syndicate_mothership/control) "vV" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/structure/hedge, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range) "vW" = ( -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) "vX" = ( -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "vY" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"wa" = ( +/obj/effect/turf_decal/siding/dark{ dir = 6 }, -/obj/effect/turf_decal/trimline/yellow/corner{ +/obj/effect/turf_decal/siding/dark/corner{ dir = 1 }, -/obj/structure/table/reinforced, -/obj/item/reagent_containers/cup/glass/bottle/whiskey{ - pixel_y = 5 - }, -/obj/item/clothing/mask/cigarette/cigar/havana{ - pixel_x = 2 - }, -/turf/open/floor/iron/dark/diagonal, -/area/centcom/central_command_areas/evacuation) -"vZ" = ( -/obj/effect/turf_decal/tile/blue/half/contrasted{ +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"wb" = ( +/obj/structure/chair/sofa/right{ dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"wa" = ( -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 +/turf/open/floor/carpet/purple, +/area/centcom/central_command_areas/admin) +"wc" = ( +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/borbop) +"wd" = ( +/obj/structure/railing{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"we" = ( +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/medical) +"wf" = ( +/turf/open/floor/carpet, +/area/centcom/central_command_areas/hall) "wg" = ( -/obj/structure/closet/secure_closet/ert_com, -/obj/structure/sign/directions/command{ - pixel_y = 24 +/obj/machinery/camera/autoname/directional/south{ + network = list("nukie") }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/iron, -/area/centcom/central_command_areas/armory) +/turf/open/floor/circuit/red/off, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "wh" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/green, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) +"wi" = ( +/obj/structure/table/glass/plasmaglass, +/obj/item/screwdriver{ + pixel_x = 1; + pixel_y = 23 + }, +/obj/item/clothing/glasses/science{ + pixel_x = -5; + pixel_y = 11 + }, +/obj/machinery/reagentgrinder{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/structure/noticeboard/directional/east, +/obj/item/grenade/chem_grenade{ + pixel_x = -4 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = -4 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = -4 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = -4 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "wj" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/flora/bush/pointy/style_random, -/turf/open/floor/grass, -/area/centcom/tdome/administration) +/obj/machinery/camera/autoname/directional/north{ + network = list("nukie") + }, +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/syndicate_mothership/control) "wk" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/stripes/line{ @@ -5555,25 +7554,39 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) -"wl" = ( -/mob/living/basic/monkey_animatronic, -/obj/structure/railing{ - dir = 6; - layer = 3.1 +"wm" = ( +/obj/structure/railing/wood{ + dir = 8 }, -/obj/structure/railing{ - dir = 9; - layer = 3.1 +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/borbop) +"wn" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/knife/kitchen, +/obj/structure/sign/poster/contraband/self_ai_liberation{ + pixel_x = -32 }, -/turf/open/floor/elevated, -/area/centcom/central_command_areas/fore) -"wq" = ( -/obj/structure/chair/comfy/black{ - dir = 1 +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"wo" = ( +/obj/structure/table/reinforced/plastitaniumglass{ + name = "Andrea's Desk" }, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/turf/open/floor/iron/grimy, +/obj/machinery/coffeemaker/impressa, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) +"wp" = ( +/obj/structure/chair/sofa/left/brown{ + dir = 4 + }, +/turf/open/floor/carpet, /area/centcom/central_command_areas/admin) +"wq" = ( +/obj/structure/hedge, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range_checkpoint_control) "wr" = ( /obj/structure/chair{ dir = 4 @@ -5583,6 +7596,11 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) +"ws" = ( +/obj/structure/closet/cardboard/metal, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "wt" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -5656,60 +7674,48 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) "wC" = ( -/obj/machinery/door/airlock/centcom{ - name = "CentCom Customs" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/ghost_spawn) -"wF" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, +/obj/structure/hedge, +/obj/structure/railing/wood, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/light/floor/has_bulb, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supplypod) +/area/centcom/central_command_areas/kitchen) +"wE" = ( +/obj/structure/chair/sofa/corp/left, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/kitchen) "wG" = ( -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 +/obj/effect/turf_decal/siding/blue/corner{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) "wH" = ( -/obj/effect/turf_decal/loading_area, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"wI" = ( -/obj/effect/turf_decal/tile/green/half/contrasted{ +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) +"wK" = ( +/obj/effect/turf_decal/siding/blue/corner{ dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"wJ" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) +"wL" = ( +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/structure/table/wood/fancy/royalblue, +/obj/effect/spawner/random/decoration/statue{ + spawn_loot_chance = 50 }, -/obj/machinery/door/airlock/public/glass{ - name = "CentCom" +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"wK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"wL" = ( -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"wM" = ( +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) +"wM" = ( /turf/open/floor/iron, /area/centcom/central_command_areas/supply) "wN" = ( @@ -5718,6 +7724,14 @@ }, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/evacuation/ship) +"wO" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/obj/machinery/vending/wardrobe/hydro_wardrobe, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) "wP" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -5726,13 +7740,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, /area/centcom/central_command_areas/evacuation/ship) -"wR" = ( -/obj/machinery/shower/directional/east, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 +"wQ" = ( +/obj/structure/table/reinforced/plasmarglass, +/obj/item/banhammer{ + desc = "A terrible weapon that has seen countless use over the ages. It looks like Ook doesn't use this thing much. A good thing for you guys!"; + force = -10 }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/turf/open/misc/grass, +/area/centcom/central_command_areas/admin) +"wS" = ( +/obj/structure/table/wood/fancy/black, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/borbop) "wT" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/wood/corner{ @@ -5744,6 +7763,13 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) +"wU" = ( +/turf/closed/indestructible/opsglass, +/area/centcom/syndicate_mothership) +"wV" = ( +/obj/machinery/computer/security/wooden_tv, +/turf/open/floor/circuit/telecomms, +/area/centcom/central_command_areas/admin) "wW" = ( /obj/item/kirbyplants{ icon_state = "plant-21" @@ -5764,25 +7790,21 @@ }, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/evacuation/ship) -"wZ" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +"wY" = ( +/obj/machinery/autolathe, +/turf/open/floor/circuit/green, +/area/centcom/central_command_areas/admin) +"xa" = ( +/obj/structure/chair/office, +/obj/structure/window/plasma/spawner/directional/west, +/obj/structure/window/plasma/spawner/directional/north, +/turf/open/indestructible/hotelwood, +/area/centcom/central_command_areas/admin) "xb" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/flora/bush/generic/style_random, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) +/obj/structure/table/reinforced, +/obj/item/storage/box/material, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) "xc" = ( /obj/machinery/door/airlock/external/ruin{ name = "Ferry Airlock" @@ -5848,111 +7870,203 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) "xl" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/machinery/light/directional/north, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"xm" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 6 + }, +/turf/open/misc/ice/icemoon, +/area/centcom/syndicate_mothership/control) "xn" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/iron/smooth_half{ + dir = 1 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/area/centcom/syndicate_mothership/control) "xo" = ( -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"xp" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"xp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/wood/large, +/area/centcom/tdome/observation) "xq" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +/obj/machinery/chem_master, +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"xr" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "xs" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range) +"xt" = ( +/obj/docking_port/stationary{ + area_type = /area/centcom/syndicate_mothership/control; + dir = 2; + dwidth = 3; + height = 7; + name = "escape pod loader"; + roundstart_template = /datum/map_template/shuttle/assault_pod/default; + width = 7 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/floor/plating/icemoon, +/area/centcom/syndicate_mothership/control) +"xu" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/wood{ dir = 8 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"xt" = ( -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 4 +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"xv" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/prison/cells) +"xw" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership) "xy" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/fueltank, -/obj/item/weldingtool/experimental, -/obj/machinery/power/terminal{ +/obj/structure/closet/secure_closet/contraband/armory, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range_checkpoint_control) +"xz" = ( +/obj/machinery/door/airlock/centcom, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/botany) +"xA" = ( +/obj/structure/fence/cut/large{ + dir = 4 + }, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"xB" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 1 + }, +/obj/structure/sign/painting/library_secure{ + pixel_x = 32 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"xC" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen/fourcolor, +/obj/effect/turf_decal/siding/dark{ dir = 8 }, -/obj/structure/cable, -/obj/structure/fireaxecabinet/directional/east, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) -"xA" = ( -/obj/structure/chair/sofa/corp/right{ +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) +"xD" = ( +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/floor/iron/kitchen/diagonal, -/area/centcom/central_command_areas/fore) -"xB" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"xE" = ( +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"xG" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/vending/wardrobe/det_wardrobe, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) -"xC" = ( -/obj/machinery/computer/operating{ +/area/centcom/tdome/observation) +"xH" = ( +/obj/structure/table/reinforced, +/obj/machinery/splicer, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"xI" = ( +/obj/structure/railing/wood{ dir = 8 }, -/obj/structure/window/reinforced/tinted/frosted{ +/obj/effect/turf_decal/siding/wood{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/structure/musician/piano, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"xJ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/floor/engine, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"xK" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/effect/turf_decal/siding/dark/corner{ dir = 4 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"xD" = ( -/turf/open/floor/carpet/neon/simple/lime/nodots, -/area/centcom/central_command_areas/ghost_spawn) -"xE" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"xL" = ( +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership) +"xM" = ( +/turf/open/floor/grass, +/area/centcom/wizard_station) +"xN" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/effect/turf_decal/siding/dark/corner{ dir = 1 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"xK" = ( -/turf/open/ballpit, -/area/centcom/central_command_areas/fore) -"xN" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/machinery/vending/wardrobe/hydro_wardrobe, +/turf/open/floor/iron/dark/side{ + dir = 6 + }, +/area/centcom/central_command_areas/hall) "xO" = ( -/turf/open/floor/iron/kitchen/herringbone, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"xP" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/bananalamp, +/turf/open/misc/grass, +/area/centcom/central_command_areas/admin) "xQ" = ( /obj/effect/turf_decal/delivery, /obj/machinery/light/directional/south, @@ -5978,40 +8092,32 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) "xT" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"xX" = ( -/obj/machinery/newscaster{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"xY" = ( -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"xZ" = ( -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"ya" = ( -/turf/open/floor/iron/tgmcemblem{ - dir = 8 +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"xU" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/control) +"xW" = ( +/obj/structure/bookcase/random/reference/wizard, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"yb" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, -/area/centcom/central_command_areas/prison) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "yc" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/structure/flora/tree/dead/style_random, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "yd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/filingcabinet/chestdrawer, @@ -6019,65 +8125,93 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) "ye" = ( -/obj/machinery/light/directional/east, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) -"yf" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/door/airlock/hatch{ + name = "Security Checkpoint" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/smooth_half{ dir = 4 }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supplypod) -"yh" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/donut_box, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"yi" = ( -/obj/machinery/atmospherics/components/unary/vent_pump{ - dir = 8 +/area/centcom/syndicate_mothership/control) +"yf" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 6 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin/storage) +/area/centcom/central_command_areas/botany) +"yg" = ( +/turf/open/floor/circuit/green, +/area/centcom/central_command_areas/admin) +"yi" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "yj" = ( -/obj/machinery/door/airlock/centcom{ - name = "CentCom Security" +/obj/structure/fake_stairs/wood/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) +"yk" = ( +/obj/structure/railing/wood{ + dir = 1 + }, +/obj/structure/fake_stairs/wood/directional/east, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"yl" = ( +/obj/structure/rack, +/obj/item/gun/energy/e_gun{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/gun/energy/e_gun, +/obj/structure/sign/nanotrasen{ + pixel_y = 32 }, /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 10 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) +"ym" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/any/security/general, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"yl" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/basic/crab, -/turf/open/indestructible/dark, -/area/centcom/central_command_areas/prison/cells) +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "yn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum, /turf/open/floor/plating, /area/centcom/central_command_areas/ferry) "yo" = ( -/obj/machinery/computer/security{ - dir = 4 +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/obj/structure/hedge, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) "yp" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) +"yq" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/obj/effect/turf_decal/siding/dark/corner, +/turf/open/floor/iron/dark/side{ + dir = 9 + }, +/area/centcom/central_command_areas/hall) "yr" = ( /obj/machinery/door/airlock/centcom{ name = "Briefing Room" @@ -6087,46 +8221,95 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) "ys" = ( -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/green{ - dir = 8 +/obj/structure/chair/sofa/corp, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/kitchen) +"yt" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/machinery/vending/cigarette, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "yv" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/directions/medical{ - dir = 4 +/turf/closed/indestructible/fakedoor{ + name = "Tac-Com" }, -/turf/open/floor/plating, -/area/centcom/central_command_areas/ghost_spawn) +/area/centcom/syndicate_mothership/control) +"yw" = ( +/obj/structure/table/wood, +/obj/item/modular_computer/laptop/preset/civilian{ + desc = "A low-end laptop often used for personal recreation. Looks like Ook's gaming computer. Thankfully these things are at least somewhat robust." + }, +/turf/open/misc/grass, +/area/centcom/central_command_areas/admin) +"yx" = ( +/obj/machinery/door/airlock/maintenance/external{ + name = "Bunk Room 2" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/catwalk_floor/iron, +/area/centcom/syndicate_mothership/control) "yy" = ( -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/centcom/syndicate_mothership/control) "yz" = ( -/obj/structure/chair{ - dir = 1 +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/structure/flora/bush/fullgrass/style_random, +/mob/living/basic/cow, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"yA" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/siding/dark{ + dir = 4 }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) "yB" = ( -/obj/effect/turf_decal/tile/blue{ +/obj/machinery/light/cold/directional/east, +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) +"yC" = ( +/turf/open/floor/circuit/telecomms, +/area/centcom/central_command_areas/admin) +"yD" = ( +/turf/closed/indestructible/rock/snow, +/area/centcom/syndicate_mothership) +"yE" = ( +/obj/structure/railing/wrestling{ dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/turf/open/floor/iron/smooth_large{ + icon = 'goon/icons/turf/floors.dmi'; + icon_state = "boxing" + }, +/area/centcom/central_command_areas/hall) +"yF" = ( +/obj/structure/chair/wood/wings{ + dir = 1 + }, +/turf/open/floor/wood, +/area/centcom/wizard_station) "yG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/trimline/green/line{ + dir = 10 }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/centcom/tdome/administration) +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) "yH" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/wood{ @@ -6138,16 +8321,27 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) -"yL" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/donut_box, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) -"yO" = ( -/obj/machinery/computer/communications, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/iron/grimy, +"yJ" = ( +/obj/structure/railing/wood{ + dir = 8 + }, +/obj/structure/railing/wood{ + dir = 4 + }, +/obj/structure/railing/wood, +/obj/structure/gel_cocoon, +/turf/open/floor/grass, +/area/centcom/central_command_areas/admin_hangout) +"yK" = ( +/obj/effect/turf_decal/siding/green/end{ + dir = 8 + }, +/obj/structure/railing/wood, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) +"yM" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/carpet/purple, /area/centcom/central_command_areas/admin) "yP" = ( /obj/machinery/newscaster{ @@ -6161,6 +8355,12 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) +"yQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "yS" = ( /obj/structure/table/reinforced, /obj/item/storage/box/emps, @@ -6171,19 +8371,22 @@ /obj/item/gun/energy/ionrifle/carbine, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) -"yU" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 +"yT" = ( +/obj/machinery/light/small/directional/south, +/obj/item/watertank{ + pixel_x = -10 }, -/obj/machinery/door/airlock/public/glass{ - name = "CentCom" +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/syndicate_mothership/control) +"yU" = ( +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) "yV" = ( /obj/docking_port/stationary{ dir = 8; @@ -6196,6 +8399,10 @@ }, /turf/open/space, /area/space) +"yW" = ( +/obj/structure/cable, +/turf/open/floor/catwalk_floor/iron, +/area/centcom/syndicate_mothership/control) "yX" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -6203,11 +8410,13 @@ /turf/open/floor/iron/white/textured, /area/centcom/central_command_areas/evacuation/ship) "yY" = ( -/obj/structure/chair, -/obj/effect/landmark/thunderdome/observe, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +/obj/machinery/vending/cigarette/syndicate, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"yZ" = ( +/obj/structure/chair/stool/directional/west, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) "za" = ( /obj/machinery/power/terminal{ dir = 1 @@ -6216,27 +8425,46 @@ /obj/effect/decal/cleanable/oil, /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) +"zb" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/catwalk_floor/titanium, +/area/centcom/syndicate_mothership/control) "zc" = ( -/obj/structure/chair/comfy/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/structure/flora/tree/dead/style_random, +/obj/structure/flora/grass/both/style_random, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "zd" = ( -/turf/open/floor/carpet/neon/simple/black/nodots, -/area/centcom/tdome/observation) +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark/textured_half{ + dir = 8 + }, +/area/centcom/syndicate_mothership/control) "ze" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/indestructible/dark, -/area/centcom/central_command_areas/prison/cells) +/obj/machinery/door/airlock{ + icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; + name = "Observation Room" + }, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "zf" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/taperecorder, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/structure/flora/tree/jungle/style_5, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"zg" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/obj/structure/sign/poster/contraband/punch_shit{ + pixel_y = -32 + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "zh" = ( /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -6250,30 +8478,20 @@ }, /area/awaymission/errorroom) "zk" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "CentCom Medbay" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/access/any/medical, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/medical) "zl" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction, +/turf/open/space/basic, +/area/space/nearstation) "zm" = ( -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 8 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "zn" = ( /obj/machinery/light/directional/north, /obj/structure/table/reinforced, @@ -6283,14 +8501,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) -"zo" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" +"zp" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"zq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) "zr" = ( /obj/docking_port/stationary{ dir = 4; @@ -6309,15 +8533,36 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/two) "zt" = ( -/obj/structure/sink/directional/west, -/obj/structure/mirror/directional/east, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/structure/sink/kitchen/directional/east, +/turf/open/floor/iron/smooth_large{ + icon = 'goon/icons/turf/floors.dmi'; + icon_state = "boxing" + }, +/area/centcom/central_command_areas/admin) +"zu" = ( +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"zv" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "zw" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, -/area/centcom/tdome/observation) +/obj/machinery/light/cold/directional/west, +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) "zx" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 8 @@ -6344,6 +8589,14 @@ }, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) +"zy" = ( +/obj/machinery/computer/records/medical/laptop, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "zz" = ( /obj/structure/table/reinforced, /obj/item/restraints/handcuffs/cable/zipties, @@ -6351,112 +8604,207 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) -"zA" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/flora/bush/generic/style_random, -/turf/open/floor/grass, -/area/centcom/tdome/administration) "zB" = ( -/turf/open/floor/holofloor/stairs{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/siding/purple, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "zC" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/pale/style_random, -/turf/open/misc/asteroid, -/area/centcom/central_command_areas/control) +/obj/structure/table/wood/fancy, +/obj/item/camera/spooky, +/turf/open/floor/carpet, +/area/centcom/wizard_station) +"zD" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/prison/cells) "zE" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/three) "zF" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/structure/chair/sofa/corp{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/carpet, +/area/centcom/central_command_areas/kitchen) "zG" = ( -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"zH" = ( -/obj/machinery/stasis{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/siding/dark{ dir = 9 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/siding/dark/corner, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"zH" = ( +/obj/effect/turf_decal/siding/blue, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) "zI" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/siding/blue, +/obj/structure/railing/wood, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) "zJ" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) "zK" = ( -/obj/machinery/firealarm/directional/east, -/obj/structure/table/reinforced/rglass, -/obj/item/book, -/obj/item/greentext, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 +/obj/effect/turf_decal/siding/blue{ + dir = 6 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/medical) "zL" = ( -/obj/structure/sink/kitchen/directional/west, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/kitchen/herringbone, -/area/centcom/central_command_areas/fore) +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) "zM" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/two) -"zT" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/plating, -/area/centcom/central_command_areas/briefing) -"zU" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +"zN" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"zZ" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supplypod/loading/three) -"Ab" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"Ad" = ( -/obj/effect/turf_decal/tile/green/half/contrasted, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/floor/carpet, +/area/centcom/central_command_areas/kitchen) +"zO" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/table/wood/fancy/black, +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 2; + pixel_x = -6 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 13; + pixel_x = 7 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"zP" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/kitchen) +"zQ" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/mecha_part_fabricator, +/turf/open/floor/mineral/titanium/purple, +/area/centcom/central_command_areas/admin) +"zR" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 4; + pixel_x = -4 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin_hangout) +"zS" = ( +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "XCCQMLoad"; + pixel_x = 6 + }, +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"zT" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/plating, +/area/centcom/central_command_areas/briefing) +"zU" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/evacuation) +"zV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"zW" = ( +/obj/structure/railing/wood, +/obj/structure/railing/wood{ + dir = 8 + }, +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/borbop) +"zX" = ( +/turf/open/floor/plating/abductor, +/area/centcom/central_command_areas/admin) +"zY" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/circuit/telecomms, +/area/centcom/central_command_areas/admin) +"zZ" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supplypod/loading/three) +"Aa" = ( +/obj/machinery/suit_storage_unit/rd, +/turf/open/floor/carpet/purple, +/area/centcom/central_command_areas/admin) +"Ab" = ( +/obj/structure/railing/wood, +/obj/structure/railing/wood{ + dir = 8 + }, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/ghost_spawn) +"Ac" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/machinery/vending/cigarette, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) +"Ad" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/hall) "Ae" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 @@ -6466,93 +8814,135 @@ dir = 8 }, /area/centcom/central_command_areas/evacuation/ship) -"Af" = ( -/obj/structure/table/wood, -/obj/item/storage/photo_album, -/obj/item/camera, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) "Ag" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" +/obj/structure/chair/stool/directional/south, +/obj/structure/sign/map/right{ + desc = "A framed picture of the station. Clockwise from security in red at the top, you see engineering in yellow, science in purple, escape in checkered red-and-white, medbay in green, arrivals in checkered red-and-blue, and then cargo in brown."; + icon_state = "map-right-MS"; + pixel_y = 32 }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) "Ah" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" }, -/obj/effect/turf_decal/tile/green{ - dir = 4 +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "Ai" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"Am" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +/obj/structure/sign/poster/contraband/lamarr{ + pixel_y = -32 }, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/turf/open/floor/iron/smooth_half{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"An" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/green{ +/area/centcom/syndicate_mothership/control) +"Aj" = ( +/obj/structure/railing/wood{ dir = 8 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"Ao" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/structure/flora/bush/large/style_3, +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"Ak" = ( +/obj/structure/railing/wood{ + dir = 4 + }, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin_hangout) +"Am" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"An" = ( +/turf/open/floor/carpet, +/area/centcom/central_command_areas/kitchen) "Ap" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) "Aq" = ( -/obj/machinery/computer/operating{ - dir = 4 +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 +/obj/machinery/door/poddoor/shutters/window{ + id = "FBBZ1"; + name = "Security Shutters" }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/structure/fans/tiny, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "Ar" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 4; - pixel_x = -4 +/obj/structure/fake_stairs/wood/directional/south, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"At" = ( +/obj/structure/sign/poster/contraband/bountyhunters{ + pixel_x = -32 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"As" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/light/directional/east, -/obj/structure/chair/sofa/corp/right{ - dir = 8 +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/iron/smooth, +/area/centcom/syndicate_mothership/control) +"Au" = ( +/turf/open/floor/plastic, +/area/centcom/syndicate_mothership/expansion_fridgerummage) +"Av" = ( +/obj/effect/turf_decal/siding/green, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/botany) +"Aw" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin) +"Ax" = ( +/obj/structure/table/reinforced/plasmarglass, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 5 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"At" = ( -/obj/effect/turf_decal/siding/yellow, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/item/folder/red{ + pixel_x = -5 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership) +"Ay" = ( +/obj/structure/railing/wood, +/obj/structure/table/reinforced, +/obj/item/botanical_lexicon, +/obj/item/botanical_lexicon, +/obj/item/botanical_lexicon, +/obj/item/botanical_lexicon, +/obj/effect/turf_decal/trimline/green/line, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"Az" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) "AA" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/north, @@ -6563,14 +8953,36 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/centcom/central_command_areas/evacuation/ship) +"AB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "AC" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/airlock/security{ - name = "Central Command Legal Affairs" +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/coffeepot/bluespace{ + pixel_y = 5; + pixel_x = -6 }, -/obj/effect/mapping_helpers/airlock/access/any/service/lawyer, -/turf/open/floor/iron, -/area/centcom/central_command_areas/courtroom) +/obj/item/reagent_containers/cup/coffeepot/bluespace{ + pixel_y = 9; + pixel_x = 5 + }, +/obj/item/storage/box/coffeepack/robusta{ + pixel_y = -2; + pixel_x = -6 + }, +/obj/item/storage/box/coffeepack/robusta{ + pixel_y = -3; + pixel_x = 4 + }, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/admin) "AD" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -6578,20 +8990,16 @@ /obj/item/banner/command, /turf/open/floor/stone, /area/centcom/central_command_areas/evacuation/ship) -"AE" = ( -/obj/structure/sink/directional/east, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/tdome/observation) "AF" = ( -/obj/structure/table/wood, -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/fax{ - name = "Central Command Admiral's Fax Machine" +/obj/effect/turf_decal/siding/dark{ + dir = 1 }, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) +/obj/effect/turf_decal/siding/dark, +/obj/structure/sign/painting/library{ + pixel_y = -32 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "AG" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/drinkingglass{ @@ -6609,10 +9017,25 @@ "AH" = ( /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/one) +"AI" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"AJ" = ( +/obj/machinery/vending/autodrobe/all_access, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "AK" = ( -/obj/machinery/light_switch/directional/north, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) +/obj/effect/turf_decal/trimline/red, +/obj/effect/turf_decal/trimline/red, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "AL" = ( /obj/structure/chair/office{ dir = 1 @@ -6622,80 +9045,214 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"AM" = ( +/obj/structure/fake_stairs/wood/directional/south, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"AN" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/machinery/computer/records/medical/laptop, +/turf/open/floor/mineral/titanium/white, +/area/centcom/central_command_areas/admin) +"AO" = ( +/obj/machinery/computer/operating{ + dir = 8 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) +"AP" = ( +/obj/machinery/nuclearbomb/beer, +/turf/open/floor/mineral/titanium/white, +/area/centcom/central_command_areas/admin) +"AQ" = ( +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/railing{ + dir = 9 + }, +/turf/open/lava/plasma/ice_moon, +/area/centcom/syndicate_mothership/control) +"AR" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/dice/d20, +/turf/open/floor/circuit/telecomms, +/area/centcom/central_command_areas/admin) +"AS" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) "AT" = ( -/obj/structure/sign/departments/medbay/alt, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) "AU" = ( -/obj/machinery/stasis{ +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/structure/railing{ dir = 8 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/turf/open/lava/plasma/ice_moon, +/area/centcom/syndicate_mothership/control) "AV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/structure/hedge, +/obj/structure/railing/wood{ + dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/effect/turf_decal/tile/orange/diagonal_edge, +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/structure/railing/wood, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "AW" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"AX" = ( -/obj/structure/table, -/obj/item/toy/sword, -/obj/item/gun/ballistic/shotgun/toy/crossbow, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"AY" = ( -/obj/structure/chair{ +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 1 }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/turf/open/floor/mineral/titanium/tiled/blue, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"AX" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/centcom/central_command_areas/hall) "AZ" = ( -/obj/structure/chair{ +/obj/structure/chair/office{ dir = 1 }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/area/centcom/syndicate_mothership/control) "Ba" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) "Bb" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/closet/crate/bin, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"Bc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/firing_range) +"Bc" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/area/centcom/syndicate_mothership/control) "Bd" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"Bj" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/structure/fence{ + dir = 4 + }, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"Be" = ( +/obj/item/clothing/head/soft/fishing_hat, +/obj/structure/table/wood, +/obj/item/fishing_line, +/obj/item/fishing_line/reinforced, +/obj/item/fishing_rod/tech, +/obj/item/fishing_rod/tech, +/obj/item/fishing_hook/weighted, +/obj/item/fishing_hook/weighted, +/obj/item/fishing_hook/stabilized, +/obj/item/fishing_hook/stabilized, +/obj/item/fishing_hook/shiny, +/obj/item/fishing_hook/shiny, +/obj/item/fishing_hook/jaws, +/obj/item/fishing_hook/jaws, +/obj/item/fishing_hook/bone, +/obj/item/fishing_hook/bone, +/obj/item/bait_can/worm/premium, +/obj/item/bait_can/worm/premium, +/obj/item/bait_can/worm/premium, +/obj/item/bait_can/worm/premium, +/obj/item/bait_can/worm/premium, +/obj/item/bait_can/worm/premium, +/turf/open/floor/carpet/neon/simple/cyan, +/area/centcom/central_command_areas/admin) +"Bf" = ( +/obj/effect/turf_decal/siding/dark/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark{ dir = 6 }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) +"Bg" = ( +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/obj/structure/railing{ + dir = 6; + layer = 3.1 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"Bh" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/item/kirbyplants{ + icon_state = "plant-22"; + pixel_x = -4 + }, +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"Bi" = ( +/obj/effect/turf_decal/siding/green{ + dir = 5 + }, +/obj/machinery/vending/hydroseeds, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) +"Bj" = ( +/obj/effect/landmark/navigate_destination/centcom/dresser, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"Bk" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"Bl" = ( +/obj/structure/table/wood, +/obj/item/storage/box/drinkingglasses, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/tdome/administration) +/area/centcom/syndicate_mothership/control) "Bm" = ( /obj/structure/reagent_dispensers/fueltank, /obj/item/weldingtool/experimental, @@ -6703,80 +9260,85 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, -/area/centcom/central_command_areas/admin) +/area/centcom/central_command_areas/ferry) "Bn" = ( -/obj/structure/table/wood/fancy/royalblue, -/obj/structure/sign/painting/library_secure{ - pixel_x = 32 - }, -/obj/effect/spawner/random/decoration/statue{ - spawn_loot_chance = 50 +/obj/structure/table/reinforced/titaniumglass, +/obj/machinery/door/window/left/directional/west{ + name = "Secret Stuff"; + req_access = list("robotics"); + dir = 4 }, -/turf/open/floor/carpet/royalblue, -/area/centcom/tdome/administration) -"Bo" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 +/obj/item/reagent_containers/pill/adminordrazine{ + list_reagents = list(/datum/reagent/medicine/adminordrazine = 99999); + name = "sv_cheats 1"; + desc = "god"; + color = "#fcba03" }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"Bp" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/tdome/administration) -"Br" = ( -/obj/structure/chair/comfy/black{ - dir = 4 +/obj/structure/fans/tiny/invisible, +/obj/item/tank/internals/oxygen/yellow{ + pixel_x = -7; + pixel_y = 7 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 +/obj/item/tank/internals/oxygen/yellow{ + pixel_y = -7; + pixel_x = 7 }, -/turf/open/floor/iron/grimy, +/turf/open/floor/carpet/green, /area/centcom/central_command_areas/admin) -"Bs" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/storage/bag/tray, -/obj/item/kitchen/fork, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"Bt" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ +"Bo" = ( +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range) +"Bp" = ( +/obj/structure/fence/door, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"Bq" = ( +/obj/effect/landmark/start/wizard, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"Br" = ( +/obj/structure/railing/wood{ dir = 8 }, -/obj/machinery/door/airlock/security{ - name = "Central Command Legal Affairs" +/obj/structure/railing/wood, +/obj/machinery/light/directional/north, +/obj/structure/flora/bush/grassy/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"Bt" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, -/obj/effect/mapping_helpers/airlock/access/any/security/court, -/turf/open/floor/iron, -/area/centcom/central_command_areas/courtroom) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/evacuation) +"Bu" = ( +/obj/machinery/vending/drugs, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) "Bv" = ( -/obj/machinery/computer/security{ - dir = 1 +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 }, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) -"Bw" = ( -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/green/anticorner/contrasted, -/obj/machinery/vending/medical, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"Bx" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +/area/centcom/syndicate_mothership/control) +"Bw" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line{ - dir = 4 +/obj/machinery/disposal/delivery_chute, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/plating, +/area/centcom/central_command_areas/admin) +"Bx" = ( +/obj/structure/table/wood, +/obj/item/food/syndicake{ + pixel_y = 3 }, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) "By" = ( /obj/machinery/light/directional/south, /obj/structure/filingcabinet/chestdrawer, @@ -6784,304 +9346,316 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/ferry) +"Bz" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/bureaucracy/pen, +/obj/effect/spawner/random/bureaucracy/folder, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supply) "BA" = ( -/obj/machinery/door/airlock/centcom{ - name = "CentCom Security" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/access/any/medical/general, -/obj/effect/mapping_helpers/airlock/access/any/security/general, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, -/obj/effect/turf_decal/siding/blue/corner{ +/obj/structure/chair/sofa/corp/right{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"BB" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen/red, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/turf/open/floor/wood/large, /area/centcom/tdome/observation) -"BD" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 +"BB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) -"BE" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/shutters/preopen{ - name = "CC Main Access Shutters"; - id = "XCCsec3" +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin) +"BC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"BF" = ( -/obj/item/storage/backpack/duffelbag/med/surgery, -/obj/structure/window/reinforced/tinted/frosted, -/obj/item/reagent_containers/pill/adminordrazine{ - pixel_y = 6; - pixel_x = 8 +/obj/machinery/vending/cigarette, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"BD" = ( +/obj/effect/turf_decal/siding/purple{ + dir = 1 }, -/obj/item/reagent_containers/pill/adminordrazine{ - pixel_y = 6; - pixel_x = 8 +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 8 }, -/obj/item/reagent_containers/pill/adminordrazine{ - pixel_y = 6; - pixel_x = 6 +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"BE" = ( +/obj/structure/fake_stairs/wood/directional/south, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"BG" = ( +/obj/structure/fence{ + dir = 4 }, -/obj/item/reagent_containers/pill/adminordrazine{ - pixel_y = 10; - pixel_x = 2 +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"BH" = ( +/turf/open/floor/mineral/titanium/yellow, +/area/centcom/syndicate_mothership/control) +"BI" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 1 }, -/obj/item/reagent_containers/pill/adminordrazine{ - pixel_y = 10; - pixel_x = 5 +/turf/open/floor/carpet, +/area/centcom/central_command_areas/hall) +"BJ" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/syndicrate{ + max_integrity = 1 }, -/obj/item/reagent_containers/medigel/sterilizine, -/obj/structure/table/reinforced/rglass, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supply) +"BK" = ( +/obj/effect/turf_decal/siding/dark{ dir = 10 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"BG" = ( -/obj/machinery/door/window/brigdoor/left/directional{ - name = "Emergency Surgery" - }, -/obj/effect/turf_decal/trimline/blue/filled/warning, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"BH" = ( -/obj/item/storage/backpack/duffelbag/med/surgery, -/obj/structure/window/reinforced/tinted/frosted, -/obj/structure/window/reinforced/tinted/frosted{ +/obj/effect/turf_decal/siding/dark/corner{ dir = 4 }, -/obj/item/reagent_containers/pill/adminordrazine{ - pixel_y = 8; - pixel_x = 5 - }, -/obj/item/reagent_containers/pill/adminordrazine{ - pixel_y = 8 - }, -/obj/item/reagent_containers/pill/adminordrazine{ - pixel_y = 8; - pixel_x = 3 - }, -/obj/item/reagent_containers/pill/adminordrazine{ - pixel_y = 6; - pixel_x = 3 - }, -/obj/item/reagent_containers/medigel/sterilizine, -/obj/structure/table/reinforced/rglass, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 +/obj/structure/sign/painting/library_secure{ + pixel_x = -32 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"BI" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "CentCom Medbay" +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"BL" = ( +/obj/machinery/light/small/directional/west, +/obj/structure/closet/secure_closet/freezer/fridge/open, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/obj/item/food/grown/tomato, +/obj/item/food/grown/tomato, +/obj/item/food/grown/tomato, +/obj/item/reagent_containers/condiment/enzyme{ + layer = 5 }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 1 +/obj/item/storage/fancy/egg_box, +/obj/item/storage/fancy/egg_box, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/flour{ + pixel_x = -5; + pixel_y = 9 }, -/obj/effect/turf_decal/trimline/blue/filled/warning, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"BJ" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate/syndicrate{ - max_integrity = 1 +/obj/item/reagent_containers/condiment/flour{ + pixel_x = -5; + pixel_y = 9 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/turf/open/floor/plastic, +/area/centcom/syndicate_mothership/expansion_fridgerummage) "BM" = ( -/obj/machinery/door/airlock/centcom{ - name = "CentCom Security" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/access/any/security, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"BN" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/storage/fancy/donut_box, -/obj/machinery/door/window/brigdoor{ - base_state = "rightsecure"; - dir = 1; - icon_state = "rightsecure"; - name = "CentCom Customs"; - req_access = list("cent_captain") - }, -/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/garbage, +/obj/structure/fans/tiny/invisible, /turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/area/centcom/central_command_areas/admin) "BO" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/folder/red, -/obj/item/pen/red, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"BP" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/brigdoor{ - base_state = "rightsecure"; - dir = 1; - icon_state = "rightsecure"; - name = "CentCom Customs"; - req_access = list("cent_captain") +/obj/structure/bed{ + dir = 4 }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/item/bedsheet/syndie{ + dir = 4 + }, +/turf/open/floor/iron/smooth_half, +/area/centcom/syndicate_mothership/control) "BQ" = ( -/obj/structure/bookcase/random, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line{ - dir = 10 +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 }, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "BR" = ( /turf/open/floor/grass, /area/centcom/central_command_areas/evacuation/ship) +"BS" = ( +/mob/living/simple_animal/bot/medbot/mysterious{ + desc = "If you don't accidentally blow yourself up from time to time you're not really a wizard anyway."; + faction = list("neutral","silicon","creature"); + name = "Nobody's Perfect" + }, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "BT" = ( -/obj/structure/table/wood, -/obj/item/clipboard, -/obj/item/toy/figure/dsquad, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) +/obj/machinery/door/airlock{ + icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; + name = "Storage" + }, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "BU" = ( -/obj/item/clipboard, -/obj/item/folder/red, -/obj/item/stamp/denied{ - pixel_x = 3; - pixel_y = 3 +/obj/structure/sign/poster/contraband/lusty_xenomorph{ + pixel_y = 32 }, -/obj/item/stamp, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"BV" = ( -/obj/vehicle/sealed/mecha/odysseus, -/obj/effect/turf_decal/trimline/blue/filled/warning{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/iron/smooth_half{ dir = 1 }, -/turf/open/floor/iron/recharge_floor, -/area/centcom/central_command_areas/control) +/area/centcom/syndicate_mothership/control) +"BV" = ( +/obj/effect/turf_decal/siding/red{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "BW" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/turf/open/floor/plating/snowed/icemoon, +/area/centcom/syndicate_mothership/control) "BX" = ( -/turf/closed/indestructible/fakeglass, -/area/centcom/central_command_areas/control) -"Ca" = ( +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) +"BY" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, /obj/item/kirbyplants{ - icon_state = "plant-22" + icon_state = "plant-22"; + pixel_x = -4 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) -"Cb" = ( -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/ghost_spawn) +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"Cc" = ( +/obj/structure/chair/comfy/shuttle, +/turf/open/floor/circuit/green, +/area/centcom/central_command_areas/admin) "Cd" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/flora/bush/generic/style_random, -/mob/living/basic/butterfly, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership/control) +"Ce" = ( +/obj/structure/table/wood, +/obj/item/dice/d20, +/obj/item/dice, +/turf/open/floor/carpet, +/area/centcom/wizard_station) "Cf" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) +/obj/structure/destructible/cult/item_dispenser/forge/engine, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "Cg" = ( -/obj/item/cardboard_cutout{ - starting_cutout = "Private Security Officer" +/obj/effect/turf_decal/siding/dark{ + dir = 6 }, -/obj/effect/turf_decal/tile/red/half/contrasted{ +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"Ch" = ( +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"Ci" = ( +/obj/structure/railing/wood{ + dir = 4 + }, +/obj/structure/railing/wood{ dir = 1 }, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) -"Ck" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/ghost_spawn) +"Cj" = ( +/obj/effect/turf_decal/siding/dark/corner{ + dir = 8 }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/centcom/central_command_areas/fore) -"Cn" = ( -/obj/structure/table, -/obj/machinery/processor{ - pixel_y = 8 +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"Ck" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 }, -/turf/open/floor/iron/kitchen/herringbone, -/area/centcom/central_command_areas/fore) +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"Cl" = ( +/turf/open/space/transit, +/area/space) +"Cm" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/table/reinforced, +/obj/structure/desk_bell, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/borbop) "Co" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/four) -"Cs" = ( -/obj/machinery/modular_computer/console/preset/command{ +"Cp" = ( +/obj/effect/turf_decal/siding/thinplating_new/light{ dir = 8 }, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"Cq" = ( +/obj/structure/chair/comfy/carp, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"Cr" = ( +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"Cs" = ( +/obj/effect/turf_decal/siding/dark, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) +"Ct" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "Cu" = ( -/obj/machinery/hydroponics/constructable, -/turf/open/floor/carpet/neon/simple/lime/nodots, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) "Cv" = ( -/obj/structure/closet/crate/freezer/surplus_limbs, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/item/storage/organbox/preloaded, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/smooth_half{ + dir = 1 }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"Cx" = ( +/area/centcom/syndicate_mothership/control) +"Cw" = ( +/obj/effect/turf_decal/siding/red, /obj/structure/table/reinforced, -/obj/item/storage/box/handcuffs, -/obj/item/crowbar/red, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/recharger, +/obj/item/stack/spacecash/c10{ + pixel_x = -19; + pixel_y = 10 + }, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) +"Cx" = ( +/obj/machinery/door/airlock/centcom, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/area/centcom/central_command_areas/medical) "Cy" = ( /obj/structure/table/wood, /obj/machinery/chem_dispenser/drinks{ @@ -7096,41 +9670,38 @@ /obj/structure/sign/calendar/directional/north, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/evacuation/ship) -"Cz" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/public/glass{ - name = "ThunderDome" +"CA" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/trimline/green, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/botany) +"CB" = ( +/obj/structure/railing/corner{ + dir = 4 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"CC" = ( +/obj/structure/flora/tree/pine/style_random, +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "CD" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) -"CE" = ( -/obj/item/clipboard, -/obj/item/folder/red, -/obj/item/stamp/denied{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stamp, /obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/megaphone/sec, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) +/area/centcom/central_command_areas/firing_range_checkpoint_control) "CF" = ( /obj/machinery/suit_storage_unit/industrial, /obj/structure/window/reinforced/survival_pod/spawner/directional/east, /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) +"CG" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "CH" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -7139,47 +9710,69 @@ /turf/open/floor/iron/white/textured, /area/centcom/central_command_areas/evacuation/ship) "CI" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/structure/flora/rock/pile/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "CJ" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/structure/barricade/sandbags, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "CK" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/stripes/full, +/turf/open/floor/mineral/titanium/yellow, +/area/centcom/syndicate_mothership/control) "CL" = ( -/obj/structure/table, -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ +/obj/docking_port/stationary{ + area_type = /area/centcom/syndicate_mothership; + dheight = 1; + dir = 4; + dwidth = 12; + height = 17; + name = "syndicate recon outpost"; + roundstart_template = /datum/map_template/shuttle/infiltrator/basic; + shuttle_id = "syndicate_away"; + width = 23 + }, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"CM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/turf_decal/siding/wood{ dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"CP" = ( -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 +/obj/structure/hedge, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"CN" = ( +/obj/machinery/door/airlock/centcom{ + name = "Vicky's Office" }, -/obj/effect/spawner/random/engineering/tank, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/effect/mapping_helpers/airlock/access/any/admin/captain, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) +"CO" = ( +/obj/structure/fireaxecabinet/directional/north, +/turf/open/misc/grass, +/area/centcom/central_command_areas/admin) +"CP" = ( +/obj/structure/flora/rock/icy/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"CQ" = ( +/obj/structure/injured_spawner, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) +"CR" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/mineral/titanium/white, +/area/centcom/central_command_areas/admin) +"CS" = ( +/obj/machinery/door/airlock/centcom, +/obj/effect/mapping_helpers/airlock/access/any/admin/captain, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "CT" = ( /obj/structure/table/reinforced, /obj/structure/railing{ @@ -7205,45 +9798,40 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) "CU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table/wood, +/obj/machinery/computer/security/wooden_tv, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) -"CV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) -"CX" = ( -/obj/item/reagent_containers/cup/watering_can/advanced, -/obj/item/reagent_containers/cup/watering_can/advanced, -/obj/item/reagent_containers/cup/watering_can/advanced, -/obj/structure/table/wood/fancy/royalblue, -/obj/item/botanical_lexicon, -/obj/item/botanical_lexicon, -/obj/item/botanical_lexicon, -/obj/item/botanical_lexicon, -/obj/item/botanical_lexicon, -/turf/open/floor/wood, -/area/centcom/tdome/observation) -"CY" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ +"CW" = ( +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"CZ" = ( -/obj/structure/chair{ - dir = 8 +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"CX" = ( +/obj/structure/chair/stool/directional/south, +/obj/structure/sign/map/left{ + 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-left-MS"; + pixel_y = 32 }, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/landmark/start/nukeop, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) +"CY" = ( +/obj/structure/chair/greyscale{ dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"CZ" = ( +/obj/item/clothing/mask/facehugger/dead, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/plating, +/area/centcom/central_command_areas/admin) "Da" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/bodycontainer/morgue, @@ -7251,72 +9839,158 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/white, /area/centcom/central_command_areas/evacuation/ship) +"Db" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood{ + dir = 8 + }, +/obj/structure/railing/wood{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin_hangout) +"Dc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"Dd" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) +"De" = ( +/obj/item/cautery/alien, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/centcom/wizard_station) +"Df" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"Dg" = ( +/obj/structure/hedge, +/obj/structure/railing/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"Dh" = ( +/obj/structure/bookcase, +/obj/item/book/granter/action/spell/random, +/obj/item/storage/book/bible, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/book/random, +/obj/item/book/random, +/obj/item/book/random, +/turf/open/floor/plating/abductor, +/area/centcom/central_command_areas/admin) "Di" = ( /turf/closed/indestructible/riveted, /area/centcom/ai_multicam_room) "Dj" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/prison/cells) +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "Dk" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/structure/chair/sofa/right/brown{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/revolver{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"Dl" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/white, /area/centcom/central_command_areas/admin) +"Dm" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/red/corner, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "Dn" = ( /obj/structure/flora/tree/palm, /obj/machinery/light/directional/north, /turf/open/floor/grass, /area/centcom/central_command_areas/evacuation/ship) +"Do" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin_hangout) "Dp" = ( -/obj/item/reagent_containers/cup/beaker/bluespace, -/obj/item/reagent_containers/cup/beaker/bluespace, -/obj/structure/table/reinforced/rglass, -/obj/effect/turf_decal/trimline/blue/filled/corner{ +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/red{ dir = 4 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "Dq" = ( -/obj/structure/chair/sofa/corp/right, -/turf/open/floor/iron/kitchen/diagonal, -/area/centcom/central_command_areas/fore) +/obj/structure/railing{ + dir = 5 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "Ds" = ( -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 +/obj/structure/table/wood, +/obj/machinery/fax{ + name = "Glyphee's Fax Machine"; + fax_name = "Glyphee's Spam Mail" }, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/obj/structure/fans/tiny/invisible, +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/admin) "Dt" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/storage/fancy/donut_box, -/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/modular_computer/console/preset/id/centcom, +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) +"Dv" = ( +/obj/item/clothing/suit/wizrobe/black, +/obj/item/clothing/head/wizard/black, /obj/effect/turf_decal/bot, /turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"Dv" = ( -/obj/item/paper_bin, -/obj/item/pen, -/obj/item/reagent_containers/cup/coffeepot/bluespace{ - layer = 3.1 - }, -/obj/item/clipboard, -/obj/structure/table/reinforced/rglass, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/area/centcom/wizard_station) +"Dw" = ( +/obj/effect/turf_decal/siding/wood{ dir = 8 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"Dy" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin) +"Dy" = ( +/obj/structure/flora/grass/both/style_random, +/obj/structure/railing{ dir = 1 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"Dz" = ( +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/obj/structure/barricade/sandbags, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "DA" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 8 @@ -7330,161 +10004,371 @@ }, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) -"DD" = ( -/obj/structure/reagent_dispensers/watertank/high, -/turf/open/floor/wood, -/area/centcom/tdome/observation) +"DB" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/table/reinforced, +/obj/effect/spawner/random/special_lighter, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/borbop) +"DC" = ( +/obj/structure/railing/wood{ + dir = 8 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"DE" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supply) "DF" = ( -/obj/structure/sign/warning/no_smoking, -/turf/closed/indestructible/riveted, -/area/centcom/tdome/observation) -"DG" = ( -/obj/structure/chair/office{ +/obj/structure/railing/wood{ dir = 4 }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 +/obj/structure/railing/wood{ + dir = 1 }, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin_hangout) "DH" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/folder/red, -/obj/item/pen/red, -/obj/machinery/door/window/brigdoor{ - base_state = "rightsecure"; - dir = 4; - icon_state = "rightsecure"; - name = "CentCom Customs"; - req_access = list("cent_captain") +/obj/machinery/igniter/incinerator_ordmix{ + id = "syn_ordmix_igniter" }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/engine/vacuum, +/area/centcom/syndicate_mothership/expansion_bombthreat) "DI" = ( -/obj/machinery/door/firedoor, -/obj/item/folder/white, -/obj/item/pen/blue, -/obj/machinery/door/window/brigdoor{ - base_state = "rightsecure"; - dir = 8; - icon_state = "rightsecure"; - name = "CentCom Customs"; - req_access = list("cent_captain") +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/dark/textured_half{ + dir = 8 }, -/obj/effect/turf_decal/bot, -/obj/structure/table/reinforced/rglass, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/area/centcom/syndicate_mothership/control) "DJ" = ( -/obj/structure/chair/office{ - dir = 8 +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 8 +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) "DK" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Chief Engineer" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 +/obj/structure/sign/poster/contraband/c20r{ + pixel_y = -32 }, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/obj/effect/mapping_helpers/airlock/access/any/engineering/ce, -/turf/open/floor/iron/dark/diagonal, -/area/centcom/central_command_areas/evacuation) +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/centcom/syndicate_mothership/control) "DL" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/evacuation/ship) -"DQ" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 +"DM" = ( +/obj/machinery/door/window{ + dir = 8 }, -/turf/open/floor/iron/dark/diagonal, -/area/centcom/central_command_areas/evacuation) -"DS" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/basic/butterfly, -/turf/open/indestructible/dark, -/area/centcom/central_command_areas/prison/cells) -"DV" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +/turf/open/floor/carpet/purple, +/area/centcom/central_command_areas/admin) +"DN" = ( +/obj/structure/table/glass/plasmaglass, +/obj/item/stack/sheet/mineral/plasma{ + pixel_y = 15 }, -/obj/effect/turf_decal/tile/green{ - dir = 8 +/obj/item/grenade/chem_grenade, +/obj/item/stack/cable_coil, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 8; + pixel_y = 14 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"DW" = ( +/obj/machinery/light/cold/directional/west, +/obj/item/stack/cable_coil, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"DO" = ( /obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"Eg" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/airlock/public/glass{ - name = "ThunderDome" + icon_state = "plant-22"; + pixel_x = -4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"Ei" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/green{ - dir = 8 +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"Eq" = ( -/obj/structure/chair/stool/bar/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/carpet/red, -/area/centcom/central_command_areas/evacuation/ship) -"Ew" = ( -/obj/effect/turf_decal/siding/wideplating_new/dark{ +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"DP" = ( +/obj/machinery/vending/wardrobe/cargo_wardrobe, +/obj/effect/turf_decal/siding/dark/end{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/full, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/obj/item/kirbyplants, -/turf/open/floor/iron/dark/textured_large, -/area/centcom/central_command_areas/evacuation/ship) -"Ey" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 +/turf/open/floor/iron/dark/side{ + dir = 6 }, -/obj/item/storage/cans/sixsoda, -/obj/structure/closet/crate/freezer, -/obj/effect/spawner/random/food_or_drink/pizzaparty, -/obj/effect/spawner/random/food_or_drink/pizzaparty, -/obj/effect/spawner/random/medical/memeorgans, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/centcom/central_command_areas/fore) -"Ez" = ( +/area/centcom/central_command_areas/hall) +"DQ" = ( +/obj/machinery/light/floor/has_bulb, /obj/structure/table/reinforced, -/obj/item/restraints/handcuffs/cable/zipties, -/obj/item/assembly/flash/handheld, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/lighter{ + pixel_y = 9; + pixel_x = -8 + }, +/obj/item/lighter/skull{ + pixel_y = -6; + pixel_x = 11 + }, +/turf/open/floor/stone, +/area/centcom/central_command_areas/admin_hangout) +"DR" = ( +/obj/structure/railing/wood{ + dir = 1 + }, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/ghost_spawn) +"DS" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"DU" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"DX" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/obj/effect/turf_decal/siding/dark/corner, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"DY" = ( +/obj/structure/closet/secure_closet/ert_engi, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/fireaxecabinet/directional/north, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) +"DZ" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/borbop) +"Eb" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/storage/box/cups, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/mineral/titanium/white, +/area/centcom/central_command_areas/admin) +"Ec" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"Ee" = ( +/obj/structure/chair/wood/wings{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/centcom/wizard_station) +"Eg" = ( +/obj/machinery/door/airlock{ + icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; + name = "Break Room" + }, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"Eh" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/borbop) +"Ei" = ( +/obj/machinery/door/airlock/titanium{ + name = "Restroom" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/catwalk_floor/titanium, +/area/centcom/syndicate_mothership/control) +"Ek" = ( +/obj/item/toy/figure/syndie, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"El" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"Em" = ( +/obj/structure/chair/comfy/carp{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"En" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/prison/cells) +"Eo" = ( +/obj/structure/railing/wood{ + dir = 4 + }, +/obj/structure/railing/wood, +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"Ep" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"Eq" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/carpet/red, +/area/centcom/central_command_areas/evacuation/ship) +"Er" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/machinery/vending/cola/black, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"Es" = ( +/obj/item/toy/plush/lizard_plushie/green{ + name = "Spots-The-Operative" + }, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) +"Eu" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/blood/gibs/body, +/turf/open/floor/grass, +/area/centcom/wizard_station) +"Ev" = ( +/obj/structure/chair/sofa/corp/right, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) +"Ew" = ( +/obj/effect/turf_decal/siding/wideplating_new/dark{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/full, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/west, +/obj/item/kirbyplants, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/central_command_areas/evacuation/ship) +"Ex" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/hall) +"Ey" = ( +/obj/structure/railing/wood{ + dir = 8 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/mob/living/basic/cow, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"Ez" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/hedge, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) +"EA" = ( +/obj/machinery/computer/records/security/laptop, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/machinery/light/directional/north, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/area/centcom/central_command_areas/admin) +"EC" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/hedge, +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/obj/effect/turf_decal/siding/dark/corner, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/borbop) "ED" = ( -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/structure/railing/wood{ + dir = 8 + }, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin_hangout) +"EE" = ( +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"EF" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/door/airlock/public/glass{ + name = "Cafeteria" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/smooth_half{ + dir = 4 + }, +/area/centcom/syndicate_mothership/control) +"EG" = ( +/obj/effect/turf_decal/siding/green{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/botany) "EH" = ( /obj/machinery/door/window{ dir = 8 @@ -7494,23 +10378,19 @@ }, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/evacuation/ship) -"EJ" = ( -/obj/structure/chair/comfy/brown{ - color = "#596479"; - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump{ - dir = 8 +"EI" = ( +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" }, -/turf/open/floor/iron/grimy, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) +"EJ" = ( +/obj/effect/spawner/random/trash/garbage, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/plating, /area/centcom/central_command_areas/admin) -"EK" = ( -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/obj/structure/table/reinforced, -/obj/effect/spawner/random/bureaucracy/paper, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) "EL" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 4 @@ -7525,6 +10405,12 @@ }, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) +"EM" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "EN" = ( /obj/structure/flora/bush/sparsegrass, /obj/machinery/light/directional/south, @@ -7542,17 +10428,51 @@ /obj/effect/spawner/random/exotic/antag_gear, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) -"ET" = ( -/obj/machinery/newscaster/directional/west, -/obj/structure/window/reinforced/tinted/frosted{ +"EP" = ( +/obj/structure/table/wood/fancy/royalblack, +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"EQ" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/chair/sofa/corp/left, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) +"ER" = ( +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/structure/table/reinforced, +/obj/item/knife, +/obj/item/knife, +/obj/item/kitchen/rollingpin, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/kitchen) +"ES" = ( +/obj/effect/turf_decal/siding/green, +/obj/effect/turf_decal/siding/green/corner{ + dir = 4 + }, +/obj/structure/railing/wood, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) +"ET" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"EU" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/hedge, +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/obj/effect/turf_decal/siding/dark/corner{ dir = 8 }, -/obj/machinery/vending/coffee, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/borbop) "EV" = ( /obj/structure/table/wood, /obj/machinery/microwave{ @@ -7567,37 +10487,57 @@ }, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/evacuation/ship) -"EW" = ( -/obj/machinery/door/airlock/centcom{ - name = "CentCom Supplypod Loading" +"EY" = ( +/obj/structure/chair{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, +/obj/machinery/light/directional/south, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supplypod) +/area/centcom/central_command_areas/firing_range_checkpoint_control) "EZ" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/three) +"Fa" = ( +/obj/structure/railing/wrestling, +/obj/structure/railing/wrestling{ + dir = 4 + }, +/turf/open/floor/iron/smooth_large{ + icon = 'goon/icons/turf/floors.dmi'; + icon_state = "boxing" + }, +/area/centcom/central_command_areas/hall) "Fb" = ( -/obj/machinery/vending/boozeomat, -/turf/closed/indestructible/riveted, -/area/centcom/tdome/administration) +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/structure/table/wood/fancy/royalblue, +/obj/effect/spawner/random/decoration/statue{ + spawn_loot_chance = 50 + }, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "Fc" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/obj/effect/turf_decal/siding/wideplating{ + dir = 6 + }, +/obj/machinery/camera/autoname/directional/south{ + network = list("nukie") + }, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) +"Fd" = ( +/obj/structure/weightmachine/weightlifter, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "Fe" = ( -/obj/structure/sink/directional/west, -/obj/structure/mirror/directional/east, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/evacuation) "Ff" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 @@ -7605,75 +10545,108 @@ /turf/open/floor/carpet/red, /area/centcom/central_command_areas/evacuation/ship) "Fg" = ( -/obj/structure/closet/crate/bin, -/obj/machinery/status_display/evac/directional/south, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 8 +/obj/machinery/light/floor/has_bulb, +/obj/machinery/hydroponics/constructable/helper, +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"Fh" = ( +/obj/structure/chair/sofa/corp{ + dir = 4; + pixel_x = -4 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin_hangout) "Fi" = ( /obj/effect/landmark/basketball/game_area, /turf/open/space/basic, /area/space) -"Fj" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"Fl" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"Fm" = ( +/obj/structure/table/reinforced/plastitaniumglass{ + name = "Andrea's Desk" }, -/obj/machinery/door/airlock/centcom{ - name = "Thunderdome VIP" +/obj/item/banhammer{ + desc = "A terrible weapon that has seen countless use over the ages. This one appears to have taken a beating."; + force = -10 }, -/obj/effect/mapping_helpers/airlock/access/any/command/general, -/turf/open/floor/iron, -/area/centcom/tdome/administration) -"Fk" = ( -/obj/machinery/vending/cola, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) +"Fn" = ( +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/firing_range) "Fo" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/directions/engineering{ - desc = "A sign that shows there are doors here. There are doors everywhere!"; - icon_state = "doors"; - name = "WARNING: BLAST DOORS" - }, -/turf/open/floor/plating, -/area/centcom/central_command_areas/prison) +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/vending/wardrobe/law_wardrobe, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) "Fq" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/control) -"Fs" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/obj/machinery/door/airlock/glass_large{ - name = "Thunderdome Administration" +/obj/machinery/light/directional/south, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"Fr" = ( +/obj/machinery/camera/autoname/directional/north{ + network = list("nukie") }, -/turf/open/floor/iron, -/area/centcom/tdome/administration) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/syndicate_mothership/control) +"Fs" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/control) "Ft" = ( -/turf/closed/indestructible/fakeglass, -/area/centcom/central_command_areas/evacuation) +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) "Fv" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/public/glass{ - name = "CentCom" +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/structure/table/reinforced, +/obj/machinery/processor{ + pixel_y = 8 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) -"Fx" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 4; - pixel_x = -4 +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/kitchen) +"Fw" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/door/puzzle/keycard/syndicate_fridge, +/turf/open/floor/iron/smooth_half{ + dir = 4 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/area/centcom/syndicate_mothership/expansion_fridgerummage) +"Fx" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/centcom_teleporter/spawn_area, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) +"Fz" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership) +"FA" = ( +/obj/structure/flora/bush/large/style_3, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) "FB" = ( /obj/structure/table/reinforced, /obj/item/storage/box/syringes, @@ -7684,10 +10657,19 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) +"FC" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/machinery/processor/slime, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "FD" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/centcom/tdome/administration) +/obj/structure/railing/wood{ + dir = 1 + }, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/evacuation) "FE" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 8 @@ -7703,16 +10685,66 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) +"FF" = ( +/obj/structure/railing/wood, +/obj/structure/table/reinforced, +/obj/item/storage/medkit/fire{ + pixel_y = 5; + pixel_x = -4 + }, +/obj/item/storage/medkit/brute, +/obj/item/storage/medkit/regular{ + pixel_x = -7 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) +"FH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/evacuation) +"FI" = ( +/obj/structure/filingcabinet/filingcabinet, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) +"FJ" = ( +/obj/structure/table/reinforced/plastitaniumglass{ + name = "Andrea's Desk" + }, +/obj/machinery/fax{ + fax_name = "Andrea's Desk"; + name = "Andrea's Fax Machine" + }, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) "FK" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/trimline/dark_red/filled/line, -/obj/effect/turf_decal/trimline/dark_red/line{ +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"FL" = ( +/obj/structure/railing/wood{ dir = 1 }, -/turf/open/floor/iron/smooth_half{ - dir = 4 +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/evacuation) +"FM" = ( +/obj/structure/railing/wood, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/evacuation) +"FN" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" }, -/area/centcom/central_command_areas/prison) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "FO" = ( /obj/structure/table/reinforced, /obj/item/computer_disk/quartermaster, @@ -7724,6 +10756,43 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) +"FP" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"FS" = ( +/obj/machinery/computer/records/medical/laptop{ + dir = 4 + }, +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/circuit/telecomms, +/area/centcom/central_command_areas/admin) +"FT" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/folder, +/obj/effect/spawner/random/bureaucracy/folder, +/obj/effect/spawner/random/bureaucracy/folder, +/obj/effect/spawner/random/bureaucracy/folder, +/obj/effect/spawner/random/bureaucracy/folder, +/obj/item/hand_labeler, +/obj/item/pen, +/obj/structure/window/plasma/spawner/directional/west, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) +"FV" = ( +/obj/structure/closet/crate/freezer/blood, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) "FW" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/entertainment/money_small, @@ -7738,12 +10807,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/ferry) +"FY" = ( +/obj/effect/turf_decal/siding/green{ + dir = 4 + }, +/obj/machinery/vending/hydronutrients, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) "FZ" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 +/obj/structure/railing/wood{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin_hangout) "Ga" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/security_space_law, @@ -7751,27 +10827,48 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/ferry) -"Gc" = ( -/obj/effect/turf_decal/stripes/line{ +"Gb" = ( +/obj/machinery/modular_computer/console/preset/id/centcom{ dir = 4 }, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ +/turf/open/floor/circuit/telecomms, +/area/centcom/central_command_areas/admin) +"Gd" = ( +/obj/structure/centcom_item_spawner/gun_and_ammo_creator, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range) +"Ge" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/turf_decal/siding/wood{ dir = 4 }, -/obj/effect/turf_decal/trimline/dark_red/line{ +/obj/machinery/light/directional/south, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin) +"Gf" = ( +/obj/structure/table/wood, +/obj/item/stack/medical/bruise_pack, +/obj/item/stack/medical/ointment, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"Gg" = ( +/obj/effect/turf_decal/siding/wood{ dir = 8 }, -/turf/open/floor/iron/smooth_half{ - dir = 1 +/obj/machinery/light/directional/west, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/firing_range) +"Gh" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 }, -/area/centcom/central_command_areas/prison) -"Gf" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump{ +/obj/effect/turf_decal/siding/wood/corner{ dir = 8 }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "Gi" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/rack, @@ -7795,131 +10892,300 @@ /turf/open/floor/iron/white, /area/centcom/central_command_areas/evacuation/ship) "Gj" = ( -/obj/machinery/light/directional/north, -/obj/machinery/vending/hydroseeds{ - default_price = 0; - extra_price = 0 +/obj/structure/sink/kitchen/directional/west, +/obj/item/reagent_containers/cup/bucket, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/syndicate_mothership/control) +"Gk" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 }, -/turf/open/floor/wood, -/area/centcom/tdome/observation) -"Gs" = ( -/obj/machinery/power/smes/magical, -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) -"Gy" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +/obj/effect/turf_decal/siding/purple, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"Gl" = ( +/obj/structure/flora/grass/both/style_random, +/obj/structure/flora/rock/icy/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"Gm" = ( +/obj/structure/railing/wood{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) -"GA" = ( -/turf/closed/indestructible/fakeglass, -/area/centcom/central_command_areas/ferry) -"GB" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/plasteel{ - amount = 15 +/obj/structure/railing/wood{ + dir = 8 }, -/obj/item/stack/sheet/rglass{ - amount = 50; - pixel_x = 2; - pixel_y = -2 +/obj/machinery/media/jukebox, +/obj/structure/railing/wood{ + dir = 4 }, -/obj/item/stack/rods/fifty, -/obj/item/stack/cable_coil, -/obj/item/screwdriver/power, -/obj/structure/cable, -/obj/item/storage/belt/utility/chief/full{ - name = "Central Command Engineer's toolbelt" +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/borbop) +"Gn" = ( +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) -"GC" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) +"Go" = ( +/obj/machinery/computer/camera_advanced{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/turf/open/floor/wood, +/area/centcom/wizard_station) +"Gp" = ( +/obj/structure/chair/wood{ dir = 8 }, -/obj/machinery/door/airlock/security/glass{ - name = "Central Command Brig" +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/borbop) +"Gq" = ( +/obj/structure/fans/tiny/invisible, +/turf/open/floor/plating, +/area/centcom/central_command_areas/admin) +"Gr" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 4 + }, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) +"Gt" = ( +/obj/machinery/door/airlock/centcom{ + name = "Trapp's Office" }, -/obj/effect/mapping_helpers/airlock/access/any/security/entrance, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/obj/effect/mapping_helpers/airlock/access/any/service/lawyer, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) -"GE" = ( -/turf/open/floor/iron/tgmcemblem/center{ - dir = 8 +/obj/effect/mapping_helpers/airlock/access/any/admin/captain, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) +"Gu" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 9 }, -/area/centcom/central_command_areas/prison) -"GJ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/directions/engineering{ - desc = "A sign that shows there are doors here. There are doors everywhere!"; - icon_state = "doors"; - name = "WARNING: BLAST DOORS" +/obj/effect/turf_decal/siding/dark/corner, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/borbop) +"Gv" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 6 }, -/turf/open/floor/plating, -/area/centcom/central_command_areas/evacuation) -"GL" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/effect/turf_decal/siding/dark/corner{ + dir = 1 }, -/obj/item/clothing/head/costume/festive{ - pixel_x = -4; - pixel_y = 6 +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) +"Gw" = ( +/obj/structure/railing{ + dir = 1 }, -/obj/effect/spawner/random/bureaucracy/briefcase, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) -"GM" = ( -/obj/effect/turf_decal/siding/wideplating/dark/corner{ +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"Gx" = ( +/obj/effect/turf_decal/siding/wideplating{ dir = 1 }, -/obj/effect/turf_decal/siding/wideplating/dark/corner{ - dir = 8 +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 }, -/obj/effect/turf_decal/siding/wideplating/dark{ +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/smooth_half{ dir = 4 }, -/turf/open/floor/wood, -/area/centcom/central_command_areas/fore) -"GT" = ( +/area/centcom/syndicate_mothership/control) +"Gy" = ( +/obj/item/gun/energy/ionrifle, +/obj/structure/rack, +/obj/machinery/camera/autoname/directional/west{ + network = list("nukie") + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) +"Gz" = ( +/obj/machinery/computer/auxiliary_base/directional/north, /obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"GV" = ( +/obj/item/clipboard, +/obj/item/folder/yellow, +/obj/item/pen/red, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/warning{ - dir = 8 - }, /turf/open/floor/iron/dark, -/area/centcom/tdome/administration) -"Ha" = ( +/area/centcom/central_command_areas/supply) +"GA" = ( +/turf/closed/indestructible/fakeglass, +/area/centcom/central_command_areas/ferry) +"GB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/fun_police{ + pixel_x = -32 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"GC" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"GE" = ( +/obj/structure/chair/stool/directional/north, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) +"GF" = ( /obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen/fourcolor, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/food/nachos{ + pixel_x = 7; + pixel_y = -14 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"GG" = ( +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/expansion_fridgerummage) +"GI" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/vending/autodrobe/all_access, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) +"GJ" = ( +/turf/open/floor/stone, +/area/centcom/central_command_areas/hall) +"GK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"GL" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/item/clothing/head/costume/festive{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/effect/spawner/random/bureaucracy/briefcase, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supply) +"GM" = ( +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range_checkpoint_control) +"GN" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/kitchen) +"GO" = ( +/obj/machinery/computer/records/security{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) +"GP" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/bureaucracy/stamp, +/obj/effect/spawner/random/bureaucracy/stamp, +/obj/effect/spawner/random/bureaucracy/stamp, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supply) +"GQ" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/storage/box/donkpockets, +/obj/item/storage/box/donkpockets/donkpocketberry, +/obj/item/storage/box/donkpockets/donkpockethonk, +/obj/item/storage/box/donkpockets/donkpocketpizza, +/obj/item/storage/box/donkpockets/donkpocketspicy, +/obj/item/storage/box/donkpockets/donkpocketteriyaki, +/obj/item/storage/fancy/cigarettes/cigars/havana, +/obj/item/storage/fancy/cigarettes/cigars/havana, +/obj/item/storage/fancy/cigarettes/cigpack_robustgold, +/obj/item/storage/fancy/cigarettes/cigpack_robustgold, +/obj/effect/spawner/random/special_lighter, +/obj/effect/spawner/random/special_lighter, +/turf/open/floor/carpet/executive, +/area/centcom/central_command_areas/admin) +"GR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/machinery/hydroponics/constructable{ + self_growing = 1; + self_sustaining = 1; + sustaining_precent = 100; + multi = 15 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) +"GS" = ( +/obj/structure/chair/sofa/corp, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) +"GT" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/light/directional/west, +/obj/item/reagent_containers/cup/glass/shaker, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"GV" = ( +/obj/structure/mop_bucket, +/obj/item/mop, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/syndicate_mothership/control) +"GW" = ( +/turf/open/floor/carpet, +/area/centcom/central_command_areas/admin_hangout) +"GX" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) +"GY" = ( +/obj/structure/table/wood/fancy/purple, +/obj/machinery/fax{ + name = "Trapp's Fax Machine"; + fax_name = "Trapp's Office" + }, +/turf/open/floor/plating/abductor, +/area/centcom/central_command_areas/admin) +"GZ" = ( +/obj/machinery/door/airlock/centcom{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/admin/captain, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/area/centcom/central_command_areas/admin) +"Ha" = ( +/obj/machinery/door/airlock/external/ruin, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "Hb" = ( /obj/machinery/power/port_gen/pacman, /obj/structure/cable, @@ -7928,23 +11194,61 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/smooth_edge, /area/centcom/central_command_areas/evacuation/ship) +"Hc" = ( +/obj/structure/closet, +/obj/item/food/cake/birthday{ + name = "70th Cake"; + desc = "When no one was looking, Vicky Hudson stole 70 cakes, that is as many as seven tens and that's terrible." + }, +/obj/item/dice/d6, +/obj/item/dice/d6, +/turf/open/floor/circuit/telecomms, +/area/centcom/central_command_areas/admin) +"He" = ( +/obj/structure/table/wood, +/obj/item/toy/plush/lizard_plushie, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/admin) "Hf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/structure/window/reinforced/survival_pod/spawner/directional/east, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 6 }, -/obj/effect/turf_decal/trimline/blue/filled/line{ +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"Hg" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/purple, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"Hh" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ dir = 8 }, -/obj/structure/injured_spawner, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"Hj" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/machinery/door/airlock/highsecurity{ + name = "Sky Bridge" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/textured_large, +/area/centcom/syndicate_mothership/control) +"Hi" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) +"Hk" = ( +/obj/effect/turf_decal/loading_area{ dir = 4 }, +/obj/structure/fake_stairs/wood/directional/east, /turf/open/floor/iron, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/supply) "Hl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 @@ -7954,64 +11258,120 @@ /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) "Hm" = ( -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/ferny/style_random, -/turf/open/floor/iron{ - icon_state = "asteroid5"; - name = "plating" +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 }, -/area/centcom/tdome/observation) -"Hn" = ( -/obj/machinery/vending/wallmed/directional/east, -/obj/effect/turf_decal/trimline/blue/filled/warning{ +/obj/effect/turf_decal/siding/wood{ dir = 5 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/structure/sign/warning/yes_smoking/circle/directional/north, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"Hn" = ( +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) "Ho" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/centcom{ - name = "CentCom" +/obj/effect/turf_decal/siding/dark{ + dir = 9 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/turf/open/floor/iron/smooth_large{ + icon = 'goon/icons/turf/floors.dmi'; + icon_state = "boxing" }, -/obj/effect/mapping_helpers/airlock/access/any/security/armory, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/area/centcom/central_command_areas/admin) +"Hp" = ( +/obj/machinery/modular_computer/console/preset/id/centcom{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) +"Hr" = ( +/obj/structure/chair/sofa/corp{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/tdome/observation) "Hs" = ( -/obj/machinery/door/airlock/centcom{ - name = "CentCom Security" +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 }, -/obj/effect/turf_decal/stripes/line{ +/turf/open/misc/ice/icemoon, +/area/centcom/syndicate_mothership/control) +"Ht" = ( +/obj/effect/turf_decal/siding/wood{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 +/turf/open/floor/wood/large, +/area/centcom/tdome/observation) +"Hu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/obj/effect/mapping_helpers/airlock/access/any/security, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) -"Hv" = ( -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/courtroom) +/obj/machinery/smartfridge, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) "Hw" = ( -/turf/open/floor/glass/reinforced/plasma, -/area/centcom/central_command_areas/evacuation) -"Hz" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/admin) -"HE" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/pale/style_random, -/turf/open/floor/grass, -/area/centcom/central_command_areas/control) +"Hx" = ( +/obj/structure/fence/cut/large, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"Hy" = ( +/obj/structure/window/plasma/spawner/directional/north, +/obj/structure/window/plasma/spawner/directional/east, +/turf/open/indestructible/hotelwood, +/area/centcom/central_command_areas/admin) +"Hz" = ( +/obj/structure/table/wood, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"HA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"HB" = ( +/obj/structure/table/wood/fancy/black, +/obj/machinery/light/floor/has_bulb, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 2; + pixel_x = -6 + }, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/borbop) +"HC" = ( +/obj/machinery/chem_master, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"HD" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/borbop) +"HF" = ( +/obj/structure/flora/rock/icy/style_random, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "HG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 @@ -8020,19 +11380,19 @@ /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/evacuation/ship) "HH" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "HI" = ( -/obj/machinery/stasis, -/obj/structure/window/reinforced/tinted/frosted{ +/obj/effect/turf_decal/siding/blue, +/obj/effect/turf_decal/siding/blue/corner{ dir = 4 }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/structure/railing/wood, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) "HJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -8041,6 +11401,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/stone, /area/centcom/central_command_areas/evacuation/ship) +"HK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "HL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -8048,6 +11417,44 @@ }, /turf/open/floor/stone, /area/centcom/central_command_areas/evacuation/ship) +"HM" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/flora/bush/large/style_3, +/obj/structure/railing/wood, +/obj/structure/railing/wood{ + dir = 1 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/admin_hangout) +"HN" = ( +/obj/structure/railing/wood, +/obj/structure/railing/wood{ + dir = 4 + }, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin_hangout) +"HO" = ( +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/centcom/syndicate_mothership/control) +"HP" = ( +/obj/structure/hedge, +/obj/structure/railing/wood, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"HQ" = ( +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/admin) "HR" = ( /obj/structure/bed/roller, /obj/machinery/iv_drip, @@ -8055,6 +11462,46 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/white, /area/centcom/central_command_areas/evacuation/ship) +"HS" = ( +/obj/structure/fake_stairs/wood/directional/south, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"HT" = ( +/obj/structure/table/reinforced/plastitaniumglass{ + name = "Andrea's Desk" + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/admin_hangout) +"HU" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"HV" = ( +/obj/structure/barricade/sandbags, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"HW" = ( +/obj/effect/turf_decal/siding/blue/corner, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/medical) +"HX" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"HY" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/security/telescreen, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) "HZ" = ( /obj/structure/railing{ dir = 6; @@ -8070,47 +11517,87 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) -"Id" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -8; - pixel_y = 5 +"Ia" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 9 }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = -8 +/obj/machinery/smartfridge/chemistry/preloaded, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) +"Ib" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 5 }, -/obj/item/reagent_containers/cup/glass/mug/britcup, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"Ie" = ( -/obj/structure/sign/poster/contraband/syndicate_recruitment, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/admin) -"If" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/medical) +"Ic" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 5 }, -/obj/effect/turf_decal/trimline/dark_red/filled/corner{ - dir = 4 +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/effect/turf_decal/tile/orange/diagonal_edge, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) +"Id" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 6 }, -/obj/effect/turf_decal/trimline/dark_red/line{ - dir = 10 +/turf/open/floor/iron/smooth_large{ + icon = 'goon/icons/turf/floors.dmi'; + icon_state = "boxing" }, -/turf/open/floor/iron/smooth_corner{ - dir = 4 +/area/centcom/central_command_areas/admin) +"If" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/landmark/start/nukeop, +/obj/structure/sign/poster/contraband/donk_co{ + pixel_y = -32 }, -/area/centcom/central_command_areas/prison) +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) +"Ig" = ( +/obj/structure/dresser, +/obj/item/storage/backpack/satchel, +/turf/open/floor/carpet, +/area/centcom/wizard_station) "Ih" = ( /turf/closed/indestructible/fakeglass, /area/centcom/central_command_areas/supply) -"Im" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 +"Ij" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/table/glass, +/obj/machinery/light/floor/has_bulb, +/obj/item/reagent_containers/cup/glass/mug/nanotrasen{ + pixel_y = -1; + pixel_x = 10 + }, +/obj/item/reagent_containers/cup/glass/mug/britcup{ + pixel_y = 7; + pixel_x = -7 }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/centcom/central_command_areas/fore) +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/borbop) +"Ik" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/vending/wardrobe/robo_wardrobe, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) +"Il" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"Im" = ( +/obj/item/coin/antagtoken, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/centcom/wizard_station) +"In" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/turf/open/floor/circuit/telecomms, +/area/centcom/central_command_areas/admin) "Io" = ( /obj/docking_port/stationary{ dir = 8; @@ -8127,6 +11614,9 @@ /obj/structure/chair/stool/bar/directional/east, /turf/open/floor/carpet/red, /area/centcom/central_command_areas/evacuation/ship) +"Iq" = ( +/turf/closed/indestructible/opsglass, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "Ir" = ( /obj/machinery/computer/emergency_shuttle{ dir = 1 @@ -8146,6 +11636,11 @@ "It" = ( /turf/open/indestructible/event/plating, /area/centcom/tdome/arena/actual) +"Iu" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "Iv" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -8155,18 +11650,63 @@ }, /turf/open/floor/stone, /area/centcom/central_command_areas/evacuation/ship) +"Iw" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space/basic, +/area/space/nearstation) +"Iy" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/borbop) +"Iz" = ( +/obj/structure/flora/rock/pile/style_random, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"IB" = ( +/obj/structure/closet, +/obj/structure/window/plasma/spawner/directional/east, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) +"IC" = ( +/turf/open/floor/iron/dark/textured_half{ + dir = 8 + }, +/area/centcom/syndicate_mothership/control) +"ID" = ( +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin) "IE" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, /turf/open/indestructible/event/plating, /area/centcom/tdome/arena/actual) -"IH" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 +"IF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/structure/closet/secure_closet/hydroponics{ + locked = 0 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) +"IG" = ( +/obj/structure/railing/wrestling, +/obj/structure/railing/wrestling{ + dir = 8 + }, +/turf/open/floor/iron/smooth_large{ + icon = 'goon/icons/turf/floors.dmi'; + icon_state = "boxing" + }, +/area/centcom/central_command_areas/hall) +"II" = ( +/obj/structure/railing/wood, +/obj/structure/fake_stairs/wood/directional/east, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) "IJ" = ( /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 @@ -8181,107 +11721,291 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) -"IP" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Kitchen" +"IL" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 9 }, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "cafe_counter"; - name = "Kitchen Counter Shutters" +/turf/open/floor/carpet, +/area/centcom/central_command_areas/hall) +"IM" = ( +/obj/effect/turf_decal/trimline/green/line, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"IN" = ( +/obj/structure/chair/wood{ + dir = 4 }, -/turf/open/floor/iron/kitchen/herringbone, -/area/centcom/central_command_areas/fore) -"IX" = ( -/obj/machinery/door/firedoor, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"IO" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"IP" = ( /obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/mineral/titanium/tiled/blue, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"IQ" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 }, -/obj/structure/sign/painting/library{ - pixel_y = -32 +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"IY" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line, -/obj/structure/sign/painting/library_secure{ - pixel_y = -32 +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"IR" = ( +/obj/structure/table/wood/fancy/royalblack, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"IS" = ( +/obj/machinery/door/poddoor/shutters/indestructible/preopen, +/turf/closed/indestructible/fakeglass, +/area/centcom/central_command_areas/admin) +"IT" = ( +/obj/effect/turf_decal/stripes/box, +/obj/machinery/portable_atmospherics/pump/lil_pump{ + desc = "A betrayer to pump-kind." + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"IU" = ( +/turf/open/floor/mineral/titanium/white, +/area/centcom/central_command_areas/admin) +"IV" = ( +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/kitchen) +"IW" = ( +/obj/machinery/door/airlock/centcom{ + dir = 4; + name = "Borbop's Office" }, +/obj/effect/mapping_helpers/airlock/access/any/admin/captain, /turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/area/centcom/central_command_areas/admin) +"IX" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"IY" = ( +/obj/effect/baseturf_helper/asteroid/snow, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/control) +"IZ" = ( +/obj/structure/chair/wood, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/borbop) +"Ja" = ( +/obj/structure/chair/wood/wings{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/centcom/wizard_station) "Jb" = ( /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/prison/cells) -"Je" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/restaurant_portal/restaurant, +"Jc" = ( +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"Jd" = ( +/obj/structure/fake_stairs/wood/directional/north, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) +"Je" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 5 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) "Jf" = ( -/obj/structure/sign/poster/random/directional/west, -/obj/item/lazarus_injector{ - pixel_x = -1; - pixel_y = -4 +/obj/structure/sign/poster/contraband/syndiemoth{ + pixel_x = 32 }, -/obj/item/lazarus_injector{ - pixel_x = -1; - pixel_y = 7 +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"Jg" = ( +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/structure/table/reinforced, +/obj/item/pizzabox, +/obj/item/pizzabox{ + pixel_y = 3 }, -/obj/item/lazarus_injector{ - pixel_x = -1; - pixel_y = 4 +/obj/item/pizzabox{ + pixel_y = 6 }, -/obj/item/lazarus_injector{ - pixel_x = -1 +/obj/item/pizzabox{ + pixel_y = 9 }, -/obj/structure/table/reinforced/rglass, -/turf/open/floor/carpet/cyan, -/area/centcom/central_command_areas/control) -"Jg" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/centcom/central_command_areas/fore) +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/kitchen) "Jh" = ( /obj/effect/turf_decal/loading_area{ dir = 4 }, /turf/open/indestructible/event/plating, /area/centcom/tdome/arena/actual) +"Ji" = ( +/turf/open/floor/carpet/neon/simple/white, +/area/centcom/central_command_areas/admin) "Jk" = ( /obj/effect/turf_decal/loading_area{ dir = 8 }, /turf/open/indestructible/event/plating, /area/centcom/tdome/arena/actual) +"Jm" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/borbop) +"Jn" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"Jo" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/book/manual/wiki/security_space_law, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/mineral/titanium/white, +/area/centcom/central_command_areas/admin) +"Jp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin) "Jq" = ( /obj/machinery/camera/motion/thunderdome{ pixel_x = 10 }, /turf/open/indestructible/event/plating, /area/centcom/tdome/arena/actual) -"Jr" = ( -/mob/living/simple_animal/hostile/retaliate/clown{ - limb_destroyer = 1 - }, -/turf/open/ballpit, -/area/centcom/central_command_areas/fore) "Js" = ( -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/obj/structure/table/reinforced/plastitaniumglass{ + name = "Andrea's Desk" + }, +/obj/machinery/computer/security/wooden_tv, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/admin_hangout) "Jt" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/closet/syndicate/personal, +/obj/structure/sign/poster/contraband/lusty_xenomorph{ + pixel_y = 32 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/tile/red/full, +/turf/open/floor/iron/dark/textured_half{ + dir = 8 + }, +/area/centcom/syndicate_mothership/control) +"Ju" = ( +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"Jv" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/infinite, +/turf/open/floor/mineral/titanium/purple, +/area/centcom/central_command_areas/admin) +"Jw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"Jx" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"Jy" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/machinery/door/puzzle/keycard/syndicate_bio, +/obj/structure/fans/tiny, +/turf/open/floor/iron/smooth_half{ + dir = 4 + }, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"Jz" = ( +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/sign/warning/yes_smoking/circle/directional/north, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"JA" = ( +/obj/effect/turf_decal/siding/blue/end{ + dir = 8 + }, +/obj/structure/railing/wood, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) "JB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/machinery/gibber/autogibber, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"JC" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) +"JD" = ( +/obj/machinery/door/airlock{ + icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; + name = "Engine Room" + }, +/obj/structure/barricade/wooden, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "JE" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 4 @@ -8295,85 +12019,180 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) -"JH" = ( -/turf/open/indestructible/event/plating, -/area/centcom/tdome/observation) -"JI" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/toy/figure/mime, -/turf/open/indestructible/dark, -/area/centcom/central_command_areas/prison/cells) -"JJ" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/donut_box, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line, +"JF" = ( +/obj/machinery/hydroponics/constructable, /turf/open/floor/iron/dark, -/area/centcom/tdome/administration) -"JK" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/table/reinforced, -/obj/item/storage/medkit/tactical/premium{ - pixel_y = 2; - pixel_x = 1; - layer = 3.5 +/area/centcom/central_command_areas/botany) +"JG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, -/obj/item/storage/medkit/tactical/premium{ - pixel_y = -5; - pixel_x = 1 +/obj/structure/chair/wood{ + dir = 4 }, -/obj/item/storage/medkit/tactical/premium{ - pixel_y = -2; - pixel_x = 1 +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"JH" = ( +/obj/structure/fake_stairs/wood/directional/north, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"JI" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 }, -/obj/item/defibrillator/compact/combat/loaded/nanotrasen, -/obj/item/bodybag/bluespace, -/obj/item/bodybag/bluespace{ - pixel_y = 7 +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 }, -/obj/item/autosurgeon/medical_hud, -/obj/item/autosurgeon/medical_hud, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"JJ" = ( +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/structure/table/wood/fancy/royalblue, +/obj/structure/mannequin, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) +"JK" = ( +/obj/structure/fans/tiny/invisible, +/turf/open/chasm, +/area/centcom/central_command_areas/admin) +"JL" = ( +/obj/effect/turf_decal/siding/dark/corner{ + dir = 1 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"JT" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/siding/wood{ +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"JM" = ( +/obj/structure/railing/wood{ dir = 1 }, -/obj/machinery/light/directional/south, +/turf/open/floor/grass, +/area/centcom/central_command_areas/borbop) +"JN" = ( +/obj/structure/railing/wood, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation/ship) -"JV" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/beer{ +/area/centcom/central_command_areas/evacuation) +"JO" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/analyzer{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/item/pipe_dispenser{ + desc = "A device used to rapidly pipe things. This one has a curious abundance of warning labels."; + name = "Syndicate Rapid Pipe Dispenser (RPD)"; + pixel_y = -3 + }, +/obj/item/flamethrower/full, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"JP" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"JQ" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/paper_bin, +/obj/item/pen/fourcolor, +/obj/item/stamp, +/obj/item/stamp/denied, +/obj/item/stamp/void, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin) +"JR" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ dir = 8 }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"JS" = ( +/obj/structure/flora/tree/pine/style_random, +/obj/structure/flora/grass/both/style_random, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"JT" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/directional/south, /turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/evacuation/ship) +"JU" = ( +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"JV" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/hall) "JW" = ( /obj/structure/table/reinforced, /obj/item/storage/secure/briefcase, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"JX" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"JZ" = ( +/obj/machinery/smartfridge/chemistry/virology/preloaded, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"Ka" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/wood{ + dir = 4 + }, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "Kb" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted, -/obj/structure/table/reinforced, -/obj/effect/spawner/random/bureaucracy/folder, -/obj/effect/spawner/random/bureaucracy/pen, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/structure/railing/wood{ + dir = 1 + }, +/obj/structure/railing/wood{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"Kc" = ( +/turf/open/floor/mineral/titanium/purple, +/area/centcom/central_command_areas/admin) "Kd" = ( -/obj/effect/turf_decal/tile/red/opposingcorners, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ +/obj/effect/turf_decal/trimline/green/corner{ dir = 1 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/trimline/green{ + pixel_y = -16; + pixel_x = 16 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) "Ke" = ( /obj/item/clipboard, /obj/item/folder/red, @@ -8386,83 +12205,220 @@ /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/briefing) "Kf" = ( -/obj/machinery/door/airlock/centcom{ - name = "Administrative Storage" +/obj/effect/turf_decal/siding/red{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) +"Kg" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) +"Kh" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/effect/turf_decal/siding/dark/corner{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ +/obj/structure/sign/painting/large/library{ + dir = 1; + pixel_y = -65 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"Ki" = ( +/obj/machinery/modular_computer/console/preset/id/centcom{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) +"Kj" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) +"Kk" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair/wood{ dir = 8 }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/any/command/general, -/turf/open/floor/iron, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"Kl" = ( +/obj/effect/turf_decal/siding/green/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) +"Kn" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) +"Ko" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/admin) -"Kg" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ +"Kp" = ( +/obj/effect/turf_decal/siding/dark{ dir = 5 }, -/obj/item/storage/cans/sixsoda, -/obj/structure/closet/crate/freezer, -/obj/effect/spawner/random/food_or_drink/pizzaparty, -/obj/effect/spawner/random/food_or_drink/pizzaparty, -/obj/effect/spawner/random/food_or_drink/cake_ingredients, -/obj/effect/spawner/random/medical/memeorgans, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/centcom/central_command_areas/fore) -"Km" = ( -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/prison) -"Kq" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/siding/dark/corner{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 +/obj/structure/table/reinforced, +/obj/machinery/light/directional/north, +/obj/machinery/microwave, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) +"Kq" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 9 }, -/obj/machinery/door/airlock/public/glass{ - name = "CentCom" +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) +"Kr" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) +"Ks" = ( +/obj/structure/fluff/iced_abductor, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/admin_hangout) "Kt" = ( -/obj/structure/chair/comfy/teal{ - dir = 8 +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) +"Ku" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 10 }, -/obj/structure/sign/poster/quirk/crew/renault{ - pixel_y = -26 +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"Kv" = ( +/obj/item/clothing/shoes/sneakers/marisa, +/obj/item/clothing/suit/wizrobe/marisa, +/obj/item/clothing/head/wizard/marisa, +/obj/item/staff/broom, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"Kw" = ( +/obj/structure/chair/office{ + dir = 1 }, -/turf/open/floor/carpet/cyan, -/area/centcom/central_command_areas/control) +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) +"Kx" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/carpet/executive, +/area/centcom/central_command_areas/admin) "Ky" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/simple_animal/hostile/retaliate/clown{ - limb_destroyer = 1 +/obj/structure/railing/wood{ + dir = 1 }, -/turf/open/indestructible/dark, -/area/centcom/central_command_areas/prison/cells) +/obj/structure/railing/wood{ + dir = 4 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"Kz" = ( +/obj/structure/fluff/tram_rail, +/obj/structure/fluff/tram_rail{ + pixel_y = 17 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"KB" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin) "KC" = ( -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/wood, -/area/centcom/central_command_areas/courtroom) +/obj/structure/table/wood/fancy, +/obj/item/skub{ + pixel_y = 16 + }, +/turf/open/floor/iron/white, +/area/centcom/wizard_station) "KD" = ( -/obj/structure/chair{ - dir = 8 +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line, +/obj/structure/railing{ + dir = 1 }, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/courtroom) +/turf/open/floor/plating/snowed/icemoon, +/area/centcom/syndicate_mothership/control) +"KE" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 9 + }, +/obj/structure/table/glass/plasmaglass, +/obj/machinery/reagentgrinder{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = -7; + pixel_y = -8 + }, +/obj/item/reagent_containers/cup/beaker/cryoxadone{ + pixel_x = 9; + pixel_y = -7 + }, +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/obj/structure/sign/poster/contraband/kudzu{ + pixel_y = 32 + }, +/obj/item/reagent_containers/spray/plantbgone{ + pixel_x = 10; + pixel_y = 5 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "KF" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/one) +"KG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) "KH" = ( /turf/closed/wall/mineral/titanium, /area/centcom/central_command_areas/evacuation/ship) @@ -8482,6 +12438,28 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) +"KL" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/structure/closet/firecloset, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"KM" = ( +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin) +"KN" = ( +/obj/structure/chair/sofa/corp/left, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) "KO" = ( /obj/effect/turf_decal/siding/wideplating_new/dark/corner{ dir = 8 @@ -8512,12 +12490,14 @@ /turf/open/floor/plating, /area/centcom/central_command_areas/evacuation/ship) "KR" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/obj/effect/spawner/random/exotic/ripley, -/turf/open/floor/iron/recharge_floor, -/area/centcom/central_command_areas/supply) +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/obj/structure/flora/tree/dead/style_random, +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "KS" = ( /obj/docking_port/stationary{ dir = 4; @@ -8529,6 +12509,14 @@ }, /turf/open/space/basic, /area/space) +"KT" = ( +/obj/structure/closet/secure_closet/brig, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range_checkpoint_control) +"KU" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) "KV" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 4 @@ -8544,37 +12532,34 @@ /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) "KW" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/table/reinforced, -/obj/item/storage/backpack/duffelbag/med/surgery{ - pixel_y = 5 - }, -/obj/item/storage/backpack/duffelbag/med/surgery{ - pixel_y = 8 +/obj/machinery/camera/autoname/directional/south{ + network = list("nukie") }, -/obj/item/clothing/glasses/hud/health/night/science{ - pixel_x = 9; - pixel_y = -7 +/turf/open/floor/iron/dark/textured_half{ + dir = 8 }, -/obj/item/clothing/glasses/hud/health/sunglasses{ - pixel_y = 7; - pixel_x = 10 +/area/centcom/syndicate_mothership/control) +"KX" = ( +/obj/structure/railing{ + dir = 6; + layer = 3.1 }, -/obj/item/clothing/glasses/hud/health{ - pixel_y = 2; - pixel_x = 9 +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 }, -/obj/item/clothing/glasses/hud/health/night/meson{ - pixel_y = -6; - pixel_x = 8 +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"KY" = ( +/obj/structure/railing/wood, +/obj/structure/railing/wood{ + dir = 1 }, -/obj/item/defibrillator/compact/combat/loaded/nanotrasen, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 +/obj/structure/railing/wood{ + dir = 8 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/structure/fluff/arc, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin_hangout) "KZ" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -8584,6 +12569,21 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) +"La" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/flora/tree/jungle/small/style_3, +/obj/structure/railing/wood{ + dir = 1 + }, +/obj/structure/railing/wood, +/obj/structure/railing/wood{ + dir = 8 + }, +/obj/structure/railing/wood{ + dir = 4 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/borbop) "Lb" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/effect/turf_decal/tile/neutral/opposingcorners, @@ -8594,6 +12594,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation/ship) +"Lc" = ( +/obj/effect/turf_decal/siding/blue, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/medical) "Ld" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -8602,6 +12606,15 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) +"Le" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/red/corner{ + dir = 8 + }, +/obj/item/folder/red, +/obj/item/pen/red, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "Lf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 @@ -8610,6 +12623,18 @@ /obj/structure/marker_beacon/burgundy, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/evacuation/ship) +"Lg" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood, +/obj/structure/railing/wood{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin_hangout) +"Lh" = ( +/obj/structure/fake_stairs/wood/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/borbop) "Li" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/effect/turf_decal/tile/neutral/opposingcorners, @@ -8666,14 +12691,31 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) +"Lq" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/effect/turf_decal/tile/orange/diagonal_edge, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "Lr" = ( -/obj/machinery/button/door/directional/west{ - id = "cafe_counter"; - name = "Counter Shutters Control"; - pixel_y = 24 +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 6 + }, +/obj/machinery/camera/autoname/directional/east{ + network = list("nukie") + }, +/obj/machinery/chem_dispenser/mutagensaltpeter, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"Ls" = ( +/obj/machinery/biogenerator/admin, +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/turf/open/floor/iron/kitchen/herringbone, -/area/centcom/central_command_areas/fore) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) "Lt" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/centcom/central_command_areas/evacuation/ship) @@ -8691,10 +12733,27 @@ }, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) +"Lv" = ( +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) "Lw" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, /area/centcom/central_command_areas/evacuation/ship) +"Lx" = ( +/obj/effect/turf_decal/siding/green{ + dir = 9 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/botany) +"Ly" = ( +/obj/structure/table/wood, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "Lz" = ( /obj/structure/railing{ dir = 10; @@ -8753,6 +12812,13 @@ /obj/effect/turf_decal/tile/neutral/full, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) +"LE" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "LF" = ( /obj/structure/flora/grass/jungle/b/style_3, /turf/open/floor/grass, @@ -8779,6 +12845,13 @@ /obj/effect/decal/cleanable/glass, /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) +"LK" = ( +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"LL" = ( +/obj/machinery/vending/boozeomat, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/admin) "LM" = ( /obj/docking_port/stationary{ dir = 8; @@ -8837,14 +12910,15 @@ /turf/open/floor/carpet/red, /area/centcom/central_command_areas/evacuation/ship) "LS" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/basic/garden_gnome, -/turf/open/indestructible/dark, -/area/centcom/central_command_areas/prison/cells) +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "LT" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/centcom/central_command_areas/ghost_spawn) +/obj/structure/flora/tree/jungle/small/style_5, +/turf/open/floor/grass, +/area/centcom/central_command_areas/kitchen) "LU" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/computer/records/medical{ @@ -8863,86 +12937,222 @@ /obj/structure/speaking_tile, /turf/closed/mineral/ash_rock, /area/awaymission/errorroom) +"LY" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/table/wood/fancy/black, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "LZ" = ( -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) -"Mn" = ( -/obj/structure/table/wood/fancy/red, -/obj/effect/spawner/random/food_or_drink/pizzaparty, -/obj/mystery_box_item, -/turf/open/floor/iron/kitchen/diagonal, -/area/centcom/central_command_areas/fore) -"Mo" = ( -/obj/structure/bed, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/spawner/random/entertainment/plushie_delux, -/obj/item/bedsheet/centcom, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/closet/syndicate/personal, +/obj/structure/sign/poster/contraband/gorlex_recruitment{ + pixel_y = 32 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/red/full, +/turf/open/floor/iron/dark/textured_half{ + dir = 8 + }, +/area/centcom/syndicate_mothership/control) +"Ma" = ( +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) +"Mb" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) -"Mp" = ( -/obj/structure/table/wood, -/obj/machinery/recharger, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) -"Mr" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/light/directional/north, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) -"Ms" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ +"Mc" = ( +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin) +"Md" = ( +/obj/structure/railing{ + dir = 6; + layer = 3.1 + }, +/obj/effect/turf_decal/siding/dark{ dir = 1 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"Mt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"Mf" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) +"Mg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/turf_decal/siding/wood{ dir = 4 }, -/turf/open/floor/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"Mh" = ( +/obj/structure/chair/comfy/carp{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"Mi" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/obj/machinery/iv_drip, +/obj/item/reagent_containers/blood, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"Mj" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 5 + }, +/area/centcom/central_command_areas/hall) +"Mk" = ( +/obj/machinery/modular_computer/console/preset/id/centcom{ + dir = 4 + }, +/turf/open/floor/plating/abductor, /area/centcom/central_command_areas/admin) -"Mu" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, +"Ml" = ( +/obj/structure/hedge, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"Mm" = ( +/obj/structure/flora/bush/large/style_3, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"Mn" = ( +/obj/effect/turf_decal/siding/thinplating, +/obj/machinery/door/window/survival_pod{ + name = "Surgery"; + opacity = 1 + }, +/turf/open/floor/mineral/titanium/tiled/blue, +/area/centcom/syndicate_mothership/control) +"Mo" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, /area/centcom/tdome/observation) -"Mv" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"Mp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 }, -/turf/open/floor/iron, -/area/centcom/tdome/administration) -"Mw" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, +/turf/open/floor/wood/large, /area/centcom/tdome/observation) -"My" = ( -/obj/structure/chair/office{ +"Mq" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/plating/icemoon, +/area/centcom/syndicate_mothership/control) +"Mr" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ dir = 4 }, +/obj/machinery/door/airlock/highsecurity{ + name = "Sky Bridge" + }, /obj/structure/cable, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/textured_large, +/area/centcom/syndicate_mothership/control) +"Ms" = ( +/turf/closed/indestructible/riveted/uranium, +/area/centcom/wizard_station) +"Mt" = ( +/mob/living/simple_animal/bot/cleanbot/medbay, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) +"Mu" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/titanium{ + name = "Experiments Wing Decontamination" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"Mv" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"Mw" = ( +/obj/effect/turf_decal/trimline/red, +/obj/effect/turf_decal/trimline/red, +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/north{ + network = list("nukie") + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"Mx" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/chair/comfy/carp{ + dir = 8 + }, +/turf/open/floor/stone, +/area/centcom/central_command_areas/admin_hangout) +"My" = ( +/obj/structure/fake_stairs/wood/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "Mz" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/centcom/central_command_areas/prison) -"MA" = ( -/obj/structure/sign/directions/medical{ +/obj/machinery/microwave, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"MB" = ( +/obj/structure/hedge, +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/effect/turf_decal/siding/dark/corner{ dir = 1 }, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/control) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/borbop) "MC" = ( /obj/structure/flora/grass/jungle/b, /obj/effect/decal/cleanable/garbage{ @@ -8951,11 +13161,31 @@ }, /turf/open/floor/grass, /area/centcom/central_command_areas/evacuation/ship) +"MD" = ( +/obj/structure/railing/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"ME" = ( +/obj/structure/chair/comfy/shuttle{ + dir = 8 + }, +/turf/open/floor/circuit/telecomms, +/area/centcom/central_command_areas/admin) "MF" = ( -/obj/structure/fans/tiny, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/obj/structure/curtain/cloth/fancy, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/indestructible/event/plating, +/area/centcom/central_command_areas/kitchen) +"MG" = ( +/obj/structure/railing/wood, +/obj/structure/railing/wood{ + dir = 4 + }, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) "MH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 @@ -8965,18 +13195,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) -"MI" = ( -/obj/machinery/light/directional/north, -/obj/structure/table/wood, -/obj/structure/reagent_dispensers/beerkeg, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/line, -/obj/effect/spawner/random/food_or_drink/donkpockets, -/obj/effect/spawner/random/food_or_drink/refreshing_beverage, -/turf/open/floor/iron/dark/diagonal, -/area/centcom/central_command_areas/evacuation) "MJ" = ( /obj/structure/chair/office, /obj/effect/landmark/ert_spawn, @@ -8984,66 +13202,109 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) "MK" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"ML" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/area/centcom/central_command_areas/hall) +"ML" = ( +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/item/clothing/suit/wizrobe/red, +/obj/item/clothing/head/wizard/red, +/obj/item/staff, +/obj/item/clothing/shoes/sandal/magic, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "MM" = ( /obj/machinery/power/shuttle_engine/large, /turf/open/floor/plating, /area/centcom/central_command_areas/evacuation/ship) "MN" = ( +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"MO" = ( /obj/item/kirbyplants{ - icon_state = "plant-21" + icon_state = "plant-22"; + pixel_x = -4 }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"MQ" = ( -/obj/structure/closet/secure_closet/courtroom, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"MR" = ( -/obj/machinery/vending/boozeomat, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"MP" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/vending/wardrobe/engi_wardrobe, +/obj/machinery/light/floor/has_bulb, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) -"MS" = ( -/obj/machinery/shower/directional/west, -/obj/effect/turf_decal/tile/red{ +"MQ" = ( +/obj/machinery/vending/wardrobe/atmos_wardrobe, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/effect/turf_decal/siding/dark/corner{ dir = 4 }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) -"MT" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/flora/bush/generic/style_random, -/obj/machinery/light/directional/south, -/mob/living/basic/butterfly, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) +/turf/open/floor/iron/dark/side{ + dir = 10 + }, +/area/centcom/central_command_areas/hall) +"MR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1 + }, +/obj/machinery/airalarm/unlocked{ + dir = 8; + pixel_x = -24 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"MS" = ( +/obj/machinery/door/airlock{ + icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; + name = "Observation Deck" + }, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"MT" = ( +/obj/machinery/computer/camera_advanced/xenobio, +/obj/structure/noticeboard/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "MU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/firing_range) "MV" = ( -/obj/structure/chair{ - dir = 1 +/obj/effect/turf_decal/siding/thinplating{ + dir = 5 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table/reinforced/plasmarglass, +/obj/item/storage/backpack/duffelbag/med/surgery{ + pixel_y = -11 + }, +/obj/item/storage/belt/medical, +/turf/open/floor/mineral/titanium/tiled/blue, +/area/centcom/syndicate_mothership/control) +"MW" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/machinery/light/directional/west, +/obj/structure/railing/wood, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/area/centcom/central_command_areas/evacuation) "MX" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -9053,43 +13314,80 @@ /obj/structure/sign/nanotrasen, /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/briefing) +"MZ" = ( +/obj/structure/hedge, +/obj/structure/railing/wood, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) "Na" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line{ - dir = 1 - }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/indestructible/event/plating, +/area/centcom/central_command_areas/admin_hangout) +"Nb" = ( /turf/open/floor/iron/dark, -/area/centcom/tdome/administration) -"Ne" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/trophy/gold_cup, +/area/centcom/central_command_areas/medical) +"Nc" = ( +/obj/structure/chair/office{ + dir = 1; + name = "gamer chair" + }, /turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/admin) +"Nd" = ( +/obj/effect/turf_decal/siding/green, +/obj/structure/hedge, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) +"Ne" = ( +/obj/item/stack/sheet/mineral/sandbags, +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) +"Nf" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/wood/large, /area/centcom/tdome/observation) "Ng" = ( -/turf/open/floor/wood, -/area/centcom/central_command_areas/ghost_spawn) +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) "Nh" = ( -/obj/structure/table/wood, -/obj/item/storage/box/drinkingglasses, -/obj/item/reagent_containers/cup/glass/shaker, -/obj/item/lighter, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 }, -/obj/effect/turf_decal/trimline/yellow/corner, -/turf/open/floor/iron/dark/diagonal, -/area/centcom/central_command_areas/evacuation) +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/door/airlock/hatch{ + name = "Kitchen" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/smooth_half{ + dir = 4 + }, +/area/centcom/syndicate_mothership/control) +"Ni" = ( +/obj/effect/turf_decal/siding/dark/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"Nj" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/prison/cells) "Nk" = ( -/obj/structure/sign/poster/contraband/syndicate_pistol, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/admin) -"Nl" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ dir = 1 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) "Nm" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -9098,96 +13396,133 @@ /turf/open/floor/iron/white/textured, /area/centcom/central_command_areas/evacuation/ship) "Nn" = ( -/obj/structure/table/reinforced, -/obj/item/storage/lockbox/loyalty, -/obj/item/gun/ballistic/automatic/ar, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/storage/fancy/cigarettes/cigars/havana, +/obj/item/toy/plush/nukeplushie{ + name = "Sir Flash Nukedon"; + pixel_x = -2; + pixel_y = 14 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) +/area/centcom/syndicate_mothership/control) "Np" = ( -/obj/structure/bookcase/random, -/obj/structure/noticeboard/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/structure/chair/office, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "Nq" = ( -/obj/structure/chair/office{ - dir = 4 +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) -"Nr" = ( -/obj/structure/table/reinforced, -/obj/item/folder/red, -/obj/item/restraints/handcuffs, -/obj/item/assembly/flash/handheld, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/structure/hedge, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"Ns" = ( +/obj/structure/dresser, +/turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) "Nt" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/centcom/central_command_areas/ghost_spawn) +/obj/item/kirbyplants{ + icon_state = "plant-22"; + pixel_x = -4 + }, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"Nu" = ( +/obj/structure/rack, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/ducts/fifty, +/obj/item/wrench{ + desc = "A little smidgeon of Freon..."; + name = "Freon" + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"Nv" = ( +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/obj/structure/flora/tree/pine/style_random, +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"Nw" = ( +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/expansion_bombthreat) "Nx" = ( -/obj/structure/fans/tiny, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/door/poddoor/shutters/cc/xcc, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supply) +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/machinery/reagentgrinder, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) "Ny" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"Nz" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"NA" = ( +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/lava/plasma/ice_moon, +/area/centcom/syndicate_mothership/control) +"NB" = ( +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/structure/table/wood/fancy/royalblue, +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" + }, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "NC" = ( /obj/structure/cable, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) "ND" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/machinery/vending/snack, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "NE" = ( /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/pod_storage) +"NF" = ( +/obj/structure/fake_stairs/wood/directional/south, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) "NG" = ( -/obj/machinery/door/airlock/centcom{ - name = "CentCom Security" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/obj/structure/chair/wood/wings{ dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/any/security/general, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "NH" = ( -/obj/structure/table/reinforced, -/obj/item/food/mint, -/obj/item/reagent_containers/condiment/enzyme{ - pixel_y = 5 +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood{ + dir = 8 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/kitchen/spoon/soup_ladle, -/obj/item/kitchen/spoon/soup_ladle, -/obj/item/kitchen/spoon/soup_ladle, -/obj/item/reagent_containers/cup/soup_pot, -/obj/item/reagent_containers/cup/soup_pot, -/obj/item/reagent_containers/cup/soup_pot, -/obj/item/kitchen/spoon/soup_ladle, +/obj/structure/railing/wood, /turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/admin_hangout) "NI" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -9195,12 +13530,17 @@ /turf/open/floor/stone, /area/centcom/central_command_areas/evacuation/ship) "NJ" = ( -/obj/machinery/computer/mech_bay_power_console, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 1 +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/trimline/green/line{ + dir = 6 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"NK" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/wooden_tv, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "NL" = ( /obj/item/kirbyplants{ icon_state = "plant-22" @@ -9211,122 +13551,162 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) "NM" = ( -/obj/structure/closet/crate/bin, -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) -"NN" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" +/obj/structure/fence/cut/large, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 }, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"NN" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/trimline/green, +/obj/effect/turf_decal/siding/green/end, +/obj/effect/turf_decal/tile/dark_blue/diagonal_centre, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/botany) +"NO" = ( +/obj/machinery/door/airlock/centcom, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/evacuation) +"NQ" = ( +/obj/structure/bookcase/random, /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) -"NO" = ( +/area/centcom/central_command_areas/ferry) +"NR" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"NS" = ( +/obj/machinery/rnd/production/techfab/department/medical, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supplypod) -"NP" = ( -/obj/machinery/door/airlock/silver{ - name = "Shower" +/area/centcom/central_command_areas/medical) +"NT" = ( +/obj/structure/disposalpipe/loafer{ + dir = 4 }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/structure/fans/tiny/invisible, +/obj/machinery/light/very_dim/directional{ + dir = 1 + }, +/turf/open/floor/plating, +/area/centcom/central_command_areas/admin) "NU" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/structure/chair/sofa/bench, +/obj/machinery/light/cold/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/stone, +/area/centcom/syndicate_mothership/control) +"NV" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"NY" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/turf_decal/siding/wideplating/dark{ dir = 1 }, -/obj/machinery/door/airlock/public/glass{ - name = "CentCom" +/obj/machinery/door/puzzle/keycard/syndicate_bomb, +/obj/structure/fans/tiny, +/turf/open/floor/iron/smooth_half{ + dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"NV" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"NW" = ( -/obj/structure/bookcase/random, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/area/centcom/syndicate_mothership/expansion_bombthreat) "NZ" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "Ob" = ( -/obj/structure/sign/painting/library{ - pixel_x = -32 +/obj/structure/fireplace{ + pixel_x = 0 }, -/turf/open/floor/wood, -/area/centcom/tdome/administration) -"Oc" = ( -/obj/machinery/door/airlock/centcom{ - name = "Administrative Office" +/obj/item/kirbyplants{ + icon_state = "plant-05"; + pixel_y = 20; + pixel_x = -8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 +/obj/structure/chair/comfy/brown{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/mapping_helpers/airlock/access/any/admin/living, -/turf/open/floor/iron/dark, +/turf/open/floor/carpet, /area/centcom/central_command_areas/admin) -"Od" = ( -/obj/structure/cable, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) -"Of" = ( -/obj/item/clipboard, -/obj/item/stamp/denied{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stamp, +"Oc" = ( /obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"Og" = ( -/obj/machinery/light/directional/north, -/obj/machinery/hydroponics/constructable, -/turf/open/floor/carpet/neon/simple/lime/nodots, -/area/centcom/tdome/observation) -"Oj" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/centcom{ - name = "CentCom" +/obj/effect/turf_decal/siding/red{ + dir = 1 }, -/obj/effect/turf_decal/stripes/line{ +/obj/item/folder/red, +/obj/item/pen/red, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) +"Od" = ( +/obj/effect/turf_decal/siding/purple, +/obj/effect/turf_decal/siding/thinplating_new/light{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"Oe" = ( +/turf/open/misc/ice/icemoon, +/area/centcom/syndicate_mothership/control) +"Of" = ( +/obj/structure/curtain/cloth/fancy, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/indestructible/event/plating, +/area/centcom/central_command_areas/borbop) +"Og" = ( +/obj/structure/railing/wood{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"Ok" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = 8; - pixel_y = -4 +/obj/structure/flora/bush/large/style_3, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"Oh" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 1 }, -/obj/item/pen{ - pixel_x = 8; - pixel_y = -4 +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/tdome/observation) +"Oi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 }, -/obj/item/flashlight/lamp{ - pixel_x = -5; - pixel_y = 6 +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"Oj" = ( +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"Ok" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/mob/living/silicon/robot, +/turf/open/floor/mineral/titanium/purple, +/area/centcom/central_command_areas/admin) +"Ol" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) "Om" = ( /obj/structure/table/reinforced, /obj/item/clipboard, @@ -9339,69 +13719,98 @@ /turf/closed/indestructible/riveted, /area/centcom/central_command_areas/admin) "Op" = ( +/obj/structure/railing/wood, /obj/structure/table/reinforced, -/obj/machinery/microwave{ - desc = "Cooks and boils stuff, somehow."; - pixel_x = -3; - pixel_y = 5 +/obj/item/toy/sword, +/obj/item/toy/sword, +/obj/item/toy/sword, +/obj/effect/turf_decal/siding/dark{ + dir = 1 }, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/siding/dark, +/obj/item/clothing/gloves/boxing/yellow{ + pixel_y = 7; + pixel_x = 6 + }, +/obj/item/clothing/gloves/boxing/green{ + pixel_y = 2; + pixel_x = 1 + }, +/obj/item/clothing/gloves/boxing/blue{ + pixel_x = -5; + pixel_y = 7 + }, +/obj/item/clothing/gloves/boxing{ + pixel_x = -8; + pixel_y = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "Oq" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/two) -"Or" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 1 +"Os" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 10 }, -/obj/machinery/meter, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin/storage) +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 + }, +/obj/machinery/vending/wardrobe/law_wardrobe, +/turf/open/floor/iron/dark/side{ + dir = 10 + }, +/area/centcom/central_command_areas/hall) "Ot" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/structure/railing, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"Ov" = ( +/obj/structure/chair/wood/wings, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "Ow" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/floor/has_bulb, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin/storage) +/area/centcom/central_command_areas/firing_range) "Ox" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/machinery/griddle, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/kitchen) "Oy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/button/door/directional/east{ + id = "FBBZ1"; + name = "Security Shutters" }, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 1 +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"Oz" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 6 }, -/obj/effect/turf_decal/trimline/dark_red/line, -/turf/open/floor/iron/tgmcemblem{ - dir = 5 +/obj/item/kirbyplants/random, +/obj/machinery/camera/autoname/directional/east{ + network = list("nukie") }, -/area/centcom/central_command_areas/prison) -"Oz" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/pale/style_random, -/obj/structure/railing{ +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"OA" = ( +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark{ dir = 1 }, -/turf/open/misc/asteroid, -/area/centcom/tdome/administration) +/obj/machinery/vending/wardrobe/robo_wardrobe, +/turf/open/floor/iron/dark/side, +/area/centcom/central_command_areas/hall) +"OB" = ( +/obj/structure/railing/wood{ + dir = 8 + }, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/ghost_spawn) "OC" = ( /obj/structure/table/reinforced, /obj/item/toy/plush/space_lizard_plushie{ @@ -9410,28 +13819,12 @@ /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) "OD" = ( -/obj/machinery/microwave{ - desc = "Cooks and boils stuff, somehow."; - pixel_x = -3; - pixel_y = 5 - }, -/obj/structure/table/wood, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/line, -/turf/open/floor/iron/dark/diagonal, -/area/centcom/central_command_areas/evacuation) -"OE" = ( -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/ferny/style_random, -/turf/open/floor/iron{ - dir = 6; - icon_state = "asteroid8"; - name = "sand" +/obj/machinery/clonepod{ + name = "First Success"; + desc = "A little known fact is that clones requires souls, the men and woman who worked on the first success of what would come to be known as the Iden Project did not know that." }, -/area/centcom/tdome/observation) +/turf/open/floor/circuit/telecomms, +/area/centcom/central_command_areas/admin) "OF" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/table/wood, @@ -9459,35 +13852,50 @@ /turf/open/floor/iron/dark/smooth_large, /area/centcom/central_command_areas/evacuation/ship) "OH" = ( -/obj/machinery/computer/records/security{ - dir = 4 +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/sign/poster/contraband/cybersun_six_hundred{ + pixel_x = 32 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/obj/item/kirbyplants/random, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "OI" = ( -/obj/structure/table/wood/fancy/red, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "cafe_counter"; - name = "Kitchen Counter Shutters" +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/red/corner{ + dir = 1 }, -/obj/machinery/reagentgrinder{ - pixel_x = -6; - pixel_y = 6 +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) +"OJ" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 5 }, -/turf/open/floor/iron/kitchen/herringbone, -/area/centcom/central_command_areas/fore) -"OL" = ( -/turf/open/floor/eighties/red{ - icon = 'goon/icons/turf/floors.dmi'; - icon_state = "clown_carpet" +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) +"OK" = ( +/obj/structure/railing/wood{ + dir = 4 }, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) +"OL" = ( +/turf/closed/indestructible/rock/snow, +/area/centcom/syndicate_mothership/control) "OM" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) +"ON" = ( +/obj/machinery/vending/magivend, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"OO" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) "OP" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, @@ -9502,35 +13910,39 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) "OR" = ( -/obj/machinery/computer/records/security{ +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/structure/table/reinforced, +/obj/machinery/coffeemaker/impressa, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/admin) +"OS" = ( +/obj/effect/decal/remains/human, +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/grass, +/area/centcom/wizard_station) +"OT" = ( +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) -"OS" = ( -/obj/structure/bookcase/random, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"OU" = ( -/obj/machinery/light/directional/east, -/obj/machinery/chem_master, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"OU" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "OV" = ( -/obj/structure/sink/directional/west, -/obj/structure/mirror/directional/east, -/obj/effect/turf_decal/tile/green{ - dir = 4 +/obj/effect/turf_decal/siding/dark{ + dir = 1 }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/siding/dark, +/obj/structure/sign/painting/library{ + pixel_y = 32 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "OW" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 5 @@ -9547,92 +13959,81 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) "OY" = ( -/obj/item/storage/fancy/donut_box, -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) -"OZ" = ( -/obj/machinery/light/directional/west, -/mob/living/simple_animal/hostile/retaliate/clown{ - limb_destroyer = 1 +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"Pa" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/turf/open/ballpit, -/area/centcom/central_command_areas/fore) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/evacuation) "Pb" = ( -/obj/structure/railing{ - dir = 1 +/obj/machinery/vending/wardrobe/chap_wardrobe, +/obj/effect/turf_decal/siding/dark/end{ + dir = 4 }, -/mob/living/basic/pet/dog/corgi/puppy{ - name = "Fresh Ian"; - desc = "The HoP's beloved corgi puppy. This one is number 604"; - gender = "female" +/turf/open/floor/iron/dark/side{ + dir = 5 }, -/obj/item/dog_bone, -/turf/open/floor/grass, -/area/centcom/central_command_areas/control) +/area/centcom/central_command_areas/hall) "Pc" = ( -/obj/structure/fans/tiny, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"Pe" = ( -/obj/structure/table/wood, -/obj/item/phone{ - desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; - pixel_x = -3; - pixel_y = 3 +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/item/clothing/mask/cigarette/cigar/cohiba{ - pixel_x = 6 +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"Pd" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 }, -/obj/item/clothing/mask/cigarette/cigar/havana{ - pixel_x = 2 +/obj/effect/turf_decal/siding/wideplating, +/turf/open/floor/iron/smooth_half{ + dir = 4 }, -/obj/item/clothing/mask/cigarette/cigar{ - pixel_x = 4.5 +/area/centcom/syndicate_mothership/control) +"Pe" = ( +/obj/structure/railing/wood{ + dir = 8 }, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/structure/railing/wood, +/obj/structure/flora/bush/flowers_pp/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) "Pg" = ( -/obj/machinery/computer/auxiliary_base/directional/north, -/obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/item/folder/yellow, -/obj/item/pen/red, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/storage/belt/utility/chief/full{ - name = "Central Command Engineer's toolbelt" - }, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supply) +/obj/structure/fake_stairs/wood/directional/north, +/turf/open/indestructible/hotelwood, +/area/centcom/central_command_areas/borbop) +"Ph" = ( +/obj/machinery/door/airlock/hatch{ + name = "Closet" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/smooth_edge, +/area/centcom/syndicate_mothership/control) "Pj" = ( -/turf/closed/indestructible/fakeglass, -/area/centcom/tdome/administration) +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "Pk" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/donut_box, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/item/kirbyplants/random, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"Pl" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/dice/d10, +/turf/open/floor/circuit/telecomms, +/area/centcom/central_command_areas/admin) "Pm" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/four) -"Pn" = ( -/obj/item/storage/box/matches{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/structure/table/wood, -/obj/machinery/barsign/all_access/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) "Po" = ( /obj/machinery/vending/boozeomat, /obj/effect/turf_decal/siding/wood{ @@ -9640,23 +14041,29 @@ }, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/evacuation/ship) -"Pq" = ( -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/prison) +"Pp" = ( +/obj/structure/table/reinforced/plastitaniumglass{ + name = "Andrea's Desk" + }, +/obj/item/clipboard, +/obj/item/clipboard, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) "Pr" = ( -/obj/effect/landmark/thunderdome/admin, -/obj/structure/chair/comfy/black{ - dir = 1 +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/turf/open/floor/carpet/executive, -/area/centcom/tdome/administration) +/turf/open/floor/wood/large, +/area/centcom/tdome/observation) "Ps" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 +/obj/structure/flora/tree/pine/style_random, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin/storage) +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "Pt" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/mechanical, @@ -9667,15 +14074,12 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/armory) "Pu" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/stripes/end{ dir = 8 }, -/obj/machinery/door/airlock/public/glass{ - name = "CentCom Courtroom" - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/courtroom) +/obj/machinery/monkey_recycler, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "Pv" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 @@ -9693,35 +14097,61 @@ }, /turf/open/space/basic, /area/space) +"Px" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "Py" = ( -/obj/machinery/door/airlock/centcom{ - name = "Supply Pod Storage" +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"Pz" = ( +/obj/machinery/computer/shuttle/syndicate/recall{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supplypod) -"Pz" = ( -/obj/structure/table/reinforced, -/obj/item/paper/pamphlet/centcom/visitor_info, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supplypod) -"PD" = ( -/obj/machinery/light/directional/north, -/obj/machinery/door/window{ - name = "Secure Art Exhibition"; - req_access = list("library") +/turf/open/floor/carpet, +/area/centcom/syndicate_mothership/control) +"PA" = ( +/turf/open/floor/carpet, +/area/centcom/syndicate_mothership/control) +"PB" = ( +/obj/machinery/light/small/directional/north, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"PC" = ( +/obj/machinery/button/door/indestructible{ + id = "XCCQMLoaddoor"; + layer = 4; + name = "Loading Doors"; + pixel_x = -27; + pixel_y = -5 }, -/obj/structure/window/spawner/directional/west, -/obj/structure/table/wood/fancy/royalblue, -/obj/structure/sign/painting/large/library{ - dir = 1 +/obj/machinery/button/door/indestructible{ + id = "XCCQMLoaddoor2"; + layer = 4; + name = "Loading Doors"; + pixel_x = -27; + pixel_y = 5 }, -/turf/open/floor/wood, -/area/centcom/tdome/administration) +/obj/machinery/computer/cargo{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"PD" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/centcom/wizard_station) "PE" = ( /obj/machinery/newscaster{ pixel_x = 32 @@ -9730,9 +14160,18 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/armory) "PF" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/admin) +/obj/item/kirbyplants/random, +/turf/open/floor/catwalk_floor/iron_smooth, +/area/centcom/syndicate_mothership/control) +"PG" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) "PH" = ( /obj/machinery/firealarm/directional/south, /obj/structure/closet/crate/bin, @@ -9753,13 +14192,8 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/one) "PL" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/pale/style_random, -/turf/open/misc/asteroid, -/area/centcom/central_command_areas/evacuation) +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "PM" = ( /obj/structure/chair/office, /obj/effect/landmark/ert_spawn, @@ -9768,65 +14202,48 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) "PN" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/barman_recipes, -/obj/item/reagent_containers/cup/glass/shaker, -/obj/item/reagent_containers/cup/rag, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"PQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/dark_red/line, -/turf/open/floor/iron/smooth_half{ - dir = 4 - }, -/area/centcom/central_command_areas/prison) -"PR" = ( -/obj/structure/table/wood, -/obj/item/phone{ - desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/mask/cigarette/cigar/cohiba{ - pixel_x = 6 - }, -/obj/item/clothing/mask/cigarette/cigar/havana{ - pixel_x = 2 - }, -/obj/item/clothing/mask/cigarette/cigar{ - pixel_x = 4.5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 +/obj/structure/sign/poster/contraband/gorlex_recruitment{ + pixel_x = -32 }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"PO" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) +"PP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/iron, +/area/centcom/syndicate_mothership/control) +"PQ" = ( +/obj/machinery/light/cold/directional/north, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "PS" = ( -/obj/machinery/newscaster/directional/south, -/obj/machinery/computer/records/medical{ - dir = 1 +/obj/machinery/computer/camera_advanced{ + dir = 8; + networks = list("nukie") }, -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"PT" = ( -/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/tdome/observation) +/area/centcom/syndicate_mothership/control) +"PT" = ( +/obj/structure/fake_stairs/wood/directional/east, +/obj/structure/railing/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"PU" = ( +/turf/open/floor/circuit/red, +/area/centcom/syndicate_mothership/control) "PV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/machinery/door/airlock{ + icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; + name = "Personal Quarters" }, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supplypod) +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "PW" = ( /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/three) @@ -9844,20 +14261,40 @@ /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/briefing) "PY" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"Qb" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"PZ" = ( /obj/structure/table/wood, -/obj/item/folder/red, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/restraints/handcuffs, -/obj/item/assembly/flash/handheld, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/item/paper_bin, +/obj/item/pen/fourcolor, +/obj/machinery/pollution_scrubber, +/turf/open/floor/carpet, /area/centcom/central_command_areas/admin) +"Qa" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"Qb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/c20r{ + pixel_x = 32 + }, +/obj/machinery/portable_atmospherics/canister/plasma, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"Qc" = ( +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "Qd" = ( /obj/structure/table/wood, /obj/item/reagent_containers/cup/glass/drinkingglass{ @@ -9876,71 +14313,80 @@ "Qe" = ( /turf/open/ai_visible, /area/centcom/ai_multicam_room) -"Qf" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) -"Qg" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/machinery/requests_console/directional/north{ - announcementConsole = 1; - department = "Captain's Desk"; - assistance_requestable = 1; - anon_tips_receiver = 1 - }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) -"Qh" = ( -/obj/structure/table/wood/fancy/red, -/obj/effect/spawner/random/food_or_drink/pizzaparty, -/obj/item/storage/cans/sixsoda, -/obj/effect/spawner/random/food_or_drink/refreshing_beverage, -/turf/open/floor/iron/kitchen/diagonal, -/area/centcom/central_command_areas/fore) "Qi" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"Qk" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door/indestructible{ - id = "XCCsec3"; - name = "CC Main Access Control" +/obj/structure/railing/wood{ + dir = 8 }, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) -"Qp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/structure/railing/wood{ + dir = 4 }, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ +/obj/structure/railing/wood{ + dir = 1 + }, +/obj/structure/fluff/arc, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/grass, +/area/centcom/central_command_areas/admin_hangout) +"Qj" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/evacuation) +"Qk" = ( +/obj/structure/cable, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/control) +"Ql" = ( +/obj/effect/turf_decal/siding/wood{ dir = 10 }, -/obj/effect/turf_decal/trimline/dark_red/corner{ - dir = 4 +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"Qm" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"Qn" = ( +/obj/structure/hedge, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) +"Qo" = ( +/obj/structure/railing/wood{ + dir = 1 }, -/turf/open/floor/iron/smooth_corner{ +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"Qp" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/centcom/central_command_areas/hall) +"Qq" = ( +/obj/structure/chair/wood{ dir = 4 }, -/area/centcom/central_command_areas/prison) +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/borbop) "Qr" = ( -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/prison) -"Qs" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ +/obj/machinery/light/cold/directional/north, +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"Qs" = ( +/obj/effect/turf_decal/siding/blue/end{ + dir = 4 + }, +/obj/structure/railing/wood, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) "Qt" = ( /obj/structure/table/reinforced, /obj/item/storage/toolbox/electrical{ @@ -9950,47 +14396,55 @@ /obj/item/storage/toolbox/mechanical, /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) -"Qu" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/carpet/neon/simple/black/nodots, -/area/centcom/tdome/observation) "Qv" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "Qw" = ( -/obj/item/clipboard, -/obj/item/folder/red, -/obj/item/stamp/denied{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stamp, -/obj/structure/table/reinforced, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/ai/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) -"Qx" = ( -/obj/effect/turf_decal/siding/yellow{ +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks{ dir = 1 }, +/obj/structure/sign/poster/contraband/andromeda_bitters{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/area/centcom/syndicate_mothership/control) +"Qx" = ( +/turf/closed/indestructible/fakedoor{ + name = "Sub-Laboratory Elevator" + }, +/area/centcom/syndicate_mothership/control) "Qy" = ( -/obj/machinery/shower/directional/west, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 4 +/obj/effect/turf_decal/siding/purple{ + dir = 1 }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/structure/sign/poster/contraband/power{ + pixel_y = 32 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "Qz" = ( -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/machinery/door/airlock/hatch{ + name = "Gangway" + }, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"QA" = ( +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/structure/table/wood/fancy/royalblue, +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" + }, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "QB" = ( /obj/structure/table/reinforced, /obj/structure/railing{ @@ -10023,17 +14477,23 @@ }, /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) +"QE" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/ferry) "QF" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ +/obj/effect/turf_decal/siding/wideplating{ dir = 1 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"QG" = ( -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/effect/turf_decal/siding/wideplating, +/obj/machinery/door/airlock/external/ruin, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/smooth_half{ + dir = 4 + }, +/area/centcom/syndicate_mothership/control) "QH" = ( /obj/effect/turf_decal/siding/wideplating_new/dark, /obj/effect/turf_decal/tile/neutral/full, @@ -10043,329 +14503,440 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) +"QI" = ( +/obj/effect/turf_decal/siding/green{ + dir = 8 + }, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) +"QJ" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood{ + dir = 4 + }, +/obj/structure/railing/wood, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin_hangout) +"QL" = ( +/obj/structure/chair/office/tactical, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) "QM" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 8 }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/three) +"QN" = ( +/obj/machinery/rnd/production/techfab/department/service, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) "QO" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ dir = 4 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supplypod) +/obj/machinery/door/airlock/highsecurity{ + name = "Sky Bridge" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/textured_large, +/area/centcom/syndicate_mothership/control) +"QP" = ( +/obj/effect/heretic_rune/big, +/obj/structure/chair/musical, +/turf/open/floor/plating/abductor, +/area/centcom/central_command_areas/admin) "QQ" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/trimline/dark_red/filled/line, -/obj/effect/turf_decal/trimline/dark_red/line{ +/obj/structure/chair/wood/wings{ dir = 1 }, -/turf/open/floor/iron/tgmcemblem{ - dir = 10 - }, -/area/centcom/central_command_areas/prison) +/turf/open/floor/carpet, +/area/centcom/wizard_station) "QR" = ( -/obj/structure/chair/office/light{ +/obj/machinery/shower/directional/east, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/mineral/titanium/tiled, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"QS" = ( +/obj/effect/turf_decal/siding/dark/corner{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"QU" = ( -/obj/structure/table/wood, -/obj/item/phone{ - desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/mask/cigarette/cigar/cohiba{ - pixel_x = 6 - }, -/obj/item/clothing/mask/cigarette/cigar/havana{ - pixel_x = 2 +/obj/effect/turf_decal/siding/dark{ + dir = 5 }, -/obj/item/clothing/mask/cigarette/cigar{ - pixel_x = 4.5 +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) +"QT" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/firing_range) +"QU" = ( +/obj/structure/flora/tree/pine/style_random, +/obj/structure/flora/grass/both/style_random, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) "QV" = ( /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) +"QW" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) "QX" = ( -/obj/structure/flora/bush/ferny/style_random, -/obj/structure/railing, -/turf/open/floor/iron{ - dir = 6; - icon_state = "asteroid8"; - name = "sand" - }, -/area/centcom/tdome/administration) +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/evacuation) "QY" = ( -/obj/item/storage/box/handcuffs, -/obj/item/ammo_box/a357, -/obj/item/ammo_box/a357, -/obj/item/gun/ballistic/revolver/mateba, -/obj/structure/table/reinforced, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/effect/turf_decal/siding/wood{ + dir = 8 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) +/obj/machinery/light/directional/west, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"QZ" = ( +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "Ra" = ( -/obj/machinery/door/airlock/centcom{ - name = "CentCom Security" +/obj/machinery/button/door/indestructible{ + id = "CC_firing_range_checkpoint"; + name = "Checkpoint Shutters" }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/access/any/security/brig, -/turf/open/floor/iron, -/area/centcom/central_command_areas/prison) +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range_checkpoint_control) "Rb" = ( -/obj/machinery/shower/directional/west, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/machinery/chem_heater/withbuffer, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "Rc" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/table/reinforced, -/obj/item/storage/medkit/advanced, -/obj/item/storage/medkit/advanced{ - pixel_y = 7; - layer = 3.5 - }, -/obj/item/storage/medkit/advanced{ - pixel_y = 4 - }, -/obj/item/defibrillator/compact/combat/loaded/nanotrasen, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"Rg" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/chem_master/condimaster, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) -"Rh" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +/area/centcom/central_command_areas/botany) +"Re" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/floor/iron, +/obj/machinery/chem_heater/debug, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"Rf" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, /area/centcom/tdome/observation) -"Rj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 +"Rg" = ( +/obj/item/food/meat/slab/human/mutant/slime, +/turf/open/floor/grass, +/area/centcom/wizard_station) +"Ri" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 5 }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/siding/dark/corner{ dir = 8 }, -/obj/machinery/door/airlock/vault{ - req_access = list("cent_captain") +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"Rj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) +/obj/structure/centcom_teleporter/arena, +/turf/open/floor/wood/large, +/area/centcom/tdome/observation) "Rk" = ( /obj/structure/cable, /obj/structure/marker_beacon/burgundy, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/evacuation/ship) "Rl" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/turf/open/floor/carpet, +/area/centcom/syndicate_mothership/control) +"Rm" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 9 }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) +/obj/effect/turf_decal/siding/dark/corner, +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) "Rn" = ( -/obj/structure/chair/sofa/corp{ - dir = 8 +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 }, -/obj/machinery/light/directional/east, -/obj/structure/sign/painting/library_secure{ - pixel_x = 32 +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 }, -/turf/open/floor/iron/kitchen/diagonal, -/area/centcom/central_command_areas/fore) +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "Ro" = ( -/obj/structure/table/wood, -/obj/item/storage/box/donkpockets, -/obj/item/storage/fancy/cigarettes/cigars/cohiba{ - pixel_y = 3 - }, -/obj/item/crowbar/power, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 4 - }, -/obj/item/storage/belt/utility/chief/full{ - name = "Central Command Engineer's toolbelt" - }, -/mob/living/simple_animal/parrot{ - desc = "Poly the Parrot. Don't tell anyone, but the others are clones."; - health = 800; - limb_destroyer = 1; - name = "Poly Prime" +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/turf/open/floor/iron/dark/diagonal, -/area/centcom/central_command_areas/evacuation) +/turf/open/floor/wood/large, +/area/centcom/tdome/observation) "Rp" = ( /obj/machinery/computer/communications, /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) -"Rr" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +"Rq" = ( +/obj/machinery/chem_dispenser/fullupgrade, +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/centcom/tdome/administration) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"Rr" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/admin_hangout) "Rs" = ( -/obj/structure/closet/secure_closet/security, -/obj/item/storage/belt/security/full, -/obj/item/gun/ballistic/automatic/wt550, -/obj/item/clothing/head/helmet/swat/nanotrasen, -/obj/item/crowbar/red, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) -"Ru" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supplypod) -"Rw" = ( -/obj/structure/table/wood, -/obj/item/clipboard, -/obj/item/radio/headset/headset_cent, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) -"Rx" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"Rt" = ( /obj/structure/table/reinforced, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -8; - pixel_y = 5 +/obj/item/paper_bin, +/obj/item/pen/fourcolor, +/turf/open/floor/carpet/purple, +/area/centcom/central_command_areas/admin) +"Ru" = ( +/obj/item/statuebust{ + pixel_y = 12 }, -/obj/item/reagent_containers/condiment/peppermill{ +/obj/structure/table/wood/fancy, +/turf/open/floor/wood, +/area/centcom/wizard_station) +"Rv" = ( +/obj/machinery/vending/boozeomat, +/obj/item/reagent_containers/cup/glass/modglass/small{ + pixel_y = 23; pixel_x = -8 }, -/obj/item/knife/kitchen, -/obj/machinery/newscaster/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/holosign_creator/robot_seat/restaurant, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"Ry" = ( -/obj/structure/chair/office{ - dir = 4 +/obj/item/reagent_containers/cup/glass/modglass/large{ + pixel_y = 22 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"RA" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/item/reagent_containers/cup/glass/modglass{ + pixel_y = 23; + pixel_x = 12 + }, +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark{ dir = 1 }, -/obj/machinery/shower/directional/north, -/mob/living/simple_animal/bot/cleanbot/medbay, -/turf/open/floor/noslip{ - icon_state = "textured_white"; - color = "#52B4E9" +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/borbop) +"Rw" = ( +/obj/structure/flora/rock/pile/style_random, +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 }, -/area/centcom/central_command_areas/control) -"RB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"Rx" = ( +/obj/structure/railing/wrestling{ + dir = 8 }, -/turf/open/floor/iron, -/area/centcom/tdome/administration) -"RC" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"RF" = ( +/turf/open/floor/iron/smooth_large{ + icon = 'goon/icons/turf/floors.dmi'; + icon_state = "boxing" + }, +/area/centcom/central_command_areas/hall) +"Ry" = ( /obj/structure/table/reinforced, -/obj/item/crowbar/red, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/clothing/mask/gas, -/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) -"RG" = ( -/obj/structure/chair/comfy/black{ +/area/centcom/central_command_areas/firing_range) +"Rz" = ( +/obj/effect/turf_decal/siding/wood/corner{ dir = 1 }, -/obj/machinery/light/directional/south, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/chair/wood{ + dir = 1 + }, +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"RA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"RB" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/machinery/door/airlock/hatch{ + name = "Armoury" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/smooth_half{ + dir = 4 + }, +/area/centcom/syndicate_mothership/control) +"RC" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/white, +/area/centcom/wizard_station) +"RD" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"RE" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/flora/bush/large/style_3, +/turf/open/floor/grass, +/area/centcom/central_command_areas/ghost_spawn) +"RF" = ( +/obj/structure/table/reinforced, +/obj/item/crowbar/red, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/clothing/mask/gas, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) +"RG" = ( +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "RH" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) "RI" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/centcom/central_command_areas/courtroom) +/obj/machinery/oven/range, +/obj/structure/sign/poster/contraband/eat{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "RJ" = ( /obj/effect/decal/cleanable/fuel_pool, /turf/open/floor/grass, /area/centcom/central_command_areas/evacuation/ship) +"RK" = ( +/obj/machinery/modular_computer/console/preset/id/centcom{ + dir = 1; + desc = "A specialized console to connect to gaming computers to be able to broadcast live. Seriously, where does Ook find this stuff?" + }, +/turf/open/misc/grass, +/area/centcom/central_command_areas/admin) "RL" = ( -/obj/machinery/door/airlock/freezer, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" + }, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "RM" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/armory) -"RO" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +"RN" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 }, -/obj/effect/turf_decal/tile/green/anticorner/contrasted, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/machinery/vending/wardrobe/chef_wardrobe, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) +"RO" = ( +/obj/structure/hedge, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "RP" = ( -/obj/structure/bookcase/random, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/structure/flora/tree/dead/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"RQ" = ( +/obj/structure/rack, +/obj/item/katana/cursed{ + desc = "A gift from your benefactors."; + force = 20 + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/centcom/syndicate_mothership/control) "RR" = ( -/obj/structure/chair/comfy/teal{ - dir = 8 +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/railing{ + dir = 10 }, -/turf/open/floor/carpet/cyan, -/area/centcom/central_command_areas/control) +/turf/open/lava/plasma/ice_moon, +/area/centcom/syndicate_mothership/control) +"RS" = ( +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/firing_range) "RT" = ( /obj/machinery/light/directional/south, /turf/open/floor/grass, /area/centcom/central_command_areas/evacuation/ship) "RU" = ( -/obj/machinery/modular_computer/console/preset/id/centcom, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) +/obj/structure/table/reinforced, +/obj/item/storage/medkit/fire{ + pixel_y = 5; + pixel_x = -4 + }, +/obj/item/storage/medkit/brute, +/obj/item/storage/medkit/regular{ + pixel_x = -7 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) "RV" = ( /obj/structure/table/reinforced, /obj/item/restraints/handcuffs, @@ -10376,15 +14947,32 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/armory) "RW" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/paper/pamphlet/centcom/visitor_info, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"Sb" = ( -/turf/open/floor/wood, -/area/centcom/tdome/observation) +/obj/machinery/computer/mech_bay_power_console{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"RX" = ( +/obj/structure/railing/wood, +/obj/effect/turf_decal/trimline/green/line, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"RZ" = ( +/obj/structure/chair/bronze{ + name = "gamer chair mk2" + }, +/obj/item/toy/plush/moth/ookplush{ + name = "Ook" + }, +/turf/open/floor/carpet/neon/simple/white, +/area/centcom/central_command_areas/admin) +"Sa" = ( +/obj/structure/flora/tree/jungle/style_3, +/turf/open/floor/grass, +/area/centcom/central_command_areas/evacuation) "Sd" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/lattice, @@ -10394,31 +14982,47 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/two) +"Sf" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/structure/sign/painting/library_secure{ + pixel_x = -32 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "Sg" = ( -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 3 +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 }, -/obj/item/storage/secure/briefcase, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) -"Sh" = ( -/obj/structure/table/reinforced, -/obj/item/mod/control/pre_equipped/corporate{ - pixel_y = 5 +/obj/machinery/door/poddoor/shutters{ + id = "FBBZ1"; + name = "Security Shutters" }, -/obj/item/clothing/gloves/combat, -/obj/item/clothing/shoes/combat/swat, -/obj/item/clothing/mask/gas/sechailer/swat, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) +/obj/structure/fans/tiny, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) +"Sh" = ( +/obj/effect/spawner/random/trash/garbage, +/obj/effect/spawner/random/maintenance/two, +/obj/machinery/recycler/deathtrap, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/plating, +/area/centcom/central_command_areas/admin) "Si" = ( /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/two) +"Sj" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/red, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "Sk" = ( /obj/structure/table/reinforced, /obj/item/storage/medkit/regular, @@ -10426,35 +15030,40 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) "Sl" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/centcom/tdome/observation) -"Sn" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 8 - }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/centcom/central_command_areas/prison) -"So" = ( -/obj/structure/table/wood, -/obj/machinery/computer/records/medical/laptop, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/chair/sofa/corp, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) +/area/centcom/central_command_areas/hall) +"Sn" = ( +/obj/machinery/light/cold/directional/west, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "Sp" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/access/any/engineering/external, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/structure/closet/crate/freezer{ + name = "meat freezer" + }, +/obj/item/food/meat/slab/bear, +/obj/item/food/meat/slab/bear, +/obj/item/food/meat/slab/bear, +/obj/item/food/meat/slab/bear, +/obj/item/food/meat/slab/gondola, +/obj/item/food/meat/slab/xeno, +/obj/item/food/meat/slab/xeno, +/obj/item/food/meat/slab/xeno, +/obj/item/food/meat/slab/killertomato, +/obj/item/food/meat/slab/killertomato, +/obj/item/food/meat/slab/killertomato, +/obj/item/food/meat/slab/spider, +/obj/item/food/meat/slab/penguin, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/grown/carrot, +/obj/item/food/grown/carrot, +/obj/item/food/grown/garlic, +/obj/item/food/grown/garlic, +/obj/item/food/grown/tomato, +/obj/item/food/grown/tomato, +/turf/open/floor/plastic, +/area/centcom/syndicate_mothership/expansion_fridgerummage) "Sq" = ( /obj/structure/table/reinforced, /obj/item/clipboard, @@ -10464,54 +15073,89 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) +"Sr" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/machinery/camera/autoname/directional/south{ + network = list("nukie") + }, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "Ss" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" +/obj/effect/turf_decal/siding/dark{ + dir = 4 }, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"Su" = ( -/turf/open/floor/iron, -/area/centcom/central_command_areas/supplypod) +/area/centcom/central_command_areas/admin) +"St" = ( +/obj/structure/fake_stairs/wood/directional/south, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) "Sv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/north, +/obj/effect/turf_decal/trimline/blue, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supplypod) +/area/centcom/central_command_areas/botany) "Sw" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 9 }, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) +/obj/structure/table/glass/plasmaglass, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/item/storage/medkit/regular, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "Sx" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/admin/storage) +/obj/structure/table/glass/plasmaglass, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/machinery/light/cold/directional/east, +/obj/item/gun/syringe/syndicate, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "Sz" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "SA" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "SB" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/machinery/atmospherics/components/binary/valve{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) "SC" = ( /obj/structure/tank_dispenser/oxygen, /obj/structure/window/reinforced/survival_pod/spawner/directional/west, /turf/open/floor/iron/smooth_large, /area/centcom/central_command_areas/evacuation/ship) +"SD" = ( +/obj/machinery/blackbox_recorder{ + name = "Ook's Backups"; + desc = "Huh, who would've thought Ook used tape drives to keep his data backed up safe and sound!" + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/misc/grass, +/area/centcom/central_command_areas/admin) +"SE" = ( +/obj/structure/fake_stairs/stone{ + dir = 1 + }, +/obj/structure/fans/tiny/forcefield, +/turf/open/floor/stone, +/area/centcom/central_command_areas/admin_hangout) "SF" = ( /obj/effect/turf_decal/tile/green{ dir = 4 @@ -10543,41 +15187,98 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) "SG" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) +/obj/effect/turf_decal/siding/red/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "SH" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ + chamber_id = "nukiebase"; + desc = "Has a valve and pump attached to it. Slightly more menacing than Nanotrasen's standard."; + dir = 1; + name = "syndicate air injector" }, -/obj/machinery/rnd/production/techfab/department/medical, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/turf/open/floor/engine/vacuum, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"SI" = ( +/obj/structure/closet, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) +"SJ" = ( +/obj/machinery/light/directional/east, +/obj/structure/flora/tree/jungle/style_3, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"SK" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"SL" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/table/reinforced, +/obj/item/storage/box/coffeepack/robusta, +/obj/item/storage/box/coffeepack/robusta{ + pixel_y = -3; + pixel_x = 4 + }, +/obj/item/storage/box/coffeepack/robusta{ + pixel_y = -2; + pixel_x = -6 + }, +/obj/item/reagent_containers/cup/coffeepot/bluespace{ + pixel_y = 9; + pixel_x = 5 + }, +/obj/item/reagent_containers/cup/coffeepot/bluespace{ + pixel_y = 5; + pixel_x = -6 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "SM" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +/obj/effect/turf_decal/siding/green{ + dir = 4 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) "SN" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "SO" = ( -/obj/machinery/computer/records/security{ - dir = 8 +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" }, -/obj/machinery/status_display/ai/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) -"SQ" = ( -/obj/structure/filingcabinet/medical, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) +"SP" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 1 + }, +/obj/machinery/door/airlock/titanium{ + name = "Medical Bay" + }, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/smooth_half{ + dir = 4 + }, +/area/centcom/syndicate_mothership/control) "SR" = ( /turf/open/floor/circuit/green, /area/centcom/central_command_areas/briefing) @@ -10592,29 +15293,39 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) -"SU" = ( -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/ferny/style_random, -/obj/machinery/light/directional/east, -/turf/open/floor/iron{ - dir = 6; - icon_state = "asteroid8"; - name = "sand" - }, -/area/centcom/tdome/administration) "SV" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/administration) +/obj/structure/chair/comfy/lime{ + dir = 8 + }, +/obj/structure/fans/tiny/invisible, +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/admin) +"SW" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair/wood{ + dir = 4 + }, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "SX" = ( /obj/machinery/computer/shuttle, /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) -"SZ" = ( -/turf/closed/indestructible/fakeglass, -/area/centcom/tdome/observation) +"SY" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/drinks/beer, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/borbop) +"Ta" = ( +/turf/open/floor/iron/white, +/area/centcom/wizard_station) "Tb" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -10626,6 +15337,9 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/two) +"Td" = ( +/turf/open/floor/iron, +/area/centcom/central_command_areas/supplypod/supplypod_temp_holding) "Te" = ( /obj/structure/closet/crate/engineering, /obj/item/stack/sheet/mineral/plasma{ @@ -10637,66 +15351,68 @@ /obj/item/stack/sheet/mineral/plasma/five, /turf/open/floor/iron/smooth_edge, /area/centcom/central_command_areas/evacuation/ship) +"Tf" = ( +/obj/structure/chair/bronze{ + dir = 1 + }, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin) "Tg" = ( -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 3 +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/item/storage/secure/briefcase, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/evacuation) +"Th" = ( +/obj/machinery/vending/snack, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"Ti" = ( +/obj/structure/fake_stairs/wood/directional/east, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"Tj" = ( /obj/structure/table/wood, +/obj/machinery/computer/records/medical/laptop, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) -"Ti" = ( -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"Tj" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ +/area/centcom/central_command_areas/ferry) +"Tk" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supply) +"Tl" = ( +/obj/effect/turf_decal/siding/blue{ dir = 5 }, -/obj/effect/turf_decal/trimline/yellow/corner{ - dir = 8 - }, -/obj/machinery/suit_storage_unit/ce, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/machinery/chem_heater/debug, /turf/open/floor/iron/dark/diagonal, -/area/centcom/central_command_areas/evacuation) -"Tl" = ( -/obj/structure/table/wood, -/obj/structure/plaque/static_plaque/thunderdome{ - pixel_y = -32 - }, -/obj/item/clothing/accessory/medal/gold{ - pixel_x = 3; - pixel_y = 5 - }, -/obj/item/clothing/accessory/medal/gold, -/turf/open/floor/iron/grimy, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/medical) "Tm" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/red, /area/centcom/central_command_areas/evacuation/ship) "Tn" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 }, -/obj/effect/turf_decal/tile/green/half/contrasted, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"To" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ +/obj/structure/chair/sofa/bench/left{ dir = 4 }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "Tp" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/suit/apron/chef, -/obj/item/kitchen/rollingpin, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "Tq" = ( /obj/structure/filingcabinet/filingcabinet, /obj/machinery/status_display/evac/directional/south, @@ -10704,28 +15420,22 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) "Tr" = ( -/obj/machinery/door/window/brigdoor/left/directional{ - dir = 1; - name = "Medical Supplies" - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 1 +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "Ts" = ( -/obj/structure/table/reinforced, -/obj/item/restraints/handcuffs/cable/zipties, -/obj/item/assembly/flash/handheld, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) -"Tt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 }, -/turf/open/floor/iron, -/area/centcom/tdome/administration) +/turf/open/floor/plating/snowed/icemoon, +/area/centcom/syndicate_mothership/control) +"Tt" = ( +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/control) "Tu" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 4 @@ -10748,37 +15458,35 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/evacuation/ship) -"Ty" = ( -/obj/structure/table/reinforced, -/obj/item/camera, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supplypod) +"Tw" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"Tx" = ( +/obj/machinery/modular_computer/console/preset/id/centcom, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "Tz" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/three) -"TA" = ( -/obj/structure/sign/painting/library_secure{ - pixel_x = 32 - }, -/turf/open/floor/iron/kitchen/herringbone, -/area/centcom/central_command_areas/fore) "TB" = ( -/obj/structure/closet/secure_closet/personal, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"TD" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/airlock/security/glass{ - name = "Central Command Courtroom" - }, -/obj/effect/mapping_helpers/airlock/access/any/security/court, -/obj/effect/mapping_helpers/airlock/access/any/service/lawyer, +/obj/structure/table/wood, +/obj/item/storage/box/donkpockets, +/obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, -/area/centcom/central_command_areas/courtroom) +/area/centcom/syndicate_mothership/control) +"TC" = ( +/obj/structure/curtain/bounty, +/turf/closed/indestructible/fakeglass, +/area/centcom/central_command_areas/hall) "TE" = ( /obj/structure/chair/comfy/brown{ color = "#596479"; @@ -10786,10 +15494,29 @@ }, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/briefing) +"TF" = ( +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) +"TG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "TH" = ( -/obj/structure/sign/departments/botany, -/turf/closed/indestructible/riveted, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "TI" = ( /obj/structure/table/reinforced, /obj/item/paper_bin, @@ -10797,6 +15524,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"TJ" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/obj/effect/turf_decal/siding/dark/corner, +/turf/open/floor/iron/dark/corner, +/area/centcom/central_command_areas/hall) "TK" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -10816,6 +15550,11 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) +"TN" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/vending/wardrobe/gene_wardrobe, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) "TO" = ( /obj/machinery/keycard_auth/directional/south, /obj/structure/table/reinforced, @@ -10825,50 +15564,58 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) -"TS" = ( -/obj/structure/table/wood, -/obj/item/dice/d20{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/dice/d10{ - pixel_x = -3 +"TP" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 }, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"TQ" = ( +/obj/structure/window/plasma/spawner/directional/north, +/turf/open/floor/carpet/royalblue, /area/centcom/central_command_areas/admin) +"TR" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/hedge, +/obj/effect/turf_decal/siding/dark{ + dir = 10 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/borbop) +"TS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/evacuation) "TT" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/structure/bed, +/obj/item/bedsheet/wiz, +/turf/open/floor/carpet, +/area/centcom/wizard_station) "TU" = ( -/obj/machinery/computer/security{ - dir = 8 +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/obj/machinery/vending/imported/mothic, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "TV" = ( -/obj/item/storage/fancy/cigarettes/cigars{ - pixel_y = 6 - }, -/obj/item/storage/fancy/cigarettes/cigars/cohiba{ - pixel_y = 3 +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/item/storage/fancy/cigarettes/cigars/havana, -/obj/structure/table/wood, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/turf/open/floor/wood/large, /area/centcom/tdome/observation) "TW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 }, -/turf/open/floor/iron/white, -/area/centcom/central_command_areas/admin) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "TX" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/contraband/armory, @@ -10881,214 +15628,280 @@ /obj/effect/spawner/random/exotic/antag_gear, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) +"TY" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/ferry) +"TZ" = ( +/obj/structure/chair/office, +/obj/structure/window/plasma/spawner/directional/north, +/turf/open/indestructible/hotelwood, +/area/centcom/central_command_areas/admin) "Ua" = ( -/obj/effect/turf_decal/stripes/corner{ +/obj/structure/table/reinforced/titaniumglass, +/obj/structure/window/reinforced/survival_pod/spawner/directional{ dir = 1 }, -/obj/effect/turf_decal/trimline/dark_red/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/dark_red/line{ - dir = 6 +/obj/machinery/door/window/left/directional/west{ + name = "Secret Stuff"; + req_access = list("robotics"); + dir = 4 }, -/turf/open/floor/iron/smooth_corner{ - dir = 1 +/obj/item/melee/powerfist{ + name = "Iron"; + desc = "You load sixteen tons..."; + force = 1000; + pixel_y = 4; + color = "#fcba03" }, -/area/centcom/central_command_areas/prison) +/obj/structure/fans/tiny/invisible, +/obj/machinery/light/floor/has_bulb, +/obj/item/melee/powerfist{ + name = "Steel"; + desc = "Another day older and deeper in debt..."; + force = 1000; + pixel_y = -4; + color = "#fcba03" + }, +/turf/open/floor/carpet/green, +/area/centcom/central_command_areas/admin) "Ub" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 1 - }, -/obj/machinery/meter, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin/storage) +/obj/machinery/vending/tool, +/turf/open/floor/mineral/titanium/yellow, +/area/centcom/syndicate_mothership/control) +"Uc" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "Ud" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 }, -/obj/structure/organ_creator, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/turf/open/space/basic, +/area/space/nearstation) +"Ue" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "Uf" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) -"Uh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ +/obj/effect/turf_decal/siding/dark{ dir = 8 }, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) +/obj/structure/hedge, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"Uh" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin_hangout) "Ui" = ( -/obj/structure/table/wood, -/obj/machinery/computer/security/wooden_tv, -/obj/item/storage/secure/safe{ - pixel_x = 32; - pixel_y = 24 +/obj/machinery/light/small/directional/east, +/turf/open/floor/carpet, +/area/centcom/wizard_station) +"Uj" = ( +/obj/structure/chair/sofa/corp/right, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/kitchen) +"Uk" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 4 }, -/obj/machinery/status_display/ai/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) -"Ul" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/pale/style_random, -/turf/open/misc/asteroid, -/area/centcom/central_command_areas/fore) -"Um" = ( -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/ferny/style_random, -/turf/open/floor/iron{ - dir = 6; - icon_state = "asteroid8"; - name = "sand" +/obj/effect/turf_decal/siding/dark{ + dir = 8 }, -/area/centcom/tdome/administration) -"Uo" = ( -/obj/structure/closet/secure_closet/security, -/obj/item/storage/belt/security/full, -/obj/item/gun/ballistic/automatic/wt550, -/obj/item/clothing/head/helmet/swat/nanotrasen, -/obj/item/crowbar/red, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) +"Ul" = ( +/obj/structure/table/wood/fancy, +/obj/item/radio/headset, +/turf/open/floor/wood, +/area/centcom/wizard_station) +"Un" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/firing_range) +"Up" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) +"Uq" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/area/centcom/central_command_areas/supply) "Ur" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/under/rank/civilian/curator/treasure_hunter, -/obj/item/clothing/under/dress/skirt, -/obj/item/clothing/under/shorts/black, -/obj/item/clothing/under/pants/track, -/obj/item/clothing/accessory/armband/deputy, -/obj/item/clothing/accessory/waistcoat, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/shoes/laceup, -/obj/item/clothing/neck/large_scarf/red, -/obj/item/clothing/neck/tie/red, -/obj/item/clothing/head/helmet/space/beret, -/obj/item/clothing/suit/jacket/curator, -/obj/item/clothing/suit/space/officer, -/obj/item/clothing/gloves/fingerless, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/glasses/eyepatch, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) +/obj/machinery/light/small/directional/west, +/turf/open/floor/carpet, +/area/centcom/wizard_station) "Us" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ +/obj/effect/turf_decal/stripes/box, +/obj/structure/closet/emcloset, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership) +"Ut" = ( +/obj/effect/turf_decal/siding/wood/corner{ dir = 8 }, -/obj/effect/turf_decal/trimline/dark_red/line{ - dir = 4 - }, -/turf/open/floor/iron/smooth_half{ +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/area/centcom/central_command_areas/prison) -"Uv" = ( -/obj/machinery/chem_heater/debug, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 +/obj/structure/chair/wood{ + dir = 4 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"Uu" = ( +/obj/item/storage/box/coffeepack/robusta, +/obj/item/storage/box/coffeepack/robusta, +/obj/item/reagent_containers/cup/coffeepot/bluespace, +/obj/item/reagent_containers/cup/coffeepot/bluespace, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) "Uw" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supplypod) +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) "Ux" = ( -/turf/open/indestructible/hierophant, -/area/centcom/central_command_areas/admin) -"Uz" = ( -/turf/open/floor/iron/tgmcemblem{ - dir = 4 +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 }, -/area/centcom/central_command_areas/prison) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) +"Uz" = ( +/turf/closed/indestructible/fakeglass, +/area/centcom/central_command_areas/hall) "UA" = ( -/obj/item/cardboard_cutout{ - starting_cutout = "Private Security Officer" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/navigate_destination/centcom/medical, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) -"UH" = ( -/obj/structure/closet/crate/freezer/blood, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"UI" = ( -/obj/effect/turf_decal/stripes/line{ +/area/centcom/central_command_areas/medical) +"UB" = ( +/obj/structure/flora/bush/flowers_yw/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) +"UC" = ( +/obj/structure/chair/sofa/corp{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/tank/air{ - dir = 1 +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/tdome/observation) +"UD" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/siding/red/corner, +/obj/item/folder/red, +/obj/item/pen/red, +/turf/open/floor/iron/dark/textured_large, +/area/centcom/syndicate_mothership/control) +"UE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/control) +"UF" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/trimline/green/line{ + dir = 9 }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) -"UM" = ( -/obj/effect/turf_decal/tile/brown/half/contrasted{ +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"UG" = ( +/obj/structure/chair/sofa/corp/left{ dir = 8 }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supplypod) -"UN" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin_hangout) +"UI" = ( +/obj/effect/turf_decal/siding/green{ + dir = 4 }, -/obj/structure/sign/painting/library{ - pixel_y = 32 +/obj/effect/turf_decal/siding/green{ + dir = 8 }, +/obj/effect/turf_decal/tile/dark_green/diagonal_centre, +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/botany) +"UJ" = ( +/obj/structure/closet/cardboard, +/obj/item/banhammer, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, -/area/centcom/central_command_areas/control) -"UO" = ( -/obj/machinery/door/airlock/centcom{ - name = "CentCom Security" +/area/centcom/wizard_station) +"UK" = ( +/obj/machinery/computer/operating{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) +"UL" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/vending/wardrobe/medi_wardrobe, +/turf/open/floor/iron/dark, +/area/centcom/tdome/observation) +"UM" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 10 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 +/obj/structure/table/glass/plasmaglass, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 6 }, -/obj/effect/mapping_helpers/airlock/access/any/security/general, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"UN" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/door/airlock/centcom, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/kitchen) +"UO" = ( +/obj/structure/table/wood, +/obj/item/clothing/head/wizard/tape, +/obj/item/clothing/suit/wizrobe/tape, +/obj/item/staff/tape, +/obj/item/stack/sticky_tape/super, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "UP" = ( -/obj/machinery/door/airlock/centcom{ - name = "Supply Pod Storage" +/obj/effect/turf_decal/siding/wideplating, +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 +/obj/machinery/door/airlock/hatch{ + name = "General Quarters" }, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, -/turf/open/floor/iron, -/area/centcom/tdome/administration) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/effect/mapping_helpers/airlock/access/all/syndicate/general, +/turf/open/floor/iron/dark/textured_half, +/area/centcom/syndicate_mothership/control) +"UQ" = ( +/obj/structure/sign/poster/contraband/moffuchis_pizza{ + pixel_x = -32 + }, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "UR" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/training_machine, /turf/open/floor/iron/dark, +/area/centcom/central_command_areas/firing_range) +"US" = ( +/obj/structure/window/plasma/spawner/directional/north, +/turf/open/indestructible/hotelwood, /area/centcom/central_command_areas/admin) "UT" = ( /obj/effect/turf_decal/bot, @@ -11103,56 +15916,88 @@ /obj/effect/spawner/random/exotic/antag_gear, /turf/open/floor/iron, /area/centcom/central_command_areas/supply) -"UV" = ( -/obj/structure/table/wood, -/obj/item/folder/red, -/obj/item/lighter, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line, +"UU" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin/carbon, /turf/open/floor/iron/dark, -/area/centcom/tdome/administration) -"UW" = ( +/area/centcom/central_command_areas/firing_range_checkpoint_control) +"UX" = ( /obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ dir = 10 }, -/turf/open/floor/iron, -/area/centcom/tdome/administration) -"UX" = ( -/obj/machinery/shower/directional/east, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 +/obj/machinery/light/cold/directional/east, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"UY" = ( +/turf/open/floor/iron/dark/diagonal, +/area/centcom/central_command_areas/medical) +"UZ" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger{ + pixel_y = 4 }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) -"Vc" = ( -/obj/effect/decal/cleanable/vomit/old, +/obj/machinery/light/directional/south, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/area/centcom/central_command_areas/firing_range) +"Va" = ( +/obj/machinery/fishing_portal_generator, +/turf/open/floor/carpet/neon/simple/cyan, +/area/centcom/central_command_areas/admin) +"Vc" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp, +/obj/item/reagent_containers/cup/glass/mug/nanotrasen, +/turf/open/floor/carpet/purple, +/area/centcom/central_command_areas/admin) "Vd" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"Ve" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 5 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "Vf" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/simple_animal/hostile/retaliate/goose, -/turf/open/indestructible/dark, -/area/centcom/central_command_areas/prison/cells) +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) "Vg" = ( /obj/structure/rack, -/obj/item/gun/energy/e_gun{ - pixel_x = -3; - pixel_y = 3 +/obj/machinery/light/cold/directional/west, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 }, -/obj/item/gun/energy/e_gun, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 +/obj/item/stock_parts/micro_laser/high{ + pixel_x = 12 }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/item/wrench{ + desc = "A little smidgeon of Freon..."; + name = "Freon" }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/armory) +/obj/item/stock_parts/micro_laser/high{ + pixel_x = -4; + pixel_y = -8 + }, +/obj/item/stock_parts/micro_laser/high{ + pixel_x = 8; + pixel_y = 4 + }, +/obj/item/stock_parts/micro_laser/high{ + pixel_x = -8; + pixel_y = -4 + }, +/obj/item/melee/powerfist, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) "Vh" = ( /obj/structure/table/reinforced, /obj/item/storage/backpack/duffelbag/med/surgery{ @@ -11167,11 +16012,18 @@ /turf/open/floor/iron/white, /area/centcom/central_command_areas/evacuation/ship) "Vi" = ( -/obj/item/book/manual/wiki/security_space_law, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table/reinforced/plasmarglass, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 6 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership) +"Vj" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/vending/clothing, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/area/centcom/tdome/observation) "Vk" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 @@ -11179,45 +16031,77 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/two) "Vl" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/pale/style_random, -/turf/open/misc/asteroid, -/area/centcom/tdome/administration) +/obj/effect/turf_decal/siding/dark{ + dir = 5 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 8 + }, +/obj/structure/sign/painting/library_secure{ + pixel_x = 32 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"Vm" = ( +/obj/structure/table/reinforced, +/obj/item/papercutter, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "Vn" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/three) "Vp" = ( -/obj/structure/chair/office{ - dir = 8 +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/structure/table/wood/fancy/royalblue, +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/obj/structure/mannequin, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) "Vq" = ( -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/obj/structure/fence/cut/medium{ + dir = 4 + }, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "Vr" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 +/obj/structure/table/reinforced, +/obj/item/storage/box/material, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) +"Vs" = ( +/obj/effect/turf_decal/tile/dark/diagonal_edge, +/obj/structure/table/wood/fancy/royalblue, +/obj/effect/spawner/random/decoration/statue{ + spawn_loot_chance = 50 }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) -"Vs" = ( -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) +"Vt" = ( +/obj/machinery/light/cold/directional/east, +/obj/machinery/vending/snack/teal, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/titanium, +/area/centcom/syndicate_mothership/control) "Vu" = ( /obj/structure/closet/secure_closet/ert_med, /obj/machinery/vending/wallmed/directional/south{ @@ -11253,34 +16137,80 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) "Vx" = ( -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) "Vy" = ( -/obj/machinery/status_display/ai/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supply) +/obj/effect/turf_decal/siding/green{ + dir = 6 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/botany) "Vz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/machinery/vending/dinnerware, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) +"VB" = ( +/obj/structure/chair/sofa/bench/right{ dir = 4 }, /obj/structure/cable, -/turf/open/floor/iron/grimy, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/catwalk_floor/titanium, +/area/centcom/syndicate_mothership/control) +"VC" = ( +/turf/open/floor/iron/dark/textured_half{ + dir = 4 + }, +/area/centcom/syndicate_mothership/control) +"VE" = ( +/obj/structure/table/reinforced, +/obj/item/gun/ballistic/automatic/wt550, +/obj/item/flashlight/seclite, +/obj/structure/noticeboard/directional/north, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) +"VF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"VH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) +"VI" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/mineral/titanium/purple, /area/centcom/central_command_areas/admin) -"VB" = ( -/obj/machinery/airalarm/directional/south, -/obj/machinery/dna_scannernew, -/obj/effect/turf_decal/trimline/blue/filled/warning, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"VG" = ( -/turf/open/floor/carpet/neon/simple/lime/nodots, -/area/centcom/tdome/observation) -"VK" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/donut_box, -/turf/open/floor/iron/grimy, +"VJ" = ( +/obj/structure/window/plasma/spawner/directional/east, +/obj/machinery/photocopier/gratis, +/turf/open/floor/carpet/royalblue, /area/centcom/central_command_areas/admin) +"VK" = ( +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "VL" = ( /obj/machinery/modular_computer/console/preset/id/centcom{ dir = 1 @@ -11299,6 +16229,12 @@ /obj/machinery/status_display/evac/directional/east, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) +"VN" = ( +/obj/structure/fence/corner{ + dir = 6 + }, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) "VO" = ( /obj/machinery/door/poddoor/ert, /obj/effect/turf_decal/delivery, @@ -11309,33 +16245,55 @@ /obj/effect/turf_decal/tile/brown/anticorner/contrasted, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/four) +"VR" = ( +/obj/machinery/light/directional/west, +/obj/structure/hedge, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/admin) +"VS" = ( +/obj/structure/railing/wood, +/obj/structure/railing/wood{ + dir = 4 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/borbop) "VT" = ( -/obj/structure/rack, -/obj/item/storage/box/donkpockets, -/obj/item/storage/box/donkpockets, -/obj/item/clothing/head/utility/chefhat, -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"VW" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/centcom/central_command_areas/ghost_spawn) -"VY" = ( -/obj/machinery/computer/records/security{ +/obj/structure/chair/stool/directional/north, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) +"VU" = ( +/obj/structure/chair/comfy/carp, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin) +"VV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ dir = 8 }, -/obj/machinery/button/door/indestructible{ - id = "XCCcustoms1"; - layer = 3; - name = "CC Emergency Docks Control"; - pixel_x = 24; - pixel_y = 24 +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) +"VX" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/chair/wood, +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/wood/parquet, +/area/centcom/central_command_areas/borbop) "VZ" = ( /obj/structure/closet/secure_closet/ert_med, /obj/structure/sign/directions/medical{ @@ -11347,130 +16305,205 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) +"Wb" = ( +/turf/open/floor/wood/large, +/area/centcom/tdome/observation) "Wc" = ( -/obj/machinery/door/airlock/centcom{ - name = "CentCom Security" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 }, -/obj/effect/mapping_helpers/airlock/access/any/medical/cmo, -/obj/effect/mapping_helpers/airlock/access/any/security, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, -/turf/open/floor/iron, -/area/centcom/central_command_areas/evacuation) +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) "Wd" = ( -/obj/structure/table/reinforced, -/obj/item/gun/ballistic/automatic/wt550, -/obj/item/flashlight/seclite, -/obj/structure/noticeboard/directional/north, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/central_command_areas/armory) +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/closed/indestructible/rock/snow, +/area/centcom/syndicate_mothership) +"We" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron_smooth{ + initial_gas_mix = "TEMP=2.7" + }, +/area/centcom/syndicate_mothership) "Wf" = ( -/obj/structure/sink/directional/west, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/structure/railing/wood{ + dir = 8 + }, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/structure/flora/bush/grassy/style_random, +/mob/living/basic/cow, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) "Wg" = ( /obj/effect/turf_decal/delivery, /turf/open/indestructible/event/plating, /area/centcom/tdome/arena/actual) +"Wh" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/fake_stairs/wood/directional/east, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supply) "Wi" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/door/airlock/public/glass{ - name = "CentCom Courtroom" +/obj/structure/hedge, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) "Wj" = ( -/obj/machinery/stove, -/turf/open/floor/iron/kitchen/herringbone, -/area/centcom/central_command_areas/fore) -"Wl" = ( -/obj/structure/table/wood, -/obj/machinery/recharger, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/structure/fake_stairs/wood/directional/east, +/obj/structure/railing/wood, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"Wk" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/chem_dispenser/drinks/fullupgrade{ + dir = 8 + }, +/turf/open/floor/carpet/executive, /area/centcom/central_command_areas/admin) "Wm" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 }, -/obj/machinery/light/directional/north, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) +/obj/structure/chair/office/light, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) "Wn" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/centcom/tdome/administration) +/obj/effect/turf_decal/siding/purple{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/the_big_gas_giant_truth{ + pixel_y = 32 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) +"Wo" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/mapping_helpers/airlock/access/any/supply/general, +/obj/effect/mapping_helpers/airlock/access/any/admin/general, +/obj/machinery/door/airlock/centcom{ + name = "CentCom Logistics" + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supply) "Wp" = ( -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 3 +/obj/structure/table/wood/poker, +/obj/machinery/light/warm/directional/north, +/obj/item/reagent_containers/cup/glass/bottle/whiskey{ + pixel_x = -4; + pixel_y = 14 }, -/obj/item/storage/secure/briefcase, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"Wq" = ( -/obj/machinery/modular_computer/console/preset/id/centcom, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons and the AI's satellite from the safety of his office."; - name = "Research Monitor"; - network = list("rd","minisat"); - pixel_y = 28 +/obj/item/toy/cards/deck{ + pixel_x = 3; + pixel_y = 6 }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) +/obj/item/clothing/mask/cigarette/robust{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/ash{ + pixel_x = 12; + pixel_y = -6 + }, +/obj/effect/spawner/random/entertainment/lighter{ + pixel_x = 9; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"Wr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"Ws" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 8 + }, +/obj/structure/sink/kitchen/directional/east, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) "Wt" = ( /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/four) +"Wu" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/carpet/neon/simple/cyan, +/area/centcom/central_command_areas/admin) "Wv" = ( -/obj/machinery/barsign/all_access/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"Ww" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 10 +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/effect/turf_decal/trimline/yellow/corner{ - dir = 4 +/obj/structure/table/reinforced, +/obj/item/storage/medkit/fire{ + pixel_y = 5; + pixel_x = -4 }, -/obj/structure/bed/double{ - dir = 4 +/obj/item/storage/medkit/brute, +/obj/item/storage/medkit/regular{ + pixel_x = -7 }, -/obj/item/bedsheet/ce/double{ +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) +"Ww" = ( +/mob/living/simple_animal/slime, +/turf/open/floor/circuit/red/off, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"Wx" = ( +/obj/effect/turf_decal/siding/wood{ dir = 4 }, -/obj/structure/sign/poster/contraband/clown{ - pixel_y = -29 - }, -/turf/open/floor/iron/dark/diagonal, -/area/centcom/central_command_areas/evacuation) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) "Wy" = ( /obj/structure/chair/office, /obj/effect/landmark/ert_spawn, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) -"WD" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" +"Wz" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 5 }, -/obj/effect/turf_decal/tile/green{ - dir = 8 +/obj/structure/sign/poster/contraband/rip_badger{ + pixel_x = 32 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/machinery/biogenerator, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"WA" = ( +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/asteroid/snow/icemoon, +/area/centcom/syndicate_mothership/control) +"WB" = ( +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) +"WC" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) +"WD" = ( +/obj/structure/destructible/cult/item_dispenser/archives/library, +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) "WE" = ( /obj/effect/turf_decal/tile/neutral/opposingcorners, /obj/effect/turf_decal/tile/neutral/opposingcorners, @@ -11480,53 +16513,52 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation/ship) -"WF" = ( -/obj/item/storage/box/ids{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/silver_ids, -/obj/structure/table/reinforced, -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) "WG" = ( -/obj/structure/closet/secure_closet/ert_engi, -/obj/structure/sign/directions/engineering{ - pixel_y = 24 +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/botany) +"WH" = ( +/obj/machinery/door/window/brigdoor/security{ + dir = 1 }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/centcom/central_command_areas/armory) +/turf/open/floor/circuit/telecomms, +/area/centcom/central_command_areas/admin) "WI" = ( -/obj/structure/table/wood, -/obj/item/storage/box/drinkingglasses, -/obj/item/reagent_containers/cup/glass/bottle/whiskey{ - pixel_y = 5 +/obj/effect/turf_decal/siding/dark/end{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/admin) +"WJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/machinery/hydroponics/constructable{ + self_growing = 1; + self_sustaining = 1; + sustaining_precent = 100; + multi = 15 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) "WK" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/green{ - dir = 4 +/obj/structure/chair/bronze{ + dir = 8 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/floor/carpet, +/area/centcom/syndicate_mothership/control) "WL" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/green{ - dir = 1 +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/structure/chair/stool/directional/east, +/turf/open/floor/wood/tile, +/area/centcom/syndicate_mothership/control) "WM" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/iron, -/area/centcom/tdome/administration) +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 4 + }, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership/expansion_bombthreat) "WN" = ( /obj/structure/table/wood, /obj/item/storage/box/drinkingglasses, @@ -11537,36 +16569,35 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) "WO" = ( -/obj/structure/table/wood, -/obj/item/phone{ - desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/mask/cigarette/cigar/cohiba{ - pixel_x = 6 +/obj/effect/turf_decal/stripes/line, +/obj/machinery/button/ignition/incinerator/ordmix{ + id = "syn_ordmix_igniter"; + pixel_x = -6; + pixel_y = -30 }, -/obj/item/clothing/mask/cigarette/cigar/havana{ - pixel_x = 2 +/obj/machinery/button/door/directional/south{ + id = "syn_ordmix_vent"; + pixel_x = 5; + pixel_y = -29 }, -/obj/item/clothing/mask/cigarette/cigar{ - pixel_x = 4.5 +/obj/machinery/camera/autoname/directional/south{ + network = list("nukie") }, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) "WP" = ( -/obj/machinery/computer/station_alert{ - dir = 8 +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 }, -/obj/item/radio/intercom{ - desc = "Talk smack through this."; - pixel_x = 28; - syndie = 1 +/obj/item/kirbyplants{ + icon_state = "plant-22"; + pixel_x = -4 }, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "WQ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/centcom{ @@ -11594,19 +16625,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) -"WU" = ( -/obj/machinery/door/airlock/centcom{ - name = "Administrative Office" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin) -"WX" = ( -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron/grimy, +"WT" = ( +/turf/open/floor/carpet/executive, /area/centcom/central_command_areas/admin) +"WV" = ( +/obj/effect/turf_decal/siding/dark, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"WW" = ( +/obj/structure/hedge, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/medical) "WY" = ( /obj/machinery/light/directional/north, /obj/structure/table/reinforced, @@ -11617,50 +16646,65 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/ferry) +"WZ" = ( +/obj/effect/turf_decal/siding/dark, +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin) "Xa" = ( -/obj/machinery/door/firedoor, -/obj/item/reagent_containers/cup/glass/mug/britcup{ - pixel_x = -4; - pixel_y = -6 +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line{ + dir = 10 }, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/effect/turf_decal/bot, -/obj/machinery/coffeemaker, -/obj/structure/table/reinforced/rglass, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/structure/fluff/tram_rail{ + pixel_y = 17 + }, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/centcom/syndicate_mothership/control) "Xb" = ( -/obj/machinery/computer/security{ - dir = 8 +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/machinery/newscaster/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "Xc" = ( -/obj/structure/noticeboard/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/ghost_spawn) "Xd" = ( -/obj/item/lighter{ - pixel_x = 3; - pixel_y = 3 +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"Xe" = ( +/obj/structure/table/reinforced, +/obj/item/grenade/c4{ + pixel_x = 6 }, -/obj/item/lighter, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +/obj/item/grenade/c4{ + pixel_x = -4 + }, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) "Xf" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/flora/bush/pointy/style_random, -/turf/open/floor/grass, -/area/centcom/tdome/observation) +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) +"Xg" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) "Xh" = ( /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/four) @@ -11673,37 +16717,52 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) "Xk" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/handcuffs, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) -"Xl" = ( -/obj/structure/sink/directional/east, -/obj/structure/mirror/directional/west, -/obj/effect/turf_decal/tile/red/half/contrasted{ +/obj/machinery/vending/wardrobe/viro_wardrobe, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ dir = 8 }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/centcom/central_command_areas/hall) +"Xl" = ( +/obj/structure/table/wood, +/obj/item/storage/bag/tray, +/obj/item/food/burger/spell, +/turf/open/floor/carpet, +/area/centcom/wizard_station) +"Xm" = ( +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line, +/obj/structure/railing{ + dir = 9 + }, +/turf/open/lava/plasma/ice_moon, +/area/centcom/syndicate_mothership/control) "Xn" = ( -/obj/machinery/computer/security/telescreen, -/obj/structure/table/reinforced, -/turf/open/floor/carpet/executive, -/area/centcom/tdome/administration) -"Xo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/wood, +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, /area/centcom/central_command_areas/admin) "Xp" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/computer/monitor, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) -"Xq" = ( -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) "Xr" = ( /obj/machinery/keycard_auth/directional/south, /obj/structure/table/reinforced, @@ -11721,22 +16780,37 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/one) "Xt" = ( -/obj/structure/table/reinforced, -/obj/item/storage/fancy/donut_box, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/machinery/mech_bay_recharge_port, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "Xu" = ( -/obj/structure/sink/directional/east, -/obj/structure/mirror/directional/west, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/docking_port/stationary{ + dwidth = 25; + height = 50; + name = "Syndicate Auxiliary Shuttle Dock"; + shuttle_id = "emergency_syndicate"; + width = 50 }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"Xv" = ( +/obj/machinery/camera/autoname/directional/west{ + network = list("nukie") + }, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "Xw" = ( -/turf/open/floor/carpet/executive, -/area/centcom/tdome/administration) +/turf/closed/indestructible/fakeglass, +/area/centcom/central_command_areas/admin_hangout) +"Xx" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood/large, +/area/centcom/tdome/observation) "Xy" = ( /obj/machinery/door/airlock/external/ruin{ name = "Ferry Airlock" @@ -11750,35 +16824,68 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) "Xz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump{ - dir = 4 - }, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) +/obj/structure/flora/bush/grassy/style_random, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) "XA" = ( /obj/structure/filingcabinet/filingcabinet, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) +"XB" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/prison/cells) "XC" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/vending/imported/yangyu, -/turf/open/floor/iron, -/area/centcom/central_command_areas/fore) +/obj/effect/turf_decal/siding/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark, +/obj/structure/food_machine, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) "XD" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/one) +"XE" = ( +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) +"XF" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/supply) +"XH" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/west{ + network = list("nukie") + }, +/obj/structure/chair/greyscale{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) +"XI" = ( +/obj/structure/table/abductor, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin) "XJ" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/flora/bush/generic/style_random, -/turf/open/floor/grass, -/area/centcom/tdome/observation) +/turf/open/floor/iron/smooth_edge{ + dir = 8 + }, +/area/centcom/syndicate_mothership/control) "XK" = ( /obj/machinery/firealarm/directional/south, /obj/structure/closet/crate/bin, @@ -11786,158 +16893,202 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) -"XL" = ( -/obj/structure/chair/comfy/brown{ - dir = 8 +"XM" = ( +/turf/open/floor/plating/elevatorshaft, +/area/centcom/syndicate_mothership/control) +"XN" = ( +/obj/structure/chair/office, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) +"XO" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark/textured_half{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 +/area/centcom/syndicate_mothership/control) +"XP" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/obj/effect/turf_decal/tile/brown/diagonal_centre, +/obj/effect/turf_decal/tile/orange/diagonal_edge, +/turf/open/floor/iron/white/diagonal, +/area/centcom/central_command_areas/hall) +"XQ" = ( +/obj/structure/chair/greyscale{ + dir = 4 }, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership) +"XR" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/west, +/obj/item/toy/plush/lizard_plushie, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) -"XQ" = ( -/obj/machinery/computer/crew{ +"XS" = ( +/obj/structure/flora/tree/dead/style_random, +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"XT" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 }, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 +/obj/structure/sink/directional/south, +/obj/item/shovel/spade{ + pixel_x = -4 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"XT" = ( -/turf/closed/indestructible/fakeglass, -/area/centcom/central_command_areas/supplypod) -"XV" = ( -/obj/structure/table/wood, -/obj/item/clipboard, -/obj/item/folder/red, -/obj/item/stamp/denied{ - pixel_x = 3; - pixel_y = 3 +/obj/item/reagent_containers/cup/bucket, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) +"XU" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 6 + }, +/obj/effect/turf_decal/siding/dark/corner{ + dir = 1 }, -/obj/item/stamp, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) -"Ya" = ( -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/armory) -"Yc" = ( -/obj/structure/fireplace, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) -"Ye" = ( -/obj/structure/flora/bush/pale/style_random, -/obj/structure/flora/bush/flowers_pp/style_random, -/turf/open/floor/grass, -/area/centcom/central_command_areas/control) -"Yi" = ( -/obj/machinery/computer/camera_advanced, /turf/open/floor/iron/dark/herringbone, -/area/centcom/central_command_areas/evacuation/ship) -"Yj" = ( -/obj/structure/chair/comfy/black, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) -"Yk" = ( -/obj/effect/turf_decal/bot, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) -"Ym" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/pale/style_random, -/turf/open/misc/asteroid, -/area/centcom/central_command_areas/control) -"Yn" = ( -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/supplypod) -"Yo" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/door/airlock/public/glass{ - name = "CentCom Courtroom" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ +"XV" = ( +/obj/effect/turf_decal/siding/wood{ dir = 1 }, +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/hall) +"XW" = ( +/obj/machinery/light/floor/has_bulb, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/evacuation) -"Yp" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 8 +/area/centcom/central_command_areas/medical) +"XX" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 9 }, -/obj/effect/turf_decal/siding/wideplating/dark{ +/obj/effect/turf_decal/siding/dark/corner, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin) +"XY" = ( +/obj/structure/railing/wood, +/obj/structure/railing/wood{ + dir = 1 + }, +/obj/structure/railing/wood{ dir = 4 }, -/obj/structure/railing{ - dir = 8 +/obj/structure/table/reinforced, +/obj/machinery/fax{ + name = "Admin Meeting Room Fax Machine" }, -/turf/open/floor/wood, -/area/centcom/central_command_areas/fore) -"Yq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ +/turf/open/floor/glass/reinforced, +/area/centcom/central_command_areas/admin_hangout) +"XZ" = ( +/obj/effect/turf_decal/siding/green{ + dir = 9 + }, +/obj/structure/chair/sofa/bamboo/left{ dir = 4 }, -/obj/structure/cable, -/turf/open/floor/wood, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) +"Ya" = ( +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/armory) +"Yb" = ( +/obj/structure/table/wood/fancy/green{ + name = "Intern Desk" + }, +/obj/item/clipboard, +/obj/structure/window/plasma/spawner/directional/west, +/turf/open/indestructible/hotelwood, /area/centcom/central_command_areas/admin) -"Yr" = ( -/obj/structure/table/wood, -/obj/machinery/computer/security/wooden_tv, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/grimy, +"Yd" = ( +/obj/structure/closet/crate/science, +/obj/item/clothing/head/beret/science/rd, +/turf/open/floor/carpet/purple, /area/centcom/central_command_areas/admin) -"Ys" = ( -/obj/structure/window/reinforced/spawner/directional/west, +"Yg" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, /obj/structure/table/reinforced, -/obj/item/gun/medbeam{ - pixel_y = -1 +/obj/item/reagent_containers/cup/glass/bottle/vodka/badminka{ + pixel_y = 19; + pixel_x = 9 }, -/obj/item/gun/medbeam{ - pixel_y = 7 +/obj/item/reagent_containers/cup/glass/bottle/whiskey{ + pixel_x = 1; + pixel_y = 21 }, -/obj/item/gun/medbeam{ - pixel_y = 3 +/obj/item/reagent_containers/cup/glass/bottle/wine{ + pixel_y = 21; + pixel_x = -8 }, -/obj/item/defibrillator/compact/combat/loaded/nanotrasen, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 +/obj/item/reagent_containers/cup/glass/bottle/tequila{ + pixel_x = 8; + pixel_y = 11 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"Yu" = ( -/obj/structure/table/reinforced, -/obj/machinery/reagentgrinder{ - desc = "Used to grind things up into raw materials and liquids."; - pixel_y = 5 +/obj/item/reagent_containers/cup/glass/bottle/sake{ + pixel_y = 15 + }, +/obj/item/reagent_containers/cup/glass/bottle/navy_rum{ + pixel_x = -8; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/glass/bottle/mushi_kombucha{ + pixel_y = 4 + }, +/obj/item/reagent_containers/cup/glass/bottle/maltliquor{ + pixel_x = 11 }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"Yv" = ( -/obj/effect/turf_decal/stripes/line{ +/area/centcom/central_command_areas/borbop) +"Yh" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/closed/indestructible/opsglass, +/area/centcom/syndicate_mothership/control) +"Yi" = ( +/obj/machinery/computer/camera_advanced, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/evacuation/ship) +"Yj" = ( +/obj/machinery/modular_computer/console/preset/id/centcom{ dir = 4 }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, +/turf/open/floor/mineral/titanium/white, +/area/centcom/central_command_areas/admin) +"Yk" = ( +/obj/effect/turf_decal/bot, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supply) +"Yn" = ( +/turf/closed/indestructible/riveted, /area/centcom/central_command_areas/supplypod) -"Yw" = ( -/obj/machinery/stasis, -/obj/structure/window/reinforced/tinted/frosted{ - dir = 4 +"Yq" = ( +/obj/machinery/door/airlock{ + icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; + name = "Bathroom" }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 +/turf/open/floor/engine/cult, +/area/centcom/wizard_station) +"Yt" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/fake_stairs/wood/directional/east, +/turf/open/floor/iron, +/area/centcom/central_command_areas/supply) +"Yu" = ( +/obj/machinery/vending/cigarette/syndicate, +/turf/open/floor/catwalk_floor/titanium, +/area/centcom/syndicate_mothership/control) +"Yv" = ( +/obj/structure/mirror/magic{ + pixel_y = 28 }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/structure/sink/directional/south, +/turf/open/floor/iron/white, +/area/centcom/wizard_station) "Yx" = ( /turf/open/floor/iron/white/herringbone, /area/centcom/central_command_areas/evacuation/ship) @@ -11949,30 +17100,40 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) -"YA" = ( -/obj/machinery/door/airlock/centcom{ - locked = 1; - name = "CentCom Auxiliary Announcement Closet" +"Yz" = ( +/obj/structure/table/wood, +/obj/machinery/fax{ + fax_name = "Waffles"; + name = "Waffles' Fax Machine" }, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/admin) +"YA" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/centcom/wizard_station) +"YC" = ( +/obj/structure/hedge, +/obj/structure/railing/wood, +/obj/effect/turf_decal/tile/dark/opposingcorners, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) +/area/centcom/central_command_areas/kitchen) "YD" = ( -/obj/structure/table/wood, -/obj/structure/reagent_dispensers/beerkeg, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/tdome/observation) -"YG" = ( -/obj/machinery/door/airlock/centcom{ - name = "Botanical Training Area" - }, -/obj/effect/mapping_helpers/airlock/unres{ +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/floor/iron, +/turf/open/floor/wood/large, /area/centcom/tdome/observation) +"YE" = ( +/obj/structure/fake_stairs/wood/directional/north, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/botany) +"YF" = ( +/obj/structure/flora/tree/jungle/style_3, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/grass, +/area/centcom/central_command_areas/hall) "YH" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -11983,80 +17144,70 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation/ship) -"YI" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/flora/bush/pointy/style_random, -/mob/living/basic/butterfly, -/turf/open/floor/grass, -/area/centcom/central_command_areas/evacuation) -"YN" = ( -/obj/machinery/chem_dispenser/fullupgrade, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/structure/sign/poster/official/plasma_effects{ - pixel_y = 35 - }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) -"YO" = ( -/obj/item/radio{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/radio{ - pixel_x = -5; - pixel_y = 5 +"YJ" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 10 }, -/obj/item/radio, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/trimline/dark_blue/filled/line{ +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/prison/cells) +"YK" = ( +/obj/effect/turf_decal/siding/dark{ dir = 5 }, +/turf/open/floor/carpet, +/area/centcom/central_command_areas/hall) +"YL" = ( +/obj/structure/railing/wood, /turf/open/floor/iron/dark, -/area/centcom/tdome/administration) -"YP" = ( -/obj/structure/chair/office/light{ - dir = 4 +/area/centcom/central_command_areas/medical) +"YM" = ( +/obj/structure/closet/cardboard, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) +"YN" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/hall) +"YP" = ( +/obj/effect/spawner/random/trash/garbage, +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/structure/fans/tiny/invisible, /turf/open/floor/iron, -/area/centcom/tdome/observation) -"YQ" = ( -/obj/structure/table/wood, -/obj/item/toy/cards/deck/cas{ - pixel_x = -5; - pixel_y = 5 +/area/centcom/central_command_areas/admin) +"YR" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 8 }, -/obj/item/toy/cards/deck/cas/black{ - pixel_x = 5; - pixel_y = 5 +/obj/effect/turf_decal/siding/dark{ + dir = 4 }, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/admin_hangout) +"YS" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/borbop) "YT" = ( -/obj/structure/table/wood, -/obj/structure/plaque/static_plaque/thunderdome{ - pixel_y = -32 - }, -/obj/item/clothing/accessory/medal{ - pixel_y = 5 +/turf/open/floor/iron/smooth_large{ + icon = 'goon/icons/turf/floors.dmi'; + icon_state = "boxing" }, -/turf/open/floor/iron/grimy, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/hall) "YU" = ( -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/admin/storage) +/obj/structure/lattice/catwalk, +/obj/effect/turf_decal/stripes/line, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/plating/snowed/icemoon, +/area/centcom/syndicate_mothership/control) "YV" = ( -/obj/structure/closet/lawcloset, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) +/obj/structure/bed, +/obj/item/bedsheet/syndie, +/turf/open/floor/iron/smooth_half, +/area/centcom/syndicate_mothership/control) "YW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 @@ -12065,61 +17216,75 @@ /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation/ship) "YX" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/prison/cells) +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "YY" = ( -/obj/machinery/airalarm/directional/east, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/control) -"Za" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/indestructible/riveted, -/area/centcom/central_command_areas/fore) -"Zd" = ( -/obj/effect/landmark/prisonwarp, +/obj/machinery/computer/atmos_control/noreconnect{ + atmos_chambers = list("nukiebase"="Burn Chamber"); + desc = "Used to monitor the Syndicate Ordnance Laboratory's burn chamber."; + dir = 1; + name = "Ordnance Chamber Monitor" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/cold/directional/west{ + dir = 2 + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"YZ" = ( +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/obj/structure/railing/wood, +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/botany) +"Zb" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/bed/pod{ - dir = 8 +/obj/machinery/door/airlock/centcom{ + name = "CentCom Security" }, -/obj/item/pillow/clown, -/obj/item/bedsheet/clown, -/turf/open/indestructible/dark, -/area/centcom/central_command_areas/prison/cells) -"Ze" = ( -/obj/effect/turf_decal/tile/red, +/obj/effect/mapping_helpers/airlock/access/any/admin/general, /turf/open/floor/iron, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/ferry) +"Zc" = ( +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/admin) +"Zd" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/floor/engine, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "Zf" = ( /turf/closed/indestructible/fakeglass, /area/centcom/central_command_areas/admin) -"Zg" = ( -/obj/machinery/status_display/ai/directional/north, -/obj/item/kirbyplants{ - icon_state = "plant-15"; - pixel_x = -6; - pixel_y = 12 +"Zh" = ( +/obj/structure/window/reinforced/survival_pod/spawner/directional/south{ + name = "Tinted Window"; + opacity = 1 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"Zi" = ( +/obj/item/kirbyplants/fullysynthetic, +/turf/open/floor/mineral/titanium/white, /area/centcom/central_command_areas/admin) "Zj" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/oven/range, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/landmark/navigate_destination/centcom/kitchen, /turf/open/floor/iron/dark, -/area/centcom/tdome/observation) +/area/centcom/central_command_areas/kitchen) "Zk" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/obj/item/storage/cans/sixsoda, -/obj/structure/closet/crate/freezer, -/obj/effect/spawner/random/food_or_drink/pizzaparty, -/obj/effect/spawner/random/food_or_drink/pizzaparty, -/obj/effect/spawner/random/medical/memeorgans, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/centcom/central_command_areas/fore) +/obj/machinery/light/cold/directional/east, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "Zl" = ( /obj/structure/table/reinforced, /obj/item/clipboard, @@ -12129,72 +17294,78 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) "Zm" = ( -/obj/structure/sink/directional/east, -/obj/structure/mirror/directional/west, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/siding/wood{ dir = 8 }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) +"Zn" = ( +/obj/structure/window/plasma/spawner/directional/west, +/turf/open/floor/carpet/royalblue, +/area/centcom/central_command_areas/admin) "Zo" = ( /obj/structure/sign/warning/vacuum/external, /turf/closed/indestructible/fakeglass, /area/centcom/central_command_areas/supply) +"Zp" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/botany) "Zq" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/herringbone, /area/centcom/central_command_areas/evacuation/ship) +"Zr" = ( +/obj/structure/chair/sofa/left{ + dir = 4 + }, +/turf/open/floor/carpet/purple, +/area/centcom/central_command_areas/admin) "Zs" = ( /obj/machinery/shuttle_manipulator, /turf/open/floor/circuit/green, /area/centcom/central_command_areas/briefing) "Zt" = ( -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 10 - }, -/turf/open/floor/iron/dark/textured, -/area/centcom/central_command_areas/control) +/obj/structure/flora/rock/pile/style_random, +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"Zu" = ( +/obj/structure/fake_stairs/wood/directional/west, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "Zv" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/armory) "Zw" = ( -/obj/structure/chair/stool{ - dir = 8 - }, -/turf/open/floor/eighties/red{ - icon = 'goon/icons/turf/floors.dmi'; - icon_state = "clown_carpet" +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 }, -/area/centcom/central_command_areas/fore) +/turf/open/space/basic, +/area/space/nearstation) "Zx" = ( -/obj/machinery/computer/records/security{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/courtroom) -"Zy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_red/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 4 +/obj/effect/turf_decal/siding/dark{ + dir = 5 }, -/turf/open/floor/iron/smooth_half{ - dir = 1 +/obj/structure/punching_bag, +/turf/open/floor/iron/smooth_large{ + icon = 'goon/icons/turf/floors.dmi'; + icon_state = "boxing" }, -/area/centcom/central_command_areas/prison) +/area/centcom/central_command_areas/admin) +"Zy" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/manifold, +/turf/open/space/basic, +/area/space/nearstation) +"Zz" = ( +/obj/structure/closet/crate/freezer/surplus_limbs, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/medical) "ZA" = ( /obj/effect/turf_decal/siding/wideplating_new/dark{ dir = 8 @@ -12207,10 +17378,33 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured_large, /area/centcom/central_command_areas/evacuation/ship) +"ZB" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood{ + dir = 1 + }, +/obj/structure/railing/wood{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/hall) "ZC" = ( -/obj/machinery/biogenerator/admin, -/turf/open/indestructible/event/plating, -/area/centcom/tdome/observation) +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck/wizoff{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/toy/cards/deck/tarot{ + pixel_x = 6; + pixel_y = 4 + }, +/turf/open/floor/carpet, +/area/centcom/wizard_station) +"ZD" = ( +/obj/structure/chair/sofa/corp/corner, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/mineral/titanium/white, +/area/centcom/central_command_areas/admin) "ZE" = ( /obj/effect/landmark/error, /turf/open/misc/ashplanet/wateryrock{ @@ -12218,15 +17412,6 @@ planetary_atmos = 0 }, /area/awaymission/errorroom) -"ZF" = ( -/obj/structure/dresser, -/obj/structure/plaque/static_plaque/golden/captain{ - pixel_x = 32 - }, -/obj/machinery/status_display/ai/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) "ZG" = ( /obj/structure/table/wood, /obj/item/newspaper{ @@ -12249,19 +17434,54 @@ /obj/machinery/barsign/all_access/directional/north, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/evacuation/ship) +"ZH" = ( +/obj/effect/turf_decal/siding/green, +/obj/structure/railing/wood, +/turf/open/floor/iron/dark/small, +/area/centcom/central_command_areas/botany) +"ZI" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/structure/chair/sofa/bench/left{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "ZJ" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/airlock/glass_large{ - name = "Shipping and Receiving" +/obj/structure/flora/rock/icy/style_random{ + pixel_x = -7 }, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/obj/effect/mapping_helpers/airlock/access/any/supply/shipping, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/supplypod) +/obj/effect/light_emitter{ + set_cap = 1; + set_luminosity = 4 + }, +/turf/open/misc/asteroid/snow/airless, +/area/centcom/syndicate_mothership) +"ZK" = ( +/obj/structure/bookcase/random/adult, +/turf/open/floor/iron/white, +/area/centcom/wizard_station) +"ZL" = ( +/obj/effect/turf_decal/siding/dark{ + dir = 9 + }, +/obj/effect/turf_decal/siding/dark/corner, +/obj/machinery/vending/wardrobe/bar_wardrobe, +/turf/open/floor/iron/dark/side{ + dir = 9 + }, +/area/centcom/central_command_areas/hall) "ZM" = ( -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/admin_hangout) "ZN" = ( /obj/item/clipboard, /obj/item/folder/red, @@ -12275,24 +17495,20 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/ferry) "ZO" = ( -/obj/structure/railing{ - dir = 1 +/obj/structure/chair/sofa/bench/right{ + dir = 8 }, -/mob/living/simple_animal/pet/cat{ - name = "Fresh Runtime"; - gender = "female"; - desc = "GCAT, This one is number 817, but it seems like something went wrong."; - icon_state = "cat" +/obj/structure/sign/poster/contraband/syndicate_pistol{ + pixel_y = 32 }, -/turf/open/floor/grass, -/area/centcom/central_command_areas/control) +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "ZP" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/hall) "ZQ" = ( /obj/effect/turf_decal/tile/brown/anticorner/contrasted{ dir = 8 @@ -12300,69 +17516,66 @@ /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/four) "ZR" = ( -/obj/machinery/door/airlock/centcom{ - name = "Thunderdome Red Team" +/obj/effect/turf_decal/stripes/corner{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 +/obj/structure/railing/corner{ + dir = 4 }, -/turf/open/floor/iron, -/area/centcom/tdome/observation) +/turf/open/floor/plating/icemoon, +/area/centcom/syndicate_mothership/control) "ZS" = ( -/obj/structure/table/reinforced, -/obj/item/wrench, -/obj/item/restraints/handcuffs, -/obj/item/assembly/flash/handheld, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/control) -"ZT" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen/fourcolor, -/obj/machinery/vending/wallmed/directional/north{ - use_power = 0 +/obj/structure/railing/wood{ + dir = 4 }, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/railing/wood, /turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) +/area/centcom/central_command_areas/hall) "ZU" = ( -/obj/structure/chair/sofa/corp/left, -/turf/open/floor/iron/kitchen/diagonal, -/area/centcom/central_command_areas/fore) -"ZV" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted{ +/obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 }, -/turf/open/floor/iron/white, -/area/centcom/tdome/observation) +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bombthreat) +"ZV" = ( +/obj/structure/railing/wrestling, +/turf/closed/indestructible/riveted, +/area/centcom/central_command_areas/hall) +"ZW" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/structure/rack, +/obj/item/storage/bag/plants, +/obj/item/clothing/suit/apron, +/obj/item/hatchet, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "ZX" = ( -/obj/machinery/door/airlock/centcom{ - name = "CentCom Logistics" +/obj/effect/turf_decal/siding/dark{ + dir = 10 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 +/obj/effect/turf_decal/siding/dark/corner{ + dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/any/supply/general, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/turf/open/floor/iron, -/area/centcom/central_command_areas/supply) +/obj/structure/hedge, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/white/herringbone, +/area/centcom/central_command_areas/kitchen) "ZY" = ( -/obj/machinery/door/airlock/centcom{ - name = "CentCom Security" +/obj/structure/chair/wood{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/mapping_helpers/airlock/access/any/security/general, -/obj/effect/mapping_helpers/airlock/access/any/admin/general, -/turf/open/floor/iron, -/area/centcom/central_command_areas/control) +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/centcom/central_command_areas/kitchen) +"ZZ" = ( +/obj/structure/flora/tree/jungle/small/style_5, +/turf/open/floor/grass, +/area/centcom/central_command_areas/borbop) (1,1,1) = {" fX @@ -12620,9003 +17833,28 @@ aa aa aa aa -"} -(2,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -LV -LV -LV -LV -LV -LV -LV -LV -LV -LV -LV -aa -"} -(3,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -LV -LW -LW -LW -LW -LW -LW -LW -LW -LW -LV -aa -"} -(4,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -LV -LW -zi -zi -zi -ik -zi -zi -zi -LW -LV -aa -"} -(5,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -LV -LW -zi -zi -zi -ik -zi -zi -zi -LW -LV -aa -"} -(6,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -LV -LW -zi -zi -zi -ik -zi -zi -zi -LW -LV -aa -"} -(7,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -LV -LW -ik -ik -ik -ik -ik -ik -ik -LW -LV -aa -"} -(8,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -de -fX -fX -fX -fX -fX -fX -fX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -LV -LW -zi -zi -zi -ik -ik -ik -ik -LW -LV -aa -"} -(9,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -LV -LX -zi -zi -zi -ik -ik -ZE -fy -LW -LV -aa -"} -(10,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -LV -LW -zi -zi -zi -ik -ik -ik -ik -LW -LV -aa -"} -(11,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -LV -LW -ik -ik -ik -ik -ik -ik -ik -LW -LV -aa -"} -(12,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -LV -LW -zi -zi -zi -ik -zi -zi -zi -LW -LV -aa -"} -(13,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -LV -LW -zi -zi -zi -ik -zi -zi -zi -LW -LV -aa -"} -(14,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -LV -LW -zi -zi -zi -ik -zi -zi -zi -LW -LV -aa -"} -(15,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -LV -LW -LW -LW -LW -LW -LW -LW -LW -LW -LV -aa -"} -(16,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -LV -LV -LV -LV -LV -LV -LV -LV -LV -LV -LV -aa -"} -(17,1,1) = {" -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -fX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -fR -aa -aa -aa -aa -aa -aa -aa -aa -"} -(18,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(19,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -aa -"} -(20,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -jA -aa -"} -(21,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -jA -aa -"} -(22,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -jA -aa -"} -(23,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -jA -aa -"} -(24,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -jA -aa -"} -(25,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -jA -aa -"} -(26,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -jA -aa -"} -(27,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -hH -hH -hH -hH -hH -jA -jA -jA -jA -jA -hH -hH -hH -hH -hH -jA -aa -"} -(28,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -hH -hH -hH -hH -hH -jA -lS -lS -lS -jA -hH -hH -hH -hH -hH -jA -aa -"} -(29,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -hH -hH -hH -hH -hH -jA -lS -lS -lS -jA -hH -hH -hH -hH -hH -jA -aa -"} -(30,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -hH -hH -hH -hH -hH -jA -lS -lS -lS -jA -hH -hH -hH -hH -hH -jA -aa -"} -(31,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -hH -hH -hH -hH -hH -jA -jA -jA -jA -jA -hH -hH -hH -hH -hH -jA -aa -"} -(32,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -jA -aa -"} -(33,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -jA -aa -"} -(34,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -jA -aa -"} -(35,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -jA -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -jA -aa -"} -(36,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +"} +(2,1,1) = {" +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX aa aa aa aa -jA -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -jA aa -"} -(37,1,1) = {" aa aa aa @@ -21840,7 +18078,35 @@ aa aa aa aa +LV +LV +LV +LV +LV +LV +LV +LV +LV +LV +LV aa +"} +(3,1,1) = {" +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX aa aa aa @@ -21854,26 +18120,7 @@ aa aa aa aa -jA -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -jA aa -"} -(38,1,1) = {" aa aa aa @@ -22055,6 +18302,29 @@ aa aa aa aa +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di aa aa aa @@ -22065,7 +18335,35 @@ aa aa aa aa +LV +LW +LW +LW +LW +LW +LW +LW +LW +LW +LV aa +"} +(4,1,1) = {" +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX aa aa aa @@ -22111,26 +18409,7 @@ aa aa aa aa -jA -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -hH -jA aa -"} -(39,1,1) = {" aa aa aa @@ -22238,12 +18517,27 @@ aa aa aa aa +OL +OL +OL +OL +OL +OL +OL +OL +OL aa aa aa aa aa aa +OL +OL +OL +OL +OL +OL aa aa aa @@ -22265,6 +18559,29 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa @@ -22275,7 +18592,35 @@ aa aa aa aa +LV +LW +zi +zi +zi +ik +zi +zi +zi +LW +LV aa +"} +(5,1,1) = {" +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX aa aa aa @@ -22368,26 +18713,39 @@ aa aa aa aa -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA -jA aa -"} -(40,1,1) = {" +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Ms +Ms +sQ +sQ +sQ +Ms +Ms +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl aa aa aa @@ -22415,7 +18773,28 @@ aa aa aa aa +OL +OL +ku +ku +ku +ku +ku +ku +ku +OL aa +OL +OL +OL +OL +OL +OL +PL +PL +PL +PL +OL aa aa aa @@ -22437,6 +18816,29 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa @@ -22447,7 +18849,35 @@ aa aa aa aa +LV +LW +zi +zi +zi +ik +zi +zi +zi +LW +LV aa +"} +(6,1,1) = {" +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX aa aa aa @@ -22541,6 +18971,38 @@ aa aa aa aa +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Ms +Ms +Ms +Ms +Ov +WD +xW +WD +NG +Ms +sQ +sQ +Ms +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl aa aa aa @@ -22568,6 +19030,28 @@ aa aa aa aa +OL +ku +gP +bB +iw +DN +pO +QR +ku +OL +OL +OL +PL +PL +PL +JZ +PL +rU +mT +Ww +PL +OL aa aa aa @@ -22589,6 +19073,29 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa @@ -22599,7 +19106,35 @@ aa aa aa aa +LV +LW +zi +zi +zi +ik +zi +zi +zi +LW +LV aa +"} +(7,1,1) = {" +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX aa aa aa @@ -22643,8 +19178,6 @@ aa aa aa aa -"} -(41,1,1) = {" aa aa aa @@ -22695,6 +19228,38 @@ aa aa aa aa +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Ms +Ms +Go +fc +jz +QZ +QZ +QZ +QZ +QZ +MS +QZ +QZ +Ms +Ms +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl aa aa aa @@ -22722,6 +19287,28 @@ aa aa aa aa +OL +ku +Nu +qc +qc +qc +qc +qc +ku +nK +nK +nK +PL +KE +oH +sf +si +uG +mT +mT +PL +OL aa aa aa @@ -22743,6 +19330,29 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa @@ -22753,7 +19363,35 @@ aa aa aa aa +LV +LW +ik +ik +ik +ik +ik +ik +ik +LW +LV aa +"} +(8,1,1) = {" +fX +fX +fX +fX +fX +fX +fX +de +fX +fX +fX +fX +fX +fX +fX aa aa aa @@ -22847,6 +19485,38 @@ aa aa aa aa +Cl +Cl +Cl +Cl +Cl +Cl +Ms +Ms +Ul +cZ +fc +Ms +QZ +QZ +QZ +QZ +QZ +Ms +QZ +aN +QZ +Ms +Ms +Ms +Ms +Ms +Cl +Cl +Cl +Cl +Cl +Cl aa aa aa @@ -22874,6 +19544,28 @@ aa aa aa aa +OL +ku +BD +Cp +Cp +Cp +Cp +Od +ku +rk +rk +rk +PL +vM +Ue +pE +ne +uG +uG +uG +PL +OL aa aa aa @@ -22895,19 +19587,68 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa aa aa -"} -(42,1,1) = {" aa aa aa aa aa +LV +LW +zi +zi +zi +ik +ik +ik +ik +LW +LV aa +"} +(9,1,1) = {" +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX aa aa aa @@ -23001,6 +19742,38 @@ aa aa aa aa +Cl +Cl +Cl +Cl +Cl +Ms +Ms +fc +fc +fc +fc +Ms +Ov +WD +QZ +WD +NG +Ms +QZ +QZ +QZ +Ms +Dv +De +UJ +Ms +Ms +sQ +Ms +Cl +Cl +Cl aa aa aa @@ -23028,6 +19801,28 @@ aa aa aa aa +OL +ku +Qy +rC +Dc +vL +vu +Hg +ku +rk +rk +rk +PL +jG +cX +eO +ex +uG +mT +wg +PL +OL aa aa aa @@ -23049,6 +19844,29 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa @@ -23059,7 +19877,35 @@ aa aa aa aa +LV +LX +zi +zi +zi +ik +ik +ZE +fy +LW +LV aa +"} +(10,1,1) = {" +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX aa aa aa @@ -23153,12 +19999,42 @@ aa aa aa aa +Cl +Cl +Cl +Cl +Cl +Ms +ji +yF +fc +fc +YA +Ms +Ms +sQ +sQ +sQ +Ms +Ms +fd +aN +QZ +BT +PD +PD +tl +JD +QZ +QZ +Ms +Cl +Cl +Cl aa aa aa aa -"} -(43,1,1) = {" aa aa aa @@ -23169,6 +20045,11 @@ aa aa aa aa +yD +yD +yD +yD +yD aa aa aa @@ -23177,6 +20058,28 @@ aa aa aa aa +OL +ku +TH +xr +AK +JP +JP +zB +ku +nK +Qx +nK +PL +mz +cX +pE +vy +uG +mT +mT +PL +OL aa aa aa @@ -23198,6 +20101,29 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa @@ -23208,7 +20134,35 @@ aa aa aa aa +LV +LW +zi +zi +zi +ik +ik +ik +ik +LW +LV aa +"} +(11,1,1) = {" +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX aa aa aa @@ -23302,6 +20256,38 @@ aa aa aa aa +Cl +Cl +Ms +Ms +Ms +Ms +Ul +fc +fc +fc +Ru +Ms +Gf +QZ +QZ +QZ +BS +Ms +QZ +QZ +QZ +Ms +hq +Im +aT +Ms +Ms +JD +Ms +Ms +Ms +Cl aa aa aa @@ -23311,11 +20297,49 @@ aa aa aa aa +yD +yD +yD +yD +yD +yD +Wd +Wd +Wd +yD +yD +yD +yD aa aa aa aa aa +OL +ku +Mw +Cr +xO +Py +Oi +Gk +ku +kd +je +ah +uG +XT +qs +Hf +hS +uG +uG +uG +PL +OL +OL +OL +OL aa aa aa @@ -23334,6 +20358,29 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa @@ -23344,7 +20391,35 @@ aa aa aa aa +LV +LW +ik +ik +ik +ik +ik +ik +ik +LW +LV aa +"} +(12,1,1) = {" +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX aa aa aa @@ -23414,8 +20489,6 @@ aa aa aa aa -"} -(44,1,1) = {" aa aa aa @@ -23440,6 +20513,38 @@ aa aa aa aa +Cl +Ms +Ms +Rs +lG +Ms +Ms +Ms +ze +Ms +Ms +Ms +fK +QZ +QZ +QZ +OU +Ms +QZ +aN +QZ +Ms +Ms +Ms +Ms +Ms +QZ +QZ +Cf +op +Ms +Cl aa aa aa @@ -23448,9 +20553,50 @@ aa aa aa aa +yD +yD +jH +jH +jH +yD +Wd +Wd +Iz +Wd +Wd +Wd +Wd +yD +yD +yD aa aa aa +OL +ku +Wn +iJ +iJ +iJ +iJ +vb +Iq +DS +xU +oS +Jy +Vd +eO +cA +cA +Pu +uG +xJ +ga +Iw +Iw +Zw +OL aa aa aa @@ -23469,6 +20615,29 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa @@ -23479,7 +20648,35 @@ aa aa aa aa +LV +LW +zi +zi +zi +ik +zi +zi +zi +LW +LV aa +"} +(13,1,1) = {" +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX aa aa aa @@ -23573,6 +20770,38 @@ aa aa aa aa +Cl +sQ +QZ +QZ +QZ +sQ +QZ +QZ +QZ +mF +ON +Ms +QZ +QZ +QZ +QZ +QZ +sQ +QZ +QZ +QZ +Ms +Ce +Ur +Ig +Ms +Hz +QZ +QZ +op +mx +iB aa aa aa @@ -23580,8 +20809,51 @@ aa aa aa aa +yD +yD +jH +jH +Fz +jH +jH +Wd +HF +xE +xE +Bd +Rw +Wd +Wd +Wd +yD +yD aa aa +OL +ku +Rb +qc +Np +qc +qc +qc +fL +DS +xU +oS +uG +Wz +Lr +MT +OY +FC +uG +Zd +ga +Iw +Iw +Zy +OL aa aa aa @@ -23600,6 +20872,29 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa @@ -23610,7 +20905,35 @@ aa aa aa aa +LV +LW +zi +zi +zi +ik +zi +zi +zi +LW +LV aa +"} +(14,1,1) = {" +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX aa aa aa @@ -23671,8 +20994,6 @@ aa aa aa aa -"} -(45,1,1) = {" aa aa aa @@ -23706,12 +21027,90 @@ aa aa aa aa +Cl +sQ +rt +QZ +QZ +gb +QZ +QZ +QZ +QZ +QZ +Eg +QZ +QZ +eL +Bq +QZ +MS +QZ +aN +QZ +PV +aN +TT +aN +sQ +mY +QZ +QZ +op +mx +iB aa aa aa aa aa aa +yD +yD +jH +jH +Fz +Fz +Fz +jH +jH +xE +iK +Iz +xA +fx +fx +Ps +Wd +Wd +yD +yD +yD +yD +ku +ku +HC +tE +Sx +wi +em +Iq +DS +xU +lW +Nw +Nw +Nw +Nw +Nw +Nw +Nw +Nw +Nw +rJ +zl +Ud +OL aa aa aa @@ -23730,6 +21129,29 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +pW +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa @@ -23740,7 +21162,35 @@ aa aa aa aa +LV +LW +zi +zi +zi +ik +zi +zi +zi +LW +LV aa +"} +(15,1,1) = {" +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX aa aa aa @@ -23834,12 +21284,90 @@ aa aa aa aa +Cl +sQ +QZ +QZ +QZ +sQ +QZ +QZ +QZ +vX +ND +Ms +QZ +QZ +QZ +QZ +QZ +sQ +QZ +QZ +QZ +Ms +iQ +Ui +Xl +Ms +UO +QZ +QZ +op +mx +iB aa aa aa aa aa aa +yD +jH +jH +Fz +Fz +Fz +Fz +Fz +jH +jH +xE +xE +Bd +fx +fx +fx +Rw +Wd +Wd +Wd +Wd +Wd +Wd +ku +ku +ku +ku +ku +ku +ku +Qr +xU +oa +Nw +zL +en +Vg +dm +GB +ck +Nw +Nw +Nw +Nw +Nw +OL aa aa aa @@ -23858,6 +21386,29 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa @@ -23868,7 +21419,35 @@ aa aa aa aa +LV +LW +LW +LW +LW +LW +LW +LW +LW +LW +LV aa +"} +(16,1,1) = {" +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX aa aa aa @@ -23928,8 +21507,6 @@ aa aa aa aa -"} -(46,1,1) = {" aa aa aa @@ -23964,12 +21541,90 @@ aa aa aa aa +Cl +Ms +Ms +as +vv +Ms +Ms +Ms +dN +Ms +Ms +Ms +uW +QZ +QZ +QZ +OU +Ms +QZ +aN +QZ +Ms +Ms +Ms +Ms +Ms +sW +QZ +Cf +op +Ms +Cl aa aa aa aa aa aa +yD +jH +Fz +Fz +Fz +Fz +Fz +Fz +Fz +jH +jH +xE +Bp +fx +fx +if +fx +fx +JS +Iz +xE +JS +ZJ +nK +kL +hT +Sw +dr +UM +oD +DS +xU +oS +kU +Wc +IQ +Wm +tZ +bh +qS +MR +tV +eH +qW +Nw +OL aa aa aa @@ -23988,6 +21643,29 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa @@ -23998,7 +21676,35 @@ aa aa aa aa +LV +LV +LV +LV +LV +LV +LV +LV +LV +LV +LV aa +"} +(17,1,1) = {" +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX +fX aa aa aa @@ -24092,12 +21798,90 @@ aa aa aa aa +Cl +Cl +Ms +Ms +Ms +Ms +aN +Ja +aN +zC +ow +Ms +oI +ML +Kv +QZ +QZ +Ms +QZ +QZ +QZ +Ms +nH +jo +ZK +Ms +Ms +sQ +Ms +Ms +Ms +Cl aa aa aa aa aa aa +yD +jH +jH +jH +jH +kK +jH +Fz +Fz +Fz +jH +xE +Bd +fx +fx +zc +ZJ +fx +xE +nD +xE +nD +yc +nK +gw +Mn +Rn +hP +oS +SP +DS +xU +oS +NY +eZ +eZ +eZ +eZ +hC +IT +WO +Nw +ps +DH +Nw +OL aa aa aa @@ -24116,6 +21900,29 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa @@ -24129,6 +21936,7 @@ aa aa aa aa +fR aa aa aa @@ -24137,6 +21945,8 @@ aa aa aa aa +"} +(18,1,1) = {" aa aa aa @@ -24185,8 +21995,6 @@ aa aa aa aa -"} -(47,1,1) = {" aa aa aa @@ -24194,6 +22002,7 @@ aa aa aa aa +Fi aa aa aa @@ -24246,12 +22055,90 @@ aa aa aa aa +Cl +Cl +Cl +Cl +Cl +Ms +qX +ju +QQ +aN +fP +Ms +Ms +sQ +sQ +sQ +Ms +Ms +fd +aN +QZ +Yq +Ta +Ta +lM +Ms +Cl +Cl +Cl +Cl +Cl +Cl aa aa aa aa aa aa +yD +Wd +jH +jH +xw +xL +jH +jH +kK +jH +jH +og +Bd +fx +fx +fx +if +nD +xE +fs +fs +xE +nD +nK +MV +lx +mj +Mi +Oz +oD +DS +xU +oS +kU +JO +eu +ZU +gp +Je +nz +ti +tV +SH +qW +Nw +OL aa aa aa @@ -24270,6 +22157,29 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa @@ -24292,6 +22202,8 @@ aa aa aa aa +"} +(19,1,1) = {" aa aa aa @@ -24400,11 +22312,90 @@ aa aa aa aa +Cl +Cl +Cl +Cl +Cl +Ms +Ms +Ee +aN +Ja +aN +sQ +vc +pb +sL +OS +pb +sQ +QZ +QZ +QZ +Ms +Yv +RC +KC +Ms +Cl +Cl +Cl +Cl +Cl +Cl aa aa aa aa aa +yD +Wd +fx +Rw +jH +lz +XQ +pY +jH +iV +Us +jH +bs +Bd +fx +fx +fx +xE +eJ +xE +xE +nD +nK +nK +nK +nK +nK +nK +GG +GG +GG +Ve +vd +th +Nw +gJ +dg +DJ +gJ +fM +SB +YY +gM +hJ +hJ +Nw +OL aa aa aa @@ -24423,11 +22414,53 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa aa +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA aa +"} +(20,1,1) = {" aa aa aa @@ -24442,8 +22475,6 @@ aa aa aa aa -"} -(48,1,1) = {" aa aa aa @@ -24538,10 +22569,90 @@ aa aa aa aa +Cl +Cl +Cl +Cl +Cl +Cl +Ms +Ms +qX +ZC +QQ +sQ +Eu +xM +Eu +Rg +Eu +sQ +QZ +aN +QZ +Ms +Ms +Ms +Ms +Ms +Cl +Cl +Cl +Cl +Cl +Cl aa aa aa aa +yD +Wd +fx +Rw +fx +jH +Vi +Ax +jH +jH +kK +jH +jH +bs +Bd +fx +fx +if +xE +xE +nD +nD +oD +oD +nK +Mz +wn +GT +RI +GG +BL +GG +nK +Mu +nK +Nw +vQ +dB +nE +Zh +OT +Nk +IP +Nw +WM +WM +Nw +OL aa aa aa @@ -24560,11 +22671,53 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa aa +jA +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +jA aa +"} +(21,1,1) = {" aa aa aa @@ -24673,9 +22826,90 @@ aa aa aa aa +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Ms +Ms +Ee +aN +sQ +hk +jq +pb +xM +pb +sQ +QZ +QZ +Ms +Ms +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl aa aa aa +yD +Wd +fx +fx +Ps +fx +jH +wU +wU +jH +We +We +We +We +tG +Vq +fx +fx +Iz +xE +xE +eJ +oD +oD +zb +nK +ei +Bc +Bc +Bc +Fw +Au +GG +rp +Tt +XH +Nw +Ck +Qb +bJ +un +dH +UX +AW +Nw +tQ +tQ +Nw +OL aa aa aa @@ -24694,45 +22928,53 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa aa +jA +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +jA aa "} -(49,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(22,1,1) = {" aa aa aa @@ -24841,9 +23083,90 @@ aa aa aa aa +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Ms +Ms +Ms +Ms +pb +xM +Eu +uV +kV +Ms +sQ +sQ +Ms +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl aa aa aa +yD +Wd +tP +NM +tP +tP +jH +qU +ef +jH +qU +qU +Hx +qU +qU +VN +fx +fx +fx +xE +qy +xE +oD +gW +VK +Nh +Bc +Bc +Bc +Qw +GG +dI +GG +sz +Tt +oQ +Nw +Nw +Nw +Nw +Nw +Nw +Nw +Nw +Nw +zm +zm +Nw +OL aa aa aa @@ -24862,11 +23185,53 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa aa +jA +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +jA aa +"} +(23,1,1) = {" aa aa aa @@ -24956,8 +23321,6 @@ aa aa aa aa -"} -(50,1,1) = {" aa aa aa @@ -24977,6 +23340,90 @@ aa aa aa aa +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Ms +Ms +Ms +Ms +Ms +Ms +Ms +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +Cl +aa +aa +yD +Wd +xE +Ps +Rw +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +eJ +nD +Iz +oD +CY +VK +nK +eb +jx +Bc +fo +GG +Sp +GG +KL +Tt +ZW +nK +ir +rN +PN +Sn +lw +lN +UQ +Nw +Nw +Nw +Nw +OL aa aa aa @@ -24995,11 +23442,53 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Di aa aa aa aa +jA +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +jA aa +"} +(24,1,1) = {" aa aa aa @@ -25142,6 +23631,56 @@ aa aa aa aa +yD +Wd +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +xE +oD +oD +VK +VK +kB +TB +eg +GF +Bl +GG +kT +GG +nK +kY +nK +nK +ir +vU +dX +jT +jT +qC +qC +nK +OL +OL +OL +OL aa aa aa @@ -25160,11 +23699,53 @@ aa aa aa aa +Di +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +Qe +pu +Di aa aa aa aa +jA +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +jA aa +"} +(25,1,1) = {" aa aa aa @@ -25213,8 +23794,6 @@ aa aa aa aa -"} -(51,1,1) = {" aa aa aa @@ -25271,6 +23850,94 @@ aa aa aa aa +sk +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +if +xE +eJ +oD +vi +VK +lP +nK +Bv +NZ +NZ +BQ +GG +GG +GG +PF +nS +mn +nK +nK +nK +Ei +nK +nK +nK +nK +nK +OL +OL +OL +OL aa aa aa @@ -25289,11 +23956,53 @@ aa aa aa aa +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di +Di aa aa aa aa +jA +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +jA aa +"} +(26,1,1) = {" aa aa aa @@ -25398,6 +24107,94 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +nD +xE +oD +Fd +VK +VK +rv +XJ +XJ +XJ +XJ +EF +mu +At +kF +kF +dp +eM +nK +iz +qr +uM +Wp +pf +Dk +oD +CC +Gl +OL +OL aa aa aa @@ -25443,7 +24240,26 @@ aa aa aa aa +jA +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +jA aa +"} +(27,1,1) = {" aa aa aa @@ -25470,8 +24286,6 @@ aa aa aa aa -"} -(52,1,1) = {" aa aa aa @@ -25550,6 +24364,94 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +eJ +xE +oD +kD +VK +VK +IY +Fr +nS +nS +nS +Yh +nS +aQ +gV +jB +kF +re +UP +Xd +Xd +yW +Iu +Bc +Bc +oD +vY +CC +jN +OL aa aa aa @@ -25568,6 +24470,22 @@ aa aa aa aa +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn aa aa aa @@ -25579,7 +24497,26 @@ aa aa aa aa +jA +hH +hH +hH +hH +hH +jA +jA +jA +jA +jA +hH +hH +hH +hH +hH +jA aa +"} +(28,1,1) = {" aa aa aa @@ -25684,6 +24621,94 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +Iz +nD +oD +Fd +VK +VK +rv +by +by +by +by +EF +nS +aQ +aQ +aQ +tc +pa +nK +ap +Df +PP +Df +oP +Nn +oD +WA +WA +CI +OL aa aa aa @@ -25702,6 +24727,22 @@ aa aa aa aa +Yn +KF +KF +KF +KF +KF +SS +Yn +Yn +EZ +EZ +EZ +EZ +EZ +QM +Yn aa aa aa @@ -25713,7 +24754,26 @@ aa aa aa aa +jA +hH +hH +hH +hH +hH +jA +lS +lS +lS +jA +hH +hH +hH +hH +hH +jA aa +"} +(29,1,1) = {" aa aa aa @@ -25727,8 +24787,6 @@ aa aa aa aa -"} -(53,1,1) = {" aa aa aa @@ -25820,6 +24878,94 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +iK +oD +oD +ke +sy +nK +ru +WL +dj +jV +nK +Fs +wj +eM +eM +Qk +Qk +nK +nK +kz +nK +yx +nK +nK +nK +CP +WA +jj +OL aa aa aa @@ -25838,6 +24984,22 @@ aa aa aa aa +Yn +AH +AH +AH +AH +OP +PK +Yn +Yn +Vn +PW +Vn +PW +Vn +zZ +Yn aa aa aa @@ -25849,7 +25011,26 @@ aa aa aa aa +jA +hH +hH +hH +hH +hH +jA +lS +lS +lS +jA +hH +hH +hH +hH +hH +jA aa +"} +(30,1,1) = {" aa aa aa @@ -25954,6 +25135,94 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +nD +xE +oD +le +Qc +nK +CX +kE +Bx +VT +nK +hn +aQ +aQ +DK +nK +GV +nK +BO +xn +km +BU +BO +nK +vY +jj +CI +WA +OL aa aa aa @@ -25972,6 +25241,22 @@ aa aa aa aa +Yn +OP +AH +AH +AH +OP +PK +Yn +Yn +Vn +PW +Vn +PW +Vn +zZ +Yn aa aa aa @@ -25983,37 +25268,26 @@ aa aa aa aa +jA +hH +hH +hH +hH +hH +jA +lS +lS +lS +jA +hH +hH +hH +hH +hH +jA aa "} -(54,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(31,1,1) = {" aa aa aa @@ -26118,6 +25392,94 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +xE +eJ +oD +Gr +Fc +nK +Ag +iE +pr +If +nK +NU +aQ +aQ +dp +Ph +yT +nK +rc +ih +km +kc +bu +nK +WA +CP +qj +vY +OL aa aa aa @@ -26136,6 +25498,22 @@ aa aa aa aa +Yn +OP +OP +OP +OP +OP +PK +Yn +Yn +Vn +PW +Vn +PW +Vn +zZ +Yn aa aa aa @@ -26147,7 +25525,26 @@ aa aa aa aa +jA +hH +hH +hH +hH +hH +jA +jA +jA +jA +jA +hH +hH +hH +hH +hH +jA aa +"} +(32,1,1) = {" aa aa aa @@ -26241,8 +25638,6 @@ aa aa aa aa -"} -(55,1,1) = {" aa aa aa @@ -26254,6 +25649,94 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +nD +xE +nD +oD +oD +Yu +nK +Ft +lR +yZ +kH +nK +tg +aQ +aQ +nT +nK +Gj +nK +YV +Ai +km +rA +YV +nK +RP +WA +vY +CC +OL aa aa aa @@ -26272,6 +25755,22 @@ aa aa aa aa +Yn +AH +AH +AH +AH +OP +PK +Yn +Yn +Vn +Vn +Vn +Vn +Vn +zZ +Yn aa aa aa @@ -26283,7 +25782,26 @@ aa aa aa aa +jA +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +jA aa +"} +(33,1,1) = {" aa aa aa @@ -26388,6 +25906,95 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +eJ +qy +xE +oD +oD +nK +oD +oD +oD +oD +nK +UE +Hh +Hh +Qk +nK +nK +nK +oD +oD +nK +oD +oD +nK +nK +vY +vY +vY +OL +OL aa aa aa @@ -26405,6 +26012,22 @@ aa aa aa aa +Yn +XD +XD +XD +XD +XD +Xs +Yn +Yn +Tz +Tz +Tz +Tz +Tz +zE +Yn aa aa aa @@ -26416,7 +26039,26 @@ aa aa aa aa +jA +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +jA aa +"} +(34,1,1) = {" aa aa aa @@ -26498,8 +26140,6 @@ aa aa aa aa -"} -(56,1,1) = {" aa aa aa @@ -26523,6 +26163,98 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +nD +xE +Iz +CJ +nK +nK +xE +eJ +xE +XS +oD +UE +IC +IC +Qk +oD +BW +nK +Ts +Ts +Ts +Ts +Ts +nK +nK +vY +vY +vY +BG +OL +OL +OL +OL aa aa aa @@ -26537,6 +26269,22 @@ aa aa aa aa +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn aa aa aa @@ -26548,7 +26296,26 @@ aa aa aa aa +jA +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +jA aa +"} +(35,1,1) = {" aa aa aa @@ -26653,6 +26420,99 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +xE +iK +xE +CJ +xE +nD +xE +nD +qy +xE +oD +lb +IC +IC +bP +oD +BW +CP +jN +vY +pm +vY +jj +WA +vY +vY +vY +vY +bc +vY +vY +vY +OL +OL aa aa aa @@ -26666,6 +26526,22 @@ aa aa aa aa +Yn +zM +zM +zM +zM +zM +zs +Yn +Yn +Pv +Pv +Pv +Pv +Pv +ZQ +Yn aa aa aa @@ -26677,7 +26553,26 @@ aa aa aa aa +jA +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +jA aa +"} +(36,1,1) = {" aa aa aa @@ -26755,8 +26650,6 @@ aa aa aa aa -"} -(57,1,1) = {" aa aa aa @@ -26784,6 +26677,99 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +nD +xE +nD +CJ +xE +xE +XS +xE +xE +eJ +oD +lb +IC +IC +bP +oD +BW +WA +CI +CP +jN +pm +vY +vY +vY +vY +vY +vY +BG +vY +vY +vY +vY +OL aa aa aa @@ -26797,6 +26783,22 @@ aa aa aa aa +Yn +Se +Si +Se +Se +Se +Tc +Yn +Yn +Pm +Pm +Pm +Xh +Xh +Wt +Yn aa aa aa @@ -26808,7 +26810,26 @@ aa aa aa aa +jA +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +jA aa +"} +(37,1,1) = {" aa aa aa @@ -26913,6 +26934,103 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +fx +fx +fx +CJ +CJ +xE +xE +nD +xE +xE +oD +UE +mO +zd +Qk +oD +BW +vY +CC +WA +vY +vY +fk +vY +vY +fk +vY +vY +bV +vY +vY +vY +vY +OL +OL +OL +OL +OL aa aa aa @@ -26922,6 +27040,22 @@ aa aa aa aa +Yn +Se +Si +Se +Si +Se +Tc +Yn +Yn +Xh +Xh +Pm +Xh +Xh +Wt +Yn aa aa aa @@ -26933,7 +27067,26 @@ aa aa aa aa +jA +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +jA aa +"} +(38,1,1) = {" aa aa aa @@ -27012,8 +27165,6 @@ aa aa aa aa -"} -(58,1,1) = {" aa aa aa @@ -27040,6 +27191,104 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +fx +fx +fx +fx +Dz +fx +xE +xE +xE +nD +oD +UE +oV +DI +Qk +oD +BW +WA +vY +vY +fk +vY +vY +vY +vY +vY +vY +vY +BG +vY +vY +vY +vY +OL +OL +xm +vY +OL +OL aa aa aa @@ -27048,6 +27297,22 @@ aa aa aa aa +Yn +Se +Si +Se +Si +Se +Tc +Yn +Yn +Xh +Xh +Pm +Xh +Xh +Wt +Yn aa aa aa @@ -27059,7 +27324,26 @@ aa aa aa aa +jA +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +hH +jA aa +"} +(39,1,1) = {" aa aa aa @@ -27164,6 +27448,104 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +fx +fx +fx +fx +fx +fx +fx +xE +xE +xE +oD +lb +IC +IC +bP +oD +BW +vY +vY +vY +vY +hO +nK +iS +iS +iS +hO +iS +nK +CB +vY +vY +vY +vY +vY +vY +vY +vY +OL aa aa aa @@ -27172,6 +27554,22 @@ aa aa aa aa +Yn +Se +Se +Se +Si +Se +Tc +Yn +Yn +Pm +Pm +Pm +Pm +Pm +Wt +Yn aa aa aa @@ -27183,7 +27581,26 @@ aa aa aa aa +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA +jA aa +"} +(40,1,1) = {" aa aa aa @@ -27269,8 +27686,6 @@ aa aa aa aa -"} -(59,1,1) = {" aa aa aa @@ -27290,6 +27705,104 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +JS +fx +fx +fx +fx +fx +fx +fx +fx +xE +xE +xE +oD +lb +IC +IC +bP +oD +BW +vY +vY +vY +vY +aD +uR +rT +rT +rT +rT +rT +uR +Dq +CB +vY +vY +OL +vY +vY +vY +gC +OL aa aa aa @@ -27298,6 +27811,22 @@ aa aa aa aa +Yn +Vk +Vk +Vk +Vk +Vk +Oq +Yn +Yn +Co +Co +Co +Co +Co +VP +Yn aa aa aa @@ -27327,6 +27856,8 @@ aa aa aa aa +"} +(41,1,1) = {" aa aa aa @@ -27431,6 +27962,104 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +fx +fx +fx +fx +fx +fx +xE +xE +xE +xE +oD +UE +bt +KW +Qk +oD +BW +vY +vY +fk +hO +Jx +uR +rT +rT +rT +rT +rT +uR +rT +Gw +vY +vY +OL +OL +vY +gC +Oe +OL aa aa aa @@ -27439,6 +28068,22 @@ aa aa aa aa +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn +Yn aa aa aa @@ -27468,6 +28113,8 @@ aa aa aa aa +"} +(42,1,1) = {" aa aa aa @@ -27523,11 +28170,10 @@ aa aa aa aa +gt aa aa aa -"} -(60,1,1) = {" aa aa aa @@ -27573,6 +28219,104 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +Rw +if +fx +fx +fx +fx +xE +xE +xE +CJ +xE +xE +oD +UE +mO +zd +Qk +oD +BW +pm +vY +vY +Ot +rT +uR +AQ +AU +AU +AU +sg +uR +rT +HH +vY +WA +OL +vY +vY +Hs +xm +OL aa aa aa @@ -27626,6 +28370,8 @@ aa aa aa aa +"} +(43,1,1) = {" aa aa aa @@ -27730,6 +28476,104 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +if +fx +Ps +if +fx +xE +Iz +nD +CJ +CJ +xE +xE +oD +lb +IC +IC +bP +oD +BW +jN +vY +vY +aD +rT +tO +Mq +gU +gU +gU +bT +nZ +rT +rT +sZ +vY +OL +ry +vY +OL +OL +OL aa aa aa @@ -27784,14 +28628,7 @@ aa aa aa "} -(61,1,1) = {" -aa -aa -aa -aa -aa -aa -aa +(44,1,1) = {" aa aa aa @@ -27896,6 +28733,103 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +if +fx +iK +xE +xE +nD +xE +CJ +nD +xE +Zt +oD +lb +IC +IC +bP +oD +BW +CI +vY +vY +hf +Xm +Mq +gU +gU +gU +gU +gU +bT +RR +rT +Gw +CI +OL +OL +vY +vY +OL aa aa aa @@ -27950,6 +28884,8 @@ aa aa aa aa +"} +(45,1,1) = {" aa aa aa @@ -28040,8 +28976,6 @@ aa aa aa aa -"} -(62,1,1) = {" aa aa aa @@ -28056,6 +28990,104 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +JS +fx +Iz +xE +nD +qy +xE +nD +CJ +xE +xE +XS +oD +UE +IC +IC +Qk +oD +BW +nK +vY +vY +vY +NA +gU +gU +gU +gU +gU +gU +gU +bR +rT +Dy +vY +OL +OL +OL +vY +OL +OL aa aa aa @@ -28109,6 +29141,8 @@ aa aa aa aa +"} +(46,1,1) = {" aa aa aa @@ -28213,6 +29247,105 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +nK +nK +nK +nK +nK +nK +xE +fs +qy +nD +nK +nK +Fs +Fs +QO +Mr +Qk +nK +nK +nK +PB +vY +vY +KD +xt +gU +gU +gU +gU +gU +gU +bR +rT +CB +qj +OL +OL +OL +vY +vY +OL +OL aa aa aa @@ -28221,6 +29354,13 @@ aa aa aa aa +KH +Lt +Lt +Lt +Lt +Lt +Lt aa aa aa @@ -28258,6 +29398,8 @@ aa aa aa aa +"} +(47,1,1) = {" aa aa aa @@ -28297,8 +29439,6 @@ aa aa aa aa -"} -(63,1,1) = {" aa aa aa @@ -28364,12 +29504,120 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +ib +Xf +sN +Xv +Sg +nK +oD +oD +oD +oD +nK +fN +dL +SN +rA +rA +QF +di +di +Gx +vY +vY +vY +KD +gU +gU +gU +gU +gU +gU +gU +bR +rT +bd +vY +RP +OL +vY +Ek +vY +qb +OL +OL aa aa aa aa aa aa +KH +Lt +KK +wk +Qt +Lk +cP +MM aa aa aa @@ -28407,6 +29655,8 @@ aa aa aa aa +"} +(48,1,1) = {" aa aa aa @@ -28511,12 +29761,120 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +ib +Xf +Xf +Xf +Sg +lB +XO +VC +VC +XO +lB +VK +kZ +nM +rA +Cv +nK +nK +nK +nK +mS +vY +vY +YU +ZR +gU +gU +gU +gU +gU +tM +lt +CP +CC +vY +CI +OL +Ek +cO +Ek +vY +Hs +OL aa aa aa aa aa aa +Lt +tA +wX +HG +HG +Lk +cP +KQ aa aa aa @@ -28555,50 +29913,7 @@ aa aa aa "} -(64,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(49,1,1) = {" aa aa aa @@ -28703,12 +30018,120 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +ib +Xf +Xf +Xf +Sg +Pd +XO +VC +VC +XO +Pd +VK +kZ +nM +rA +ez +nK +XM +XM +nK +nK +qj +vY +vY +Xa +ZR +gU +gU +gU +tM +ph +CP +jN +CI +vY +jj +OL +OL +Ek +vY +gC +Oe +OL aa aa aa aa aa aa +KH +Lt +Lt +LJ +fW +SC +Lt +Lt aa aa aa @@ -28746,6 +30169,8 @@ aa aa aa aa +"} +(50,1,1) = {" aa aa aa @@ -28763,29 +30188,6 @@ aa aa aa aa -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di aa aa aa @@ -28811,8 +30213,6 @@ aa aa aa aa -"} -(65,1,1) = {" aa aa aa @@ -28875,6 +30275,106 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +ib +Xf +Xf +bG +nK +nK +oD +oc +pn +oD +nK +ZO +tN +Pk +rA +rA +jF +XM +XM +XM +nK +OL +CI +WA +Kz +HO +kA +Qz +kA +yy +Kz +jj +CI +jN +CP +OL +OL +OL +OL +OL +OL +OL +OL aa aa aa @@ -28883,6 +30383,11 @@ aa aa aa aa +Lt +Lt +qp +Lt +Lt aa aa aa @@ -28921,6 +30426,8 @@ aa aa aa aa +"} +(51,1,1) = {" aa aa aa @@ -29020,34 +30527,107 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +ib +Xf +Xf +Xf +oD +ws +Vm +AZ +Bc +rs +nK +ab +VB +Pk +rA +rA +jF +XM +XM +XM +nK +OL +vY +QU +Kz +CI +oD +Jc +oD +WA +Kz +jw +CP +OL +OL +OL +OL +OL +OL aa aa aa @@ -29060,16 +30640,24 @@ aa aa aa aa +fT +Lo +Lf +Sd +pV aa aa aa +KH +Lt +Lt +Lt +KH aa aa aa aa aa -"} -(66,1,1) = {" aa aa aa @@ -29095,6 +30683,8 @@ aa aa aa aa +"} +(52,1,1) = {" aa aa aa @@ -29199,6 +30789,97 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +Xu +ib +Xf +Xf +Xf +Aq +Bc +Bc +Bc +Bc +Bc +ye +VK +kZ +nM +rA +lj +nK +XM +XM +nK +nK +OL +OL +CI +Kz +jj +oD +lU +oD +RP +Kz +WA +jj +OL aa aa aa @@ -29216,8 +30897,20 @@ aa aa aa aa +Lt +Lt +qp +Lt +Lt aa aa +KH +Lt +cl +HR +Gi +Lt +KH aa aa aa @@ -29247,6 +30940,8 @@ aa aa aa aa +"} +(53,1,1) = {" aa aa aa @@ -29277,29 +30972,6 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -29325,8 +30997,6 @@ aa aa aa aa -"} -(67,1,1) = {" aa aa aa @@ -29376,6 +31046,97 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +ib +Xf +Xf +Xf +Aq +Oy +Jf +Bc +mE +av +nK +yY +Vt +OH +rA +Cv +nK +nK +nK +nK +OL +OL +OL +OL +Kz +WA +oD +Jc +oD +ql +nK +RP +OL +OL aa aa aa @@ -29392,8 +31153,26 @@ aa aa aa aa +KH +Lt +aZ +Xj +cr +Lt aa aa +Lt +Vh +LI +CH +CH +PJ +Lt +Lt +Lt +Lt +Lt +KH aa aa aa @@ -29418,6 +31197,8 @@ aa aa aa aa +"} +(54,1,1) = {" aa aa aa @@ -29522,6 +31303,96 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +ib +YM +Xf +bG +nK +nK +nK +PS +ht +rx +nK +nK +UE +nK +cz +cz +nK +rS +pc +nK +nK +nK +nK +nK +nK +oD +oD +Jc +nK +jj +WA +vY +OL aa aa aa @@ -29534,45 +31405,46 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa aa aa +Lt +Xp +lg +KZ +aL +Lt +Lt aa +LH +LN +OW +yX +yX +Nm +Lt +ey +LG +pH +gj +Lt +KH aa +ut aa aa aa +LM aa aa aa +Pw aa aa aa +pJ aa aa aa @@ -29583,58 +31455,7 @@ aa aa aa "} -(68,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(55,1,1) = {" aa aa aa @@ -29739,6 +31560,96 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +ib +Xf +Xf +Xf +ZI +hb +nK +nK +nK +nK +nK +Ub +mL +oD +VK +VK +bf +BX +BX +Uw +qA +iL +oX +DS +lU +Jc +Jc +Jc +nK +OL +OL +OL +OL aa aa aa @@ -29756,6 +31667,43 @@ aa aa aa aa +Lw +QB +ec +Ae +HZ +QD +Lt +Lt +Lt +LO +Zq +Yx +AA +Da +Lt +iI +LF +BR +MC +EN +Lt +Lt +LC +Lt +Lt +Lt +LC +Lt +Lt +Lt +LC +Lt +Lt +Lt +LC +Lt +KH aa aa aa @@ -29763,6 +31711,8 @@ aa aa aa aa +"} +(56,1,1) = {" aa aa aa @@ -29791,29 +31741,6 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -29839,8 +31766,6 @@ aa aa aa aa -"} -(69,1,1) = {" aa aa aa @@ -29892,6 +31817,95 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +ib +Xf +Xf +Xf +SA +gh +nK +gm +zw +Gy +nK +vn +BH +oD +VK +VK +Kn +UD +Dp +nL +GE +iL +nK +nK +nK +nK +nK +nK +nK +OL +Cd +OL aa aa aa @@ -29910,6 +31924,43 @@ aa aa aa aa +Lw +Yi +fV +YW +vJ +aI +Lt +pZ +Lt +mB +Lj +fI +vq +OF +Lw +wP +ud +Iv +NI +NI +Lw +KP +JE +Vv +of +LD +KV +EL +Ew +Lu +KV +LD +TM +LD +JE +Tu +Lt aa aa aa @@ -29917,6 +31968,8 @@ aa aa aa aa +"} +(57,1,1) = {" aa aa aa @@ -30021,6 +32074,95 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +ib +Xf +Xf +Xf +iY +cp +nK +Jt +eN +RQ +nK +nK +jy +Fs +PQ +VK +Kn +ai +qk +nY +GE +iL +RW +nK +OL +OL +OL +OL +OL +OL +Cd +OL aa aa aa @@ -30039,6 +32181,43 @@ aa aa aa aa +Lw +SX +jC +Hl +Hl +YW +gd +kr +dK +LQ +LQ +cj +cj +wT +Lm +HL +HJ +HJ +HJ +HJ +ci +QH +WE +WE +Li +Lb +Lb +WE +WE +Lb +Li +Li +Lb +bN +bN +bN +Lt aa aa aa @@ -30046,31 +32225,10 @@ aa aa aa aa +"} +(58,1,1) = {" aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -30096,8 +32254,6 @@ aa aa aa aa -"} -(70,1,1) = {" aa aa aa @@ -30175,6 +32331,95 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +ib +Xf +Xf +Xf +Tn +hG +nK +rO +eN +Ne +oD +VK +VK +kZ +VK +VK +Kn +Cw +PU +Oc +GE +iL +Xt +nK +OL +Cd +Cd +OL +Cd +OL +OL +OL aa aa aa @@ -30193,6 +32438,43 @@ aa aa aa aa +Lw +Rp +bb +MH +fV +sm +Lt +OG +Lt +LR +Tm +Tm +Ff +yH +Lw +AD +oY +dn +dn +eR +Lw +KO +LA +nb +sB +zx +ZA +Lp +sB +DA +LA +Lp +FE +Lp +LB +tm +Lt aa aa aa @@ -30200,6 +32482,8 @@ aa aa aa aa +"} +(59,1,1) = {" aa aa aa @@ -30304,30 +32588,95 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +ib +Xf +Xf +Xf +SA +VK +nK +LZ +Dd +Dd +RB +Fl +Fl +kZ +VK +VK +Kn +Le +cL +OI +GE +iL +CK +nK +OL +OL +OL +OL +OL +OL +OL aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -30346,6 +32695,43 @@ aa aa aa aa +Lw +CT +sw +dv +Lz +QD +Lt +Lt +Lt +KJ +Eq +Ip +Ip +JT +Lt +Dn +BR +LG +BR +RT +Lt +Lt +LP +Lt +Lt +Lt +LP +Lt +Lt +Lt +LP +Lt +Lt +Lt +LP +Lt +KH aa aa aa @@ -30354,9 +32740,7 @@ aa aa aa "} -(71,1,1) = {" -aa -aa +(60,1,1) = {" aa aa aa @@ -30461,6 +32845,89 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +ib +Xf +Zk +no +iY +zg +nK +rO +yB +iP +oD +VK +VK +kZ +VK +VK +Dm +BV +BV +BV +SG +Sr +rK +nK +nK +OL aa aa aa @@ -30485,17 +32952,41 @@ aa aa aa aa +Lt +sF +Ln +YH +Tb +Lt +Lt aa +Lt +ZG +AG +Qd +Tv +EH +Lt +Ll +LG +mU +RJ +Lt +KH aa +gi aa aa aa +cJ aa aa aa +KS aa aa aa +zr aa aa aa @@ -30505,6 +32996,8 @@ aa aa aa aa +"} +(61,1,1) = {" aa aa aa @@ -30562,29 +33055,6 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -30610,8 +33080,6 @@ aa aa aa aa -"} -(72,1,1) = {" aa aa aa @@ -30634,6 +33102,89 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +nK +nK +nK +nK +nK +nK +nK +nK +nK +nK +nK +nK +oD +Ha +oD +VK +Sj +dF +lY +jO +Kf +iL +yv +Es +nK +OL aa aa aa @@ -30658,8 +33209,26 @@ aa aa aa aa +KH +Lt +LU +Ld +rG +Lt aa aa +Lt +EV +eX +mf +rz +wN +Lt +Lt +Lt +Lt +Lt +KH aa aa aa @@ -30684,6 +33253,8 @@ aa aa aa aa +"} +(62,1,1) = {" aa aa aa @@ -30788,6 +33359,89 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +nK +nK +fx +Nv +fx +oz +nK +nK +Nv +fx +fx +ia +oD +Xf +oD +mK +Sj +PA +WK +PA +Kf +bg +nK +nK +nK +OL aa aa aa @@ -30813,35 +33467,24 @@ aa aa aa aa +Lt +Lt +ge +Lt +Lt aa aa +KH +Lt +Cy +iC +Po +Lt +KH aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -30868,32 +33511,7 @@ aa aa aa "} -(73,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(63,1,1) = {" aa aa aa @@ -30998,6 +33616,89 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +ia +fx +gA +fx +fx +ia +gA +fx +fx +KR +fx +oD +Xf +oD +nK +oD +er +Pz +Rl +oD +nK +nK +OL +OL +OL aa aa aa @@ -31023,9 +33724,19 @@ aa aa aa aa +fT +Lo +Rk +Sd +pV aa aa aa +KH +Lt +Lt +Lt +KH aa aa aa @@ -31056,6 +33767,8 @@ aa aa aa aa +"} +(64,1,1) = {" aa aa aa @@ -31076,29 +33789,6 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -31124,8 +33814,6 @@ aa aa aa aa -"} -(74,1,1) = {" aa aa aa @@ -31185,6 +33873,89 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +oz +fx +KR +fx +fx +fx +fx +fx +fx +Nv +oD +mM +oD +qg +oD +oD +oD +oD +oD +ia +Wd +yD +xE +yD aa aa aa @@ -31210,6 +33981,11 @@ aa aa aa aa +Lt +Lt +ge +Lt +Lt aa aa aa @@ -31248,6 +34024,8 @@ aa aa aa aa +"} +(65,1,1) = {" aa aa aa @@ -31333,29 +34111,6 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -31375,14 +34130,95 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +qg +fx +fx +gA +fx +nu +ia +fx +fx +fx +oD +Xf +oD +fx +gA +fx +ia +fx +fx +KR +Wd +yD +xE +yD aa aa aa aa aa aa -"} -(75,1,1) = {" aa aa aa @@ -31400,6 +34236,14 @@ aa aa aa aa +KH +Lt +Lt +Te +DL +CF +Lt +Lt aa aa aa @@ -31437,6 +34281,8 @@ aa aa aa aa +"} +(66,1,1) = {" aa aa aa @@ -31541,6 +34387,89 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +fx +fx +ia +fx +fx +fx +fx +fx +gA +ia +oD +Xf +oD +ia +fx +fx +fx +Nv +fx +fx +Wd +Wd +yD +yD aa aa aa @@ -31564,6 +34493,14 @@ aa aa aa aa +Lt +fz +za +MX +DL +ep +cP +MM aa aa aa @@ -31590,29 +34527,6 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -pW -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -31624,6 +34538,8 @@ aa aa aa aa +"} +(67,1,1) = {" aa aa aa @@ -31638,8 +34554,6 @@ aa aa aa aa -"} -(76,1,1) = {" aa aa aa @@ -31730,6 +34644,88 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +oD +sD +oD +fx +Nv +fx +fx +fx +gA +fx +ia +Wd +yD aa aa aa @@ -31754,6 +34750,14 @@ aa aa aa aa +KH +Lt +cT +Hb +OC +ep +cP +KQ aa aa aa @@ -31791,6 +34795,8 @@ aa aa aa aa +"} +(68,1,1) = {" aa aa aa @@ -31847,29 +34853,6 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -31895,8 +34878,6 @@ aa aa aa aa -"} -(77,1,1) = {" aa aa aa @@ -31920,6 +34901,88 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +CL +xE +xE +xE +fx +gA +fx +fx +ia +fx +Wd +yD aa aa aa @@ -31945,6 +35008,13 @@ aa aa aa aa +KH +Lt +Lt +Lt +Lt +Lt +Lt aa aa aa @@ -31982,6 +35052,8 @@ aa aa aa aa +"} +(69,1,1) = {" aa aa aa @@ -32086,6 +35158,88 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +ia +gA +fx +Nv +fx +fx +yD aa aa aa @@ -32104,29 +35258,6 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -32152,8 +35283,6 @@ aa aa aa aa -"} -(78,1,1) = {" aa aa aa @@ -32180,6 +35309,8 @@ aa aa aa aa +"} +(70,1,1) = {" aa aa aa @@ -32284,6 +35415,88 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +fx +fx +fx +fx +fx +yD aa aa aa @@ -32353,6 +35566,8 @@ aa aa aa aa +"} +(71,1,1) = {" aa aa aa @@ -32361,29 +35576,6 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -32409,8 +35601,6 @@ aa aa aa aa -"} -(79,1,1) = {" aa aa aa @@ -32482,6 +35672,88 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +yD aa aa aa @@ -32551,6 +35823,8 @@ aa aa aa aa +"} +(72,1,1) = {" aa aa aa @@ -32618,29 +35892,6 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -32666,8 +35917,6 @@ aa aa aa aa -"} -(80,1,1) = {" aa aa aa @@ -32680,6 +35929,88 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +yD aa aa aa @@ -32749,6 +36080,8 @@ aa aa aa aa +"} +(73,1,1) = {" aa aa aa @@ -32853,6 +36186,88 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +yD aa aa aa @@ -32875,29 +36290,6 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -32923,8 +36315,6 @@ aa aa aa aa -"} -(81,1,1) = {" aa aa aa @@ -32947,6 +36337,8 @@ aa aa aa aa +"} +(74,1,1) = {" aa aa aa @@ -33051,6 +36443,88 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +yD aa aa aa @@ -33120,6 +36594,8 @@ aa aa aa aa +"} +(75,1,1) = {" aa aa aa @@ -33132,29 +36608,6 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -33180,8 +36633,6 @@ aa aa aa aa -"} -(82,1,1) = {" aa aa aa @@ -33249,6 +36700,88 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +yD aa aa aa @@ -33318,6 +36851,8 @@ aa aa aa aa +"} +(76,1,1) = {" aa aa aa @@ -33389,29 +36924,6 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -33437,8 +36949,6 @@ aa aa aa aa -"} -(83,1,1) = {" aa aa aa @@ -33447,6 +36957,88 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +yD aa aa aa @@ -33516,6 +37108,8 @@ aa aa aa aa +"} +(77,1,1) = {" aa aa aa @@ -33620,6 +37214,88 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +yD aa aa aa @@ -33646,29 +37322,6 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -33694,8 +37347,6 @@ aa aa aa aa -"} -(84,1,1) = {" aa aa aa @@ -33714,6 +37365,8 @@ aa aa aa aa +"} +(78,1,1) = {" aa aa aa @@ -33818,6 +37471,88 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +yD aa aa aa @@ -33887,6 +37622,8 @@ aa aa aa aa +"} +(79,1,1) = {" aa aa aa @@ -33903,29 +37640,6 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Di aa aa aa @@ -33951,8 +37665,6 @@ aa aa aa aa -"} -(85,1,1) = {" aa aa aa @@ -34016,6 +37728,88 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +fx +fx +fx +fx +fx +yD aa aa aa @@ -34085,6 +37879,8 @@ aa aa aa aa +"} +(80,1,1) = {" aa aa aa @@ -34160,96 +37956,6 @@ aa aa aa aa -Di -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -Qe -pu -Di -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(86,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -34279,6 +37985,88 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +fx +fx +fx +fx +fx +yD aa aa aa @@ -34348,6 +38136,8 @@ aa aa aa aa +"} +(81,1,1) = {" aa aa aa @@ -34417,29 +38207,6 @@ aa aa aa aa -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di -Di aa aa aa @@ -34465,13 +38232,6 @@ aa aa aa aa -"} -(87,1,1) = {" -aa -aa -aa -aa -aa aa aa aa @@ -34482,6 +38242,89 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +HV +HV +HV +fx +Wd +yD +yD aa aa aa @@ -34550,6 +38393,8 @@ aa aa aa aa +"} +(82,1,1) = {" aa aa aa @@ -34654,6 +38499,89 @@ aa aa aa aa +yD +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +xE +xE +xE +xE +xE +xE +xE +xE +xE +xE +fx +fx +fx +fx +fx +fx +fx +fx +HV +fx +fx +fx +Wd +xE +yD aa aa aa @@ -34723,9 +38651,7 @@ aa aa aa "} -(88,1,1) = {" -aa -aa +(83,1,1) = {" aa aa aa @@ -34830,6 +38756,89 @@ aa aa aa aa +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +yD +xE +xE +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +Wd +Wd +Wd +yD +yD aa aa aa @@ -34898,6 +38907,8 @@ aa aa aa aa +"} +(84,1,1) = {" aa aa aa @@ -34979,8 +38990,6 @@ aa aa aa aa -"} -(89,1,1) = {" aa aa aa @@ -35058,6 +39067,34 @@ aa aa aa aa +yD +xE +xE +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +HV +HV +fx +Wd +Wd +yD +yD +yD aa aa aa @@ -35127,6 +39164,8 @@ aa aa aa aa +"} +(85,1,1) = {" aa aa aa @@ -35236,8 +39275,6 @@ aa aa aa aa -"} -(90,1,1) = {" aa aa aa @@ -35287,6 +39324,34 @@ aa aa aa aa +yD +xE +xE +fx +fx +HV +HV +HV +HV +fx +fx +fx +fx +HV +HV +fx +fx +HV +HV +HV +HV +fx +fx +Wd +xE +yD +xE +yD aa aa aa @@ -35356,6 +39421,8 @@ aa aa aa aa +"} +(86,1,1) = {" aa aa aa @@ -35493,8 +39560,6 @@ aa aa aa aa -"} -(91,1,1) = {" aa aa aa @@ -35516,6 +39581,34 @@ aa aa aa aa +yD +xE +xE +fx +fx +fx +fx +fx +fx +fx +fx +Wd +Wd +fx +fx +fx +fx +fx +fx +fx +fx +fx +fx +Wd +xE +yD +xE +yD aa aa aa @@ -35585,6 +39678,8 @@ aa aa aa aa +"} +(87,1,1) = {" aa aa aa @@ -35743,6 +39838,34 @@ aa aa aa aa +yD +yD +xE +fx +fx +fx +fx +fx +fx +fx +Wd +Wd +Wd +Wd +fx +fx +fx +fx +fx +fx +fx +fx +fx +Wd +yD +yD +yD +yD aa aa aa @@ -35750,8 +39873,6 @@ aa aa aa aa -"} -(92,1,1) = {" aa aa aa @@ -35814,6 +39935,8 @@ aa aa aa aa +"} +(88,1,1) = {" aa aa aa @@ -35973,6 +40096,33 @@ aa aa aa aa +yD +yD +Wd +Wd +Wd +Wd +fx +fx +Wd +Wd +yD +yD +Wd +Wd +Wd +Wd +fx +fx +fx +fx +fx +Wd +Wd +xE +yD +yD +yD aa aa aa @@ -36007,8 +40157,6 @@ aa aa aa aa -"} -(93,1,1) = {" aa aa aa @@ -36044,6 +40192,8 @@ aa aa aa aa +"} +(89,1,1) = {" aa aa aa @@ -36204,8 +40354,32 @@ aa aa aa aa +yD +yD +yD +yD +Wd +Wd +Wd +Wd +yD aa aa +yD +yD +yD +Wd +Wd +Wd +Wd +Wd +Wd +Wd +yD +yD +xE +xE +yD aa aa aa @@ -36264,8 +40438,6 @@ aa aa aa aa -"} -(94,1,1) = {" aa aa aa @@ -36277,6 +40449,8 @@ aa aa aa aa +"} +(90,1,1) = {" aa aa aa @@ -36440,11 +40614,29 @@ aa aa aa aa +yD +yD +yD +yD +yD +yD aa aa aa aa aa +yD +yD +yD +yD +yD +yD +yD +yD +xE +yD +yD +yD aa aa aa @@ -36514,6 +40706,8 @@ aa aa aa aa +"} +(91,1,1) = {" aa aa aa @@ -36521,8 +40715,6 @@ aa aa aa aa -"} -(95,1,1) = {" aa aa aa @@ -36695,6 +40887,13 @@ aa aa aa aa +yD +yD +yD +yD +yD +yD +yD aa aa aa @@ -36764,6 +40963,8 @@ aa aa aa aa +"} +(92,1,1) = {" aa aa aa @@ -36778,8 +40979,6 @@ aa aa aa aa -"} -(96,1,1) = {" aa aa aa @@ -36947,6 +41146,11 @@ aa aa aa aa +yD +yD +yD +yD +yD aa aa aa @@ -37016,6 +41220,8 @@ aa aa aa aa +"} +(93,1,1) = {" aa aa aa @@ -37035,8 +41241,6 @@ aa aa aa aa -"} -(97,1,1) = {" aa aa aa @@ -37273,6 +41477,8 @@ aa aa aa aa +"} +(94,1,1) = {" aa aa aa @@ -37292,8 +41498,6 @@ aa aa aa aa -"} -(98,1,1) = {" aa aa aa @@ -37504,13 +41708,6 @@ aa aa aa aa -KH -Lt -Lt -Lt -Lt -Lt -Lt aa aa aa @@ -37537,6 +41734,8 @@ aa aa aa aa +"} +(95,1,1) = {" aa aa aa @@ -37549,8 +41748,6 @@ aa aa aa aa -"} -(99,1,1) = {" aa aa aa @@ -37676,7 +41873,6 @@ aa aa aa aa -Fi aa aa aa @@ -37760,14 +41956,6 @@ aa aa aa aa -KH -Lt -KK -wk -Qt -Lk -cP -MM aa aa aa @@ -37803,11 +41991,11 @@ aa aa aa aa +"} +(96,1,1) = {" aa aa aa -"} -(100,1,1) = {" aa aa aa @@ -38017,14 +42205,6 @@ aa aa aa aa -Lt -tA -wX -HG -HG -Lk -cP -KQ aa aa aa @@ -38063,13 +42243,13 @@ aa aa aa aa -"} -(101,1,1) = {" aa aa aa aa aa +"} +(97,1,1) = {" aa aa aa @@ -38274,14 +42454,6 @@ aa aa aa aa -KH -Lt -Lt -LJ -fW -SC -Lt -Lt aa aa aa @@ -38320,8 +42492,6 @@ aa aa aa aa -"} -(102,1,1) = {" aa aa aa @@ -38335,6 +42505,8 @@ aa aa aa aa +"} +(98,1,1) = {" aa aa aa @@ -38533,11 +42705,6 @@ aa aa aa aa -Lt -Lt -qp -Lt -Lt aa aa aa @@ -38577,8 +42744,6 @@ aa aa aa aa -"} -(103,1,1) = {" aa aa aa @@ -38597,6 +42762,8 @@ aa aa aa aa +"} +(99,1,1) = {" aa aa aa @@ -38790,19 +42957,9 @@ aa aa aa aa -fT -Lo -Lf -Sd -pV aa aa aa -KH -Lt -Lt -Lt -KH aa aa aa @@ -38834,8 +42991,6 @@ aa aa aa aa -"} -(104,1,1) = {" aa aa aa @@ -38864,6 +43019,8 @@ aa aa aa aa +"} +(100,1,1) = {" aa aa aa @@ -39047,20 +43204,8 @@ aa aa aa aa -Lt -Lt -qp -Lt -Lt aa aa -KH -Lt -cl -HR -Gi -Lt -KH aa aa aa @@ -39091,8 +43236,6 @@ aa aa aa aa -"} -(105,1,1) = {" aa aa aa @@ -39133,6 +43276,8 @@ aa aa aa aa +"} +(101,1,1) = {" aa aa aa @@ -39303,26 +43448,8 @@ aa aa aa aa -KH -Lt -aZ -Xj -cr -Lt aa aa -Lt -Vh -LI -CH -CH -PJ -Lt -Lt -Lt -Lt -Lt -KH aa aa aa @@ -39348,8 +43475,6 @@ aa aa aa aa -"} -(106,1,1) = {" aa aa aa @@ -39408,6 +43533,8 @@ aa aa aa aa +"} +(102,1,1) = {" aa aa aa @@ -39560,41 +43687,17 @@ aa aa aa aa -Lt -Xp -lg -KZ -aL -Lt -Lt aa -LH -LN -OW -yX -yX -Nm -Lt -ey -LG -pH -gj -Lt -KH aa -ut aa aa aa -LM aa aa aa -Pw aa aa aa -pJ aa aa aa @@ -39605,8 +43708,6 @@ aa aa aa aa -"} -(107,1,1) = {" aa aa aa @@ -39689,6 +43790,8 @@ aa aa aa aa +"} +(103,1,1) = {" aa aa aa @@ -39817,43 +43920,6 @@ aa aa aa aa -Lw -QB -ec -Ae -HZ -QD -Lt -Lt -Lt -LO -Zq -Yx -AA -Da -Lt -iI -LF -BR -MC -EN -Lt -Lt -LC -Lt -Lt -Lt -LC -Lt -Lt -Lt -LC -Lt -Lt -Lt -LC -Lt -KH aa aa aa @@ -39862,8 +43928,6 @@ aa aa aa aa -"} -(108,1,1) = {" aa aa aa @@ -39983,6 +44047,8 @@ aa aa aa aa +"} +(104,1,1) = {" aa aa aa @@ -40074,43 +44140,6 @@ aa aa aa aa -Lw -Yi -fV -YW -vJ -aI -Lt -pZ -Lt -mB -Lj -fI -vq -OF -Lw -wP -ud -Iv -NI -NI -Lw -KP -JE -Vv -of -LD -KV -EL -Ew -Lu -KV -LD -TM -LD -JE -Tu -Lt aa aa aa @@ -40119,8 +44148,6 @@ aa aa aa aa -"} -(109,1,1) = {" aa aa aa @@ -40277,6 +44304,8 @@ aa aa aa aa +"} +(105,1,1) = {" aa aa aa @@ -40331,43 +44360,6 @@ aa aa aa aa -Lw -SX -jC -Hl -Hl -YW -gd -kr -dK -LQ -LQ -cj -cj -wT -Lm -HL -HJ -HJ -HJ -HJ -ci -QH -WE -WE -Li -Lb -Lb -WE -WE -Lb -Li -Li -Lb -bN -bN -bN -Lt aa aa aa @@ -40376,8 +44368,6 @@ aa aa aa aa -"} -(110,1,1) = {" aa aa aa @@ -40571,6 +44561,20 @@ aa aa aa aa +"} +(106,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -40588,43 +44592,6 @@ aa aa aa aa -Lw -Rp -bb -MH -fV -sm -Lt -OG -Lt -LR -Tm -Tm -Ff -yH -Lw -AD -oY -dn -dn -eR -Lw -KO -LA -nb -sB -zx -ZA -Lp -sB -DA -LA -Lp -FE -Lp -LB -tm -Lt aa aa aa @@ -40633,8 +44600,6 @@ aa aa aa aa -"} -(111,1,1) = {" aa aa aa @@ -40845,43 +44810,6 @@ aa aa aa aa -Lw -CT -sw -dv -Lz -QD -Lt -Lt -Lt -KJ -Eq -Ip -Ip -JT -Lt -Dn -BR -LG -BR -RT -Lt -Lt -LP -Lt -Lt -Lt -LP -Lt -Lt -Lt -LP -Lt -Lt -Lt -LP -Lt -KH aa aa aa @@ -40891,7 +44819,7 @@ aa aa aa "} -(112,1,1) = {" +(107,1,1) = {" aa aa aa @@ -41102,41 +45030,17 @@ aa aa aa aa -Lt -sF -Ln -YH -Tb -Lt -Lt aa -Lt -ZG -AG -Qd -Tv -EH -Lt -Ll -LG -mU -RJ -Lt -KH aa -gi aa aa aa -cJ aa aa aa -KS aa aa aa -zr aa aa aa @@ -41147,8 +45051,6 @@ aa aa aa aa -"} -(113,1,1) = {" aa aa aa @@ -41173,6 +45075,8 @@ aa aa aa aa +"} +(108,1,1) = {" aa aa aa @@ -41359,26 +45263,8 @@ aa aa aa aa -KH -Lt -LU -Ld -rG -Lt aa aa -Lt -EV -eX -mf -rz -wN -Lt -Lt -Lt -Lt -Lt -KH aa aa aa @@ -41402,10 +45288,22 @@ aa aa aa aa +On +On +On +On +On +On +On +On +On +On +On +On +On +On aa aa -"} -(114,1,1) = {" aa aa aa @@ -41434,6 +45332,11 @@ aa aa aa aa +"} +(109,1,1) = {" +aa +aa +aa aa aa aa @@ -41617,20 +45520,8 @@ aa aa aa aa -Lt -Lt -ge -Lt -Lt aa aa -KH -Lt -Cy -iC -Po -Lt -KH aa aa aa @@ -41654,6 +45545,22 @@ aa aa aa aa +On +XX +qZ +qZ +qZ +qZ +qZ +qZ +qZ +fv +qZ +qZ +Hw +On +aa +aa aa aa aa @@ -41661,8 +45568,6 @@ aa aa aa aa -"} -(115,1,1) = {" aa aa aa @@ -41684,6 +45589,8 @@ aa aa aa aa +"} +(110,1,1) = {" aa aa aa @@ -41874,19 +45781,9 @@ aa aa aa aa -fT -Lo -Rk -Sd -pV aa aa aa -KH -Lt -Lt -Lt -KH aa aa aa @@ -41905,6 +45802,20 @@ aa aa aa aa +On +WZ +Kx +WT +WT +WT +WT +WT +Kx +WZ +xa +Yb +Aw +On aa aa aa @@ -41918,8 +45829,6 @@ aa aa aa aa -"} -(116,1,1) = {" aa aa aa @@ -41937,6 +45846,8 @@ aa aa aa aa +"} +(111,1,1) = {" aa aa aa @@ -42105,6 +46016,8 @@ aa aa aa aa +yV +aa aa aa aa @@ -42131,11 +46044,6 @@ aa aa aa aa -Lt -Lt -ge -Lt -Lt aa aa aa @@ -42151,6 +46059,26 @@ aa aa aa aa +On +WZ +WT +kn +GQ +Wk +es +nU +WT +WZ +US +vs +Aw +On +aa +aa +aa +aa +aa +aa aa aa aa @@ -42176,7 +46104,7 @@ aa aa aa "} -(117,1,1) = {" +(112,1,1) = {" aa aa aa @@ -42345,10 +46273,23 @@ aa aa aa aa +iX +jk +jr +iX +jr +jI +Ih aa aa aa aa +Ih +Ih +iF +iF +iF +iF aa aa aa @@ -42367,6 +46308,28 @@ aa aa aa aa +On +On +On +On +On +On +On +On +On +WZ +Kx +WT +WT +WT +WT +WT +Kx +WZ +US +hj +Aw +On aa aa aa @@ -42386,14 +46349,6 @@ aa aa aa aa -KH -Lt -Lt -Te -DL -CF -Lt -Lt aa aa aa @@ -42405,6 +46360,8 @@ aa aa aa aa +"} +(113,1,1) = {" aa aa aa @@ -42432,8 +46389,6 @@ aa aa aa aa -"} -(118,1,1) = {" aa aa aa @@ -42575,10 +46530,23 @@ aa aa aa aa +jb +jl +js +iX +js +jJ +Zo aa aa aa aa +Ih +OM +mG +nl +pd +iF aa aa aa @@ -42597,6 +46565,28 @@ aa aa aa aa +On +Ds +ur +jh +Ua +Bn +On +bF +KB +lF +qZ +qZ +qZ +qZ +qZ +qZ +qZ +KM +TZ +hK +Aw +On aa aa aa @@ -42627,6 +46617,8 @@ aa aa aa aa +"} +(114,1,1) = {" aa aa aa @@ -42643,14 +46635,6 @@ aa aa aa aa -Lt -fz -za -MX -DL -ep -cP -MM aa aa aa @@ -42689,8 +46673,6 @@ aa aa aa aa -"} -(119,1,1) = {" aa aa aa @@ -42802,12 +46784,68 @@ aa aa aa aa +iF +iN +iX +iX +jm +jr +iX +jr +jK +Ih +Ih +Ih +Ih +iN +iF +Gz +mH +nm +TO +iF aa aa aa aa aa aa +On +On +Zf +Zf +Zf +On +On +On +Zf +Zf +Zf +On +On +gD +uo +SV +uo +uo +On +lm +Zn +FT +Zn +Zn +Zn +hD +hD +hD +hD +Aw +Hy +hr +Aw +On +On +On aa aa aa @@ -42836,6 +46874,8 @@ aa aa aa aa +"} +(115,1,1) = {" aa aa aa @@ -42900,14 +46940,6 @@ aa aa aa aa -KH -Lt -cT -Hb -OC -ep -cP -KQ aa aa aa @@ -42946,8 +46978,6 @@ aa aa aa aa -"} -(120,1,1) = {" aa aa aa @@ -43011,6 +47041,68 @@ aa aa aa aa +iF +iO +iO +jc +jn +aF +PC +aj +jL +jc +jc +jc +iO +iO +iX +md +iR +nn +yP +iF +iF +iF +iF +iF +iF +iF +On +Tx +pi +pi +pi +Ly +On +hA +gH +nO +uk +hp +On +uo +eB +vf +eB +uo +On +TQ +AS +hD +AS +hD +hD +hD +gB +Pp +hD +eA +qZ +qZ +Ko +KB +Hw +On aa aa aa @@ -43039,6 +47131,10 @@ aa aa aa aa +"} +(116,1,1) = {" +aa +aa aa aa aa @@ -43158,13 +47254,6 @@ aa aa aa aa -KH -Lt -Lt -Lt -Lt -Lt -Lt aa aa aa @@ -43203,36 +47292,76 @@ aa aa aa aa -"} -(121,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa aa aa aa +iF +Hk +Hk +tf +Bg +fQ +vK +ac +rW +zS +EE +gq +bC +bC +iX +me +mI +lo +nG +iF +yd +GL +jt +FO +Tq +iF +On +gf +hw +pi +pi +oT +On +SD +uk +uk +uk +RK +On +sK +On +On +On +On +On +TQ +FI +hD +FI +hD +jW +hD +AS +mq +Kw +Aw +Wu +Va +Va +Wu +Aw +On +aa +aa aa aa aa @@ -43259,6 +47388,8 @@ aa aa aa aa +"} +(117,1,1) = {" aa aa aa @@ -43424,7 +47555,75 @@ aa aa aa aa +iF +DX +GC +JL +KX +Cj +GC +Ni +wd +DE +wM +Cj +GC +bq +iN +zn +iR +lo +Vw +iF +hz +mi +pj +nm +XA +iF +On +lQ +eU +NK +pi +pi +On +CO +uk +Ji +RZ +yw +On +rV +On +YP +cW +JK +On +TQ +FI +hD +FI +hD +cs +hD +QL +Fm +hD +Aw +Be +vx +vx +vx +Aw +On aa +GA +GA +mD +mD +GA +GA aa aa aa @@ -43446,6 +47645,8 @@ aa aa aa aa +"} +(118,1,1) = {" aa aa aa @@ -43460,8 +47661,6 @@ aa aa aa aa -"} -(122,1,1) = {" aa aa aa @@ -43613,9 +47812,78 @@ aa aa aa aa +iF +ac +BJ +my +Md +Yt +Wh +Yt +wd +wM +wM +wM +DE +ac +lJ +hz +iR +lo +hz +lJ +hz +iR +oJ +lo +Uq +iF +On +pi +pp +hw +pi +pi +On +wQ +uk +Ji +uk +xP +On +ul +CZ +eD +ni +ks +On +TQ +FI +hD +FI +hD +tB +hD +AS +dk +hD +Aw +ko +tX +tX +vx +Aw +On aa +GA +Ga +sq +to +ZN +GA aa aa +Io aa aa aa @@ -43634,6 +47902,8 @@ aa aa aa aa +"} +(119,1,1) = {" aa aa aa @@ -43717,8 +47987,6 @@ aa aa aa aa -"} -(123,1,1) = {" aa aa aa @@ -43801,8 +48069,79 @@ aa aa aa aa +iF +ac +dy +jp +Cj +PG +PG +PG +Ni +wM +FW +EO +wM +ac +iF +XA +bL +lq +XK +iF +os +iR +oJ +lo +qn +iF +On +pi +pi +pi +pi +pi +On +aS +uk +Ji +uk +uk +On +NT +hB +Gq +Gq +BM +On +TQ +AS +hD +AS +hD +hD +hD +FJ +wo +hD +Aw +Wu +ay +ay +Wu +Aw +On aa +mD +FX +sr +tp +Xr +mD aa +GA +xc +GA aa aa aa @@ -43820,6 +48159,8 @@ aa aa aa aa +"} +(120,1,1) = {" aa aa aa @@ -43844,7 +48185,6 @@ aa aa aa aa -gt aa aa aa @@ -43974,8 +48314,6 @@ aa aa aa aa -"} -(124,1,1) = {" aa aa aa @@ -43988,7 +48326,81 @@ aa aa aa aa +iF +ac +dy +Yk +wM +wM +wM +wM +wM +wM +al +TX +wM +ac +iF +iF +iF +uH +iF +iN +ot +mI +oJ +nn +qo +iN +On +SI +SI +pi +pi +cv +On +uk +uk +Ji +uk +dU +On +Bw +EJ +Gq +eD +Sh +On +aO +qx +VJ +qx +IB +IB +hD +QW +Uu +hD +eA +qZ +qZ +qZ +qZ +XU +On aa +GA +rm +ss +tq +Ir +mD +vA +GA +xd +GA +yn +mD aa aa aa @@ -44004,6 +48416,8 @@ aa aa aa aa +"} +(121,1,1) = {" aa aa aa @@ -44169,7 +48583,87 @@ aa aa aa aa +iF +ac +wM +wM +wM +Bz +Tk +GP +wM +wM +mm +UT +wM +Cj +GC +GC +GC +GC +RD +iF +ou +iR +oJ +lo +oM +iF +bD +On +On +GZ +IS +On +On +On +On +bO +IS +On +On +On +On +uv +On +On +WI +qZ +qZ +qZ +qZ +qZ +qZ +qZ +qZ +qZ +qZ +XU +On +On +On +On +On +On aa +GA +rn +st +tr +um +mD +vB +GA +Xy +GA +oU +mD +ta +GA +td +GA +ta +mD aa aa aa @@ -44179,6 +48673,8 @@ aa aa aa aa +"} +(122,1,1) = {" aa aa aa @@ -44231,8 +48727,6 @@ aa aa aa aa -"} -(125,1,1) = {" aa aa aa @@ -44346,7 +48840,87 @@ aa aa aa aa +iF +qQ +DE +wM +wM +wM +wM +wM +wM +wM +wM +wM +wM +wM +wM +wM +wM +DE +fQ +lK +hz +oN +iZ +lq +zh +iF +iF +iF +On +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +On aa +mD +WY +su +ts +By +mD +vC +wr +xe +wr +wx +mD +pB +pT +pT +pT +qF +GA aa aa aa @@ -44356,6 +48930,8 @@ aa aa aa aa +"} +(123,1,1) = {" aa aa aa @@ -44488,45 +49064,6 @@ aa aa aa aa -"} -(126,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -44560,7 +49097,87 @@ aa aa aa aa +iF +Ri +PG +PG +or +PG +PG +PG +PG +PG +or +PG +PG +PG +or +PG +yA +PG +XF +iF +ov +oO +do +hz +WS +Wo +wM +ij +ak +dQ +Mc +Mc +Mc +Mc +Mc +dQ +bK +Mc +Mc +Mc +Mc +dQ +Mc +Mc +Mc +Mc +Mc +dQ +Mc +Mc +Mc +Mc +Mc +dQ +Mc +Mc +Mc +Mc +Mc +dQ +Mc +On aa +GA +nB +su +ts +pR +uO +vD +fw +xf +fw +yp +sd +pC +pU +pU +pU +qG +GA aa aa aa @@ -44570,6 +49187,8 @@ aa aa aa aa +"} +(124,1,1) = {" aa aa aa @@ -44735,7 +49354,87 @@ aa aa aa aa +iF +iF +iN +iF +iF +iF +iF +iF +Ih +iF +iF +iF +iN +iF +iF +iF +iF +iF +iF +iF +iN +Ih +pl +pQ +Ih +iF +iF +iF +On +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +Mc +On aa +mD +eY +sv +tt +PH +mD +vE +wt +xg +wt +tn +mD +pD +pX +pX +pX +rb +GA aa aa aa @@ -44746,63 +49445,7 @@ aa aa aa "} -(127,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(125,1,1) = {" aa aa aa @@ -44994,6 +49637,62 @@ aa aa aa aa +On +On +On +On +On +On +On +On +Mc +Mc +Mc +On +On +On +On +On +On +On +On +On +On +GZ +IS +On +On +On +On +IW +IS +On +On +On +On +fl +IS +On +On +mD +mD +mD +tu +mD +mD +mD +wu +xh +wu +mD +mD +zT +cn +gO +cn +zT +gO +gO aa aa aa @@ -45003,20 +49702,7 @@ aa aa aa "} -(128,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(126,1,1) = {" aa aa aa @@ -45208,6 +49894,62 @@ aa aa aa aa +On +Tx +gf +uD +pi +pi +pi +On +Mc +Mc +Mc +On +pi +pi +pi +uD +gf +Hp +On +SI +SI +pi +pi +cv +On +Ob +VR +tW +Ho +zt +On +Zr +wb +uh +zQ +Kc +On +mD +Bm +pR +pR +pR +aK +mD +wv +wv +wv +mD +cx +WN +cb +wW +tb +aV +ho +gO aa aa aa @@ -45216,6 +49958,8 @@ aa aa aa aa +"} +(127,1,1) = {" aa aa aa @@ -45259,20 +50003,6 @@ aa aa aa aa -"} -(129,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -45421,6 +50151,62 @@ aa aa aa aa +Zf +pi +pi +eU +XN +pi +pi +On +Mc +Mc +Mc +IS +pi +pi +XN +eU +pi +pi +Zf +pi +pi +pi +pi +pi +On +pk +jP +Jp +Zx +Id +On +id +pe +uh +Jv +VI +On +mD +au +pR +dx +pR +dd +mD +WQ +xh +WQ +mD +hy +eF +eF +eF +eF +eF +db +gO aa aa aa @@ -45429,6 +50215,8 @@ aa aa aa aa +"} +(128,1,1) = {" aa aa aa @@ -45516,8 +50304,6 @@ aa aa aa aa -"} -(130,1,1) = {" aa aa aa @@ -45622,6 +50408,62 @@ aa aa aa aa +Zf +pi +XN +NK +XN +pi +pi +CS +Mc +dQ +Mc +CS +pi +pi +XN +NK +JC +pi +Zf +pi +hw +hw +pi +pi +On +is +ig +Xn +Dw +Ge +On +uh +uh +uh +Ok +Kc +On +mD +mD +mD +mD +mD +qR +mD +ww +xi +wz +qR +NQ +eF +hx +TE +VL +eF +bU +MY aa aa aa @@ -45630,6 +50472,8 @@ aa aa aa aa +"} +(129,1,1) = {" aa aa aa @@ -45773,8 +50617,6 @@ aa aa aa aa -"} -(131,1,1) = {" aa aa aa @@ -45823,6 +50665,62 @@ aa aa aa aa +Zf +pi +pi +pi +pi +pi +pi +IS +Mc +Mc +Mc +On +pi +pi +pi +pi +pi +pi +Zf +lQ +eU +NK +pi +pi +On +zy +xC +CU +iD +OR +On +Rt +Vc +DM +se +yg +On +Td +Td +Td +Td +Td +Td +mD +ss +xj +fa +mD +Tj +eF +PX +Ke +eV +eF +gF +gO aa aa aa @@ -45831,6 +50729,8 @@ aa aa aa aa +"} +(130,1,1) = {" aa aa aa @@ -46022,6 +50922,62 @@ aa aa aa aa +On +Ly +oT +SI +SI +pi +cv +On +Mc +Mc +Mc +On +cv +pi +SI +SI +oT +Ly +On +qa +pp +pi +pi +oT +On +EA +pp +Cs +iD +HQ +On +yM +aW +uh +yg +yg +On +Td +Td +Td +Td +Td +Td +mD +ss +fw +tr +gS +vm +WR +RH +WR +he +WR +ty +gO aa aa aa @@ -46031,8 +50987,7 @@ aa aa aa "} -(132,1,1) = {" -aa +(131,1,1) = {" aa aa aa @@ -46224,6 +51179,62 @@ aa aa aa aa +On +On +On +On +On +On +On +On +Mc +Mc +Mc +On +On +On +On +On +On +On +On +Tx +pi +pi +pi +Ly +On +Dt +Ss +vI +BB +AC +On +dC +Aa +Yd +cd +wY +On +Td +Td +Td +Td +Td +Td +mD +wx +fw +wB +yr +pR +RH +JW +eE +rB +RH +oA +gO aa aa aa @@ -46232,6 +51243,8 @@ aa aa aa aa +"} +(132,1,1) = {" aa aa aa @@ -46287,8 +51300,6 @@ aa aa aa aa -"} -(133,1,1) = {" aa aa aa @@ -46425,6 +51436,62 @@ aa aa aa aa +On +Tx +gf +uD +pi +pi +pi +On +Mc +Mc +Mc +On +pi +pi +pi +uD +gf +Hp +On +On +Zf +Zf +Zf +On +On +On +Zf +Zf +Zf +On +On +On +Zf +Zf +Zf +On +Yn +Yn +Yn +Yn +Td +Td +Td +vF +wy +TK +xQ +mD +pR +Wy +Sk +Zs +RF +OX +NL +gO aa aa aa @@ -46433,6 +51500,8 @@ aa aa aa aa +"} +(133,1,1) = {" aa aa aa @@ -46454,12 +51523,6 @@ aa aa aa aa -GA -GA -mD -mD -GA -GA aa aa aa @@ -46544,8 +51607,6 @@ aa aa aa aa -"} -(134,1,1) = {" aa aa aa @@ -46632,6 +51693,25 @@ aa aa aa aa +Zf +pi +pi +eU +XN +pi +pi +On +Mc +Mc +Mc +IS +pi +pi +XN +eU +pi +pi +Zf aa aa aa @@ -46652,6 +51732,23 @@ aa aa aa aa +Yn +Td +Td +Td +gS +wz +TK +xR +OQ +QE +PM +Om +SR +Yy +AL +oK +gO aa aa aa @@ -46660,6 +51757,8 @@ aa aa aa aa +"} +(134,1,1) = {" aa aa aa @@ -46711,15 +51810,8 @@ aa aa aa aa -GA -Ga -sq -to -ZN -GA aa aa -Io aa aa aa @@ -46801,8 +51893,6 @@ aa aa aa aa -"} -(135,1,1) = {" aa aa aa @@ -46860,6 +51950,25 @@ aa aa aa aa +Zf +pi +XN +NK +XN +pi +pi +CS +Mc +dQ +Mc +CS +pi +pi +XN +NK +JC +pi +Zf aa aa aa @@ -46880,6 +51989,23 @@ aa aa aa aa +Yn +Td +Td +Td +mD +su +fw +wh +gS +nj +MJ +TI +Zl +zz +OX +aR +gO aa aa aa @@ -46888,6 +52014,8 @@ aa aa aa aa +"} +(135,1,1) = {" aa aa aa @@ -46968,16 +52096,7 @@ aa aa aa aa -mD -FX -sr -tp -Xr -mD aa -GA -xc -GA aa aa aa @@ -47058,8 +52177,6 @@ aa aa aa aa -"} -(136,1,1) = {" aa aa aa @@ -47090,6 +52207,25 @@ aa aa aa aa +Zf +pi +pi +pi +pi +pi +pi +IS +Mc +Mc +Mc +On +pi +pi +pi +pi +pi +pi +Zf aa aa aa @@ -47110,6 +52246,23 @@ aa aa aa aa +Yn +Td +Td +Td +mD +su +fw +bm +mD +vm +Ny +ar +fi +ar +Ny +sx +gO aa aa aa @@ -47118,6 +52271,8 @@ aa aa aa aa +"} +(136,1,1) = {" aa aa aa @@ -47225,18 +52380,6 @@ aa aa aa aa -GA -rm -ss -tq -Ir -mD -vA -GA -xd -GA -yn -mD aa aa aa @@ -47315,18 +52458,31 @@ aa aa aa aa -"} -(137,1,1) = {" -aa -aa -aa -aa aa aa aa aa aa aa +On +Ly +oT +SI +SI +pi +cv +On +Mc +Mc +Mc +On +cv +pi +SI +SI +oT +Ly +On aa aa aa @@ -47347,6 +52503,23 @@ aa aa aa aa +Yn +mD +mD +mD +mD +SF +fw +ts +qR +ff +WR +RH +NC +RH +WR +dW +gO aa aa aa @@ -47355,6 +52528,8 @@ aa aa aa aa +"} +(137,1,1) = {" aa aa aa @@ -47482,24 +52657,6 @@ aa aa aa aa -GA -rn -st -tr -um -mD -vB -GA -Xy -GA -oU -mD -ta -GA -td -GA -ta -mD aa aa aa @@ -47563,6 +52720,26 @@ aa aa aa aa +On +On +On +On +On +On +On +On +On +Mc +Mc +Mc +On +On +On +On +On +On +On +On aa aa aa @@ -47572,8 +52749,6 @@ aa aa aa aa -"} -(138,1,1) = {" aa aa aa @@ -47585,6 +52760,23 @@ aa aa aa aa +Yn +NE +NE +NE +mD +su +fw +ts +mD +mD +rY +ST +VO +ST +rY +Ya +Ya aa aa aa @@ -47593,6 +52785,8 @@ aa aa aa aa +"} +(138,1,1) = {" aa aa aa @@ -47739,24 +52933,6 @@ aa aa aa aa -mD -WY -su -ts -By -mD -vC -wr -xe -wr -wx -mD -pB -pT -pT -pT -qF -GA aa aa aa @@ -47801,6 +52977,26 @@ aa aa aa aa +On +Gb +iq +FS +pt +dP +yC +zY +On +Mc +Mc +Mc +On +hR +Eb +sh +AN +qm +Yj +On aa aa aa @@ -47821,6 +53017,23 @@ aa aa aa aa +Yn +NE +NE +NE +mD +su +fw +ts +mD +bp +Zv +sE +bH +sE +Zv +VZ +Ya aa aa aa @@ -47996,35 +53209,6 @@ aa aa aa aa -GA -nB -su -ts -pR -uO -vD -fw -xf -fw -yp -sd -pC -pU -pU -pU -qG -GA -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -48050,6 +53234,26 @@ aa aa aa aa +Zf +ME +yg +Cc +AR +yC +yg +yg +On +Mc +Mc +Mc +IS +IU +ID +VU +JQ +Tf +IU +ua aa aa aa @@ -48070,6 +53274,23 @@ aa aa aa aa +Yn +NE +NE +NE +mD +su +xf +ts +mD +DY +bH +bH +bH +sE +sE +Vu +Ya aa aa aa @@ -48078,6 +53299,8 @@ aa aa aa aa +"} +(140,1,1) = {" aa aa aa @@ -48086,8 +53309,6 @@ aa aa aa aa -"} -(140,1,1) = {" aa aa aa @@ -48253,24 +53474,6 @@ aa aa aa aa -mD -eY -sv -tt -PH -mD -vE -wt -xg -wt -tn -mD -pD -pX -pX -pX -rb -GA aa aa aa @@ -48288,6 +53491,26 @@ aa aa aa aa +Zf +OD +yg +yg +Pl +yC +yC +yg +CN +Mc +dQ +Mc +cI +IU +ID +VU +eo +ID +Zi +ua aa aa aa @@ -48308,6 +53531,23 @@ aa aa aa aa +Yn +NE +NE +NE +qR +wA +fw +ts +mD +VE +bH +RV +Sq +gX +sE +yS +Ya aa aa aa @@ -48316,6 +53556,8 @@ aa aa aa aa +"} +(141,1,1) = {" aa aa aa @@ -48343,8 +53585,6 @@ aa aa aa aa -"} -(141,1,1) = {" aa aa aa @@ -48508,27 +53748,28 @@ aa aa aa aa +Zf +wV +yg +yg +In +yg +yC +yC +IS +Mc +Mc +Mc +On +ue +XI +ID +ID +ID +CR +ua aa aa -mD -mD -mD -tu -mD -mD -mD -wu -xh -wu -mD -gO -zT -cn -gO -cn -zT -gO -gO aa aa aa @@ -48547,6 +53788,23 @@ aa aa aa aa +Yn +NE +NE +NE +mD +su +fw +ts +mD +Xe +bH +bA +bj +Pt +sE +FB +Ya aa aa aa @@ -48555,6 +53813,8 @@ aa aa aa aa +"} +(142,1,1) = {" aa aa aa @@ -48600,8 +53860,6 @@ aa aa aa aa -"} -(142,1,1) = {" aa aa aa @@ -48747,6 +54005,26 @@ aa aa aa aa +On +go +yC +yC +WH +yg +yg +Hc +On +Mc +Mc +Mc +On +ZD +Dl +AP +eW +qe +Jo +On aa aa aa @@ -48761,37 +54039,29 @@ aa aa aa aa -On -Zf -Zf -On -Zf -Zf -On -Bm -Hz -Hz -Hz -aK -mD -wv -wv -wv -mD -yL -WN -cb -wW -tb -aV -ho -gO aa aa aa aa aa aa +Yn +NE +NE +NE +mD +su +xk +ts +mD +yl +bH +bH +bH +sE +sE +IK +Ya aa aa aa @@ -48800,6 +54070,8 @@ aa aa aa aa +"} +(143,1,1) = {" aa aa aa @@ -48857,8 +54129,6 @@ aa aa aa aa -"} -(143,1,1) = {" aa aa aa @@ -48992,6 +54262,26 @@ aa aa aa aa +On +On +On +On +On +On +On +On +On +Mc +Mc +Mc +On +On +On +On +On +On +On +On aa aa aa @@ -49012,39 +54302,33 @@ aa aa aa aa +Yn +NE +NE +NE +mD +wB +xi +xS +mD +bI +oL +fj +RM +PE +oL +VM +Ya aa aa aa aa aa aa -On -oo -Tg -gD -Wl -Qb -On -au -Hz -dx -Hz -dd -mD -WQ -xh -WQ -mD -WO -eF -eF -eF -eF -eF -db -gO aa aa +"} +(144,1,1) = {" aa aa aa @@ -49114,8 +54398,6 @@ aa aa aa aa -"} -(144,1,1) = {" aa aa aa @@ -49238,6 +54520,25 @@ aa aa aa aa +On +fU +Nc +XR +He +XR +LL +On +Mc +Mc +Mc +On +rh +zX +zX +cH +ki +Mk +On aa aa aa @@ -49258,6 +54559,23 @@ aa aa aa aa +Yn +NE +NE +NE +mD +wu +xh +wu +mD +mD +rY +Ya +Ya +Ya +rY +Ya +Ya aa aa aa @@ -49266,6 +54584,8 @@ aa aa aa aa +"} +(145,1,1) = {" aa aa aa @@ -49275,31 +54595,6 @@ aa aa aa aa -On -AF -Xq -Xz -Xq -cw -On -On -On -On -On -PF -mD -ww -xi -wz -qR -ib -eF -hx -TE -VL -eF -bU -MY aa aa aa @@ -49371,8 +54666,6 @@ aa aa aa aa -"} -(145,1,1) = {" aa aa aa @@ -49457,6 +54750,12 @@ aa aa aa aa +dS +dS +gL +gL +dS +dS aa aa aa @@ -49478,6 +54777,25 @@ aa aa aa aa +Zf +uu +QV +QV +QV +QV +QV +On +Mc +Mc +Mc +IS +zX +QP +zX +zX +zX +zX +Zf aa aa aa @@ -49498,6 +54816,18 @@ aa aa aa aa +Yn +NE +NE +NE +vz +vz +vz +vz +TY +mD +QC +QC aa aa aa @@ -49511,6 +54841,8 @@ aa aa aa aa +"} +(146,1,1) = {" aa aa aa @@ -49532,31 +54864,6 @@ aa aa aa aa -On -Zg -Rl -Br -Xq -qH -On -fv -hE -gm -wq -eB -mD -ss -xj -fa -mD -So -eF -PX -Ke -eV -eF -gF -gO aa aa aa @@ -49628,8 +54935,6 @@ aa aa aa aa -"} -(146,1,1) = {" aa aa aa @@ -49702,6 +55007,16 @@ aa aa aa aa +dS +rd +Hn +xH +uE +dS +dS +dS +dS +dS aa aa aa @@ -49709,10 +55024,35 @@ aa aa aa aa +pG +pG +pG +pG +pG +pG aa aa aa aa +Zf +Ns +QV +wp +cM +kl +QV +kv +Mc +dQ +Mc +Gt +zX +zX +zX +pv +zX +rh +Zf aa aa aa @@ -49729,6 +55069,22 @@ aa aa aa aa +Yn +Yn +Yn +Yn +Yn +QC +QC +mD +mD +Zb +mD +Zb +mD +xG +MP +QC aa aa aa @@ -49742,6 +55098,8 @@ aa aa aa aa +"} +(147,1,1) = {" aa aa aa @@ -49789,31 +55147,6 @@ aa aa aa aa -On -Yc -VK -PR -Uh -Xo -WU -CU -Yj -YQ -uh -oh -fs -ss -fw -tr -gS -SM -WR -RH -WR -he -WR -ty -gO aa aa aa @@ -49885,8 +55218,6 @@ aa aa aa aa -"} -(147,1,1) = {" aa aa aa @@ -49933,16 +55264,84 @@ aa aa aa aa +gL +JF +LK +LK +RX +rd +cF +IF +fh +dS +dS +dS +dS +dS +dS +pG +pG +pG +rj +ZP +oE +Ql +pG aa aa aa aa +Zf +Zc +ro +sI +sI +sI +QV +IS +Mc +Mc +Mc +On +zX +om +zX +zX +zX +zX +Zf aa aa aa aa aa aa +wc +wc +wc +wc +wc +wc +wc +wc +wc +wc +wc +wc +nP +fu +fu +fu +fu +fu +fu +xp +Pr +aw +ae +ew +ew +QC aa aa aa @@ -49956,6 +55355,8 @@ aa aa aa aa +"} +(148,1,1) = {" aa aa aa @@ -50043,34 +55444,6 @@ aa aa aa aa -On -On -qq -On -gI -pE -ia -Mt -Sw -On -AK -Yq -Xq -Xq -ef -fs -wx -fw -wB -yr -RH -RH -JW -eE -rB -RH -oA -gO aa aa aa @@ -50087,26 +55460,6 @@ aa aa aa aa -QC -QC -QC -uf -uf -uf -uf -uf -uf -uf -uf -uf -uf -uf -uf -uf -uf -uf -uf -uf aa aa aa @@ -50142,8 +55495,6 @@ aa aa aa aa -"} -(148,1,1) = {" aa aa aa @@ -50170,16 +55521,84 @@ aa aa aa aa +gL +Rc +LK +LK +IM +YE +rq +tv +dS +dS +XZ +rM +bo +rL +dS +pG +pG +rj +rj +Xb +uQ +yi +pG aa aa aa aa +On +mh +dt +Yz +ma +PZ +Mb +On +Mc +Mc +Mc +On +cC +zX +zX +qN +GY +Dh +On aa aa aa aa aa aa +wc +Wg +Jh +Jh +IE +IE +Jh +Jh +IE +IE +Is +aJ +xp +aw +nP +xp +Ht +aw +nP +TV +Wb +Mo +pq +ew +ew +QC aa aa aa @@ -50193,6 +55612,8 @@ aa aa aa aa +"} +(149,1,1) = {" aa aa aa @@ -50300,34 +55721,6 @@ aa aa aa aa -On -ry -TW -fG -nA -MU -MU -MU -NM -On -Wm -Nq -My -Od -Dk -vF -wy -TK -xQ -mD -RH -Wy -Sk -Zs -RF -OX -NL -gO aa aa aa @@ -50343,27 +55736,6 @@ aa aa aa aa -QC -Hm -OE -Sl -ca -Wn -eH -Um -Wn -ca -Wn -eH -Um -uf -dm -Ob -Ob -Ob -Ob -fK -uf aa aa aa @@ -50399,8 +55771,6 @@ aa aa aa aa -"} -(149,1,1) = {" aa aa aa @@ -50408,16 +55778,84 @@ aa aa aa aa +gL +JF +LK +LK +IM +YE +br +tv +gL +so +kb +WB +WB +Nd +dS +Mm +rj +rj +rj +Xb +uQ +yi +pG aa aa aa aa +On +On +On +On +On +On +On +On +Mc +Mc +Mc +On +On +On +On +On +On +On +On aa aa aa aa aa aa +wc +It +It +It +It +It +It +It +It +It +It +aJ +TV +Wb +St +TV +Wb +Mo +St +TV +qM +Mo +Jd +ew +dh +QC aa aa aa @@ -50431,6 +55869,8 @@ aa aa aa aa +"} +(150,1,1) = {" aa aa aa @@ -50557,34 +55997,6 @@ aa aa aa aa -On -vo -fP -On -Qg -XV -hd -To -BT -On -uP -dz -Nr -Xq -Rg -gS -wz -TK -xR -OQ -Ny -PM -Om -SR -Yy -AL -oK -gO aa aa aa @@ -50600,27 +56012,6 @@ aa aa aa aa -QC -Sl -Sl -QC -uf -uf -Wn -Wn -uf -uf -uf -Wn -Wn -uf -mX -Xw -Xw -Xw -Xw -dH -uf aa aa aa @@ -50644,6 +56035,29 @@ aa aa aa aa +dS +rd +LK +LK +IM +YE +rq +tv +xz +rr +mW +UI +NN +ZH +Qn +Ev +rj +bX +rj +Xb +uQ +yi +pG aa aa aa @@ -50653,14 +56067,52 @@ aa aa aa aa +iA +iA +iA +fB +fB +fB +iA +iA +iA aa aa aa -"} -(150,1,1) = {" aa aa +iA +iA +iA +iA +iA aa +wc +It +It +It +It +It +It +It +It +It +It +aJ +YD +Mo +St +TV +Wb +Mo +St +TV +qM +Mo +Jd +ew +ew +QC aa aa aa @@ -50674,6 +56126,8 @@ aa aa aa aa +"} +(151,1,1) = {" aa aa aa @@ -50814,70 +56268,11 @@ aa aa aa aa -On -On -On -On -RU -XL -Yr -CV -nA -eD -CV -Vp -OY -tl -fN -mD -su -fw -wh -gS -NN -MJ -TI -Zl -zz -OX -aR -gO aa aa aa aa aa -QC -QC -QC -QC -QC -QC -QC -QC -QC -QC -QC -Jt -gT -pI -tH -Bp -RB -UW -Bp -Fs -Bp -Js -Sz -Sz -Sz -Xw -Xw -Xw -Xw -dH -uf aa aa aa @@ -50894,12 +56289,87 @@ aa aa aa aa +dS +dS +gL +dS +dS +rd +LK +RX +WJ +WC +tv +gL +jQ +SM +SM +SM +ES +Qn +GS +bX +rj +rj +Xb +vp +yi +pG aa aa +iA +iA +iA aa aa aa aa +iA +Uh +Uh +fB +Pj +fB +Uh +Uh +iA +iA +iA +iA +iA +iA +iA +mP +SL +mP +iA +Xw +Xw +It +It +It +It +It +It +It +It +It +It +aJ +gx +Mo +nP +gx +Wb +Oh +nP +TV +qM +Mo +pq +ew +GI +QC aa aa aa @@ -50914,7 +56384,7 @@ aa aa aa "} -(151,1,1) = {" +(152,1,1) = {" aa aa aa @@ -51071,71 +56541,92 @@ aa aa aa aa -Ie -tW -Ux -On -yO -To -ye -Gf -oV -On -Wq -Vz -uV -hT -TS -mD -su -fw -bm -mD -SM -Ny -ar -fi -ar -Ny -sx -gO aa aa aa aa -aa -QC -wR -gy -oH -QC -ZV -Xu -cd -Zm -Xl -QC -gT -Vr -pI -WM -Bp +dS +dS +UF +jf yG -Bj -Bp -oI -Bp -Js -Js -Sz -Sz -Xw -Xw -Xw +dS +dS +LK +aX +Wi +XE +tv +dS +dS +Lx +ii +kw +aq +Qn +KN +rj +rj +ZP +TW +FA +ol +pG +aa +aa +iA +Ks +iA +iA +iA +iA +iA +iA +Uh +ns +gT +gT +gT +uU +Uh +iA +Dg +lk +Fh +zR +mP +kf +Qa +gQ +Qa +zv +mP Xw -dH -uf -aa +It +It +It +It +It +It +It +It +It +It +aJ +Hr +Mo +HY +Hr +Wb +UC +HY +TV +Wb +Mo +ae +ew +bZ +QC aa aa aa @@ -51149,6 +56640,8 @@ aa aa aa aa +"} +(153,1,1) = {" aa aa aa @@ -51170,8 +56663,6 @@ aa aa aa aa -"} -(152,1,1) = {" aa aa aa @@ -51311,6 +56802,88 @@ aa aa aa aa +gL +hg +Kd +LK +dz +Ku +gL +LK +vN +Ma +XE +oe +Zm +Ls +YZ +CA +uJ +kw +NF +ZP +aE +aE +qf +od +DC +ng +pG +iA +iA +iA +rZ +iA +yt +uI +iA +iA +Uh +Uh +Lg +yb +yQ +ev +uF +Uh +Uh +HP +lC +Uk +nf +Sz +Cq +HT +HT +HT +Mh +Sz +Xw +It +It +It +It +It +It +It +It +It +It +aJ +Hr +Mo +HY +Hr +Wb +UC +HY +TV +Nf +Mo +ae +ew +Vj +QC aa aa aa @@ -51319,79 +56892,21 @@ aa aa aa aa -yV aa aa aa aa aa +"} +(154,1,1) = {" aa aa aa -Nk -kh -tW -On -On -Oc -On -On -On -On -On -Kf -On -On -On -mD -SF -fw -ts -qR -Mp -WR -RH -NC -RH -WR -dW -gO aa aa aa aa aa -QC -cI -ie -bi -NP -bi -bi -bi -bi -bi -tF -PT -gT -QC -uf -uf -uf -uf -uf -uf -uf -Sz -Js -Js -Sz -Xw -Xw -Xw -Xw -dH -uf aa aa aa @@ -51427,8 +56942,6 @@ aa aa aa aa -"} -(153,1,1) = {" aa aa aa @@ -51546,7 +57059,103 @@ aa aa aa aa +dS +wO +Sv +pg +aG +uS +px +LK +kM +cc +XE +mg +Zp +PO +YZ +WG +WG +Av +NF +Xb +uQ +uQ +vp +Qo +YF +nh +pG +DQ +iA +Jz +HK +HK +dD +VV +Ju +iA +ch +QJ +Il +uf +fB +EM +vr +uF +ch +uj +Mf +KY +uT +mP +Uc +HT +Rr +HT +Mv +mP +Xw +It +It +It +It +It +It +It +It +It +It +aJ +BA +Mo +nP +BA +Wb +Rf +nP +TV +Wb +Mo +pq +ew +gc +QC +Fn +Fn +Fn +Fn +Fn +Fn +Fn +lr +lr +lr +lr +lr aa +"} +(155,1,1) = {" aa aa aa @@ -51572,83 +57181,15 @@ aa aa aa aa -iX -jk -jr -iX -jr -jI -Ih aa aa aa aa -Ih -Ih -iF -iF -iF -On -ZT -To -WX -Ur -UR -YU -GB -Ub -aw -YU -uY -oe -su -fw -ts -mD -Ya -rY -ST -VO -ST -rY -Ya -Ya aa aa aa aa aa -QC -rZ -MS -dw -QC -TB -TB -TB -TB -TB -QC -Qi -oi -QC -JH -JH -JH -JH -JH -JH -uf -Sz -Fc -Js -Sz -Sz -Sz -qv -PD -dm -uf aa aa aa @@ -51684,8 +57225,6 @@ aa aa aa aa -"} -(154,1,1) = {" aa aa aa @@ -51777,7 +57316,103 @@ aa aa aa aa +gL +jv +bE +LK +kg +yf +gL +LK +Ay +Ma +XE +KU +Wx +Hu +YZ +CA +cm +Vy +NF +JB +ET +ET +hI +Ky +rX +MG +pG +ka +SE +PY +GW +GW +GW +GW +ZM +ev +JH +yb +uf +co +ED +oi +EM +ev +AM +Vf +Gn +HM +uT +JH +Cq +HT +GW +HT +Mh +mA +Xw +It +It +It +It +It +It +It +It +It +It +aJ +TV +Mo +St +TV +Wb +Mo +St +TV +qM +Mo +Jd +xp +Ht +Ht +pK +pK +pK +Gg +pK +pK +Bb +mw +rE +GM +KT +lr aa +"} +(156,1,1) = {" aa aa aa @@ -51829,83 +57464,14 @@ aa aa aa aa -jb -jl -js -iX -js -jJ -Zo aa aa aa aa -Ih -OM -mG -nl -pd -On -eO -EJ -QV -QV -Mo -Sx -Gs -Ow -aD -YU -uZ -oe -su -fw -ts -mD -WG -Zv -sE -bH -sE -Zv -VZ -Ya aa aa aa aa -QC -QC -QC -QC -QC -QC -QC -QC -QC -QC -QC -QC -PT -Rh -QC -JH -JH -JH -JH -JH -JH -uf -uf -uf -Rr -Mv -Mv -Mv -uf -Bn -lG -uf aa aa aa @@ -51941,8 +57507,6 @@ aa aa aa aa -"} -(155,1,1) = {" aa aa aa @@ -52009,7 +57573,103 @@ aa aa aa aa +dS +dS +kh +Fg +NJ +dS +dS +LK +aX +Wi +XE +tv +dS +dS +lT +EG +Vy +yK +Qn +Ev +rj +rj +JB +Tr +FA +ol +pG +ka +SE +Pc +GW +Qi +yJ +GW +Qv +Uc +JH +Mv +fB +FZ +gE +cq +fB +Uc +AM +Kr +dT +hh +uT +JH +Uc +Js +GW +Js +Mv +Ki +Xw +It +It +It +It +It +Jq +It +It +It +It +aJ +YD +Mo +St +TV +ok +Mo +St +Rj +qM +Mo +Jd +TV +Nf +Wb +RS +RS +RS +RS +RS +RS +Un +oF +GM +GM +EY +lr aa +"} +(157,1,1) = {" aa aa aa @@ -52083,86 +57743,10 @@ aa aa aa aa -iF -iN -iX -iX -jm -jr -iX -jr -jK -Ih -Ih -Ih -Ih -iN -iF -Pg -mH -nm -TO -On -Ui -Cs -Hz -oB -ZF -YU -xy -Or -UI -YU -uY -oe -su -xf -ts -mD -cm -bH -bH -bH -sE -sE -Vu -Ya aa aa aa aa -QC -PY -QC -oE -MK -pI -ZM -ru -tG -ru -tG -co -ED -oi -QC -JH -JH -JH -JH -JH -JH -JH -JH -uf -Sz -Js -Js -Sz -uf -uf -uf -uf aa aa aa @@ -52198,8 +57782,6 @@ aa aa aa aa -"} -(156,1,1) = {" aa aa aa @@ -52249,6 +57831,105 @@ aa aa aa aa +dS +dS +gL +dS +dS +rd +LK +RX +GR +va +tv +gL +so +QI +QI +QI +sG +Qn +GS +bX +rj +rj +Xb +vp +yi +pG +ka +SE +PY +GW +GW +GW +GW +JX +Nz +JH +bi +zv +DF +Ak +HN +kf +Nz +AM +Kj +Lv +HM +uT +JH +Cq +HT +GW +HT +Mh +GO +Xw +It +It +It +It +It +It +It +It +It +It +aJ +TV +Mo +St +TV +Wb +Mo +St +TV +qM +Mo +Jd +Xx +Mp +Mp +MU +MU +MU +MU +MU +MU +QT +mw +wq +GM +xy +lr +aa +"} +(158,1,1) = {" +aa +aa +aa aa aa aa @@ -52340,86 +58021,10 @@ aa aa aa aa -iF -iO -iO -jc -jn -iP -jy -jD -jL -jc -jc -jc -iO -iO -iX -md -iR -nn -yP -On -On -On -pa -On -On -YU -YU -Rj -kR -YU -oe -qR -wA -fw -ts -mD -Wd -bH -RV -Sq -gX -sE -yS -Ya aa aa aa aa -Sp -Pc -Sp -Qi -oi -pI -Qv -FZ -gE -FZ -gE -FZ -gE -cq -ZR -JH -JH -JH -JH -JH -JH -JH -JH -uf -Sz -Js -Js -Sz -Wn -zA -uf -uf aa aa aa @@ -52455,8 +58060,6 @@ aa aa aa aa -"} -(157,1,1) = {" aa aa aa @@ -52488,6 +58091,104 @@ aa aa aa aa +dS +rd +LK +LK +IM +YE +rq +tv +xz +rr +mW +UI +NN +ZH +Qn +KN +rj +bX +rj +Xb +uQ +yi +pG +Mx +iA +Hm +El +El +El +El +aM +iA +Do +NH +Tp +zv +fB +kf +eG +Db +Do +gZ +Mf +XY +uT +mP +Uc +HT +Rr +HT +Mv +mP +Xw +It +It +It +It +It +It +It +It +It +It +aJ +gx +Mo +nP +gx +Wb +Oh +nP +TV +Wb +Mo +pq +ew +qH +QC +tU +tU +la +tU +la +tU +tU +lr +lr +pF +lr +lr +aa +"} +(159,1,1) = {" +aa +aa +aa +aa +aa aa aa aa @@ -52597,86 +58298,10 @@ aa aa aa aa -iF -iP -iP -jd -jo -jt -jt -jt -jM -jP -kj -kj -jD -jD -iX -me -mI -lo -nG -iF -yd -GL -jt -FO -Tq -YU -Sh -Ps -QY -YU -va -oe -su -fw -ts -mD -gw -bH -bA -bj -Pt -sE -FB -Ya aa aa aa aa -QC -Sl -QC -PT -Nl -QC -QC -at -QC -QC -QC -DF -QC -QC -QC -JH -JH -JH -JH -JH -JH -JH -JH -uf -Sz -Js -Js -Sz -Wn -ga -uf -uf aa aa aa @@ -52712,8 +58337,6 @@ aa aa aa aa -"} -(158,1,1) = {" aa aa aa @@ -52725,7 +58348,99 @@ aa aa aa aa +gL +xb +LK +LK +IM +YE +br +tv +gL +jQ +Kl +WB +WB +Nd +dS +Mm +rj +rj +rj +Xb +uQ +yi +pG +iA +iA +iA +iA +PT +Dg +cY +iA +iA +Uh +Uh +eI +bi +Qa +Nz +Db +Uh +Uh +HP +QS +YR +Bf +Sz +Cq +HT +HT +HT +Mh +Sz +Xw +It +It +It +It +It +It +It +It +It +It +aJ +Hr +Mo +HY +Hr +Wb +UC +HY +TV +Nf +Mo +ae +ew +Fo +QC +Bo +Bo +Bo +tU +Bo +Bo +Bo +mw +Ra +GM +kQ +lr aa +"} +(160,1,1) = {" aa aa aa @@ -52854,86 +58569,10 @@ aa aa aa aa -iF -iQ -oJ -oJ -oJ -oJ -oJ -oJ -oJ -oJ -oJ -oJ -oJ -ln -iN -zn -iR -lo -Vw -iF -hz -mi -pj -nm -XA -Sx -Nn -yi -cL -YU -vb -oe -su -xk -ts -mD -Vg -bH -bH -bH -sE -sE -IK -Ya aa aa aa aa -QC -Hm -Sl -Qi -oi -QC -aM -BW -Rx -NH -Tp -Yu -VT -Op -QC -JH -JH -JH -JH -JH -JH -JH -JH -uf -Sz -Js -Js -Sz -Wn -zA -uf -uf aa aa aa @@ -52966,11 +58605,99 @@ aa aa aa aa +gL +QN +LK +LK +IM +YE +rq +tv +dS +dS +Bi +on +FY +et +dS +pG +pG +rj +rj +Xb +uQ +yi +pG aa aa +iA +iA +Bk +pz +da +wc +iA +iA +Uh +ns +cY +cY +cY +uU +Uh +iA +Dg +tw +tx +UG +mP +EM +yQ +Em +yQ +uf +mP +Xw +It +It +It +It +It +It +It +It +It +It +aJ +Hr +Mo +HY +Hr +Wb +UC +HY +TV +Wb +Mo +ae +ew +UL +QC +fO +tU +tU +tU +tU +tU +fO +mw +aB +GM +kP +lr aa "} -(159,1,1) = {" +(161,1,1) = {" aa aa aa @@ -53111,86 +58838,10 @@ aa aa aa aa -iF -BD -oJ -Qx -iO -oJ -iO -oJ -iO -oJ -iO -uG -oJ -lo -lJ -hz -iR -lo -hz -lJ -hz -iR -oJ -lo -Vy -YU -hY -ql -cA -YU -va -oe -wB -xi -xS -mD -wg -oL -fj -RM -PE -oL -VM -Ya aa aa aa aa -QC -OE -Sl -PT -Rh -QC -oF -bi -eI -bi -eI -bi -eI -hv -QC -JH -JH -JH -JH -JH -JH -JH -JH -uf -Sz -Sz -Sz -Sz -uf -uf -uf -uf aa aa aa @@ -53211,6 +58862,108 @@ aa aa aa aa +gL +Hn +LK +LK +RX +rd +qO +vG +fh +dS +mQ +mQ +mQ +mQ +mQ +mQ +pG +pG +qw +Xb +TF +yi +pG +pG +aa +wc +tz +HU +Qq +DU +qi +wc +iA +Uh +Uh +fB +Pj +fB +Uh +Uh +iA +iA +iA +iA +iA +iA +iA +fB +Pj +fB +iA +Xw +Xw +It +It +It +It +It +It +It +It +It +It +aJ +BA +Mo +nP +BA +Wb +Rf +nP +TV +qM +Mo +pq +ew +Ik +QC +Bo +Bo +Bo +tU +Bo +Bo +Bo +mw +UU +GM +ob +lr +aa +"} +(162,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -53226,8 +58979,6 @@ aa aa aa aa -"} -(160,1,1) = {" aa aa aa @@ -53368,99 +59119,99 @@ aa aa aa aa -iF -pP -oJ -Qx -BJ -oJ -my -oJ -EO -oJ -FW -uG -oJ -Kb -iF -XA -mJ -lq -XK -iF -os -iR -oJ -lo -qn -YU -YU -YU -YU -YU -mD -mD -wu -xh -wu -mD -Ya -rY -Ya -Ya -Ya -rY -Ya -Ya -BX -io -io -io -QC -Sl -QC -Qi -oi -QC -uK -eI -bi -Wf -bi -eI -bi -cY -QC -QC -QC -QC -QC -QC -QC -QC -QC +dS +rd +rF +gv +uE +mQ +mQ +mQ +mQ +mQ +Oj +Uj +mC +zP +zu +mQ +mQ +pG +rj +Xb +vp +yi +rj +pG +wc +wc +zq +ic +wS +fJ +Up +wc +iA +iA +iA +iA +iA +iA +iA +iA +iA +aa +aa +aa +aa +iA +iA +Na +Na +Na +iA +iA +wc +It +It +It +It +It +It +It +It +It +It +aJ +YD +Mo +St +TV +Wb +Mo +St +TV +qM +Mo +Jd +ew +ew QC -uf -uf -uf -Fj -uf -uf -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +tU +tU +la +tU +la +tU +tU +lr +lr +pF +lr +lr aa +"} +(163,1,1) = {" aa aa aa @@ -53483,8 +59234,6 @@ aa aa aa aa -"} -(161,1,1) = {" aa aa aa @@ -53625,100 +59374,101 @@ aa aa aa aa -iF -fd -oJ -Qx -dy -oJ -jp -oJ -TX -oJ -al -uG -oJ -EK -iF -iF -iF -uH -iF -iN -ot -mI -oJ -nn -qo -iN -iF -iF -rK mQ -io -vG -vG -vG -vG -vG -io -rK mQ +mQ +mQ +mQ +mQ +mQ +mQ +mR +vH +mQ +xl +Xg +ys +mC +zF +Am +Fq +mQ +rj +rj +JB +ET +YX +rj io -io -io -qw -iu -uc -iu -lN -iu -eM -Ze -tG -pN -Dy -QC -Zj -bi -ni -zw -Id -Bs -di -QC -Wg -Jh -Jh -IE -IE -Jh -Jh -IE -IE -Is -Pj -fB -bE -GV -BQ -uf -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +wc +ra +tY +ha +Gp +MD +oq +FP +wc +Er +lh +wc +wc +wc +wc +wc +wc aa aa aa aa +Jb +XB +En +En +En +YJ +Jb +wc +It +It +It +It +It +It +It +It +It +It +aJ +TV +Mo +St +TV +Wb +Mo +St +TV +qM +Mo +Jd +ew +dh +QC +Bo +Bo +Bo +Bo +Bo +Bo +Bo +mw +wq +GM +xy +lr aa +"} +(164,1,1) = {" aa aa aa @@ -53740,8 +59490,6 @@ aa aa aa aa -"} -(162,1,1) = {" aa aa aa @@ -53882,97 +59630,102 @@ aa aa aa aa -iF -ob -oJ -Qx -dy -oJ -Yk -oJ -UT -oJ -mm -uG -oJ -lp -iF -CP -kj -kj -nm -iF -ou -iR -oJ -lo -oM -iF -rF -iF -iu -iu -io -io -Oj -mk -Oj -io -io -iu -iu -io mQ -io -iu -io +mQ +Rm +Ac +Vz +Nx +ZX +mQ +tL +af +mp +YC +fS +Jn +wE +mC +zN +Am +ZY +MF +rj +rj uc -io -iu -io -yc -bg -gE -FZ -hn -QC -bf -eI -ch -ck -BW -uv -uv -SZ -It -It -It -It -It -It -It -It -It -It -Pj -Na -Sz -Sz -IY -uf -aa -aa -aa -aa -aa -aa -aa -aa -aa +Zu +uc +rj +rj +Of +Ka +Ch +hQ +uX +Eo +Ch +te +ce +JG +Gh +jS +wc +EC +Eh +HD +wc +wc aa aa aa +Jb +zD +bQ +vw +cN +xv +Jb +wc +Wg +Jk +Jk +IJ +IJ +Jk +Jk +IJ +IJ +Wg +aJ +Xx +Ro +nP +Xx +Mp +Ro +nP +TV +Wb +Mo +pq +ew +ew +QC +Bo +Bo +Bo +Bo +Bo +Bo +Bo +oF +GM +GM +EY +lr aa +"} +(165,1,1) = {" aa aa aa @@ -53997,8 +59750,6 @@ aa aa aa aa -"} -(163,1,1) = {" aa aa aa @@ -54136,89 +59887,102 @@ aa aa aa aa +mQ +mc +vl +IV +IV +IV +GX +UN +ao +ao +kW +wC +EP +JR +KG +An +tL +IX +IR +dE +rj +rj +ZP +aE +Ql +rj +rj +Of +cQ +YS +HX +HX +HX +LS +sa +ce +rg +Jm +Jm +sH +ui +Jm +ed +hX +wc aa aa aa -iF -kp -bh -bh -oJ -oJ -oJ -oJ -oJ -oJ -oJ -oJ -oJ -lo -uH -wM -oJ -oJ -lo -lK -hz -oN -iZ -lq -zh -iF -iX -iF -tJ -tK -mR -vH -tK -xl -xT -ys -mR -zF -Am -Fq -iu -io -gl -Uo -uc -Qw -Qk -io -QC -QC -QC -at -QC -QC -QC -QC -QC +Jb +Jb +zD +Nj +xv +Jb +Jb +wc +wc +wc +wc +wc +wc +wc +wc +wc +wc +wc +wc +nP +fu +fu +fu +fu +fu +fu +TV +Nf +Mo +ae +ew +ew QC -Wv -Kd -nD -SZ -It -It -It -It -It -It -It -It -It -It -Pj -Pr -Xw -Sz -gn -uf -uf -uf +vV +Bo +Bo +xs +Bo +Bo +Bo +mw +CD +GM +sl +lr +aa +"} +(166,1,1) = {" aa aa aa @@ -54254,8 +60018,6 @@ aa aa aa aa -"} -(164,1,1) = {" aa aa aa @@ -54381,6 +60143,112 @@ aa aa aa aa +mQ +mQ +be +IV +IV +IV +IV +Vx +mQ +MO +IO +SK +YC +AI +Ng +An +qT +An +xT +bw +dE +rj +rj +nk +iu +Xc +rj +rj +Of +xu +VF +lI +lI +lI +Px +Kk +ce +bl +LE +WP +wc +ui +rQ +gK +ui +wc +wc +aa +aa +pG +Jb +Jb +Jb +Jb +Jb +pG +aa +aa +pG +dJ +Tw +Tw +Tw +Tw +Tw +Tw +gs +pG +pG +pG +pG +pG +pG +pG +pG +Xb +TF +yi +QC +TN +df +QC +Fn +Fn +iv +Fn +iv +Fn +Fn +lr +lr +lr +lr +lr +aa +"} +(167,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -54396,86 +60264,6 @@ aa aa aa aa -iF -iS -KR -pA -jq -ju -ju -mF -jN -jQ -jN -pL -sb -QG -iF -mj -jf -iZ -nJ -iF -ov -oO -do -hz -WS -qS -Nx -ZX -tK -Ab -mR -Ab -np -Ab -Ab -Ab -mR -Ab -zF -ZY -MF -NG -uc -uc -uc -uc -Bv -io -Of -rv -Sl -gE -oj -QC -Xf -XJ -Xf -QC -Je -Kd -nD -SZ -It -It -It -It -It -It -It -It -It -It -Pj -Pr -Xw -Sz -cD -Wn -wj -uf aa aa aa @@ -54511,8 +60299,6 @@ aa aa aa aa -"} -(165,1,1) = {" aa aa aa @@ -54614,6 +60400,111 @@ aa aa aa aa +mQ +Rm +vl +IV +IV +ER +IV +GX +tK +gr +Am +Nt +mQ +DO +An +An +An +An +An +in +mQ +rj +uA +Kg +RE +np +nF +io +wc +hE +lI +IZ +jX +DZ +lI +cV +wc +cU +cw +an +Cm +ej +Jm +Jm +ed +TR +wc +pG +pG +pG +jR +Sf +Sf +Sf +BK +pG +pG +pG +pG +cB +wf +wf +wf +wf +wf +wf +Op +RO +RO +uZ +Ws +Uf +Ws +tH +pG +Xb +uQ +yi +QC +QC +QC +QC +vV +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +vV +Fn +aa +"} +(168,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -54653,86 +60544,6 @@ aa aa aa aa -iF -iF -iN -iF -iF -iF -iF -iF -Ih -iF -iF -iF -iN -iF -iF -iF -iF -no -iF -iF -iN -Ih -pl -pQ -Ih -iF -iX -iF -UN -tL -LT -LT -wC -LT -LT -LT -kt -tL -IX -io -iu -io -rx -Qf -Ds -DG -OR -io -BB -YP -bd -Rh -Ag -QC -Sl -Sl -Sl -QC -hJ -Kd -sH -SZ -It -It -It -It -It -It -It -It -It -It -Pj -Xn -Xw -Sz -Rw -Wn -zA -uf aa aa aa @@ -54768,8 +60579,6 @@ aa aa aa aa -"} -(166,1,1) = {" aa aa aa @@ -54848,6 +60657,115 @@ aa aa aa aa +mQ +aC +IV +Ox +IV +Jg +IV +GX +tK +gr +xT +Ng +cE +xD +An +vt +vt +vt +An +Wr +BE +uA +Ux +nN +OB +Ab +kk +nF +Pg +FN +lI +dA +wm +zW +lI +VH +Lh +Px +VF +uq +DB +ui +Jm +eC +Jm +qV +wc +pG +zG +ym +wa +ie +QA +qu +sS +ym +xK +pG +pG +dR +wf +wf +wf +wf +wf +hV +vh +sb +sb +YN +IL +Ex +eq +WV +pG +Ec +uQ +yi +pG +aa +aa +Fn +Bo +Bo +Bo +Ow +Bo +Gd +Bo +Ow +Bo +Bo +pS +Fn +aa +"} +(169,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -54910,86 +60828,6 @@ aa aa aa aa -Vx -JB -SA -Kg -Vx -Jr -OZ -Jr -ub -wl -nc -nc -sf -Vx -Ul -Jg -mK -be -nK -nV -ow -oP -be -nK -qr -Vx -rH -Vx -tK -Ab -LT -Ng -Ng -Ng -Ng -Ng -LT -Ab -xT -iu -rK -io -io -iu -Dt -DH -iu -in -Sl -RW -Sl -Rh -PT -QC -eN -Ne -Tl -QC -yY -Kd -yY -SZ -It -It -It -It -It -It -It -It -It -It -Pj -Pr -Xw -Sz -QU -uf -Wn -uf aa aa aa @@ -55025,8 +60863,6 @@ aa aa aa aa -"} -(167,1,1) = {" aa aa aa @@ -55078,8 +60914,103 @@ aa aa aa aa +mQ +XC +IV +Ox +IV +Fv +IV +GX +tK +gr +Zj +ao +cE +qT +An +vt +LT +vt +An +qT +BE +nk +wH +DR +hL +uC +wH +Fx +Pg +fH +lX +JM +ZZ +Gm +lX +fD +Lh +Jm +Jm +dY +Iy +ui +Jm +La +Jm +Rv +wc +ct +wa +RG +RL +ca +ca +ca +RL +Ah +sS +Kh +ZV +Rx +Rx +Rx +IG +Tw +fY +Tw +wa +My +My +YN +BI +wf +kS +WV +HS +Xb +uQ +yi +pG aa aa +Fn +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +qd +Fn +aa +"} +(170,1,1) = {" aa aa aa @@ -55167,86 +61098,6 @@ aa aa aa aa -Vx -kg -Im -Ey -aE -Jr -tj -xK -qU -zB -Zw -Zw -Zw -Vx -Vx -Vx -mL -Ox -Ox -Ox -Ox -Ox -Ox -Ox -qs -Za -Vx -Za -tK -Ab -Cb -Nt -Ng -Ng -Ng -Ng -LT -Ab -An -in -io -in -CI -CY -wH -np -oQ -iu -Ms -Mw -WD -cq -wZ -QC -Sl -Sl -Sl -QC -yY -Kd -yY -SZ -It -It -It -It -It -It -It -It -It -It -Pj -Pr -Xw -Sz -Gy -Wn -zA -uf aa aa aa @@ -55282,8 +61133,6 @@ aa aa aa aa -"} -(168,1,1) = {" aa aa aa @@ -55322,6 +61171,104 @@ aa aa aa aa +mQ +aC +IV +Ox +IV +tI +IV +GX +tK +gr +xo +Ol +cE +Az +An +vt +vt +vt +An +mk +BE +zJ +oZ +Ci +dO +lA +kX +nR +Pg +sM +lI +uP +ba +VS +lI +bv +Lh +po +fe +uq +DB +ui +Jm +SY +Jm +mt +wc +vh +ie +Fb +nw +Fb +Fb +Fb +nw +JJ +lD +vh +ZV +YT +YT +YT +ea +pG +pG +pG +pG +pG +pG +YN +BI +wf +kS +WV +HS +Xb +TF +yi +pG +aa +aa +Fn +dc +Ry +sC +Ry +sC +Ry +sC +Ry +sC +Ry +UZ +Fn +aa +"} +(171,1,1) = {" +aa aa aa aa @@ -55424,86 +61371,6 @@ aa aa aa aa -Vx -dc -Ck -Zk -Vx -Jr -Jr -Jr -ez -OL -OL -OL -th -Vx -lM -tI -mM -Ox -Ox -Ox -Ox -Ox -Ox -Ox -qs -Jg -rI -tI -tK -Ab -LT -Ng -xD -xD -xD -VW -Cb -vt -xT -iu -BE -mk -CJ -Ab -Ab -Ab -DV -iu -WL -Mu -Mu -Mu -aB -DF -BW -BW -NV -zw -yY -Kd -yY -SZ -It -It -It -It -It -It -It -It -It -It -Pj -Xn -pY -Sz -dJ -Wn -wj -uf aa aa aa @@ -55539,8 +61406,6 @@ aa aa aa aa -"} -(169,1,1) = {" aa aa aa @@ -55563,8 +61428,103 @@ aa aa aa aa +mQ +hZ +il +IV +IV +tI +IV +GX +tK +gr +Am +Nt +mQ +DO +An +An +An +An +An +DO +mQ +rj +zJ +bS +RE +gg +nR +io +wc +hE +lI +IZ +HB +DZ +lI +cV +wc +cU +cw +an +Cm +ej +Jm +Jm +Gu +rR +wc +OV +hd +ca +ca +ca +ca +ca +ca +ca +pA +AF +ZV +YT +YT +YT +ea +pG +pG +ZL +fn +Os +pG +YN +YK +Ad +JV +WV +pG +Xb +vp +Ct +pG aa aa +Fn +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Fn +aa +"} +(172,1,1) = {" aa aa aa @@ -55681,86 +61641,6 @@ aa aa aa aa -Vx -Vx -RL -Vx -Vx -ap -Yp -Yp -GM -iG -iG -iG -iG -lr -nE -lr -mN -Ox -Ox -fA -ox -XC -Ox -Ox -qt -Fv -rI -NU -tM -Ab -LT -Ng -xD -xD -xD -Ng -LT -Ab -Ab -qT -BE -NU -wH -Ab -np -Ab -wH -Eg -Mw -Mu -bx -Mu -dL -hN -BW -qK -BW -Cz -BW -Kd -yY -SZ -It -It -It -It -It -Jq -It -It -It -It -Pj -mE -qk -Sz -je -uf -Wn -uf aa aa aa @@ -55796,8 +61676,6 @@ aa aa aa aa -"} -(170,1,1) = {" aa aa aa @@ -55807,8 +61685,103 @@ aa aa aa aa +mQ +mQ +be +IV +IV +IV +IV +Vx +mQ +MO +Ep +mp +YC +IN +Ol +An +qT +An +xo +nd +dE +rj +rj +nk +iu +Xc +rj +rj +eP +Ut +fe +lI +lI +lI +po +SW +ce +JG +Gh +WP +wc +ui +Yg +kq +ui +wc +wc +nc +Vp +nw +Fb +JJ +JJ +Fb +Fb +Fb +lD +mZ +ZV +yE +yE +yE +Fa +pG +jg +Qp +qK +sA +pG +dZ +bx +bx +bx +Cg +pG +Xb +TF +yi +pG +aa aa +Fn +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Fn aa +"} +(173,1,1) = {" aa aa aa @@ -55938,86 +61911,6 @@ aa aa aa aa -Vx -Wj -Lr -Cn -OI -uR -uR -uR -uR -uR -uR -uR -uR -Vx -if -Jg -mM -Ox -Ox -Ox -Ox -Ox -Ox -Ox -qs -tI -rI -Jg -tN -Ab -LT -Ng -xD -xD -xD -VW -Cb -vt -xo -mk -BE -iu -CK -Ab -Ab -Ab -DW -iu -WK -Mu -Mu -Mu -aB -zw -BW -BW -NV -QC -yY -Kd -yY -SZ -It -It -It -It -It -It -It -It -It -It -Pj -kd -kd -Sz -qd -Wn -wj -uf aa aa aa @@ -56050,11 +61943,102 @@ aa aa aa aa +mQ +Kp +il +IV +IV +IV +GX +UN +ao +ao +kW +wC +EP +JR +Mg +An +tL +JI +IR +MF +rj +rj +JB +ET +YX +rj +rj +eP +cQ +TP +AB +AB +AB +CG +LY +ce +Ij +Jm +Jm +sH +ui +Jm +Gu +li +wc +pG +sS +xK +SO +EI +ca +ca +ca +EI +gN +zG +wa +pG +pG +pG +pG +pG +pG +ub +Qp +qK +sA +pG +iH +AV +lp +Wj +aP +pG +Xb +uQ +yi +pG aa aa +Fn +Bo +Bo +Bo +Ow +Bo +Bo +Bo +Ow +Bo +Bo +Bo +Fn aa "} -(171,1,1) = {" +(174,1,1) = {" aa aa aa @@ -56195,86 +62179,6 @@ aa aa aa aa -Vx -dQ -xO -xO -hg -uR -uR -Dq -Mn -rC -uR -Qh -rC -Vx -Vx -Vx -mO -Ox -Ox -Ox -Ox -Ox -Ox -Ox -qs -Za -Vx -Za -tN -Ab -Cb -Nt -Ng -Ng -Ng -Ng -LT -Ab -Ao -in -io -in -CL -CZ -wH -np -nW -iu -Hj -Mw -MN -MK -wZ -QC -Sl -Sl -Sl -QC -yY -Kd -yY -SZ -It -It -It -It -It -It -It -It -It -It -Pj -Pr -Xw -Sz -Gy -Wn -zA -uf aa aa aa @@ -56296,6 +62200,120 @@ aa aa aa aa +mQ +mQ +hZ +az +RN +bY +Gv +mQ +Jw +IO +SK +YC +uy +Jn +Uj +mC +zP +Am +oG +dE +rj +rj +Ti +Ti +Ti +rj +rj +eP +TG +Ch +hc +xI +jZ +Ch +ek +ce +bl +LE +jS +wc +EU +Eh +MB +wc +wc +pG +pG +sS +fY +xK +Vs +NB +wL +zG +fY +wa +pG +pG +vg +Xk +MQ +pG +pG +AJ +Qp +qK +sA +pG +pG +oh +qK +qK +pI +pG +Ec +uQ +yi +pG +aa +aa +Fn +Bo +UR +Bo +UR +Bo +UR +Bo +UR +Bo +UR +Bo +Fn +aa +"} +(175,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -56310,8 +62328,6 @@ aa aa aa aa -"} -(172,1,1) = {" aa aa aa @@ -56442,96 +62458,106 @@ aa aa aa aa +mQ +mQ +mQ +mQ +mQ +mQ +mQ +mQ +Th +vO +mQ +HA +Jn +ys +mC +zF +Ap +AT +mQ +rj +rj +ZP +aE +Ql +rj +io +wc +mV +yk +dq +py +fq +II +sj +wc +BC +TU +wc +wc +wc +wc +wc +wc aa aa +pG +pG +pG +Vl +Tw +Tw +Tw +xB +pG +pG +pG +yq +ax +GJ +cy +Uz +nX +eS +ax +qK +AX +iW +pG +oh +XP +dw +pI +pG +Xb +uQ +yi +pG aa aa +Fn +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Fn aa +"} +(176,1,1) = {" aa aa aa aa aa -Vx -fO -zL -TA -IP -uR -dj -ZU -cG -xA -ex -Rn -er -Vx -hG -Jg -hi -nr -nL -nX -oy -nX -nL -nr -qu -Vx -rJ -Jg -tN -Ab -LT -Ng -Ng -Ng -Ng -Ng -LT -Ab -xo -iu -mQ -io -io -iu -Xa -DI -iu -in -Sl -RW -Sl -Rh -Ad -QC -sc -Ne -YT -QC -yY -Kd -yY -SZ -It -It -It -It -It -It -It -It -It -It -Pj -Pr -Xw -Sz -UV -uf -Wn -uf aa aa aa @@ -56567,8 +62593,6 @@ aa aa aa aa -"} -(173,1,1) = {" aa aa aa @@ -56693,6 +62717,42 @@ aa aa aa aa +we +gl +aH +fg +MZ +mQ +GN +mQ +mQ +mQ +yU +wE +mC +zN +gk +mQ +mQ +pG +rj +Xb +vp +yi +rj +pG +wc +wc +vj +ic +lI +fJ +Up +wc +wc +wc +wc +wc aa aa aa @@ -56702,93 +62762,54 @@ aa aa aa aa +pG +pG +uc +uc +uc +pG +pG aa +pG +nt +GJ +GJ +GJ +aA +qK +qK +Bj +qK +qK +OA +pG +oh +Ic +Lq +pI +pG +Xb +TF +yi +pG aa aa +Fn +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Bo +Fn aa -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Mz -il -Mz -bk -Fo -bk -Mz -io -io -io -io -io -UN -tL -LT -LT -wC -yv -LT -LT -kt -tL -IX -io -iu -io -el -Uv -Dv -DJ -XQ -io -BB -QR -bd -Rh -Tn -QC -Sl -Sl -Sl -QC -hJ -Kd -sH -SZ -It -It -It -It -It -It -It -It -It -It -Pj -Xn -Xw -Sz -Sg -Wn -wj -uf +"} +(177,1,1) = {" aa aa aa @@ -56824,8 +62845,6 @@ aa aa aa aa -"} -(174,1,1) = {" aa aa aa @@ -56955,6 +62974,38 @@ aa aa aa aa +dl +sY +Nb +Nb +YL +CM +GK +lH +vP +we +mQ +mQ +mQ +mQ +mQ +mQ +pG +pG +qw +Xb +TF +yi +pG +pG +wc +wc +Bh +rf +lI +zV +BY +wc aa aa aa @@ -56963,93 +63014,60 @@ aa aa aa aa -Jb -rs -cK -Dj -rs -LS -Dj -rs -JI -Dj -rs -dO -Dj -rs -Ky -Dj -rs -bS -Jb -uj -il -nM -nM -nM -nM -nM -io -bp -eP -Vc -YA -tN -Ab -mR -Ab -np -Ab -Ab -Ab -mR -Ab -zG -io -Ye -iu -QF -Ry -Ti -Ti -PS -io -Of -av -Sl -Vs -RO -QC -XJ -Xf -XJ -QC -hS -Kd -nD -SZ -It -It -It -It -It -It -It -It -It -It -Pj -Pr -Xw -Sz -JJ -Wn -zA -uf aa aa aa aa +pG +sJ +gR +ZP +aE +Ql +gR +sJ +pG +pG +oy +GJ +GJ +GJ +aA +qK +qK +qK +qK +qK +gy +pG +oh +qK +qK +pI +pG +Xb +vp +yi +pG +aa +aa +Fn +vV +Bo +xs +Bo +Bo +Bo +Bo +Bo +xs +Bo +vV +Fn +aa +"} +(178,1,1) = {" +aa aa aa aa @@ -57081,8 +63099,6 @@ aa aa aa aa -"} -(175,1,1) = {" aa aa aa @@ -57215,100 +63231,99 @@ aa aa aa aa +dl +NS +Nb +Nb +Nb +yj +CW +zp +we +we +Kq +mr +mr +cR +we +pG +pG +rj +rj +Xb +uQ +yi +pG +pG +wc +wc +wc +VX +zO +Rz +wc +wc +aa aa aa aa aa aa -Jb -ir -iB -YX -ir -iB -Jb -ir -iB -Jb -ir -iB -Jb -ir -iB -YX -ir -iB -Jb -iH -il -Mz -GC -Fo -GC -Mz -io -TU -WP -Ok -io -tO -tN -mR -vO -tN -xo -xo -yy -mR -zG -Ap -AT -nk -io -YN -OU -Dp -Ti -VB -io -QC -QC -QC -at -QC -QC -QC -QC -QC -QC -BW -Kd -nD -SZ -It -It -It -It -It -It -It -It -It -It -Pj -Pr -Xw -Sz -gp -uf -uf -uf aa aa aa aa aa aa +pG +ix +rj +Xb +TF +yi +rj +ix +pG +pG +Mj +qY +GJ +TJ +Uz +sP +kI +kI +kI +kI +xN +pG +pG +pG +pG +pG +pG +Xb +TF +yi +pG +pG +pG +pG +pG +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +Fn +aa +"} +(179,1,1) = {" aa aa aa @@ -57338,8 +63353,6 @@ aa aa aa aa -"} -(176,1,1) = {" aa aa aa @@ -57475,89 +63488,87 @@ aa aa aa aa +dl +Vr +Nb +Nb +Nb +yj +Qm +vR +Rq +Ia +wG +kC +UY +zH +we +Mm +rj +rj +rj +Xb +uQ +Ct +pG +pG +wc +wc +wc +wc +wc +wc +wc +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +rj +rj +Xb +TF +yi +rj +rj +pG +pG +pG +Pb +GJ +DP +pG +pG +Br +tC +cG +Kb +pG +pG +pG +Mm +rj +rj +rj +Xb +uQ +yi +rj +rj +rj +FA +pG aa aa -il -is -lL -iJ -Zy -bu -jg -Zy -bu -jz -Zy -Zy -eQ -Zy -bu -kS -Qp -lL -Ra -kB -Km -iL -iT -iT -iT -ls -io -io -io -io -io -Fq -UO -io -io -yU -mk -yU -io -io -iu -iu -io -rK -io -iu -io -NJ -Ti -aX -iu -eM -ZM -Vs -tG -dX -QC -cW -cS -nj -ck -BW -gx -gx -SZ -It -It -It -It -It -It -It -It -It -It -Pj -Na -Sz -Sz -IY -uf aa aa aa @@ -57568,6 +63579,8 @@ aa aa aa aa +"} +(180,1,1) = {" aa aa aa @@ -57595,8 +63608,6 @@ aa aa aa aa -"} -(177,1,1) = {" aa aa aa @@ -57734,87 +63745,85 @@ aa aa aa aa -iH +we +gl +Nb +Nb +Nb +yj +CW +vS +zp +qB +tk +kC +tk +zI +WW +Ev +rj +bX +rj +Xb +uQ +yi +vk +rj +rj +OO +rj +rj +OO +rj +rj +rj +OO +rj +rj +rj +rj +rj +OO +rj +rj +MK +Ez +sc +OO +rj +rj +Xb +TF +yi +rj +rj +rj +rj +sJ +pG +am +pG +sJ +FA it -lL -im -Gc -gg -Gc -Gc -If -fo -jF -Gc -Gc -gg -Gc -rS -hb -lL -Ra -kB -lL -iK -iU -iU -jx -jG -iu -Ym -io -io -rK -iu -MF -io -vP -vP -vP -vP -vP -io -rK -mQ -Ye -nk -Ye -pO -iu -BV -SN -ph -iu -yc -Bo -FZ -bD -Dy -QC -dV -cS -RC -zw -Ot -Ot -di -QC -Wg -Jk -Jk -IJ -IJ -Jk -Jk -IJ -IJ -Wg -Pj -YO -Bx -nx -ih -uf +RO +RO +lu +FA +pG +Ml +Ev +rj +bX +rj +Xb +uQ +yi +rj +bX +rj +rj +pG aa aa aa @@ -57827,6 +63836,10 @@ aa aa aa aa +"} +(181,1,1) = {" +aa +aa aa aa aa @@ -57852,8 +63865,6 @@ aa aa aa aa -"} -(178,1,1) = {" aa aa aa @@ -57988,90 +63999,91 @@ aa aa aa aa +we +we +dl +we +we +gl +Nb +YL +yo +NR +fF +xq +Tl +cK +jE +cK +HI +WW +GS +bX +rj +ZP +qf +vp +NV +Ql +Kt +rj +rj +rj +rj +rj +rj +rj +rj +rj +rj +rj +rj +rj +rj +rj +rj +rj +MK +Ez +Sl +rj +rj +ZP +qf +vp +NV +Ql +rj +rj +rj +MK +uN +RA +lE +sJ +zf +JU +ri +Aj +iG +Xz +pG +nI +GS +bX +rj +rj +Xb +vp +yi +rj +rj +bX +rj +pG aa aa aa -il -il -il -il -il -Ho -il -il -PQ -fo -FK -Mz -Mz -Ho -il -il -il -il -il -Mz -Ho -Mz -Mz -Mz -jw -pm -io -iu -io -io -iu -io -yj -io -io -Kq -mk -Kq -io -io -iu -iu -iu -iu -iu -iu -io -lT -bc -io -io -io -iu -io -Qi -cZ -QC -YD -cS -cS -AE -cS -cS -cS -Pn -QC -QC -QC -QC -QC -QC -QC -QC -QC -QC -uf -uf -Fb -tC -uf -uf aa aa aa @@ -58081,6 +64093,8 @@ aa aa aa aa +"} +(182,1,1) = {" aa aa aa @@ -58109,8 +64123,6 @@ aa aa aa aa -"} -(179,1,1) = {" aa aa aa @@ -58243,93 +64255,94 @@ aa aa aa aa +we +we +fg +UK +fg +we +we +Nb +YL +uw +vS +zp +we +we +aU +lZ +kN +Qs +WW +KN +rj +rj +Xb +Ml +FA +Ml +yi +nC +Cu +Cu +Cu +Cu +Cu +Cu +Cu +Cu +Cu +Cu +Cu +Cu +Cu +Cu +Cu +Cu +Cu +hi +Ez +EQ +rj +rj +Xb +Ml +FA +Ml +yi +OK +OK +OK +ZS +Xb +TF +yi +pG +pG +TC +TC +TC +TC +pG +pG +Ml +KN +rj +rj +ZP +TW +FA +FK +Ql +rj +rj +rj +pG aa aa aa aa aa -il -iv -iD -iD -iV -lL -bT -il -dY -ya -QQ -Mz -jU -lL -kx -kT -lu -lO -il -mS -lL -hW -nY -Mz -jw -jG -iu -Ym -iu -xB -sK -sz -Vq -io -vQ -wG -xp -wG -Fg -io -zH -Aq -AU -BF -IH -Hf -ET -xE -ei -bK -Jf -Pb -pO -iu -Ad -Rh -QC -fk -cS -cS -cS -cS -cS -cS -Xd -QC -Cu -VG -Cu -dI -nw -zd -zd -zd -uf -Sz -Sz -Sz -Sz -uf -uf -uf aa aa aa @@ -58337,6 +64350,8 @@ aa aa aa aa +"} +(183,1,1) = {" aa aa aa @@ -58366,8 +64381,6 @@ aa aa aa aa -"} -(180,1,1) = {" aa aa aa @@ -58499,99 +64512,103 @@ aa aa aa aa +dl +CQ +Nb +Nb +Nb +Zz +dl +Nb +sR +ux +vS +vR +lH +iM +rP +pw +gz +kN +Ar +ZP +aE +aE +qf +od +DC +ng +NV +aE +aE +aE +aE +aE +aE +aE +aE +aE +aE +aE +aE +aE +aE +aE +aE +aE +aE +aE +Ql +oo +ZP +aE +qf +od +DC +ng +NV +aE +aE +aE +aE +qf +TF +NV +aE +aE +aE +aE +aE +aE +QY +Ql +gG +ZP +aE +aE +qf +od +DC +ng +NV +aE +aE +Ql +pG +aa aa aa aa aa aa aa -il -iw -lL -lL -lL -lL -ji -il -kK -GE -nT -il -jT -lL -lL -lL -lL -lL -qL -lL -lL -Pq -nZ -il -jE -jG -iu -lN -iu -SQ -sK -Ts -em -io -pr -Ab -Ab -Ab -tg -io -zI -Ti -Ti -BG -Qs -RA -io -ax -ei -vk -vk -ZO -HE -iu -Qi -cZ -QC -WI -BW -uM -JV -dG -MR -TV -PN -QC -Og -VG -Cu -Sb -Sb -zd -kc -Qu -uf -Sz -Js -Js -Sz -Wn -zA -uf aa aa aa aa aa +"} +(184,1,1) = {" aa aa aa @@ -58623,8 +64640,6 @@ aa aa aa aa -"} -(181,1,1) = {" aa aa aa @@ -58754,6 +64769,130 @@ aa aa aa aa +we +Mt +Nb +cu +Nb +XW +Cx +UA +FF +Re +vS +vS +mb +dl +rP +zk +zk +Lc +Ar +qh +uQ +uQ +vp +Qo +eT +nh +vp +uQ +uQ +vp +uQ +uQ +uQ +TF +vp +TF +uQ +uQ +uQ +TF +vp +TF +uQ +uQ +uQ +TF +qq +oo +XV +uQ +vp +Qo +eT +nh +vp +uQ +uQ +TF +vp +TF +uQ +uQ +uQ +TF +vp +TF +uQ +uQ +uQ +yi +fp +Xb +uQ +uQ +vp +Qo +YF +nh +vp +uQ +uQ +yi +pG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(185,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -58762,88 +64901,6 @@ aa aa aa aa -il -ix -iE -iE -iW -lL -jh -il -Oy -Uz -gV -Mz -jU -lL -ky -kU -lv -lP -il -mT -lL -hW -oa -Mz -jw -jG -iu -Ym -iu -gl -sK -OH -yo -iu -vR -Ab -Ab -Ab -yz -iu -HI -xC -Yw -BH -QF -Ud -sZ -Ti -ei -RR -Kt -io -iu -MA -Ad -Nl -QC -QC -hf -QC -QC -QC -QC -QC -QC -QC -Cu -VG -Cu -Sb -Sb -zd -zd -zd -uf -Sz -Js -Js -Sz -Wn -ga -uf aa aa aa @@ -58880,8 +64937,6 @@ aa aa aa aa -"} -(182,1,1) = {" aa aa aa @@ -58971,6 +65026,89 @@ aa aa aa aa +dl +CQ +Nb +Nb +Nb +FV +dl +Nb +sR +ux +vS +fF +vW +iM +rP +pw +HW +zK +Ar +JB +ET +ET +hI +Ky +rX +MG +Dj +ET +ET +ET +ET +ET +ET +ET +ET +ET +ET +ET +ET +ET +ET +ET +ET +ET +ET +ET +YX +oo +JB +ET +hI +Ky +rX +MG +Dj +ET +ET +ET +ET +ET +ET +ET +ET +ET +ET +ET +ET +ET +ET +YX +gG +JB +ET +ET +hI +Ky +rX +MG +Dj +ET +ET +YX +pG aa aa aa @@ -58983,6 +65121,8 @@ aa aa aa aa +"} +(186,1,1) = {" aa aa aa @@ -59019,88 +65159,6 @@ aa aa aa aa -il -il -il -il -il -Ho -il -il -PQ -fo -FK -Mz -Mz -Ho -il -il -il -il -il -Mz -Ho -Mz -Mz -Mz -jw -pm -io -iu -io -Mr -sK -uc -uw -vd -vS -wH -Ab -Ab -np -zk -Qs -Ti -xN -BI -Qs -Ti -Ti -SN -kZ -nC -nC -nC -Zt -BA -Qi -cZ -pI -Qz -tG -Vs -tG -Vs -tG -Vs -MK -TH -Cu -VG -Cu -Sb -Sb -zd -kc -Qu -uf -Sz -Js -Js -Sz -Wn -zA -uf aa aa aa @@ -59137,8 +65195,6 @@ aa aa aa aa -"} -(183,1,1) = {" aa aa aa @@ -59227,6 +65283,110 @@ aa aa aa aa +we +we +fE +AO +fE +we +we +Nb +YL +Wv +vS +zp +we +we +Ib +qE +zK +JA +WW +Ev +rj +rj +Xb +Ml +FA +Ml +yi +ZB +rl +rl +rl +rl +rl +rl +rl +cg +cg +NO +cg +cg +Og +Ey +cS +Og +Wf +Pe +Ez +sc +rj +rj +Xb +Ml +FA +Ml +yi +rl +rl +rl +rl +rl +rl +rl +rl +rl +rl +rl +rl +rl +rl +pG +Ml +Ev +rj +rj +JB +Tr +FA +kO +YX +rj +rj +rj +pG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(187,1,1) = {" +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -59276,88 +65436,6 @@ aa aa aa aa -iH -iy -lL -ip -Us -bu -Us -Us -Ua -fo -jv -Us -Us -bu -Us -tR -Qp -lL -Ra -kB -lL -iL -iT -iT -jH -jG -iu -qw -iu -ZS -sK -Ca -ux -iu -vR -Ab -Ab -Ab -pw -gz -kN -Ar -Fx -iu -QF -Ti -Ti -TT -KW -Ys -Rc -JK -io -io -ht -cq -pI -bg -sC -FZ -sC -FZ -ZP -gU -cZ -YG -Sb -Sb -Sb -Sb -Sb -zd -zd -zd -uf -Sz -Js -Js -Sz -uf -uf -uf aa aa aa @@ -59394,8 +65472,6 @@ aa aa aa aa -"} -(184,1,1) = {" aa aa aa @@ -59465,6 +65541,88 @@ aa aa aa aa +we +we +dl +we +we +gl +Nb +YL +eK +hM +vR +Rq +Ia +mr +nv +mr +hm +WW +GS +bX +rj +JB +hI +vp +Dj +YX +Kt +rj +rj +rj +rj +rj +rj +rj +cg +ip +zU +Fe +cg +UB +MN +oW +Xz +Ba +it +Ez +Sl +rj +rj +JB +ET +ee +ET +YX +rj +rj +rj +rj +rj +rj +rj +rj +rj +rj +rj +rj +rj +rj +pG +nI +GS +bX +rj +rj +Xb +vp +yi +rj +rj +bX +rj +pG aa aa aa @@ -59477,6 +65635,8 @@ aa aa aa aa +"} +(188,1,1) = {" aa aa aa @@ -59533,86 +65693,6 @@ aa aa aa aa -il -iz -lL -iM -Sn -gg -jj -Sn -gg -jB -Sn -gg -jV -Sn -gg -kV -hb -lL -Ra -kB -Qr -iK -iU -iU -iU -lt -iu -zC -iu -Cx -sK -uc -uw -vd -vS -wH -Ab -Ab -np -zk -Qs -Ti -xN -BI -Hn -xn -xn -eT -Tr -Ti -Ti -TT -io -io -QC -QC -QC -QC -QC -QC -QC -QC -QC -Ad -Rh -TH -nw -Sb -Sb -Sb -Sb -ZC -uf -uf -uf -Rr -Mv -Mv -Mv -uf aa aa aa @@ -59627,6 +65707,7 @@ aa aa aa aa +fZ aa aa aa @@ -59651,8 +65732,6 @@ aa aa aa aa -"} -(185,1,1) = {" aa aa aa @@ -59722,6 +65801,85 @@ aa aa aa aa +we +gl +Nb +Nb +Nb +yj +CW +vS +zp +qB +tk +kC +tk +zI +WW +KN +rj +bX +rj +Xb +uQ +yi +ZB +rj +rj +rj +Hi +rj +rj +rj +rj +cg +Bt +FH +Pa +cg +SJ +UB +FA +yz +FA +ja +Ez +EQ +rj +rj +rj +Hi +rj +rj +rj +rj +rj +Hi +rj +rj +rj +Hi +rj +rj +rj +Hi +rj +rj +rj +pG +Ml +KN +rj +bX +rj +Xb +uQ +yi +rj +bX +rj +rj +pG aa aa aa @@ -59734,6 +65892,8 @@ aa aa aa aa +"} +(189,1,1) = {" aa aa aa @@ -59790,86 +65950,6 @@ aa aa aa aa -Jb -ir -iB -YX -ir -iB -Jb -ir -iB -Jb -ir -iB -Jb -ir -iB -YX -ir -iB -Jb -pc -Hv -RI -ja -et -ja -RI -io -io -io -en -uc -SO -bG -iu -vT -wI -xq -wI -Bw -iu -zK -As -zJ -YY -io -sn -sn -hk -Cv -oC -UH -SH -io -UX -uX -oH -QC -TB -TB -TB -TB -TB -QC -Qi -cZ -QC -Gj -Sb -CX -DD -Sb -ZC -uf -Sz -SV -Js -Sz -Sz -Sz -uf aa aa aa @@ -59908,8 +65988,6 @@ aa aa aa aa -"} -(186,1,1) = {" aa aa aa @@ -59980,6 +66058,85 @@ aa aa aa aa +dl +Bu +Nb +Nb +Nb +yj +Qm +fF +xq +Tl +wK +kC +UY +zH +we +Mm +rj +rj +rj +Xb +uQ +Ct +cg +cg +cg +cg +cg +cg +cg +cg +cg +cg +NO +cg +NO +cg +cg +cg +cg +cg +cg +cg +cg +cg +cg +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +Mm +rj +rj +rj +JB +ET +YX +rj +rj +rj +FA +pG aa aa aa @@ -59992,6 +66149,8 @@ aa aa aa aa +"} +(190,1,1) = {" aa aa aa @@ -60047,86 +66206,6 @@ aa aa aa aa -Jb -Zd -ze -Dj -Zd -ze -Dj -Zd -ze -Dj -Zd -Vf -Dj -Zd -yl -Dj -Zd -DS -Jb -Vi -Af -qf -ps -ig -ps -yh -Hv -cg -cg -cg -UO -cg -cg -cg -cg -yU -GJ -yU -cg -io -io -io -io -io -io -iu -iu -iu -io -iu -iu -iu -io -qg -ie -bi -NP -bi -bi -bi -bi -bi -tF -Ad -Rh -QC -uf -uf -uf -uf -uf -uf -uf -Sz -Js -Js -Sz -Sz -Sz -uf aa aa aa @@ -60165,8 +66244,6 @@ aa aa aa aa -"} -(187,1,1) = {" aa aa aa @@ -60238,6 +66315,51 @@ aa aa aa aa +dl +NS +Nb +Nb +Nb +yj +CW +zp +we +we +OJ +cK +cK +us +we +pG +pG +rj +rj +Xb +uQ +yi +cg +bM +bM +FM +QX +gY +gY +gY +gY +MW +pN +zU +TS +ly +gY +gY +gY +gY +QX +FD +bM +bM +cg aa aa aa @@ -60259,6 +66381,19 @@ aa aa aa aa +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG +pG aa aa aa @@ -60271,6 +66406,8 @@ aa aa aa aa +"} +(191,1,1) = {" aa aa aa @@ -60304,86 +66441,6 @@ aa aa aa aa -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -Jb -NW -rM -rM -rM -rM -rM -zc -pc -cg -PL -fm -cO -fm -eK -cg -vU -vU -vU -vU -vU -cg -hm -fm -cO -BM -HH -ug -HH -HH -sY -NO -NO -NO -QC -Qy -Rb -dw -QC -ND -OV -op -zt -Fe -QC -bg -Ah -pI -tH -Bp -ms -UW -Bp -Fs -Bp -Js -Js -Sz -Sz -uf -uf -uf aa aa aa @@ -60422,8 +66479,6 @@ aa aa aa aa -"} -(188,1,1) = {" aa aa aa @@ -60494,7 +66549,6 @@ aa aa aa aa -fZ aa aa aa @@ -60518,6 +66572,51 @@ aa aa aa aa +dl +RU +Nb +Nb +YL +Nq +ve +vW +vP +we +we +we +we +we +we +pG +pG +pG +rj +JB +ET +YX +cg +bM +Sa +FM +gY +gY +gY +gY +gY +gY +Tg +Qj +ml +gY +gY +gY +gY +gY +gY +FD +Sa +bM +cg aa aa aa @@ -60564,6 +66663,8 @@ aa aa aa aa +"} +(192,1,1) = {" aa aa aa @@ -60572,73 +66673,6 @@ aa aa aa aa -Hv -uN -ig -ps -Ai -ps -dZ -Hv -nS -rM -rM -rM -rM -rM -RG -Hv -cg -cg -cg -bL -cg -cg -cg -cg -wJ -GJ -wJ -cg -cg -cg -cg -Wc -cg -cg -cg -cg -Hs -cg -PV -PV -wF -QC -QC -QC -QC -QC -QC -QC -QC -QC -QC -QC -Ei -gT -pI -WM -Bp -Tt -Bj -Bp -oI -Bp -Js -Sz -uf -gh -uf aa aa aa @@ -60679,8 +66713,6 @@ aa aa aa aa -"} -(189,1,1) = {" aa aa aa @@ -60797,6 +66829,51 @@ aa aa aa aa +we +gl +ny +fE +MZ +we +we +we +we +we +aa +aa +aa +aa +aa +aa +aa +pG +pG +pG +pG +pG +cg +bM +bM +FM +gY +gY +gY +gY +gY +JN +Bt +FH +Pa +FL +gY +gY +gY +gY +gY +FD +bM +bM +cg aa aa aa @@ -60829,73 +66906,6 @@ aa aa aa aa -Hv -MQ -rk -kz -kX -lw -rk -AC -ps -rM -rM -rM -rM -rM -zc -Hv -Cd -qz -cg -sN -tS -uA -uA -vV -wK -xs -wK -vV -uA -uA -tS -AV -cg -qz -cg -Rs -HH -cg -Pz -Su -qI -NO -ti -PV -PV -wF -NO -Uw -NO -NO -NO -ZJ -gT -gT -QC -uf -uf -UP -Wn -Wn -uf -uf -Sz -Sz -uf -Sz -uf aa aa aa @@ -60910,6 +66920,14 @@ aa aa aa aa +"} +(193,1,1) = {" +aa +aa +aa +aa +aa +aa aa aa aa @@ -60936,8 +66954,6 @@ aa aa aa aa -"} -(190,1,1) = {" aa aa aa @@ -61070,6 +67086,12 @@ aa aa aa aa +we +we +we +we +we +we aa aa aa @@ -61086,73 +67108,35 @@ aa aa aa aa -Hv -YV -rk -kA -kY -lw -KC -Hv -Fk -gs -rw -qh -ps -ps -Wp -Hv -qz -qy cg -sO -tT -us -us -us -us -us -us -us -us -us -At -AW cg -qz cg -pf -HH cg -Ty -Su -qI -NO -ly -jO -as -qI -NO -NO -NO -NO -NO -ly -gT -Xt -QC -SU -QX -FD -Oz -bM -bM -Wn -Vl -bM -uf -Sz -uf +cg +sV +sV +sV +sV +sV +sV +sV +sV +sV +sV +sV +sV +sV +cg +cg +cg +cg +cg +aa +aa +aa +aa +aa +aa aa aa aa @@ -61194,7 +67178,7 @@ aa aa aa "} -(191,1,1) = {" +(194,1,1) = {" aa aa aa @@ -61343,73 +67327,6 @@ aa aa aa aa -Hv -Hv -Bt -Hv -Hv -Hv -vu -Hv -Hv -Hv -Hv -pc -Pu -Pu -pc -Hv -qA -Cd -fm -sP -tT -us -ve -vW -us -us -us -us -us -us -At -AX -fm -MT -cg -Xk -SG -cg -Yn -Yn -Yn -Yn -Yn -Yn -Yn -Yn -NO -NO -Yn -Yn -Yn -Yn -QC -QC -QC -Yn -Yn -Py -Yn -Yn -uf -uf -uf -uf -uf -Sz -uf aa aa aa @@ -61450,14 +67367,76 @@ aa aa aa aa -"} -(192,1,1) = {" aa aa aa aa aa aa +uz +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(195,1,1) = {" +aa aa aa aa @@ -61600,73 +67579,10 @@ aa aa aa aa -Hv -bB -ps -Ss -pc -hP -lR -ml -mW -rN -bP -ps -ps -ps -dZ -Hv -qy -qz -cg -fE -tT -us -vf -vX -vW -us -us -us -us -us -At -aP -cg -qy -cg -Rs -HH -Rs -Yn -KF -KF -KF -KF -KF -SS -Yn -NO -NO -Yn -EZ -EZ -EZ -EZ -EZ -QM -Yn -NE -NE -NE -Yn aa aa aa aa -uf -fF -uf aa aa aa @@ -61707,8 +67623,6 @@ aa aa aa aa -"} -(193,1,1) = {" aa aa aa @@ -61777,6 +67691,8 @@ aa aa aa aa +"} +(196,1,1) = {" aa aa aa @@ -61857,72 +67773,11 @@ aa aa aa aa -Hv -NW -rM -rM -ct -ps -ps -Zx -Ez -GT -RI -ps -rk -rk -ig -Hv -qy -qz -cg -sQ -tT -us -vf -Vd -vX -vW -us -us -us -us -At -AY -cg -fm -cg -cg -sL -cg -Yn -AH -AH -AH -AH -OP -PK -Yn -Yv -yf -Yn -Vn -PW -Vn -PW -Vn -zZ -Yn -NE -NE -NE -Yn aa aa aa aa aa -on aa aa aa @@ -61964,8 +67819,6 @@ aa aa aa aa -"} -(194,1,1) = {" aa aa aa @@ -62095,6 +67948,8 @@ aa aa aa aa +"} +(197,1,1) = {" aa aa aa @@ -62114,66 +67969,6 @@ aa aa aa aa -Hv -pM -rM -kC -Hv -RI -nq -RI -RI -RI -Hv -bJ -mY -rM -OS -Hv -cg -fm -cg -sR -tT -us -ve -vZ -vZ -vZ -vZ -vZ -yB -us -At -AZ -cg -pg -Uf -CD -HH -LZ -Yn -OP -AH -AH -AH -OP -PK -EW -UM -UM -EW -Vn -PW -Vn -PW -Vn -zZ -Yn -NE -NE -NE -XT aa aa aa @@ -62221,8 +68016,6 @@ aa aa aa aa -"} -(195,1,1) = {" aa aa aa @@ -62371,66 +68164,62 @@ aa aa aa aa -Hv -NW -rk -kD -la -rk -rk -rk -rk -rk -RI -MV -mY -rM -RP -Hv -qB -qW -rT -sO -tT -us -vg -Vd -Vd -Vd -xY -wa -zl -us -At -AW -BN -Cf -HH -HH -HH -LZ -Yn -OP -OP -OP -OP -OP -PK -EW -QO -QO -EW -Vn -PW -Vn -PW -Vn -zZ -Yn -NE -NE -NE -XT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(198,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -62478,8 +68267,6 @@ aa aa aa aa -"} -(196,1,1) = {" aa aa aa @@ -62628,66 +68415,6 @@ aa aa aa aa -pc -qc -rk -kE -lb -rk -rM -mn -mY -rk -RI -MV -mY -rM -Np -Hv -qC -qX -rU -sO -tT -us -vh -vg -Vd -Vd -Vd -yB -vh -us -At -Ba -BO -Cg -HH -HH -HH -rt -Yn -AH -AH -AH -AH -OP -PK -Yn -Sv -Ru -Yn -Vn -Vn -Vn -Vn -Vn -zZ -Yn -NE -NE -NE -Yn aa aa aa @@ -62736,7 +68463,7 @@ aa aa aa "} -(197,1,1) = {" +(199,1,1) = {" aa aa aa @@ -62885,66 +68612,6 @@ aa aa aa aa -Hv -gR -rk -kF -lc -rk -rM -mo -mY -rk -RI -MV -mY -rM -sJ -Hv -qD -qY -rV -sO -tT -us -ve -vZ -wL -Vd -Vd -Vd -yB -us -At -AW -BP -Cf -HH -UA -HH -zf -Yn -XD -XD -XD -XD -XD -Xs -Yn -NO -NO -Yn -Tz -Tz -Tz -Tz -Tz -zE -Yn -NE -NE -NE -Yn aa aa aa @@ -62992,8 +68659,6 @@ aa aa aa aa -"} -(198,1,1) = {" aa aa aa @@ -63054,6 +68719,8 @@ aa aa aa aa +"} +(200,1,1) = {" aa aa aa @@ -63142,66 +68809,6 @@ aa aa aa aa -pc -oD -rk -kG -ld -rk -rM -rM -rM -rk -TD -ps -rM -rM -Pk -Hv -cg -fm -cg -sR -tT -us -vg -wa -wa -wa -wa -wa -zl -us -At -AZ -cg -VY -Xb -CE -HH -WF -Yn -Yn -Yn -Yn -Yn -Yn -Yn -Yn -NO -NO -Yn -Yn -Yn -Yn -Yn -Yn -Yn -Yn -NE -NE -NE -Yn aa aa aa @@ -63249,8 +68856,6 @@ aa aa aa aa -"} -(199,1,1) = {" aa aa aa @@ -63371,6 +68976,10 @@ aa aa aa aa +"} +(201,1,1) = {" +aa +aa aa aa aa @@ -63399,66 +69008,6 @@ aa aa aa aa -Hv -Pe -rk -kH -le -rk -rM -mo -mY -rk -RI -MV -mY -rM -ML -pc -qz -qy -cg -sQ -tT -us -us -us -us -xt -xZ -Vd -zm -us -At -AY -cg -fm -cg -cg -cg -cg -Yn -zM -zM -zM -zM -zM -zs -Yn -NO -NO -Yn -Pv -Pv -Pv -Pv -Pv -ZQ -Yn -NE -NE -NE -XT aa aa aa @@ -63506,8 +69055,6 @@ aa aa aa aa -"} -(200,1,1) = {" aa aa aa @@ -63656,66 +69203,6 @@ aa aa aa aa -pc -BU -rk -kE -lb -rk -rM -mn -mY -rk -RI -MV -mY -rM -Np -Hv -qy -YI -cg -fE -tT -us -us -us -us -us -xt -xZ -zm -us -At -aP -cg -qz -cg -Nh -Ro -Ww -Yn -Se -Si -Se -Se -Se -Tc -Yn -Yv -yf -Yn -Pm -Pm -Pm -Xh -Xh -Wt -Yn -NE -NE -NE -XT aa aa aa @@ -63746,6 +69233,36 @@ aa aa aa aa +"} +(202,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -63763,8 +69280,6 @@ aa aa aa aa -"} -(201,1,1) = {" aa aa aa @@ -63913,66 +69428,6 @@ aa aa aa aa -Hv -NW -rk -kD -lf -rk -rk -rk -rk -rk -RI -MV -mY -rM -RP -Hv -qA -qy -fm -sS -tT -us -us -us -us -us -us -xt -zl -us -At -Bb -fm -Cd -cg -MI -Hw -DQ -Yn -Se -Si -Se -Si -Se -Tc -EW -UM -UM -EW -Xh -Xh -Pm -Xh -Xh -Wt -Yn -NE -NE -NE -Yn aa aa aa @@ -64020,8 +69475,6 @@ aa aa aa aa -"} -(202,1,1) = {" aa aa aa @@ -64037,6 +69490,8 @@ aa aa aa aa +"} +(203,1,1) = {" aa aa aa @@ -64170,66 +69625,6 @@ aa aa aa aa -Hv -pM -rM -kI -Hv -up -SB -eS -NZ -SB -Hv -bJ -mY -rM -NW -Hv -hq -xb -cg -sO -tT -us -us -us -us -us -us -us -us -us -At -AW -cg -xb -cg -OD -Hw -DQ -Yn -Se -Si -Se -Si -Se -Tc -EW -QO -QO -EW -Xh -Xh -Pm -Xh -Xh -Wt -Yn -NE -NE -NE -Yn aa aa aa @@ -64277,8 +69672,6 @@ aa aa aa aa -"} -(203,1,1) = {" aa aa aa @@ -64354,6 +69747,8 @@ aa aa aa aa +"} +(204,1,1) = {" aa aa aa @@ -64427,66 +69822,6 @@ aa aa aa aa -Hv -NW -rM -rM -ct -ps -lV -lW -lW -lV -RI -ps -rk -rk -ps -Wi -HH -HH -Yo -sT -tU -tU -tU -tU -tU -tU -tU -tU -tU -tU -tU -Bc -ag -vM -DK -sa -Hw -DQ -Yn -Se -Se -Se -Si -Se -Tc -Yn -Sv -Ru -Yn -Pm -Pm -Pm -Pm -Pm -Wt -Yn -NE -NE -NE -Yn aa aa aa @@ -64534,8 +69869,6 @@ aa aa aa aa -"} -(204,1,1) = {" aa aa aa @@ -64671,6 +70004,8 @@ aa aa aa aa +"} +(205,1,1) = {" aa aa aa @@ -64684,66 +70019,6 @@ aa aa aa aa -Hv -Wp -xX -zo -pc -Xc -KD -rc -na -dp -gC -ps -Ha -gA -zU -Hv -cg -cg -cg -sU -tV -tV -tV -tV -tV -tV -tV -tV -tV -tV -tV -Bd -cg -cg -cg -Tj -mu -vY -Yn -Vk -Vk -Vk -Vk -Vk -Oq -Yn -NO -NO -Yn -Co -Co -Co -Co -Co -VP -Yn -NE -NE -NE -Yn aa aa aa @@ -64791,8 +70066,6 @@ aa aa aa aa -"} -(205,1,1) = {" aa aa aa @@ -64941,66 +70214,6 @@ aa aa aa aa -Hv -Hv -Hv -Hv -Hv -Hv -Hv -Hv -Hv -Hv -Hv -Hv -Hv -Hv -Hv -Hv -cg -cg -cg -sV -sV -sV -sV -sV -sV -sV -sV -sV -sV -sV -sV -sV -cg -cg -cg -Ft -Ft -Ft -Yn -Yn -Yn -Yn -Yn -Yn -Yn -Yn -XT -XT -Yn -Yn -Yn -Yn -Yn -Yn -Yn -Yn -XT -XT -Yn -Yn aa aa aa @@ -65220,7 +70433,7 @@ aa aa aa aa -uz +aa aa aa aa diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_1.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_1.dmm index eab9280b8fa7..098b8f5c276a 100644 --- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_1.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_1.dmm @@ -191,7 +191,6 @@ /obj/structure/closet/crate, /obj/effect/spawner/random/engineering/material_cheap, /obj/effect/spawner/random/engineering/tool, -/obj/item/relic, /turf/open/floor/plating, /area/station/maintenance/department/cargo) "yB" = ( diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_2.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_2.dmm index ea1beb34cb0d..54ecd1927f2a 100644 --- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_2.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_2.dmm @@ -288,7 +288,6 @@ /obj/structure/closet, /obj/effect/spawner/random/engineering/material_cheap, /obj/effect/spawner/random/maintenance/three, -/obj/item/relic, /turf/open/floor/iron/smooth, /area/station/maintenance/department/cargo) "yM" = ( diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_attachment_b_3.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_attachment_b_3.dmm index ed88b7cffa3e..5b2b3de14505 100644 --- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_attachment_b_3.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_attachment_b_3.dmm @@ -25,7 +25,6 @@ "r" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, -/obj/item/relic, /obj/item/pen{ pixel_x = -4 }, diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_1.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_1.dmm index ae78ae6731f9..e1d1deeda0e1 100644 --- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_1.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_1.dmm @@ -153,10 +153,6 @@ /obj/item/stack/ore/iron, /turf/open/misc/asteroid, /area/station/asteroid) -"M" = ( -/obj/item/relic, -/turf/open/misc/asteroid/dug, -/area/station/asteroid) "O" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/barricade/wooden, @@ -719,7 +715,7 @@ V G A z -M +A z l l diff --git a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_3.dmm b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_3.dmm index e110ecac03b6..ad673312a1fa 100644 --- a/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_3.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/barcargoupper_cave_3.dmm @@ -129,10 +129,6 @@ /obj/item/assembly/signaler, /turf/open/misc/asteroid, /area/station/asteroid) -"D" = ( -/obj/item/relic, -/turf/open/misc/asteroid/dug, -/area/station/asteroid) "F" = ( /turf/closed/wall, /area/station/maintenance/department/cargo) @@ -1073,7 +1069,7 @@ Y Y u P -D +I P I i diff --git a/_maps/map_files/tramstation/maintenance_modules/cargoscilower_attachment_a_2.dmm b/_maps/map_files/tramstation/maintenance_modules/cargoscilower_attachment_a_2.dmm index aa82b69f2e72..a153b4c84bd7 100644 --- a/_maps/map_files/tramstation/maintenance_modules/cargoscilower_attachment_a_2.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/cargoscilower_attachment_a_2.dmm @@ -1,8 +1,4 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/obj/item/relic, -/turf/open/misc/asteroid/dug, -/area/station/asteroid) "b" = ( /turf/open/misc/asteroid/dug, /area/station/asteroid) @@ -150,7 +146,7 @@ n "} (9,1,1) = {" b -a +b b i V diff --git a/_maps/map_files/tramstation/maintenance_modules/dormmedupper_3.dmm b/_maps/map_files/tramstation/maintenance_modules/dormmedupper_3.dmm index 69b84841086c..beb484b0ff9d 100644 --- a/_maps/map_files/tramstation/maintenance_modules/dormmedupper_3.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/dormmedupper_3.dmm @@ -435,7 +435,6 @@ /area/station/maintenance/department/crew_quarters/dorms) "XV" = ( /obj/item/stack/ore/glass, -/obj/item/relic, /turf/open/misc/asteroid/dug, /area/station/maintenance/department/crew_quarters/dorms) "ZJ" = ( diff --git a/_maps/map_files/tramstation/maintenance_modules/medsciupper_attachment_b_1.dmm b/_maps/map_files/tramstation/maintenance_modules/medsciupper_attachment_b_1.dmm index 8bb9fa1c7463..ec76b1e334cc 100644 --- a/_maps/map_files/tramstation/maintenance_modules/medsciupper_attachment_b_1.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/medsciupper_attachment_b_1.dmm @@ -59,7 +59,7 @@ }, /obj/effect/landmark/generic_maintenance_landmark, /obj/structure/closet/body_bag, -/mob/living/simple_animal/hostile/skeleton{ +/mob/living/basic/skeleton{ name = "Jim"; desc = "Left to rot in maintenance, a poor soul whose green light was never noticed by the doctor..." }, diff --git a/_maps/map_files/tramstation/maintenance_modules/secbarupper_attachment_b_2.dmm b/_maps/map_files/tramstation/maintenance_modules/secbarupper_attachment_b_2.dmm index 52dd568eee62..bdf4c13f3604 100644 --- a/_maps/map_files/tramstation/maintenance_modules/secbarupper_attachment_b_2.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/secbarupper_attachment_b_2.dmm @@ -32,7 +32,6 @@ "p" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate, -/obj/item/relic, /turf/open/floor/plating, /area/station/maintenance/department/security) "r" = ( diff --git a/_maps/map_files/tramstation/maintenance_modules/secbarupper_cave_1.dmm b/_maps/map_files/tramstation/maintenance_modules/secbarupper_cave_1.dmm index 3b99c265a1f4..b66a69d8837c 100644 --- a/_maps/map_files/tramstation/maintenance_modules/secbarupper_cave_1.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/secbarupper_cave_1.dmm @@ -22,10 +22,6 @@ "s" = ( /turf/open/misc/asteroid/dug, /area/station/asteroid) -"v" = ( -/obj/item/relic, -/turf/open/misc/asteroid/dug, -/area/station/asteroid) "w" = ( /turf/template_noop, /area/template_noop) @@ -135,7 +131,7 @@ w "} (5,1,1) = {" F -v +s A T T diff --git a/_maps/map_files/tramstation/maintenance_modules/secservicelower_attachment_c_2.dmm b/_maps/map_files/tramstation/maintenance_modules/secservicelower_attachment_c_2.dmm index cb12e658a1ab..f5669b654ceb 100644 --- a/_maps/map_files/tramstation/maintenance_modules/secservicelower_attachment_c_2.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/secservicelower_attachment_c_2.dmm @@ -99,7 +99,6 @@ "J" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate, -/obj/item/relic, /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/station/maintenance/port/central) diff --git a/_maps/map_files/tramstation/maintenance_modules/servicecargolower_2.dmm b/_maps/map_files/tramstation/maintenance_modules/servicecargolower_2.dmm index 02960cfadc51..72d9de95ca98 100644 --- a/_maps/map_files/tramstation/maintenance_modules/servicecargolower_2.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/servicecargolower_2.dmm @@ -352,7 +352,6 @@ /area/station/maintenance/starboard/greater) "ST" = ( /obj/item/stack/ore/glass, -/obj/item/relic, /turf/open/misc/asteroid/dug, /area/station/asteroid) "Ui" = ( diff --git a/_maps/map_files/tramstation/maintenance_modules/servicecargolower_attachment_b_3.dmm b/_maps/map_files/tramstation/maintenance_modules/servicecargolower_attachment_b_3.dmm index 06409ce21b48..d42b045c7a31 100644 --- a/_maps/map_files/tramstation/maintenance_modules/servicecargolower_attachment_b_3.dmm +++ b/_maps/map_files/tramstation/maintenance_modules/servicecargolower_attachment_b_3.dmm @@ -5,11 +5,6 @@ "b" = ( /turf/closed/wall/rust, /area/station/maintenance/starboard/greater) -"d" = ( -/obj/item/relic, -/obj/item/stack/ore/glass, -/turf/open/misc/asteroid/dug, -/area/station/maintenance/starboard/greater) "i" = ( /obj/modular_map_root/tramstation{ key = "servicecargolower_attachment_b"; @@ -106,7 +101,7 @@ W i t n -d +Q n "} (7,1,1) = {" diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index acd6f5664038..012def877128 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -147,10 +147,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/safe) -"aaA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/ballpit, -/area/ruin/powered/clownplanet) "aaB" = ( /obj/structure/table, /obj/machinery/light/small/directional/east, @@ -479,12 +475,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/safe) -"abA" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/escapepodbay) "abB" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -500,6 +490,9 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/escapepodbay) +"abD" = ( +/turf/closed/wall, +/area/station/service/library/upper) "abE" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/door/airlock/grunge{ @@ -706,13 +699,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/escapepodbay) -"acg" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 9 - }, -/obj/machinery/meter, -/turf/open/floor/iron, -/area/station/engineering/atmos) "ach" = ( /turf/open/floor/iron/stairs/left{ dir = 1 @@ -805,21 +791,6 @@ dir = 1 }, /area/station/escapepodbay) -"acv" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/filingcabinet, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Security - Prison Prep Room" - }, -/obj/structure/cable, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "acw" = ( /obj/effect/turf_decal/stripes/asteroid/line{ dir = 9 @@ -841,18 +812,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/escapepodbay) -"acB" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/escapepodbay) "acC" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -941,18 +900,6 @@ }, /turf/open/floor/iron, /area/station/escapepodbay) -"acO" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/white/full, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/escapepodbay) "acP" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/siding/thinplating/dark{ @@ -1121,22 +1068,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"adj" = ( -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/machinery/door/airlock/hydroponics/glass{ - name = "Hydroponics" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "adk" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/stripes/asteroid/line{ @@ -1564,16 +1495,6 @@ "aeo" = ( /turf/open/misc/asteroid/snow/coldroom, /area/station/service/kitchen/coldroom) -"aep" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 10 - }, -/obj/effect/turf_decal/weather/snow, -/mob/living/simple_animal/hostile/retaliate/goat{ - name = "Pete" - }, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/service/kitchen/coldroom) "aeq" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/weather/snow/corner, @@ -1620,29 +1541,6 @@ /obj/machinery/light/small/directional/east, /turf/open/misc/asteroid/airless, /area/station/asteroid) -"aeA" = ( -/obj/effect/turf_decal/tile/brown/fourcorners, -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/effect/decal/cleanable/oil/streak, -/obj/structure/sign/poster/random/directional/north, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/effect/landmark/bitrunning/station_reward_spawn, -/obj/machinery/light/neon_lining{ - dir = 8; - icon_state = "pink2_1" - }, -/obj/machinery/light/neon_lining{ - dir = 1; - icon_state = "pink2_1" - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/bitrunning/den) "aeB" = ( /obj/machinery/airalarm/directional/south, /obj/structure/cable, @@ -1812,24 +1710,6 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) -"afk" = ( -/obj/effect/turf_decal/tile/brown/fourcorners, -/obj/effect/turf_decal/box/corners, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/landmark/bitrunning/station_reward_spawn, -/obj/machinery/light/neon_lining{ - dir = 4; - icon_state = "pink2_1" - }, -/obj/machinery/light/neon_lining{ - dir = 1; - icon_state = "pink2_1" - }, -/turf/open/floor/iron/dark/smooth_large, -/area/station/bitrunning/den) "afl" = ( /obj/machinery/door/airlock/mining/glass{ name = "Mining Dock" @@ -1928,16 +1808,6 @@ /obj/structure/lattice, /turf/open/openspace, /area/station/asteroid) -"afA" = ( -/obj/structure/lattice/catwalk, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/asteroid) "afF" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -1962,45 +1832,15 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"afJ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/turf/open/openspace, -/area/station/asteroid) -"afK" = ( -/obj/machinery/light/directional/north, -/obj/structure/ladder, -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/turf/open/openspace, -/area/station/asteroid) "afL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"afM" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/structure/railing{ - dir = 4; - layer = 4.1 - }, -/turf/open/openspace, -/area/station/asteroid) "afN" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, /turf/open/openspace, /area/station/asteroid) -"afO" = ( -/obj/machinery/light/directional/east, -/obj/structure/lattice, -/turf/open/openspace, -/area/station/asteroid) "afP" = ( /obj/structure/fluff/tram_rail, /turf/open/openspace, @@ -2073,45 +1913,10 @@ /obj/structure/lattice, /turf/open/openspace, /area/station/asteroid) -"agb" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/asteroid) -"agc" = ( -/obj/machinery/light/directional/south, -/obj/structure/ladder, -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/asteroid) -"agd" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/asteroid) "age" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, /area/station/asteroid) -"agf" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/structure/railing, -/turf/open/openspace, -/area/station/asteroid) "agi" = ( /obj/structure/closet, /obj/effect/decal/cleanable/dirt, @@ -2173,16 +1978,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal) -"agt" = ( -/obj/structure/table/glass, -/obj/item/radio/intercom/directional/east{ - freerange = 1; - listening = 0; - name = "Common Channel"; - pixel_x = 0 - }, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "agu" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/decal/cleanable/dirt, @@ -2197,72 +1992,10 @@ }, /turf/open/floor/iron, /area/station/maintenance/tram/mid) -"agv" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/north{ - name = "Jam Packed Radical Listening Post APC" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/spawner/random/trash/garbage, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) -"agw" = ( -/obj/structure/rack, -/obj/item/clothing/shoes/sneakers/black{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/clothing/head/soft/black{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/gloves/fingerless, -/obj/item/clothing/shoes/sneakers/black{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/clothing/gloves/fingerless, -/obj/item/clothing/head/soft/black{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/clothing/under/syndicate, -/obj/item/clothing/under/syndicate, -/obj/item/clothing/under/misc/syndicate_souvenir, -/obj/item/nullrod/clown, -/obj/item/clothing/mask/gas/clown_hat, -/obj/item/clothing/shoes/clown_shoes, -/obj/item/clothing/under/rank/civilian/clown/magic{ - name = "clown suit" - }, -/obj/item/storage/secure/safe/directional/north, -/turf/open/floor/carpet/neon/simple/yellow, -/area/ruin/powered/clownplanet) -"agx" = ( -/obj/structure/filingcabinet, -/obj/structure/window/spawner/directional/north, -/obj/item/paper/monitorkey, -/obj/item/areaeditor/blueprints{ - name = "Station Layout"; - desc = "A crude mapping of the station layout based on leaked internal documents and orbital snapshots taken during construction. I'm not sure how up-to-date this is anymore..." - }, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "agy" = ( /obj/structure/alien/weeds, /turf/open/misc/asteroid/airless, /area/station/asteroid) -"agz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/chair/comfy/carp{ - dir = 1 - }, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "agA" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/loading_area, @@ -2300,25 +2033,6 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal) -"agF" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/closet/crate/bin, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/spawner/random/trash/cigbutt, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) -"agG" = ( -/obj/structure/dresser, -/obj/item/clothing/mask/cigarette/cigar/havana, -/turf/open/floor/carpet/neon/simple/yellow, -/area/ruin/powered/clownplanet) "agH" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/structure/reagent_dispensers/beerkeg, @@ -2620,6 +2334,10 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating/icemoon, /area/station/engineering/atmos) +"ahG" = ( +/obj/structure/flora/bush/sunny/style_random, +/turf/open/misc/grass/jungle, +/area/station/science/lower) "ahR" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner, @@ -2768,6 +2486,12 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/east, /turf/open/floor/wood/large, /area/station/service/barber) +"aiT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/explab) "aiX" = ( /obj/machinery/door/poddoor/massdriver_trash{ id = "fortnitedoor" @@ -3314,6 +3038,12 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron, /area/station/engineering/atmos) +"anD" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/turf/open/floor/glass/reinforced, +/area/station/security/brig) "anH" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -3559,32 +3289,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron, /area/station/tcommsat/computer) -"apZ" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/machinery/button/door/directional/west{ - id = "atmos"; - name = "Atmospherics Lockdown"; - pixel_y = 8; - req_access = list("atmospherics") - }, -/obj/machinery/button/door/directional/west{ - id = "Secure Storage"; - name = "Engineering Secure Storage"; - req_access = list("engine_equip") - }, -/obj/machinery/button/door/directional/west{ - id = "Engineering"; - name = "Engineering Lockdown"; - pixel_y = -8; - req_access = list("engineering") - }, -/obj/structure/sign/clock/directional/north, -/mob/living/simple_animal/parrot/poly, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) "aqf" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -3741,9 +3445,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/science/genetics) -"asu" = ( -/turf/closed/wall/rock/porous, -/area/station/science/explab) "asv" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -3754,11 +3455,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) -"asK" = ( -/obj/effect/turf_decal/siding/wideplating/dark, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/maintenance/starboard/greater) "asQ" = ( /obj/structure/reagent_dispensers/fueltank/large, /turf/open/floor/iron, @@ -3781,10 +3477,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/cargo/miningdock/cafeteria) -"atl" = ( -/obj/structure/hoop, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "atC" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -4277,15 +3969,6 @@ /obj/structure/chair/plastic, /turf/open/floor/iron/smooth, /area/station/maintenance/department/science) -"axF" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "axG" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/structure/crate_empty, @@ -4311,35 +3994,6 @@ }, /turf/open/floor/iron, /area/station/cargo/drone_bay) -"axN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/structure/table, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"axO" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/relic, -/obj/item/pen{ - pixel_x = -4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - location = "QM #4" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron/smooth, -/area/station/cargo/drone_bay) "axS" = ( /turf/open/floor/iron/stairs/medium{ dir = 4 @@ -4447,11 +4101,6 @@ "ayR" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/eva) -"ayT" = ( -/obj/machinery/light/directional/west, -/obj/structure/lattice, -/turf/open/openspace, -/area/station/asteroid) "azd" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -4651,13 +4300,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/engineering/main) -"aBl" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Science - Monkey Pit"; - network = list("ss13","rd") - }, -/turf/open/misc/dirt/jungle, -/area/station/science/explab) "aBo" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 @@ -4725,20 +4367,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/teleporter) -"aBI" = ( -/obj/structure/table/glass, -/obj/item/radio/intercom/directional/east{ - freerange = 1; - listening = 0; - name = "Custom Channel"; - pixel_x = 0 - }, -/obj/item/toy/figure/clown{ - pixel_x = 8; - pixel_y = 16 - }, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "aBK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -4963,23 +4591,6 @@ }, /turf/open/floor/iron/white, /area/station/security/medical) -"aDn" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 10 - }, -/obj/machinery/smartfridge/petri/preloaded, -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "aDq" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/north, @@ -5035,13 +4646,6 @@ /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron, /area/station/security/checkpoint/escape) -"aDQ" = ( -/obj/structure/table/wood, -/obj/machinery/cassette/adv_cassette_deck, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/vaporwave, -/area/station/service/library/upper) "aDR" = ( /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt, @@ -5262,21 +4866,6 @@ /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"aFj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/landmark/blobstart, -/obj/machinery/rnd/experimentor{ - pixel_x = -10 - }, -/turf/open/floor/engine, -/area/station/science/explab) -"aFk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/relic, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "aFm" = ( /obj/machinery/crossing_signal/northeast{ inbound = 1; @@ -5364,16 +4953,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"aGh" = ( -/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/dark_blue/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) "aGn" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/end{ @@ -5472,30 +5051,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/center) -"aGN" = ( -/obj/structure/sign/directions/supply{ - dir = 4; - pixel_y = 24 - }, -/obj/structure/sign/directions/security{ - dir = 8; - pixel_y = 32 - }, -/obj/structure/sign/directions/command{ - dir = 8; - pixel_y = 40 - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "aGO" = ( /obj/structure/industrial_lift/tram/white, /obj/machinery/door/window/tram/left/directional/south{ @@ -5519,28 +5074,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) -"aGQ" = ( -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_y = 24 - }, -/obj/structure/sign/directions/medical{ - pixel_y = 32 - }, -/obj/structure/sign/directions/engineering{ - pixel_y = 40 - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "aGY" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -6140,25 +5673,21 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"aMm" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating/corner{ +"aMo" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/filingcabinet, +/obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 }, -/obj/machinery/light/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Civilian - Recreational Area South" +/obj/machinery/camera/directional/east{ + c_tag = "Security - Prison Prep Room" }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"aMn" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 1 +/obj/structure/cable, +/obj/structure/railing{ + dir = 4 }, /turf/open/floor/iron, -/area/station/commons/fitness/recreation) +/area/station/security/execution/transfer) "aMp" = ( /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -6176,21 +5705,20 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"aMy" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Civilian - Library East" - }, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron/vaporwave, -/area/station/service/library/upper) "aMz" = ( /obj/structure/table/wood, /obj/effect/spawner/random/food_or_drink/refreshing_beverage, /turf/open/floor/iron/grimy, /area/station/hallway/secondary/entry) +"aMB" = ( +/obj/machinery/elevator_control_panel{ + layer = 3.1; + linked_elevator_id = "tram_xeno_lift"; + pixel_y = 2; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/turf/closed/wall, +/area/station/science/xenobiology) "aMD" = ( /obj/machinery/destination_sign/indicator{ dir = 1 @@ -6305,6 +5833,32 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"aNA" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/cup/glass/mug/coco{ + pixel_x = -7; + pixel_y = 7 + }, +/obj/item/reagent_containers/cup/glass/mug/coco{ + pixel_x = -6; + pixel_y = -1 + }, +/obj/item/folder/yellow{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/pen{ + pixel_x = 6 + }, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "aNO" = ( /obj/structure/cable, /turf/open/floor/engine, @@ -6378,6 +5932,10 @@ "aOn" = ( /turf/closed/wall, /area/station/engineering/storage/tech) +"aOq" = ( +/mob/living/carbon/human/species/monkey, +/turf/open/misc/asteroid, +/area/station/science/lower) "aOt" = ( /obj/structure/table/wood, /obj/item/storage/dice, @@ -6456,6 +6014,20 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/cmo) +"aOK" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/spawner/random/trash/cigbutt, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "aON" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -6588,14 +6160,6 @@ /area/station/service/chapel/office) "aPI" = ( /obj/structure/rack, -/obj/item/reagent_containers/cup/bottle/acidic_buffer{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bottle/basic_buffer{ - pixel_x = -5; - pixel_y = 3 - }, /obj/item/reagent_containers/cup/bottle/formaldehyde{ pixel_x = -5; pixel_y = -2 @@ -6683,10 +6247,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) -"aQh" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "aQj" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 @@ -6711,6 +6271,23 @@ /obj/effect/landmark/start/chaplain, /turf/open/floor/iron/dark, /area/station/service/chapel) +"aQy" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/machinery/door/airlock/hydroponics/glass{ + name = "Hydroponics" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable, +/obj/effect/landmark/navigate_destination/hydro, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "aQB" = ( /obj/structure/table/reinforced, /obj/machinery/coffeemaker, @@ -6873,6 +6450,18 @@ /obj/effect/turf_decal/siding/wideplating, /turf/open/floor/iron/dark, /area/station/cargo/miningdock/oresilo) +"aSk" = ( +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north{ + name = "Jam Packed Radical Listening Post APC" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/plating, +/area/ruin/powered/clownplanet) "aSo" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 9 @@ -6929,14 +6518,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"aSQ" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/landmark/event_spawn, -/turf/open/openspace, -/area/station/maintenance/department/crew_quarters/dorms) "aST" = ( /turf/closed/wall/r_wall, /area/station/solars/port) @@ -6992,17 +6573,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"aTR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/bitrunner, -/obj/machinery/light/neon_lining{ - dir = 4; - icon_state = "pink2_1" +"aTK" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 8 }, -/turf/open/floor/iron/dark/textured_large, -/area/station/bitrunning/den) +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/secondary/construction/engineering) "aTT" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -7137,18 +6714,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"aVq" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 8 - }, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/structure/railing, -/turf/open/floor/grass, -/area/station/hallway/secondary/construction/engineering) "aVD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -7229,24 +6794,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) -"aXE" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/white/full, -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/sign/directions/upload/directional/south{ - pixel_y = -39 - }, -/turf/open/floor/iron/white, -/area/station/science/research) "aXN" = ( /obj/effect/turf_decal/trimline/purple/filled/corner, /obj/effect/turf_decal/trimline/purple/filled/corner{ @@ -7295,6 +6842,15 @@ "aYA" = ( /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"aYB" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "aYF" = ( /turf/closed/wall, /area/station/engineering/main) @@ -7427,13 +6983,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/wood/large, /area/station/service/barber) -"bcu" = ( -/obj/item/radio/radio_mic{ - pixel_y = 7 - }, -/obj/structure/table/wood, -/turf/open/floor/iron/vaporwave, -/area/station/service/library/upper) "bcx" = ( /obj/machinery/porta_turret/ai{ dir = 4 @@ -7542,6 +7091,18 @@ /obj/effect/spawner/random/trash/garbage, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) +"beg" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "bej" = ( /obj/machinery/newscaster/directional/north, /obj/effect/turf_decal/trimline/green/filled/line, @@ -7550,14 +7111,6 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) -"beq" = ( -/obj/machinery/computer/atmos_control/oxygen_tank{ - atmos_chambers = list("o2ordance"="Oxygen Supply") - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) "beF" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -7644,6 +7197,29 @@ "bfH" = ( /turf/open/floor/engine, /area/station/science/xenobiology) +"bfJ" = ( +/obj/structure/sign/directions/supply{ + dir = 1; + pixel_y = -24 + }, +/obj/structure/sign/directions/security{ + dir = 8; + pixel_y = -32 + }, +/obj/structure/sign/directions/command{ + dir = 8; + pixel_y = -40 + }, +/obj/machinery/light/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/neutral/filled/warning, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "bfM" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -7743,16 +7319,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"bhG" = ( -/obj/machinery/door/airlock/bananium, -/turf/open/floor/carpet/neon/simple/yellow, -/area/ruin/powered/clownplanet) -"bhK" = ( -/obj/structure/curtain, -/obj/machinery/shower/directional/north, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) "bhP" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -7795,6 +7361,13 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"bir" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/railing, +/turf/open/floor/iron/smooth, +/area/station/command/gateway) "biu" = ( /obj/machinery/firealarm/directional/south, /obj/machinery/light/directional/south, @@ -7912,6 +7485,15 @@ }, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) +"bjR" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/toolbox/mechanical, +/turf/open/floor/iron/smooth, +/area/station/maintenance/central/greater) "bjX" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7990,15 +7572,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/cargo) -"blW" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/obj/structure/window/spawner/directional/west, -/obj/item/toy/plush/goatplushie, -/obj/item/storage/box/donkpockets/donkpockethonk, -/obj/item/storage/box/donkpockets/donkpockethonk, -/obj/item/food/grown/banana, -/turf/open/floor/iron/white, -/area/ruin/powered/clownplanet) "bmb" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/table/wood, @@ -8043,6 +7616,20 @@ }, /turf/open/floor/iron, /area/station/escapepodbay) +"bmO" = ( +/obj/machinery/elevator_control_panel/directional/west{ + linked_elevator_id = "tram_cargo_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/obj/effect/landmark/lift_id{ + specific_lift_id = "tram_cargo_lift" + }, +/obj/structure/industrial_lift/public, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 8 + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/cargo/miningdock) "bmX" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -8092,6 +7679,13 @@ /obj/item/pickaxe, /turf/open/misc/asteroid/airless, /area/station/asteroid) +"boN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/escapepodbay) "boS" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 10 @@ -8124,10 +7718,6 @@ /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/iron, /area/station/engineering/atmos) -"bpn" = ( -/mob/living/carbon/human/species/monkey, -/turf/open/misc/grass/jungle, -/area/station/science/explab) "bpr" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/poddoor/shutters/preopen{ @@ -8157,6 +7747,24 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"bpQ" = ( +/obj/machinery/door/airlock/research/glass{ + name = "Testing Lab" + }, +/obj/machinery/door/firedoor/heavy, +/obj/effect/mapping_helpers/airlock/access/all/science/research, +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/lower) "bpR" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -8255,16 +7863,6 @@ /obj/structure/spider/stickyweb, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) -"bsu" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 6 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/secondary/construction/engineering) "bsw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/wood, @@ -8363,11 +7961,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) -"btO" = ( -/obj/machinery/light/directional/east, -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/glass/reinforced, -/area/station/science/genetics) "btP" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -8403,10 +7996,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/checkpoint/supply) -"bub" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/station/bitrunning/den) "bug" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 5 @@ -8527,6 +8116,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/science/lobby) +"bvT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + location = "QM #3" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/mob/living/simple_animal/bot/mulebot{ + home_destination = "QM #3"; + suffix = "#3" + }, +/turf/open/floor/iron/smooth, +/area/station/cargo/drone_bay) "bwg" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -8613,13 +8216,13 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) -"bxd" = ( -/obj/machinery/computer/message_monitor{ +"bxg" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 }, -/obj/structure/sign/calendar/directional/south, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "bxr" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate/trashcart, @@ -8794,6 +8397,13 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/grass, /area/station/service/hydroponics) +"bzn" = ( +/obj/machinery/door/window/right/directional/north{ + name = "The Monkey Pit"; + req_access = list("science") + }, +/turf/open/misc/grass/jungle, +/area/station/science/lower) "bzo" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -8851,6 +8461,15 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) +"bAr" = ( +/obj/structure/ladder, +/obj/effect/turf_decal/siding/thinplating_new/end, +/obj/effect/turf_decal/siding/thinplating_new/end{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/lower) "bAI" = ( /obj/item/storage/toolbox/mechanical, /obj/item/stack/cable_coil, @@ -9003,22 +8622,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/hallway) -"bDk" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 10 - }, -/obj/machinery/firealarm/directional/south{ - pixel_x = 4 - }, -/obj/machinery/light_switch/directional/south{ - pixel_x = -9 - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/turf/open/floor/iron/white, -/area/station/science/explab) "bDq" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -9087,11 +8690,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) -"bEA" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/light/small/directional/west, -/turf/open/space/openspace, -/area/station/solars/starboard/fore) "bEM" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 10 @@ -9136,6 +8734,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison) +"bFN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/science/explab) "bFQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -9288,14 +8890,6 @@ }, /turf/open/floor/iron, /area/station/engineering/engine_smes) -"bHB" = ( -/obj/effect/landmark/navigate_destination/cargo, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/office) "bHE" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -9415,34 +9009,21 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"bJN" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"bJP" = ( -/obj/structure/railing, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) +"bJM" = ( +/obj/structure/safe, +/obj/item/clothing/head/costume/bearpelt, +/obj/item/ammo_box/a357, +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/gun/ballistic/revolver/russian, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) "bJT" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/machinery/light/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/miningdock) -"bKe" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/engineering/atmos) "bKl" = ( /obj/structure/rack, /obj/item/clothing/suit/hooded/ablative, @@ -9639,25 +9220,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/ordnance/storage) -"bNr" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/machinery/door/airlock/command/glass{ - name = "AI Core" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "AI Core shutters"; - name = "AI Core Shutters" - }, -/obj/machinery/flasher/directional/west{ - id = "AI" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "bNx" = ( /obj/structure/railing, /obj/machinery/door/firedoor/border_only, @@ -9767,10 +9329,6 @@ /obj/structure/lattice, /turf/open/misc/asteroid/airless, /area/station/solars/port) -"bOV" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/engine, -/area/station/science/explab) "bPh" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -9803,13 +9361,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"bPv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/explab) "bPz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9844,6 +9395,13 @@ /obj/structure/lattice, /turf/open/space/openspace, /area/space/nearstation) +"bQa" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 5 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/science/lower) "bQt" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -9926,11 +9484,21 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) -"bSM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) +"bSs" = ( +/obj/machinery/elevator_control_panel/directional/west{ + linked_elevator_id = "tram_sci_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/obj/structure/industrial_lift/public, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 9 + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/science/lower) +"bSI" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/glass/reinforced, +/area/station/science/genetics) "bSS" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -10070,15 +9638,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/service/chapel) -"bUI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/explab) "bUT" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -10126,12 +9685,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"bVN" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 5 - }, -/turf/open/floor/glass/reinforced, -/area/station/security/brig) "bVW" = ( /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) @@ -10224,45 +9777,6 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/station/asteroid) -"bXp" = ( -/obj/item/toy/crayon/orange, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; - pixel_x = 8; - pixel_y = -32 - }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; - pixel_x = 4; - pixel_y = -32 - }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; - pixel_y = -32 - }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "i"; - name = "graffiti"; - paint_colour = "#FF9300"; - pixel_x = -4; - pixel_y = -32 - }, -/obj/effect/decal/cleanable/crayon{ - icon_state = "x"; - name = "graffiti"; - paint_colour = "#FF9300"; - pixel_x = 4; - pixel_y = -32 - }, -/obj/item/stack/sheet/mineral/bananium/five, -/turf/open/floor/plating, -/area/station/engineering/main) "bXr" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -10335,6 +9849,10 @@ }, /turf/open/floor/iron, /area/station/service/janitor) +"bYJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/engine, +/area/station/science/lower) "bYK" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -10462,6 +9980,13 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"cai" = ( +/obj/item/radio/radio_mic{ + pixel_y = 7 + }, +/obj/structure/table/wood, +/turf/open/floor/iron/vaporwave, +/area/station/service/library/upper) "can" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -10568,6 +10093,22 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/warehouse) +"cbA" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/byteforge, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) "cbG" = ( /obj/effect/landmark/start/security_officer, /obj/structure/chair{ @@ -10730,6 +10271,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/office) +"cem" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/delivery/white, +/obj/effect/mapping_helpers/trapdoor_placer, +/obj/structure/railing, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "cen" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -10813,6 +10363,15 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) +"ceJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/button/door/directional/east{ + id = "clownbunker"; + req_access = "theatre"; + name = "Shoe Storage Annex" + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "ceO" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 @@ -10969,16 +10528,6 @@ dir = 4 }, /area/station/ai_monitored/command/storage/eva) -"cgr" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 5 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/secondary/construction/engineering) "cgy" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate, @@ -11138,13 +10687,6 @@ /obj/structure/sign/directions/ptl/directional/south, /turf/open/floor/catwalk_floor, /area/station/maintenance/central/lesser) -"cjx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/railing, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/department/cargo) "cjy" = ( /turf/closed/wall/r_wall, /area/station/engineering/main) @@ -11268,19 +10810,21 @@ }, /turf/open/floor/plastic, /area/station/engineering/break_room) +"cma" = ( +/obj/structure/cable/multilayer/multiz, +/obj/effect/turf_decal/stripes/end, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing{ + layer = 3.1 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/cargo) "cmo" = ( /obj/effect/turf_decal/siding/thinplating/end, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/hallway) -"cmx" = ( -/obj/effect/decal/cleanable/confetti, -/obj/machinery/button/door/directional/south{ - req_access = "theatre"; - id_tag = "honkbunker"; - name = "Deadbolt" - }, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "cmH" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -11300,6 +10844,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"cns" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 10 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/cargo/miningdock) "cnv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate, @@ -11315,6 +10866,17 @@ /obj/machinery/atmospherics/miner/n2o, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) +"cnD" = ( +/obj/structure/industrial_lift/public, +/obj/machinery/elevator_control_panel/directional/west{ + linked_elevator_id = "tram_perma_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/obj/effect/turf_decal/caution/stand_clear/red{ + dir = 1 + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/security/execution/transfer) "cnQ" = ( /obj/structure/table, /obj/item/food/cake/birthday{ @@ -11340,6 +10902,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, /area/station/solars/port) +"cot" = ( +/obj/effect/turf_decal/trimline/dark_red/warning, +/obj/structure/industrial_lift/public, +/obj/machinery/elevator_control_panel/directional/south{ + linked_elevator_id = "tram_dorm_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/commons/dorms) "cov" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11468,6 +11039,13 @@ }, /turf/open/floor/iron, /area/station/medical/virology) +"cqu" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/landmark/navigate_destination/dockescpod1, +/turf/open/floor/iron, +/area/station/escapepodbay) "cqE" = ( /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /obj/machinery/door/airlock/research{ @@ -11620,20 +11198,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/engineering/engine_smes) -"csL" = ( -/obj/structure/closet{ - name = "Evidence Closet 2" - }, -/turf/open/floor/iron/dark, -/area/station/security/evidence) -"csN" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) "csR" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11740,6 +11304,14 @@ /obj/structure/cable, /turf/open/misc/asteroid/dug, /area/station/maintenance/department/cargo) +"cvC" = ( +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/obj/structure/railing, +/turf/open/openspace, +/area/station/security/brig) "cvI" = ( /obj/structure/table, /obj/item/airlock_painter, @@ -11789,6 +11361,13 @@ /obj/structure/stairs/north, /turf/open/floor/iron/stairs/medium, /area/station/science/lower) +"cwh" = ( +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = 40 + }, +/turf/closed/wall/r_wall, +/area/station/command/heads_quarters/captain/private) "cwj" = ( /obj/machinery/door/window/left/directional/south{ name = "Maximum Security Test Chamber"; @@ -11825,13 +11404,6 @@ "cwG" = ( /turf/open/floor/iron, /area/station/cargo/office) -"cwU" = ( -/obj/machinery/door/window/right/directional/north{ - name = "The Monkey Pit"; - req_access = list("science") - }, -/turf/open/misc/grass/jungle, -/area/station/science/explab) "cwX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/stripes/end{ @@ -11947,15 +11519,18 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/lobby) -"cyO" = ( -/obj/machinery/elevator_control_panel{ - layer = 3.1; - linked_elevator_id = "tram_xeno_lift"; - pixel_y = 2; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") +"cyT" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 }, -/turf/closed/wall/r_wall, -/area/station/science/xenobiology) +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/central/greater) "cyU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -11993,15 +11568,6 @@ /obj/machinery/atmospherics/miner/nitrogen, /turf/open/floor/engine/n2, /area/station/engineering/atmos) -"czu" = ( -/obj/structure/ladder, -/obj/effect/turf_decal/siding/thinplating_new/end, -/obj/effect/turf_decal/siding/thinplating_new/end{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/science/explab) "czB" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 10 @@ -12038,30 +11604,11 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"czX" = ( -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/obj/structure/sign/directions/vault{ - dir = 1; - pixel_y = 30 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "czY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/cigbutt, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/greater) -"cAc" = ( -/obj/structure/table, -/obj/machinery/camera/directional/north{ - c_tag = "Service - Hydroponics" - }, -/obj/effect/turf_decal/tile/green/fourcorners, -/obj/machinery/infuser, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "cAd" = ( /obj/structure/marker_beacon/burgundy, /turf/open/floor/plating/airless, @@ -12078,6 +11625,21 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"cAu" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -9; + pixel_y = 12 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = -1; + pixel_y = 13 + }, +/obj/item/kitchen/fork, +/obj/item/plate, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "cAz" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 10 @@ -12108,18 +11670,20 @@ /obj/machinery/duct, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/crew_quarters/dorms) +"cBd" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/white/side, +/area/station/science/lower) "cBe" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/engine, /area/station/engineering) -"cBi" = ( -/obj/structure/closet/emcloset/anchored, -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/ballpit, -/area/ruin/powered/clownplanet) "cBo" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -12366,12 +11930,6 @@ /obj/item/clothing/mask/cigarette/cigar/cohiba, /turf/open/floor/wood, /area/station/command/meeting_room) -"cFW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/explab) "cGc" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -12610,14 +12168,6 @@ /obj/machinery/rnd/server, /turf/open/floor/circuit/telecomms/server, /area/station/science/server) -"cJS" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "Test Chamber Blast Door" - }, -/turf/open/floor/plating, -/area/station/science/explab) "cJX" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /turf/open/floor/iron, @@ -12676,6 +12226,23 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/station/maintenance/department/cargo) +"cKy" = ( +/obj/effect/turf_decal/bot, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/obj/machinery/computer/order_console/bitrunning, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "cKE" = ( /obj/effect/decal/cleanable/dirt, /obj/item/weldingtool, @@ -12694,6 +12261,13 @@ }, /turf/open/floor/grass, /area/station/asteroid) +"cLf" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 1 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/commons/dorms) "cLj" = ( /obj/structure/closet/secure_closet/engineering_electrical, /obj/effect/turf_decal/bot{ @@ -12835,6 +12409,13 @@ }, /turf/open/openspace, /area/station/hallway/primary/tram/center) +"cNV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/railing, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/cargo) "cOe" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -13067,20 +12648,6 @@ /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/department/medical) -"cSc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - location = "QM #3" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #3"; - suffix = "#3" - }, -/turf/open/floor/iron/smooth, -/area/station/cargo/drone_bay) "cSe" = ( /obj/machinery/light/directional/east, /turf/open/floor/glass/reinforced, @@ -13158,13 +12725,6 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/central/lesser) -"cTH" = ( -/obj/structure/railing, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/openspace, -/area/station/security/brig) "cTM" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -13199,6 +12759,11 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/dorms) +"cUY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/engineering/canister, +/turf/open/floor/iron/smooth, +/area/station/maintenance/department/security) "cUZ" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner, /obj/effect/turf_decal/trimline/yellow/filled/corner{ @@ -13271,12 +12836,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"cVU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/explab) "cVW" = ( /turf/open/floor/engine, /area/station/science/auxlab/firing_range) @@ -13433,13 +12992,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) -"cYj" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/asteroid) "cYA" = ( /obj/docking_port/stationary{ dheight = 4; @@ -13486,6 +13038,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) +"cZb" = ( +/obj/structure/railing, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace, +/area/station/security/brig) "cZf" = ( /obj/effect/turf_decal/siding/thinplating_new{ dir = 8 @@ -13494,6 +13053,15 @@ /obj/effect/decal/cleanable/confetti, /turf/open/floor/iron/smooth, /area/station/maintenance/department/cargo) +"cZl" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/storage) "cZo" = ( /obj/structure/sign/collision_counter{ pixel_x = -4; @@ -13526,30 +13094,6 @@ /obj/effect/turf_decal/trimline/purple/filled/corner, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"cZP" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 4 - }, -/obj/structure/industrial_lift/public, -/obj/machinery/elevator_control_panel/directional/east{ - linked_elevator_id = "tram_lower_center_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 4 - }, -/obj/machinery/elevator_control_panel/directional/east{ - linked_elevator_id = "tram_lower_center_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/secondary/construction/engineering) "cZT" = ( /obj/structure/alien/weeds, /obj/item/clothing/mask/facehugger/dead, @@ -13574,6 +13118,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) +"dap" = ( +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/computer/cryopod{ + pixel_y = -32; + dir = 1 + }, +/obj/effect/landmark/navigate_destination/common/cryogenics, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms/laundry) "dar" = ( /turf/open/floor/iron/dark/side{ dir = 8 @@ -13643,17 +13198,6 @@ /obj/structure/window/reinforced/spawner, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"dbr" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/fans/tiny, -/obj/effect/mapping_helpers/airlock/access/all/service/theatre, -/obj/machinery/door/airlock/external/glass{ - name = "The Noise's Jam-Tastic Radical Listening Post" - }, -/turf/open/ballpit, -/area/ruin/powered/clownplanet) "dbu" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 4 @@ -13708,6 +13252,13 @@ }, /turf/open/floor/iron, /area/station/maintenance/tram/mid) +"ddd" = ( +/obj/structure/railing, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/glass/reinforced, +/area/station/ai_monitored/turret_protected/aisat/hallway) "ddz" = ( /obj/machinery/modular_computer/console/preset/cargochat/service{ dir = 1 @@ -13715,6 +13266,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"ddA" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "ddD" = ( /obj/machinery/door/airlock/external{ name = "External Access" @@ -13788,10 +13345,40 @@ }, /turf/open/floor/plating, /area/station/medical/storage) +"dex" = ( +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_y = -24 + }, +/obj/structure/sign/directions/security{ + dir = 8; + pixel_y = -32 + }, +/obj/structure/sign/directions/command{ + dir = 8; + pixel_y = -40 + }, +/obj/machinery/light/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/neutral/filled/warning, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "dez" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/cargo/drone_bay) +"deB" = ( +/obj/structure/sign/warning/electric_shock/directional/east{ + pixel_x = 0; + pixel_y = 32 + }, +/turf/closed/wall/r_wall, +/area/ruin/powered/clownplanet) "deH" = ( /obj/structure/cable/multilayer/multiz, /obj/effect/turf_decal/stripes/end, @@ -13810,6 +13397,14 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron, /area/station/security/checkpoint/science) +"deN" = ( +/obj/structure/table, +/obj/machinery/computer/security/wooden_tv{ + name = "Old TV"; + desc = "An old TV, at some point, a clown watched too much TV on this." + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "deQ" = ( /obj/structure/ladder, /obj/effect/turf_decal/stripes/box, @@ -13874,6 +13469,28 @@ }, /turf/open/floor/iron, /area/station/command/teleporter) +"dfX" = ( +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = 24 + }, +/obj/structure/sign/directions/medical{ + pixel_y = 32 + }, +/obj/structure/sign/directions/engineering{ + pixel_y = 40 + }, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "dgd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -14175,11 +13792,12 @@ "dkO" = ( /turf/open/floor/iron, /area/station/security/brig) -"dkY" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/flora/bush/fullgrass/style_random, -/turf/open/misc/grass/jungle, -/area/station/science/explab) +"dlb" = ( +/obj/machinery/bluespace_beacon, +/obj/effect/turf_decal/trimline/yellow/filled/warning, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/command/teleporter) "dlJ" = ( /obj/structure/table, /obj/structure/cable, @@ -14262,11 +13880,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plastic, /area/station/engineering/break_room) -"dmG" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/mob/living/carbon/human/species/monkey, -/turf/open/misc/grass/jungle, -/area/station/science/explab) "dmR" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/decal/cleanable/dirt, @@ -14352,6 +13965,13 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"dnL" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "dnQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -14365,6 +13985,10 @@ }, /turf/open/floor/iron/grimy, /area/station/ai_monitored/turret_protected/aisat/foyer) +"dnU" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "doa" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /obj/effect/spawner/structure/window/reinforced, @@ -14431,6 +14055,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison) +"dpd" = ( +/turf/open/misc/grass/jungle, +/area/station/science/lower) "dpk" = ( /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron/dark, @@ -14440,14 +14067,6 @@ /obj/structure/lattice/catwalk/mining, /turf/open/lava, /area/station/security/execution/education) -"dpv" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Test Chamber" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark, -/area/station/science/explab) "dpB" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -14543,20 +14162,18 @@ }, /turf/open/floor/iron/dark, /area/station/medical/storage) +"drp" = ( +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = -32 + }, +/turf/open/openspace, +/area/station/hallway/primary/tram/left) "drq" = ( /obj/structure/table, /obj/item/flashlight/lamp, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"drw" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "drB" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -14708,10 +14325,6 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) -"duu" = ( -/obj/structure/sign/directions/upload/directional/east, -/turf/closed/wall/r_wall, -/area/station/science/xenobiology) "duA" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -14778,6 +14391,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"dvZ" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "dwa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, @@ -14833,6 +14456,12 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) +"dxd" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "dxw" = ( /obj/machinery/newscaster/directional/north, /obj/structure/cable, @@ -14863,23 +14492,29 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) +"dyc" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/brig) "dyl" = ( /obj/structure/flora/bush/leavy/style_random, /turf/open/floor/grass, /area/station/medical/virology) -"dys" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 6 - }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "Air Outlet Pump" - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) +"dyx" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/south, +/obj/machinery/cassette/adv_cassette_deck, +/turf/open/floor/wood/parquet, +/area/station/service/library) "dyB" = ( /obj/structure/closet/secure_closet/medical2, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -14888,17 +14523,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) -"dyC" = ( -/obj/effect/turf_decal/trimline/green/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/green/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/effect/turf_decal/trimline/yellow/corner, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "dyD" = ( /obj/effect/turf_decal/arrows/white{ dir = 8 @@ -15150,6 +14774,14 @@ /obj/item/storage/backpack/duffelbag/med/surgery, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) +"dDd" = ( +/obj/structure/closet{ + name = "Evidence Closet 3" + }, +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/evidence) "dDe" = ( /obj/machinery/holopad, /obj/machinery/firealarm/directional/north, @@ -15209,6 +14841,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"dEe" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/light/small/directional/east, +/obj/structure/cable, +/turf/open/space/openspace, +/area/station/solars/port) "dEj" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 4 @@ -15242,6 +14880,12 @@ /obj/effect/turf_decal/trimline/white/warning, /turf/open/floor/iron, /area/station/maintenance/tram/left) +"dEr" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/directions/dorms/directional/east, +/turf/open/floor/iron, +/area/station/commons/fitness) "dEv" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/security/armory) @@ -15250,6 +14894,12 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"dFw" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/lower) "dFC" = ( /obj/machinery/light/small/directional/east, /turf/open/floor/engine, @@ -15341,6 +14991,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"dGw" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/firealarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "dGI" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -15414,13 +15078,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/treatment_center) -"dHy" = ( -/obj/effect/turf_decal/caution/stand_clear/red{ - dir = 1 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/security/execution/transfer) "dHD" = ( /obj/effect/turf_decal/arrows/white{ dir = 8 @@ -15649,12 +15306,6 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/iron, /area/station/engineering/engine_smes) -"dLE" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "dLI" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "EVA Maintenance Hatch" @@ -15823,6 +15474,19 @@ /obj/item/stack/sheet/iron/fifty, /turf/open/floor/iron/dark, /area/station/command/teleporter) +"dOJ" = ( +/obj/effect/turf_decal/stripes/end, +/obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2{ + dir = 4 + }, +/obj/structure/railing{ + layer = 3.1 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/cargo) "dOM" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -15854,6 +15518,22 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"dPo" = ( +/obj/structure/table, +/obj/machinery/button/door{ + id = "testlab"; + name = "Test Chamber Blast Doors"; + pixel_x = 4; + pixel_y = 2; + req_access = list("xenobiology") + }, +/obj/machinery/button/ignition{ + id = "testigniter"; + pixel_x = -6; + pixel_y = 2 + }, +/turf/open/floor/iron/dark, +/area/station/science/lower) "dPu" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -15930,6 +15610,20 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"dQl" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/turf/open/openspace, +/area/station/maintenance/department/crew_quarters/dorms) "dQq" = ( /obj/structure/table/reinforced, /obj/item/cigbutt/cigarbutt{ @@ -16035,6 +15729,14 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/general, /turf/open/floor/plating/airless, /area/station/engineering/supermatter/room) +"dRv" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/landmark/navigate_destination/bar, +/obj/effect/landmark/navigate_destination/kitchen, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "dRz" = ( /obj/structure/bed{ dir = 4 @@ -16122,6 +15824,13 @@ /obj/effect/turf_decal/stripes/white/full, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"dTg" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/landmark/navigate_destination/dockescpod4, +/turf/open/floor/iron, +/area/station/escapepodbay) "dTE" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16142,6 +15851,12 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"dTV" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "dTZ" = ( /obj/machinery/door/airlock/medical/glass{ name = "Medbay Storage" @@ -16198,10 +15913,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/greater) -"dUy" = ( -/obj/structure/sign/directions/vault/directional/west, -/turf/closed/wall/r_wall, -/area/station/command/meeting_room) "dUG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -16307,6 +16018,15 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/maintenance/department/science) +"dWK" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/turf/open/floor/glass/reinforced, +/area/station/security/brig) "dWM" = ( /obj/structure/table, /obj/item/radio{ @@ -16331,24 +16051,6 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, /area/station/maintenance/starboard/lesser) -"dXm" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 9 - }, -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 8 - }, -/obj/item/radio/intercom/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Civilian - Dormitories East Stairwell" - }, -/obj/structure/sign/flag/terragov/directional/north, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "dXo" = ( /obj/structure/table/glass, /obj/item/reagent_containers/chem_pack{ @@ -16403,6 +16105,15 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/wood/large, /area/station/service/library) +"dYa" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "dYe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/showroomfloor, @@ -16476,18 +16187,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/library) -"dZP" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/ladder, -/obj/structure/railing{ - dir = 9; - layer = 3.1 - }, -/turf/open/openspace, -/area/station/maintenance/department/cargo) "dZX" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -16498,20 +16197,6 @@ /obj/effect/turf_decal/trimline/brown/filled/corner, /turf/open/floor/iron, /area/station/cargo/storage) -"eab" = ( -/obj/structure/chair/plastic{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/smooth, -/area/station/cargo/drone_bay) "eaf" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" @@ -16597,12 +16282,6 @@ /obj/structure/railing, /turf/open/misc/sandy_dirt, /area/station/service/hydroponics) -"eaY" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/openspace, -/area/station/security/brig) "eaZ" = ( /obj/structure/rack, /obj/item/storage/toolbox/mechanical{ @@ -16782,22 +16461,35 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"edF" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction/engineering) "edJ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/dorms) -"edK" = ( -/obj/structure/table/wood, -/obj/machinery/light/small/directional/south, -/obj/machinery/cassette/adv_cassette_deck, -/turf/open/floor/wood/parquet, -/area/station/service/library) "edP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/science/ordnance) +"eed" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 6 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/cargo/miningdock) "eep" = ( /turf/open/floor/plating, /area/station/service/barber) @@ -16891,6 +16583,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"efz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/components/binary/valve/digital/layer2{ + name = "Chamber Waste Release" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"efA" = ( +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/command/gateway) "efB" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -16899,6 +16604,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/checkpoint/science) +"efS" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 9 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/cargo/miningdock) "efV" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -17167,6 +16879,46 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"eku" = ( +/obj/machinery/module_duplicator, +/obj/machinery/light/directional/south, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/science/lower) +"ekv" = ( +/obj/structure/closet/secure_closet/evidence{ + name = "secure evidence closet 1" + }, +/turf/open/floor/iron/dark, +/area/station/security/evidence) +"ekz" = ( +/obj/structure/sign/directions/supply{ + dir = 1; + pixel_y = 24 + }, +/obj/structure/sign/directions/security{ + dir = 8; + pixel_y = 32 + }, +/obj/structure/sign/directions/command{ + dir = 8; + pixel_y = 40 + }, +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "ekB" = ( /turf/closed/wall, /area/station/service/janitor) @@ -17197,13 +16949,6 @@ /obj/item/target/alien, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/dorms) -"ekX" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/maintenance/central/greater) "ela" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/warning{ @@ -17226,6 +16971,10 @@ "eli" = ( /turf/open/misc/asteroid, /area/station/maintenance/department/science) +"elo" = ( +/obj/structure/flora/tree/palm/style_random, +/turf/open/misc/grass/jungle, +/area/station/science/lower) "elr" = ( /turf/closed/wall, /area/station/commons/dorms) @@ -17535,15 +17284,6 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/security/prison) -"epJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/preopen{ - id = "testlab"; - name = "Test Chamber Blast Door" - }, -/turf/open/floor/iron/dark, -/area/station/science/explab) "epP" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -17567,6 +17307,15 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"eqv" = ( +/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "eqw" = ( /obj/item/weldingtool, /obj/effect/decal/cleanable/dirt, @@ -17636,11 +17385,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/science/lower) -"erw" = ( -/obj/item/stack/ore/glass, -/obj/item/relic, -/turf/open/misc/asteroid/dug, -/area/station/asteroid) "erR" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/food/pie_smudge, @@ -17766,6 +17510,9 @@ /obj/effect/spawner/random/food_or_drink/donkpockets_single, /turf/open/misc/asteroid, /area/station/maintenance/department/security) +"eui" = ( +/turf/open/floor/engine, +/area/station/asteroid) "euu" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -17898,6 +17645,21 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/central) +"eww" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/white/full, +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/structure/sign/directions/upload/directional/south{ + pixel_y = -39 + }, +/turf/open/floor/iron/white, +/area/station/science/research) "ewz" = ( /obj/machinery/holopad, /obj/structure/cable, @@ -17946,15 +17708,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/cargo/storage) -"exv" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "exx" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -18019,17 +17772,6 @@ /obj/effect/turf_decal/trimline/white/warning, /turf/open/floor/iron, /area/station/maintenance/tram/left) -"eyl" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/light/neon_lining{ - dir = 8; - icon_state = "pink2_1" - }, -/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/bitrunning/den) "eyy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -18107,6 +17849,17 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal/incinerator) +"ezs" = ( +/obj/structure/sign/directions/vault/directional/west, +/turf/closed/wall/r_wall, +/area/station/command/meeting_room) +"ezD" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/station/science/explab) "ezL" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -18248,6 +18001,14 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/cargo/lobby) +"eBV" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/landmark/event_spawn, +/turf/open/openspace, +/area/station/maintenance/department/crew_quarters/dorms) "eCk" = ( /obj/machinery/door/airlock/public/glass{ name = "Library" @@ -18299,6 +18060,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/warehouse) +"eCE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/crew_quarters/dorms) "eCQ" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/light/directional/south, @@ -18347,6 +18114,12 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"eEg" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "eEl" = ( /obj/machinery/meter/monitored/distro_loop, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, @@ -18375,10 +18148,6 @@ }, /turf/open/floor/engine/air, /area/station/engineering/atmos) -"eES" = ( -/obj/structure/statue/bananium/clown, -/turf/open/indestructible/dark, -/area/ruin/powered/clownplanet) "eFd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/plasticflaps/opaque{ @@ -18404,13 +18173,6 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/department/cargo) -"eFk" = ( -/obj/machinery/bluespace_beacon, -/obj/effect/turf_decal/trimline/yellow/filled/warning, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination/teleporter, -/turf/open/floor/iron, -/area/station/command/teleporter) "eFo" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -18442,6 +18204,17 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"eFQ" = ( +/obj/machinery/door/airlock/glass{ + name = "Break Room" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/supply/mining, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/miningdock/cafeteria) "eFR" = ( /obj/item/emptysandbag, /turf/open/misc/asteroid, @@ -18480,13 +18253,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"eGs" = ( -/obj/structure/railing, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/openspace, -/area/station/security/brig) "eGt" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/white, @@ -18567,14 +18333,18 @@ }, /turf/open/floor/iron/dark/airless, /area/station/science/ordnance/freezerchamber) +"eJh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/smooth, +/area/station/hallway/primary/tram/left) "eJz" = ( /obj/structure/sign/calendar/directional/south, /turf/open/floor/wood/large, /area/station/service/library) -"eJA" = ( -/obj/machinery/light/very_dim/directional/south, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "eJQ" = ( /turf/open/floor/glass/reinforced, /area/station/science/xenobiology) @@ -18582,24 +18352,6 @@ /obj/structure/sink/kitchen/directional/west, /turf/open/floor/wood, /area/station/service/bar/backroom) -"eJX" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 9 - }, -/obj/structure/industrial_lift/public, -/obj/machinery/elevator_control_panel/directional/west{ - linked_elevator_id = "tram_sci_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 9 - }, -/obj/machinery/elevator_control_panel/directional/west{ - linked_elevator_id = "tram_sci_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/science/lower) "eJZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, @@ -18630,6 +18382,17 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"eKE" = ( +/obj/structure/sign/calendar/directional/south, +/obj/structure/table/glass, +/obj/item/radio/intercom/directional/east{ + freerange = 1; + listening = 0; + name = "Common Channel"; + pixel_x = 0 + }, +/turf/open/floor/iron/dark/small, +/area/ruin/powered/clownplanet) "eKH" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/girder, @@ -18660,11 +18423,6 @@ /obj/structure/lattice/catwalk/mining, /turf/open/lava, /area/station/security/execution/education) -"eLB" = ( -/obj/effect/turf_decal/trimline/red/filled/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/execution/transfer) "eLG" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -18691,6 +18449,11 @@ }, /turf/open/floor/iron, /area/station/engineering/engine_smes) +"eMv" = ( +/obj/machinery/griddle, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/ruin/powered/clownplanet) "eME" = ( /obj/machinery/light/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -18878,6 +18641,14 @@ /obj/machinery/door/airlock/public/glass, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/left) +"ePD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/smooth, +/area/station/hallway/primary/tram/left) "ePG" = ( /turf/closed/wall/r_wall, /area/station/science/auxlab/firing_range) @@ -18924,6 +18695,20 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"eQn" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Secure External Operations" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/command/eva, +/obj/effect/mapping_helpers/airlock/access/any/command/gateway, +/obj/effect/mapping_helpers/airlock/access/any/command/teleporter, +/obj/effect/landmark/navigate_destination/teleporter, +/turf/open/floor/iron, +/area/station/command/teleporter) "eQE" = ( /obj/item/kirbyplants/random, /turf/open/floor/iron/dark/side{ @@ -18935,13 +18720,31 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"eQR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ +"eQY" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Engineering Foyer" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 }, -/obj/structure/railing, -/turf/open/floor/iron/smooth, -/area/station/command/gateway) +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/any/engineering/general, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "Engineering3" + }, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) "eQZ" = ( /obj/effect/turf_decal/delivery/white{ color = "#52B4E9" @@ -19111,13 +18914,6 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/dorms) -"eTI" = ( -/obj/effect/spawner/random{ - loot = list(/obj/effect/decal/cleanable/oil/slippery=10,/obj/effect/decal/cleanable/oil=90); - name = "funny slipper :)" - }, -/turf/open/floor/noslip/tram_plate, -/area/station/hallway/primary/tram/center) "eTW" = ( /obj/structure/cable, /turf/open/floor/wood/large, @@ -19313,6 +19109,16 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/left) +"eWA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/asteroid) "eWO" = ( /obj/machinery/door/airlock/engineering{ name = "Power Access Hatch" @@ -19358,11 +19164,6 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) -"eXL" = ( -/obj/effect/turf_decal/siding/thinplating/corner, -/obj/effect/turf_decal/trimline/red/corner, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "eYi" = ( /obj/machinery/camera/directional/east, /mob/living/basic/chicken/brown, @@ -19390,6 +19191,11 @@ }, /turf/open/space/openspace, /area/space) +"eYo" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/engineering/atmos) "eYs" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -19416,21 +19222,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/tram/left) -"eYN" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/science/explab) "eYP" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 @@ -19456,6 +19247,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/port/central) +"eZw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "eZy" = ( /obj/machinery/light/directional/north, /mob/living/basic/chicken/brown, @@ -19641,6 +19436,14 @@ /obj/effect/turf_decal/sand, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) +"fdK" = ( +/obj/structure/flora/bush/lavendergrass/style_random, +/obj/item/food/grown/banana/bunch{ + pixel_x = 5; + pixel_y = 16 + }, +/turf/open/misc/grass/jungle, +/area/station/science/lower) "fdU" = ( /obj/structure/disposalpipe/junction/flip{ dir = 8 @@ -19700,6 +19503,13 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) +"feL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/asteroid) "feN" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance" @@ -20065,19 +19875,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/tram/left) -"fjA" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "fjN" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -20090,15 +19887,6 @@ /obj/structure/grille, /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"fkc" = ( -/obj/structure/safe, -/obj/item/clothing/head/costume/bearpelt, -/obj/item/ammo_box/a357, -/obj/effect/turf_decal/bot_white/left, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/gun/ballistic/revolver/mateba, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) "fkg" = ( /obj/machinery/biogenerator, /obj/effect/turf_decal/tile/green/fourcorners, @@ -20212,14 +20000,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/workout) -"flP" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/trimline/green/line{ - dir = 1 - }, -/obj/effect/landmark/navigate_destination/hydro, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "flQ" = ( /obj/machinery/door/airlock/external{ name = "External Access" @@ -20269,16 +20049,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/miningdock) -"fmu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/ladder, -/turf/open/floor/engine/cult, -/area/station/service/library) "fmy" = ( /turf/closed/wall, /area/station/hallway/secondary/exit/departure_lounge) @@ -20286,6 +20056,22 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/tram/right) +"fmC" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/obj/structure/table, +/obj/item/holosign_creator/atmos, +/obj/item/holosign_creator/atmos{ + pixel_x = 5; + pixel_y = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/ordnance) "fmE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -20362,20 +20148,6 @@ "fnZ" = ( /turf/open/floor/iron, /area/station/security/checkpoint/science) -"foa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - location = "QM #2" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #2"; - suffix = "#2" - }, -/turf/open/floor/iron/smooth, -/area/station/cargo/drone_bay) "fof" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/structure/sign/warning/cold_temp/directional/south, @@ -20463,12 +20235,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/ordnance) -"foU" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/storage) "foY" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20515,15 +20281,6 @@ }, /turf/open/floor/plating, /area/station/cargo/sorting) -"fqc" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/openspace, -/area/station/security/brig) "fqn" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -20571,6 +20328,16 @@ /obj/effect/mob_spawn/corpse/human/charredskeleton, /turf/open/lava, /area/station/security/execution/education) +"frN" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 6 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/secondary/service) "frT" = ( /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, /turf/closed/wall/r_wall, @@ -20682,12 +20449,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"fsQ" = ( -/obj/structure/closet/secure_closet/evidence{ - name = "secure evidence closet 1" - }, -/turf/open/floor/iron/dark, -/area/station/security/evidence) "ftm" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/effect/turf_decal/trimline/neutral/filled/corner{ @@ -20753,20 +20514,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/white, /area/station/science/ordnance/office) -"ftO" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/railing{ - dir = 10; - layer = 3.1 - }, -/turf/open/openspace, -/area/station/maintenance/department/security) "ftQ" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 8 @@ -20889,6 +20636,14 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) +"fwh" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/oil/streak, +/obj/effect/landmark/start/bitrunner, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "fwk" = ( /obj/structure/table, /obj/machinery/microwave{ @@ -21056,6 +20811,10 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/evidence) +"fyu" = ( +/obj/machinery/artifact_xray, +/turf/open/floor/engine, +/area/station/science/explab) "fyH" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -21116,6 +20875,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"fzz" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "fAg" = ( /obj/structure/table, /obj/item/restraints/handcuffs, @@ -21160,6 +20931,11 @@ /obj/item/stack/license_plates/empty/fifty, /turf/open/floor/plating, /area/station/security/prison/work) +"fBe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing, +/turf/open/floor/catwalk_floor, +/area/station/command/gateway) "fBf" = ( /obj/machinery/light/directional/south, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -21194,13 +20970,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) -"fCh" = ( -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/turf/open/openspace, -/area/station/security/brig) "fCB" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/light/small/directional/west, @@ -21219,14 +20988,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/wood, /area/station/commons/vacant_room/office) -"fDd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet, -/obj/effect/spawner/random/engineering/material_cheap, -/obj/effect/spawner/random/maintenance/three, -/obj/item/relic, -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/cargo) "fDk" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -21265,6 +21026,16 @@ }, /turf/open/floor/glass/reinforced, /area/station/science/research) +"fDF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/cargo/drone_bay) "fDP" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, @@ -21461,6 +21232,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/dorms) +"fGj" = ( +/obj/machinery/computer/atmos_control/oxygen_tank{ + atmos_chambers = list("o2ordance"="Oxygen Supply") + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/storage) "fGo" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/escape) @@ -21701,6 +21480,10 @@ /obj/machinery/air_sensor/nitrogen_tank, /turf/open/floor/engine/n2, /area/station/engineering/atmos) +"fKx" = ( +/obj/machinery/door/airlock/bananium, +/turf/open/floor/iron/grimy, +/area/ruin/powered/clownplanet) "fKz" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 6 @@ -21764,6 +21547,12 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/medical) +"fLd" = ( +/obj/machinery/artifact_zapper{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/explab) "fLg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21916,14 +21705,19 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/freezer, /area/station/commons/toilet) -"fNI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +"fNE" = ( +/obj/effect/turf_decal/trimline/green/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/corner{ dir = 4 }, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/smooth, -/area/station/hallway/primary/tram/left) +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "fNV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22197,13 +21991,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/open/floor/iron, /area/station/science/ordnance/storage) -"fTi" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 5 - }, -/obj/machinery/meter, -/turf/open/floor/iron, -/area/station/engineering/atmos) "fTz" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood{ @@ -22211,17 +21998,6 @@ }, /turf/open/floor/wood, /area/station/service/library) -"fTI" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/computer/libraryconsole/bookmanagement, -/obj/structure/table, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "fTP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22282,10 +22058,6 @@ }, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/foyer) -"fVL" = ( -/obj/structure/sign/directions/upload/directional/east, -/turf/open/floor/iron/stairs/right, -/area/station/science/lower) "fVX" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line{ dir = 1 @@ -22297,13 +22069,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/genetics) -"fWd" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 10 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/secondary/construction/engineering) "fWh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22341,6 +22106,12 @@ }, /turf/open/openspace, /area/station/hallway/primary/tram/center) +"fXd" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace, +/area/station/security/brig) "fXf" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = 32 @@ -22376,6 +22147,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/checkpoint/engineering) +"fXV" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/bitrunner, +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "fXY" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -22505,18 +22287,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/right) -"gaX" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/obj/structure/railing, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "gaY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -22555,6 +22325,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/security/medical) +"gbu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/science/lower) "gby" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -22575,6 +22352,12 @@ /obj/item/radio, /turf/open/floor/iron, /area/station/security/checkpoint/escape) +"gbD" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/railing, +/turf/open/openspace, +/area/station/asteroid) "gbF" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -22627,6 +22410,13 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"gcF" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "gcN" = ( /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/effect/decal/cleanable/dirt, @@ -22720,12 +22510,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"gfA" = ( -/obj/structure/chair/office, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +"gfu" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/iron, -/area/station/science/explab) +/area/station/science/lower) "gfK" = ( /turf/closed/wall/r_wall, /area/station/security/execution/education) @@ -22838,6 +22631,11 @@ "ghz" = ( /turf/closed/wall, /area/station/hallway/secondary/construction/engineering) +"ghB" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/explab) "ghV" = ( /obj/structure/cable, /obj/machinery/door/airlock/public/glass, @@ -22855,15 +22653,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/tram/mid) -"ghY" = ( -/obj/machinery/light/directional/west, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/dark_blue/corner, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) "ghZ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -22876,6 +22665,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"gip" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/artifact_spawner, +/turf/open/floor/engine, +/area/station/science/explab) "giR" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -22888,6 +22684,17 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"giT" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/structure/table, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "gjb" = ( /obj/machinery/door/airlock{ name = "Water Closet" @@ -22931,13 +22738,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) -"gjn" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/explab) "gjs" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, @@ -22968,6 +22768,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/workout) +"gjA" = ( +/obj/item/stack/ore/glass, +/turf/open/misc/asteroid, +/area/station/science/lower) "gjC" = ( /obj/machinery/atmospherics/components/binary/pump/off{ name = "Port to Incinerator" @@ -23009,13 +22813,6 @@ "gkD" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) -"gkF" = ( -/obj/machinery/door/window/left/directional/north{ - name = "The Monkey Pit"; - req_access = list("science") - }, -/turf/open/misc/grass/jungle, -/area/station/science/explab) "gkG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -23172,17 +22969,6 @@ /obj/structure/destructible/cult/item_dispenser/archives/library, /turf/open/floor/engine/cult, /area/station/service/library) -"gmI" = ( -/obj/machinery/quantum_server, -/obj/machinery/light/neon_lining{ - icon_state = "pink2_1" - }, -/obj/machinery/light/neon_lining{ - dir = 4; - icon_state = "pink2_1" - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/bitrunning/den) "gmN" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -23327,16 +23113,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, /area/station/service/barber) -"gpr" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 6 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/openspace/airless, -/area/station/asteroid) "gpH" = ( /obj/effect/turf_decal/siding/thinplating, /obj/structure/cable, @@ -23344,6 +23120,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"gpL" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/navigate_destination/cargo, +/turf/open/floor/iron, +/area/station/cargo/lobby) "gpR" = ( /obj/item/beacon, /obj/effect/turf_decal/stripes/line{ @@ -23351,6 +23139,11 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"gpW" = ( +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/execution/transfer) "gqa" = ( /obj/item/assembly/mousetrap/armed, /obj/effect/decal/cleanable/dirt, @@ -23370,6 +23163,11 @@ /obj/effect/spawner/random/engineering/tank, /turf/open/floor/iron/smooth, /area/station/maintenance/department/medical) +"gqn" = ( +/obj/effect/turf_decal/trimline/dark_red/warning, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/secondary/service) "gqo" = ( /obj/effect/turf_decal/caution/stand_clear/white{ dir = 4 @@ -23445,6 +23243,14 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"gsq" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "gsu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -23456,13 +23262,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/dorms) -"gsO" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "gsT" = ( /obj/structure/easel, /obj/item/canvas/nineteen_nineteen, @@ -23471,26 +23270,17 @@ /obj/machinery/newscaster/directional/west, /turf/open/floor/iron/grimy, /area/station/service/library/lounge) +"gsU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "gtj" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"gtr" = ( -/obj/effect/turf_decal/siding/thinplating/corner, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) "gtu" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /obj/machinery/meter, @@ -23552,14 +23342,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"gun" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "guI" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -23665,6 +23447,14 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/plating/airless, /area/station/asteroid) +"gwQ" = ( +/obj/structure/closet{ + name = "Evidence Closet 4" + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/security/evidence) "gwR" = ( /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark, @@ -23678,12 +23468,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"gxi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/plastic, -/obj/effect/spawner/random/trash/garbage, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) "gxk" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -23912,12 +23696,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"gAO" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/turf/open/floor/glass/reinforced, -/area/station/security/brig) "gAQ" = ( /obj/structure/table, /obj/machinery/door/poddoor/shutters{ @@ -23979,18 +23757,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) -"gBV" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction/engineering) +"gBU" = ( +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/iron/white, +/area/ruin/powered/clownplanet) "gBX" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -24100,13 +23871,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/department/science) -"gEs" = ( -/obj/machinery/power/terminal{ - dir = 1 +"gEl" = ( +/obj/structure/railing{ + dir = 4 }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/tank_dispenser/oxygen, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "gEy" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -24121,24 +23895,6 @@ }, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/center) -"gEE" = ( -/obj/machinery/elevator_control_panel/directional/north{ - linked_elevator_id = "tram_upper_center_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 1 - }, -/obj/structure/industrial_lift/public, -/obj/machinery/elevator_control_panel/directional/north{ - linked_elevator_id = "tram_upper_center_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 1 - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/secondary/service) "gEK" = ( /obj/machinery/door/airlock/external{ name = "External Access" @@ -24148,6 +23904,29 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/science/lower) +"gEN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/filingcabinet/chestdrawer{ + pixel_y = 2 + }, +/obj/item/paper{ + default_raw_text = "what the hell is this thing....???? tell me ur secrets you devil machine!!! i will not be denied!!!!!"; + name = "scribbled notes" + }, +/obj/structure/sign/clock/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + location = "QM #6" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/mob/living/simple_animal/bot/mulebot{ + home_destination = "QM #6"; + suffix = "#6" + }, +/turf/open/floor/iron/smooth, +/area/station/cargo/drone_bay) "gER" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -24171,10 +23950,6 @@ "gFf" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/hallway) -"gFi" = ( -/obj/structure/sign/directions/vault/directional/east, -/turf/closed/wall/r_wall, -/area/station/command/meeting_room) "gFp" = ( /turf/open/floor/plating, /area/station/maintenance/department/security) @@ -24341,11 +24116,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"gHv" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/flora/bush/jungle/c/style_random, -/turf/open/misc/grass/jungle, -/area/station/science/explab) "gHx" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24578,6 +24348,24 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/sorting) +"gLq" = ( +/obj/structure/closet/emcloset/anchored, +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) +"gLu" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/asteroid) "gLC" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/camera/directional/west{ @@ -24590,6 +24378,11 @@ "gLI" = ( /turf/open/floor/plating, /area/station/maintenance/port/aft) +"gLM" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/closed/wall, +/area/station/bitrunning/den) "gLV" = ( /turf/open/misc/asteroid, /area/station/maintenance/department/security) @@ -24739,9 +24532,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/eva) -"gNy" = ( -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "gNz" = ( /obj/machinery/light/directional/east, /turf/open/floor/engine, @@ -24803,14 +24593,6 @@ /obj/machinery/computer/tram_controls/directional/west, /turf/open/floor/noslip/tram_plate, /area/station/hallway/primary/tram/center) -"gOA" = ( -/obj/structure/railing, -/obj/structure/railing{ - dir = 4; - layer = 4.1 - }, -/turf/open/openspace, -/area/station/security/brig) "gOF" = ( /obj/structure/fluff/tram_rail/floor{ dir = 1 @@ -24982,6 +24764,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/dorms) +"gRF" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 6 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/commons/dorms) "gRG" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -25029,10 +24818,9 @@ /area/station/engineering/storage/tech) "gSi" = ( /obj/structure/table, -/obj/item/folder/yellow, -/obj/item/pen{ - pixel_x = 4; - pixel_y = 4 +/obj/machinery/fax{ + fax_name = "Quartermaster's Office"; + name = "Quartermaster's Fax Machine" }, /turf/open/floor/carpet, /area/station/command/heads_quarters/qm) @@ -25109,13 +24897,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/cargo/drone_bay) -"gTv" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 10 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/security/execution/transfer) "gTw" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -25208,13 +24989,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/break_room) -"gUL" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) "gUO" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25252,29 +25026,14 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/break_room) -"gWk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/toolbox/syndicate, -/obj/structure/table, -/obj/effect/spawner/random/engineering/tool, -/obj/effect/spawner/random/mod, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) +"gWc" = ( +/mob/living/carbon/human/species/monkey, +/turf/open/misc/grass/jungle, +/area/station/science/lower) "gWo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"gWu" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) "gWx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25323,10 +25082,6 @@ }, /turf/open/floor/engine, /area/station/engineering) -"gXo" = ( -/obj/structure/flora/bush/fullgrass/style_random, -/turf/open/misc/grass/jungle, -/area/station/science/explab) "gXs" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet, @@ -25429,6 +25184,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"gYR" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "gZc" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/structure/crate_empty, @@ -25447,6 +25208,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai_upload) +"gZY" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/trash/food_packaging, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/security) "hat" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -25514,6 +25283,10 @@ }, /turf/open/floor/iron, /area/station/commons/storage/art) +"hbq" = ( +/mob/living/basic/sloth/paperwork, +/turf/open/floor/glass, +/area/station/cargo/storage) "hbQ" = ( /obj/machinery/camera/directional/north{ c_tag = "Civilian - Holodeck Controls" @@ -25557,12 +25330,6 @@ /obj/effect/spawner/random/medical/supplies, /turf/open/floor/iron/smooth, /area/station/maintenance/department/medical) -"hde" = ( -/obj/machinery/sparker/directional/west{ - id = "testigniter" - }, -/turf/open/floor/engine, -/area/station/science/explab) "hdn" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -25570,6 +25337,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation/entertainment) +"hdo" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall/r_wall, +/area/ruin/powered/clownplanet) "hdA" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -25653,21 +25424,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"heE" = ( -/obj/structure/ladder, -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/obj/structure/railing{ - dir = 4; - layer = 4.1 - }, -/turf/open/floor/glass/reinforced, -/area/station/command/bridge) "heI" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -25729,6 +25485,9 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"hfM" = ( +/turf/open/misc/asteroid, +/area/station/science/lower) "hfP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -25739,18 +25498,6 @@ /obj/structure/grille, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/greater) -"hfW" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction/engineering) "hfZ" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 @@ -25761,10 +25508,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"hgN" = ( -/mob/living/carbon/human/species/monkey, -/turf/open/misc/asteroid, -/area/station/science/explab) "hgX" = ( /obj/machinery/vending/drugs, /obj/effect/turf_decal/siding/white{ @@ -25794,6 +25537,12 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) +"hhu" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/escapepodbay) "hhC" = ( /obj/machinery/duct, /obj/structure/cable, @@ -25819,6 +25568,16 @@ }, /turf/open/floor/glass/reinforced, /area/station/security/warden) +"hhX" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plating, +/area/ruin/powered/clownplanet) "hic" = ( /obj/structure/railing{ dir = 4 @@ -25830,18 +25589,6 @@ /obj/item/clothing/head/utility/hardhat, /turf/open/misc/asteroid, /area/station/maintenance/department/cargo) -"hif" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) "hik" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/corner{ @@ -25916,6 +25663,18 @@ /obj/structure/girder, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"hiQ" = ( +/obj/structure/sign/clock/directional/south, +/obj/item/paper/crumpled/bloody, +/obj/item/radio/intercom/directional/east{ + freerange = 1; + listening = 0; + name = "Custom Channel"; + pixel_x = 0 + }, +/obj/structure/table/glass, +/turf/open/floor/iron/dark/small, +/area/ruin/powered/clownplanet) "hiR" = ( /obj/machinery/door/airlock{ name = "Bathroom" @@ -25989,6 +25748,11 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/greater) +"hkb" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/light/small/directional/west, +/turf/open/space/openspace, +/area/station/solars/starboard/fore) "hke" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26016,6 +25780,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/security) +"hla" = ( +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/security/brig) +"hlb" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/table, +/obj/item/analysis_bin, +/turf/open/floor/iron/dark, +/area/station/science/explab) "hlh" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -26180,6 +25960,20 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"hnT" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atm, +/obj/effect/landmark/navigate_destination/common/dorms, +/turf/open/floor/iron, +/area/station/commons/dorms) "hoh" = ( /obj/structure/girder, /obj/effect/turf_decal/sand/plating, @@ -26367,13 +26161,6 @@ /obj/effect/turf_decal/trimline/red/filled/line, /turf/open/floor/iron, /area/station/security/checkpoint/science) -"hrB" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 9 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/secondary/construction/engineering) "hrS" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/newscaster/directional/south, @@ -26513,20 +26300,26 @@ }, /turf/open/floor/plating, /area/station/maintenance/tram/left) -"hur" = ( -/obj/effect/turf_decal/stripes/end, -/obj/machinery/atmospherics/pipe/multiz/supply/hidden/layer4{ - dir = 4 +"htW" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 }, -/obj/machinery/atmospherics/pipe/multiz/scrubbers/hidden/layer2{ - dir = 4 +/obj/structure/bed/dogbed{ + desc = "A comfy-looking cat bed. You can even strap your pet in, in case the gravity turns off."; + name = "slime bed" }, -/obj/structure/railing{ - dir = 9; - layer = 3.1 +/obj/machinery/conveyor_switch/oneway{ + id = "hydrodropoff"; + name = "Shipment Delivery Chute Activator"; + pixel_x = 10; + pixel_y = 20 }, -/turf/open/floor/plating, -/area/station/maintenance/department/cargo) +/mob/living/simple_animal/slime/pet{ + colour = "orange"; + name = "Happy Accident" + }, +/turf/open/floor/plastic, +/area/station/engineering/break_room) "huz" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -26630,6 +26423,9 @@ /obj/effect/turf_decal/siding/thinplating/corner, /turf/open/floor/glass/reinforced, /area/station/security/warden) +"hwe" = ( +/turf/open/misc/dirt/jungle, +/area/station/science/lower) "hwn" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/siding/thinplating{ @@ -26696,6 +26492,15 @@ }, /turf/open/floor/glass, /area/station/command/meeting_room) +"hyH" = ( +/obj/machinery/light/directional/west, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/dark_blue/corner, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "hyK" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -26712,6 +26517,15 @@ /obj/effect/spawner/random/maintenance/three, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"hyR" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "hzh" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -26876,13 +26690,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"hBB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/starboard/greater) "hBH" = ( /obj/machinery/computer/atmos_control/oxygen_tank{ dir = 1 @@ -27011,6 +26818,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plastic, /area/station/engineering/break_room) +"hDt" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "hDE" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/cable, @@ -27025,12 +26842,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"hDU" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "hEb" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -27246,12 +27057,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/central) -"hHu" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/sign/directions/dorms/directional/west, -/turf/open/floor/iron, -/area/station/commons/fitness) "hHI" = ( /turf/open/floor/glass, /area/station/command/meeting_room) @@ -27262,12 +27067,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/arrivals) -"hIb" = ( -/obj/structure/sign/directions/upload{ - pixel_y = 25 - }, -/turf/closed/wall, -/area/station/commons/vacant_room/commissary) "hIt" = ( /obj/structure/railing{ dir = 1 @@ -27305,15 +27104,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/plating, /area/station/engineering/atmos) -"hIY" = ( -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/explab) "hJa" = ( /obj/structure/table, /obj/item/electronics/apc, @@ -27487,6 +27277,16 @@ /obj/item/toy/plush/space_lizard_plushie, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"hMq" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/maintenance/central/greater) "hMx" = ( /obj/effect/spawner/random/vending/colavend, /obj/machinery/light/dim/directional/west, @@ -27586,14 +27386,6 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"hNz" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/cassette/adv_cassette_deck, -/turf/open/floor/wood/large, -/area/station/service/library) "hOd" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 1 @@ -27646,12 +27438,49 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"hPn" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/machinery/door/airlock/research/glass{ + name = "Assembly Lab" + }, +/obj/structure/barricade/wooden/crude, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/landmark/navigate_destination/tram/abandonedmechbay, +/turf/open/floor/iron, +/area/station/maintenance/starboard/central) "hPs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) +"hPv" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing{ + layer = 3.1 + }, +/turf/open/openspace, +/area/station/maintenance/department/security) +"hPw" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/glass/reinforced, +/area/station/security/brig) "hPA" = ( /obj/structure/chair/office{ dir = 1 @@ -27680,20 +27509,6 @@ /obj/effect/decal/cleanable/confetti, /turf/open/floor/iron/smooth, /area/station/maintenance/department/cargo) -"hPM" = ( -/obj/effect/turf_decal/trimline/red/filled/corner, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/corner, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) "hPW" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/red/filled/corner{ @@ -27704,19 +27519,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison) -"hQg" = ( -/obj/structure/industrial_lift/public, -/obj/machinery/elevator_control_panel{ - linked_elevator_id = "tram_xeno_lift"; - pixel_y = 2; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/obj/structure/table, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 9 - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/science/xenobiology) "hQm" = ( /obj/structure/rack, /obj/effect/turf_decal/trimline/white/filled/line{ @@ -27734,13 +27536,6 @@ }, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"hQz" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 8 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/secondary/service) "hQA" = ( /obj/effect/turf_decal/trimline/dark_red/filled/corner, /obj/effect/turf_decal/trimline/dark_red/filled/corner{ @@ -27826,6 +27621,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/cargo/storage) +"hSu" = ( +/obj/machinery/light/directional/north, +/obj/machinery/portable_atmospherics/canister/plasma, +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/explab) "hSy" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -27872,16 +27676,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/line, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"hTg" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating_new/corner, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/explab) "hTn" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/structure/cable, @@ -27893,10 +27687,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) -"hTK" = ( -/obj/structure/sign/directions/dorms/directional/east, -/turf/closed/wall, -/area/station/maintenance/department/crew_quarters/dorms) "hTL" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -27944,6 +27734,17 @@ dir = 8 }, /area/station/security/execution/education) +"hUw" = ( +/obj/structure/sign/warning/vacuum/external/directional/south, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "hUz" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/stripes/asteroid/full, @@ -27984,15 +27785,6 @@ /obj/effect/turf_decal/sand, /turf/open/floor/catwalk_floor, /area/station/maintenance/tram/left) -"hVa" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/railing, -/turf/open/floor/grass, -/area/station/commons/dorms) "hVb" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -28009,6 +27801,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/safe) +"hVq" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 4 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/commons/dorms) +"hVs" = ( +/obj/machinery/porta_turret/ai, +/obj/machinery/light/directional/north, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/hallway) "hVD" = ( /obj/machinery/computer/teleporter{ dir = 1 @@ -28043,16 +27848,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/port/central) -"hWh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/stairs/old{ - dir = 8 - }, -/area/station/maintenance/central/greater) "hWl" = ( /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -28083,20 +27878,6 @@ /obj/effect/turf_decal/trimline/neutral/corner, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) -"hWL" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 8 - }, -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/turf/open/floor/iron, -/area/station/security/brig) "hWZ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -28146,13 +27927,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /turf/open/space/basic, /area/space/nearstation) -"hYg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/explab) "hYh" = ( /obj/machinery/light/warm/directional/south, /obj/structure/cable, @@ -28185,6 +27959,24 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/office) +"hYs" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/storage) "hYv" = ( /obj/machinery/crossing_signal/northwest{ inbound = 2; @@ -28214,13 +28006,6 @@ /obj/item/stack/rods, /turf/open/misc/asteroid, /area/station/maintenance/department/security) -"hYN" = ( -/obj/effect/turf_decal/siding/thinplating/corner, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/glass/reinforced, -/area/station/security/brig) "hYT" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -28232,6 +28017,10 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"hZi" = ( +/obj/effect/landmark/navigate_destination/common/shitter, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "hZr" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos) @@ -28262,18 +28051,6 @@ }, /turf/open/floor/iron, /area/station/tcommsat/computer) -"hZP" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/junction/yjunction{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "hZZ" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/button/elevator/directional/south{ @@ -28415,10 +28192,45 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"icw" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/mining/glass{ + name = "Bitrunning Den" + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, +/obj/effect/landmark/navigate_destination/common/bitrunner, +/turf/open/floor/iron, +/area/station/bitrunning/den) "icx" = ( /obj/structure/chair/stool/directional/north, /turf/open/floor/iron, /area/station/science/robotics/mechbay) +"icH" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/ladder, +/obj/machinery/light/small/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/turf/open/openspace, +/area/station/maintenance/department/crew_quarters/dorms) +"icL" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "icO" = ( /obj/effect/turf_decal/siding/thinplating/corner, /obj/item/banner/cargo/mundane, @@ -28440,11 +28252,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"idk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/cigbutt, -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/crew_quarters/dorms) "idq" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -28508,13 +28315,6 @@ dir = 8 }, /area/station/science/robotics/mechbay) -"idW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/railing, -/turf/open/floor/iron/smooth, -/area/station/command/gateway) "idZ" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -28575,30 +28375,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/checkpoint/science) -"ieY" = ( -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_y = -24 - }, -/obj/structure/sign/directions/medical{ - dir = 4; - pixel_y = -32 - }, -/obj/structure/sign/directions/engineering{ - dir = 4; - pixel_y = -40 - }, -/obj/machinery/light/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/warning, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/left) "ifg" = ( /obj/structure/railing{ dir = 4 @@ -28629,6 +28405,22 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/commons/dorms) +"ifq" = ( +/obj/structure/cable/multilayer/multiz, +/obj/effect/turf_decal/stripes/box, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/solars/port) +"ifu" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction/engineering) "ifw" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 10 @@ -28689,15 +28481,6 @@ "igy" = ( /turf/closed/wall, /area/station/engineering/supermatter/room) -"igG" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) "igL" = ( /obj/machinery/computer/operating{ dir = 8 @@ -28736,6 +28519,44 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/sorting) +"ihr" = ( +/obj/item/toy/crayon/orange, +/obj/effect/decal/cleanable/crayon{ + icon_state = "i"; + name = "graffiti"; + paint_colour = "#FF9300"; + pixel_x = 8; + pixel_y = -32 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "i"; + name = "graffiti"; + paint_colour = "#FF9300"; + pixel_x = 4; + pixel_y = -32 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "i"; + name = "graffiti"; + paint_colour = "#FF9300"; + pixel_y = -32 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "i"; + name = "graffiti"; + paint_colour = "#FF9300"; + pixel_x = -4; + pixel_y = -32 + }, +/obj/effect/decal/cleanable/crayon{ + icon_state = "x"; + name = "graffiti"; + paint_colour = "#FF9300"; + pixel_x = 4; + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/station/engineering/main) "ihu" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/grimy, @@ -28762,16 +28583,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"iih" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/storage/toolbox/electrical{ - pixel_x = 4; - pixel_y = 9 - }, -/obj/item/stock_parts/cell/high, -/turf/open/floor/iron/dark, -/area/station/science/explab) "iij" = ( /obj/machinery/door/airlock/command{ name = "Research Director's Office" @@ -28786,10 +28597,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) -"iis" = ( -/obj/machinery/bci_implanter, -/turf/open/floor/iron, -/area/station/science/explab) "iiw" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -28803,6 +28610,30 @@ "iix" = ( /turf/closed/wall/r_wall, /area/station/science/lower) +"iiF" = ( +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = -24 + }, +/obj/structure/sign/directions/medical{ + dir = 4; + pixel_y = -32 + }, +/obj/structure/sign/directions/engineering{ + dir = 4; + pixel_y = -40 + }, +/obj/machinery/light/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/neutral/filled/warning, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/left) "iiH" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -28853,6 +28684,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"ijk" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "ijq" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -28869,31 +28709,6 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"ijW" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 8 - }, -/obj/structure/industrial_lift/public, -/obj/machinery/elevator_control_panel/directional/west{ - linked_elevator_id = "tram_cargo_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/obj/effect/landmark/lift_id{ - specific_lift_id = "tram_cargo_lift" - }, -/obj/effect/landmark/lift_id{ - specific_lift_id = "tram_cargo_lift" - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 8 - }, -/obj/machinery/elevator_control_panel/directional/west{ - linked_elevator_id = "tram_cargo_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck"); - req_access = list("mining") - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/cargo/miningdock) "iko" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -28938,13 +28753,20 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/commons/dorms) -"ilo" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +"ilm" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/department/security) +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/smooth, +/area/station/cargo/drone_bay) "ilM" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/disposal/bin, @@ -28998,6 +28820,17 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/atmos) +"inc" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/machinery/firealarm/directional/west{ + pixel_x = -25; + pixel_y = -5 + }, +/obj/machinery/atm, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) "inn" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -29159,6 +28992,11 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"iph" = ( +/obj/machinery/light/directional/east, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/glass/reinforced, +/area/station/science/genetics) "ipt" = ( /obj/structure/disposalpipe/segment{ dir = 8 @@ -29176,29 +29014,6 @@ /obj/effect/spawner/random/trash/moisture, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/greater) -"ipP" = ( -/obj/structure/table, -/obj/item/multitool/circuit{ - pixel_x = -8 - }, -/obj/item/multitool/circuit{ - pixel_x = -4 - }, -/obj/item/multitool/circuit, -/obj/item/stock_parts/cell/high{ - pixel_x = 8; - pixel_y = 9 - }, -/obj/item/stock_parts/cell/high{ - pixel_x = 8; - pixel_y = -2 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Science - Testing Lab"; - network = list("ss13","rd") - }, -/turf/open/floor/iron, -/area/station/science/explab) "ipU" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 6 @@ -29258,12 +29073,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/genetics) -"iqO" = ( -/obj/structure/showcase/cyborg/old{ - pixel_y = 20 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) "iqZ" = ( /obj/structure/railing, /obj/machinery/door/window/right/directional/north{ @@ -29272,12 +29081,12 @@ }, /turf/open/floor/glass/reinforced, /area/station/science/genetics) -"ird" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 9 - }, -/turf/open/floor/glass/reinforced, -/area/station/security/brig) +"ira" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "irv" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 9 @@ -29314,6 +29123,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plastic, /area/station/engineering/break_room) +"irF" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/turf/open/floor/iron, +/area/station/security/brig) "irG" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/cable, @@ -29406,6 +29232,15 @@ }, /turf/open/floor/iron/stairs/medium, /area/station/commons/dorms) +"its" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/turf/open/floor/iron/dark, +/area/station/science/lower) "itu" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29519,6 +29354,15 @@ /obj/item/pillow/random, /turf/open/floor/carpet, /area/station/commons/dorms) +"iuK" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "iuM" = ( /obj/structure/table/wood/fancy/royalblue, /obj/machinery/door/window{ @@ -29623,12 +29467,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/courtroom/holding) -"iwi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/relic, -/turf/open/floor/plating, -/area/station/maintenance/department/security) "iwm" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/north, @@ -29687,13 +29525,6 @@ "ixc" = ( /turf/open/misc/asteroid, /area/station/engineering/atmos) -"ixf" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 10 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/commons/dorms) "ixq" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29711,16 +29542,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/port/central) -"ixs" = ( -/obj/machinery/light/neon_lining{ - icon_state = "pink2_1" - }, -/obj/machinery/light/neon_lining{ - dir = 8; - icon_state = "pink2_1" - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/bitrunning/den) "ixu" = ( /obj/structure/closet/crate/science{ name = "MOD core crate" @@ -29788,6 +29609,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/medical) +"iyh" = ( +/obj/structure/chair/office, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/science/lower) "iyi" = ( /obj/effect/turf_decal/stripes/end, /obj/structure/cable/multilayer/multiz, @@ -29815,6 +29642,12 @@ }, /turf/open/floor/iron, /area/station/cargo/miningdock) +"iyC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/science/lower) "iyK" = ( /obj/machinery/telecomms/bus/preset_two, /turf/open/floor/iron/dark/telecomms, @@ -29866,6 +29699,21 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"izZ" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/newscaster/directional/east, +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = -37 + }, +/turf/open/floor/iron/dark, +/area/station/commons/vacant_room/commissary) "iAb" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -29901,13 +29749,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/station/maintenance/department/cargo) -"iAt" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace/airless, -/area/station/asteroid) "iAx" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29942,6 +29783,17 @@ }, /turf/open/floor/iron/textured_large, /area/station/security/execution/education) +"iBp" = ( +/obj/effect/landmark/start/hangover, +/obj/machinery/duct, +/obj/structure/fluff{ + desc = "What, you think the water just magically soaks into the metallic flooring?"; + icon = 'icons/obj/lavaland/survival_pod.dmi'; + icon_state = "fan_tiny"; + name = "shower drain" + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "iBx" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -29969,11 +29821,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"iBT" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/flora/bush/fullgrass/style_random, -/turf/open/misc/grass/jungle, -/area/station/science/explab) "iBU" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, @@ -29985,23 +29832,6 @@ }, /turf/open/floor/iron/freezer, /area/station/commons/toilet) -"iCu" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/turf/open/floor/iron, -/area/station/security/brig) "iCA" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -30012,6 +29842,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/greater) +"iDl" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/turf/open/space/openspace, +/area/station/solars/starboard/fore) "iDB" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -30103,6 +29938,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/execution/transfer) +"iFz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/escape) "iFB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/crayon{ @@ -30303,6 +30145,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/service/bar/backroom) +"iIx" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, +/obj/machinery/cassette/adv_cassette_deck, +/turf/open/floor/wood, +/area/station/service/library) "iIz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/red/filled/line, @@ -30322,6 +30173,25 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/main) +"iIM" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/door/airlock/vault{ + name = "Bank of Cargo" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/supply/vault, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/landmark/navigate_destination/tram/bankofcargo, +/turf/open/floor/iron/dark, +/area/station/cargo/miningdock/oresilo) "iIW" = ( /turf/closed/mineral/random/stationside/asteroid/porus, /area/station/maintenance/starboard/greater) @@ -30332,6 +30202,22 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) +"iJh" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only, +/turf/open/floor/glass/reinforced, +/area/station/security/brig) +"iJj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/rack, +/obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/thermal_regulator, +/turf/open/floor/iron, +/area/station/engineering/main) "iJm" = ( /obj/structure/table, /obj/machinery/fax{ @@ -30341,6 +30227,18 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/department/security) +"iJF" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "iJJ" = ( /obj/item/assembly/mousetrap/armed, /obj/effect/decal/cleanable/dirt, @@ -30368,6 +30266,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/virology) +"iKq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/asteroid) "iKr" = ( /obj/effect/turf_decal/bot_white/left, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -30416,31 +30325,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"iLh" = ( -/obj/structure/sign/directions/supply{ - dir = 4; - pixel_y = 24 - }, -/obj/structure/sign/directions/security{ - dir = 1; - pixel_y = 40 - }, -/obj/structure/sign/directions/command{ - dir = 1; - pixel_y = 40 - }, -/obj/machinery/light/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/left) "iLn" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, @@ -30474,6 +30358,10 @@ }, /turf/open/floor/wood, /area/station/service/bar/backroom) +"iLx" = ( +/obj/machinery/light/directional/west, +/turf/open/openspace, +/area/station/asteroid) "iLD" = ( /obj/machinery/chem_mass_spec, /obj/effect/turf_decal/tile/yellow/fourcorners, @@ -30523,10 +30411,6 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"iMh" = ( -/obj/structure/sign/directions/dorms/directional/west, -/turf/closed/wall, -/area/station/maintenance/department/crew_quarters/dorms) "iMj" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/white/full, @@ -30582,12 +30466,29 @@ }, /turf/open/floor/plastic, /area/station/engineering/break_room) +"iMO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet, +/obj/effect/spawner/random/engineering/material_cheap, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/iron/smooth, +/area/station/maintenance/department/cargo) "iNc" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/brig) +"iNe" = ( +/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "iNo" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -30635,13 +30536,6 @@ /obj/structure/fluff/tram_rail, /turf/open/openspace, /area/station/hallway/primary/tram/right) -"iOh" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "iOi" = ( /turf/open/floor/wood/large, /area/station/service/library) @@ -30661,16 +30555,6 @@ }, /turf/open/misc/asteroid/airless, /area/station/asteroid) -"iOC" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external/glass{ - name = "The Noise's Jam-Tastic Radical Listening Post" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/mapping_helpers/airlock/access/all/service/theatre, -/turf/open/ballpit, -/area/ruin/powered/clownplanet) "iOG" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -30712,6 +30596,10 @@ /obj/machinery/light/directional/west, /turf/open/floor/catwalk_floor, /area/station/command/teleporter) +"iPu" = ( +/mob/living/carbon/human/species/monkey, +/turf/open/misc/dirt/jungle, +/area/station/science/lower) "iPx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -30748,6 +30636,29 @@ }, /turf/open/floor/iron/white, /area/station/science/auxlab/firing_range) +"iQt" = ( +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = -24 + }, +/obj/structure/sign/directions/medical{ + dir = 8; + pixel_y = -32 + }, +/obj/structure/sign/directions/engineering{ + dir = 8; + pixel_y = -40 + }, +/obj/machinery/light/directional/south, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/neutral/filled/warning, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) "iQC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/sorting/mail/flip{ @@ -30756,13 +30667,6 @@ /obj/effect/mapping_helpers/mail_sorting/science/rd_office, /turf/open/floor/iron/white, /area/station/science/research) -"iQF" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/dark/visible{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) "iQH" = ( /obj/machinery/computer/security/mining{ dir = 1 @@ -30801,6 +30705,18 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/department/cargo) +"iRg" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/any/security/maintenance, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/central/greater) "iRm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/event_spawn, @@ -30874,15 +30790,6 @@ }, /turf/open/floor/carpet, /area/station/command/heads_quarters/hos) -"iSw" = ( -/obj/machinery/griddle, -/obj/structure/sign/poster/contraband/clown{ - pixel_y = 4; - pixel_x = 32 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/ruin/powered/clownplanet) "iSF" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 @@ -30910,9 +30817,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/science) -"iTi" = ( -/turf/closed/wall, -/area/station/bitrunning/den) "iTm" = ( /obj/structure/table/glass, /obj/item/storage/pill_bottle/mannitol, @@ -31035,6 +30939,16 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"iUv" = ( +/obj/structure/railing, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/cargo) "iUw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31229,6 +31143,13 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"iWT" = ( +/obj/effect/spawner/structure/window, +/obj/structure/sign/directions/engineering{ + pixel_y = 40 + }, +/turf/open/floor/plating, +/area/station/medical/medbay/lobby) "iXe" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -31415,10 +31336,6 @@ /obj/effect/spawner/random/clothing/bowler_or_that, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/dorms) -"jap" = ( -/obj/structure/chair/office, -/turf/open/floor/carpet/neon/simple/yellow, -/area/ruin/powered/clownplanet) "jav" = ( /obj/structure/alien/weeds/node, /turf/open/misc/asteroid/airless, @@ -31548,20 +31465,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/safe) -"jcJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - location = "QM #1" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #1"; - suffix = "#1" - }, -/turf/open/floor/iron/smooth, -/area/station/cargo/drone_bay) "jcM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -31614,26 +31517,12 @@ }, /turf/open/floor/iron, /area/station/security/prison/safe) -"jdF" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "jdN" = ( /obj/machinery/vending/tool, /obj/effect/turf_decal/trimline/red/corner, /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/plastic, /area/station/engineering/break_room) -"jdU" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 9 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/cargo/miningdock) "jdZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -31768,10 +31657,6 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/dorms) -"jfu" = ( -/obj/structure/cable, -/turf/closed/wall/r_wall, -/area/station/ai_monitored/turret_protected/aisat/hallway) "jfD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -31834,6 +31719,19 @@ /obj/structure/stairs/south, /turf/open/floor/iron/stairs/medium, /area/station/security/checkpoint/supply) +"jgY" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/siding/thinplating/corner, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/obj/structure/cable, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "jha" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -31852,14 +31750,14 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit) "jhb" = ( -/obj/structure/lattice/catwalk, -/obj/structure/ladder, -/obj/machinery/light/small/directional/west, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/openspace, -/area/station/maintenance/department/security) +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/science/lower) "jhd" = ( /turf/open/space/openspace, /area/space) @@ -31916,14 +31814,6 @@ }, /turf/open/floor/plastic, /area/station/engineering/break_room) -"jil" = ( -/obj/structure/closet{ - name = "Evidence Closet 4" - }, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/evidence) "jim" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ @@ -32027,12 +31917,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) -"jjY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/effect/spawner/random/engineering/flashlight, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) "jkc" = ( /obj/machinery/status_display/ai/directional/west, /obj/structure/chair/office{ @@ -32150,6 +32034,10 @@ /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/station/asteroid) +"jlI" = ( +/obj/structure/sign/directions/vault/directional/north, +/turf/closed/wall/r_wall, +/area/station/maintenance/port/central) "jlP" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/engineering/atmospherics_portable, @@ -32212,19 +32100,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/tcommsat/computer) -"jmR" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/landmark/navigate_destination/hop, -/obj/structure/railing, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) "jne" = ( /obj/effect/turf_decal/siding/wideplating/corner{ dir = 1 @@ -32407,13 +32282,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"jpP" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 6 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/science/lower) "jpV" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -32509,13 +32377,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"jqH" = ( -/obj/structure/chair/comfy/carp{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/vaporwave, -/area/station/service/library/upper) "jqK" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -32575,16 +32436,6 @@ }, /turf/closed/wall, /area/station/maintenance/disposal) -"jrK" = ( -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/security/brig) "jrR" = ( /obj/effect/turf_decal/trimline/white/line{ dir = 5 @@ -32683,6 +32534,10 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"jto" = ( +/obj/structure/sign/directions/upload/directional/east, +/turf/closed/wall/r_wall, +/area/station/science/xenobiology) "jtp" = ( /obj/machinery/door/window/left/directional/east{ req_access = list("medical"); @@ -32758,6 +32613,11 @@ /obj/effect/turf_decal/trimline/neutral/filled/corner, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"juy" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/mob/living/carbon/human/species/monkey, +/turf/open/misc/grass/jungle, +/area/station/science/lower) "juN" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -32895,6 +32755,13 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) +"jxe" = ( +/obj/structure/chair/comfy/carp{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/vaporwave, +/area/station/service/library/upper) "jxz" = ( /obj/machinery/door/airlock/external/glass{ name = "Supply Door Airlock" @@ -33063,13 +32930,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"jAH" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 10 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/secondary/service) "jAL" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/structure/disposalpipe/segment{ @@ -33079,6 +32939,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"jAQ" = ( +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = -24 + }, +/obj/structure/sign/directions/medical{ + pixel_y = -32 + }, +/obj/structure/sign/directions/engineering{ + pixel_y = -40 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/neutral/filled/warning, +/obj/machinery/light/directional/south, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "jAU" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 4 @@ -33139,6 +33021,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"jBm" = ( +/obj/machinery/cassette/dj_station{ + pixel_y = 12 + }, +/obj/structure/table/wood, +/turf/open/floor/iron/vaporwave, +/area/station/service/library/upper) "jBy" = ( /obj/structure/sink{ dir = 4; @@ -33162,6 +33051,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) +"jBF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/structure/table, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "jCw" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -33174,6 +33076,19 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) +"jCA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/moisture_trap, +/obj/structure/railing{ + dir = 4; + layer = 4.1 + }, +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/security) "jCH" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/bar/opposingcorners, @@ -33241,14 +33156,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) -"jDQ" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/trash/food_packaging, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/department/security) "jDW" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -33332,18 +33239,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/grass, /area/station/medical/virology) -"jFt" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/suit_storage_unit/industrial, -/obj/item/mod/control/pre_equipped/cosmohonk, -/obj/item/mod/module/insignia/clown, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "jFu" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -33373,6 +33268,32 @@ /obj/structure/cable/multilayer/multiz, /turf/open/floor/plating, /area/station/ai_monitored/command/nuke_storage) +"jFV" = ( +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = 24 + }, +/obj/structure/sign/directions/medical{ + dir = 4; + pixel_y = 32 + }, +/obj/structure/sign/directions/engineering{ + dir = 4; + pixel_y = 40 + }, +/obj/machinery/light/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/left) "jGa" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -33422,13 +33343,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/brig) -"jGN" = ( -/obj/machinery/door/firedoor/border_only{ +"jGW" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ dir = 4 }, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) +/obj/structure/table/reinforced, +/obj/structure/cable/multilayer/multiz, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "jGX" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -33636,24 +33558,10 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/port/central) -"jKV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"jKZ" = ( -/obj/structure/railing, -/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/dark_blue/corner{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) +"jKU" = ( +/obj/structure/sign/directions/cryo/directional/south, +/turf/closed/wall, +/area/station/security/checkpoint/arrivals) "jLf" = ( /turf/open/floor/iron/chapel, /area/station/service/chapel) @@ -33680,6 +33588,14 @@ /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /turf/open/floor/plating, /area/station/engineering/atmos) +"jMd" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "jMo" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_atmos{ dir = 8 @@ -33688,11 +33604,6 @@ /obj/machinery/atmospherics/pipe/bridge_pipe/dark/visible, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) -"jMr" = ( -/obj/effect/turf_decal/trimline/dark_red/warning, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/secondary/service) "jMu" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/red/filled/line, @@ -33793,6 +33704,12 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white, /area/station/medical/virology) +"jNA" = ( +/obj/machinery/sparker/directional/west{ + id = "testigniter" + }, +/turf/open/floor/engine, +/area/station/science/lower) "jNE" = ( /obj/structure/table, /obj/effect/decal/cleanable/dirt, @@ -33861,6 +33778,23 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, /area/station/asteroid) +"jPi" = ( +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/corner, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) "jPo" = ( /obj/effect/turf_decal/trimline/white/warning{ dir = 4 @@ -33887,15 +33821,6 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/station/maintenance/department/science) -"jPF" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/structure/cable, -/obj/machinery/door/airlock/grunge{ - name = "Dynamic Bar Docking Port"; - desc = "This airlock is a contingency to keep any funny business from the replacable bar system. If it opens to a wall, this is intentional!" - }, -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/cargo) "jPG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -33927,9 +33852,24 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/service/library) +"jQb" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/misc/grass/jungle, +/area/station/science/lower) "jQm" = ( /turf/open/floor/engine/hull, /area/station/solars/port) +"jQq" = ( +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) +"jQs" = ( +/obj/machinery/door/airlock/grunge{ + name = "Dynamic Bar Docking Port"; + desc = "This airlock is a contingency to keep any funny business from the replacable bar system. If it opens to a wall, this is intentional!" + }, +/turf/open/floor/iron/smooth, +/area/station/maintenance/department/security) "jQw" = ( /obj/machinery/disposal/bin, /obj/machinery/firealarm/directional/north, @@ -34019,15 +33959,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) -"jSd" = ( -/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/dark_blue/corner{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) "jSe" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 5 @@ -34087,6 +34018,16 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/grimy, /area/station/hallway/secondary/entry) +"jTj" = ( +/obj/structure/railing, +/obj/effect/turf_decal/trimline/dark_blue/arrow_cw, +/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "jTo" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -34126,18 +34067,6 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) -"jTQ" = ( -/obj/structure/railing{ - layer = 3.1; - dir = 4 - }, -/obj/machinery/netpod, -/obj/machinery/light/neon_lining{ - dir = 1; - icon_state = "pink2_1" - }, -/turf/open/floor/carpet/neon/simple/purple/nodots, -/area/station/bitrunning/den) "jUa" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 4 @@ -34551,6 +34480,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal) +"jZf" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/misc/grass/jungle, +/area/station/science/lower) "jZw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/junction/flip{ @@ -34835,6 +34768,21 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"kfl" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/station/science/lower) "kfD" = ( /obj/effect/turf_decal/sand, /obj/machinery/door/airlock/external{ @@ -34855,6 +34803,10 @@ "kfO" = ( /turf/open/floor/plating, /area/station/cargo/drone_bay) +"kfT" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) "kgd" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -34903,6 +34855,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"kgL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/turf/open/openspace, +/area/station/asteroid) "kgM" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -35013,6 +34970,12 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"kjg" = ( +/obj/structure/lattice/catwalk, +/obj/item/stack/cable_coil, +/obj/structure/cable, +/turf/open/space/openspace, +/area/station/solars/port) "kjm" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -35043,6 +35006,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/miningdock) +"kkb" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 9 + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "kkc" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/open/floor/iron, @@ -35178,6 +35150,13 @@ /obj/machinery/light/directional/north, /turf/open/floor/circuit, /area/station/ai_monitored/command/nuke_storage) +"klx" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/security) "kly" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction/flip{ @@ -35280,6 +35259,18 @@ /obj/structure/spider/stickyweb, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) +"kna" = ( +/obj/machinery/netpod, +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/carpet/neon/simple/purple/nodots, +/area/station/bitrunning/den) "knl" = ( /obj/machinery/chem_dispenser/drinks{ pixel_y = 30; @@ -35306,10 +35297,6 @@ /obj/effect/turf_decal/tile/dark_green/fourcorners, /turf/open/floor/iron/white, /area/station/science/genetics) -"knr" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/carpet/neon/simple/yellow, -/area/ruin/powered/clownplanet) "knC" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/line{ dir = 8 @@ -35397,10 +35384,6 @@ /obj/effect/landmark/blobstart, /turf/open/floor/iron, /area/station/engineering/atmos) -"kpo" = ( -/obj/item/relic, -/turf/open/misc/asteroid/dug, -/area/station/maintenance/department/cargo) "kpq" = ( /obj/machinery/atmospherics/pipe/color_adapter, /turf/closed/wall/r_wall, @@ -35461,16 +35444,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"kqs" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "kqy" = ( /obj/vehicle/sealed/mecha/working/ripley/cargo, /obj/machinery/requests_console/directional/north{ @@ -35526,6 +35499,19 @@ /obj/machinery/light/directional/west, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) +"kqT" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/door/airlock/mining/glass{ + name = "MULE Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/general, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "kqY" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -35609,26 +35595,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"ksx" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/neon_lining{ - icon_state = "pink2_1" - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/bitrunning/den) -"ksP" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction/engineering) "ktl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/carpet, @@ -35809,18 +35775,38 @@ }, /turf/open/floor/iron/cafeteria, /area/station/command/heads_quarters/rd) -"kyc" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ +"kxX" = ( +/obj/item/toy/basketball{ + pixel_x = 8; + pixel_y = 14 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) +"kya" = ( +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_y = 24 + }, +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = 40 + }, +/obj/structure/sign/directions/command{ + dir = 1; + pixel_y = 40 + }, +/obj/machinery/light/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/trimline/neutral/filled/line{ +/obj/effect/turf_decal/trimline/neutral/filled/warning{ dir = 1 }, -/obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, -/area/station/cargo/warehouse) +/area/station/hallway/primary/tram/left) "kye" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, @@ -36043,6 +36029,20 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/dorms) +"kCb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/chair/comfy/carp{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) +"kCh" = ( +/obj/machinery/disposal/delivery_chute, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/misc/asteroid, +/area/ruin/powered/clownplanet) "kCk" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -36245,16 +36245,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/tram/mid) -"kFs" = ( -/obj/item/bedsheet/clown/double{ - dir = 4 - }, -/obj/structure/bed/double{ - dir = 4 - }, -/obj/item/pillow/clown, -/turf/open/floor/carpet/neon/simple/yellow, -/area/ruin/powered/clownplanet) "kFu" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -36273,13 +36263,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/cafeteria, /area/station/security/prison) -"kFD" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 6 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/commons/dorms) "kFJ" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -36497,6 +36480,32 @@ }, /turf/open/floor/catwalk_floor, /area/station/command/gateway) +"kId" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/white/full, +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/sign/directions/upload/directional/south{ + pixel_y = -39 + }, +/turf/open/floor/iron/white, +/area/station/science/research) +"kIn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "testlab"; + name = "Test Chamber Blast Door" + }, +/turf/open/floor/plating, +/area/station/science/lower) "kIE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line{ @@ -36577,6 +36586,15 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/iron/smooth, /area/station/maintenance/department/eva) +"kJS" = ( +/obj/machinery/light/directional/south, +/obj/structure/ladder, +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/asteroid) "kJU" = ( /obj/structure/chair/comfy/beige, /turf/open/floor/iron/grimy, @@ -36610,15 +36628,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"kKo" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/explab) "kKp" = ( /obj/structure/closet/wardrobe/mixed, /obj/machinery/light/directional/west, @@ -36634,13 +36643,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/lawyer, /turf/open/floor/wood, /area/station/service/lawoffice) -"kKC" = ( -/obj/structure/sign/directions/security{ - dir = 1; - pixel_y = 40 - }, -/turf/closed/wall/r_wall, -/area/station/command/heads_quarters/captain/private) "kKF" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 @@ -36704,17 +36706,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/engineering/main) -"kLV" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/machinery/firealarm/directional/west{ - pixel_x = -25; - pixel_y = -5 - }, -/obj/machinery/atm, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) "kMc" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron, @@ -36807,13 +36798,6 @@ }, /turf/open/floor/iron, /area/station/security/office) -"kMJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall, -/area/station/service/library/upper) "kMR" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -37114,14 +37098,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"kQR" = ( -/obj/structure/flora/bush/lavendergrass/style_random, -/obj/item/food/grown/banana/bunch{ - pixel_x = 5; - pixel_y = 16 - }, -/turf/open/misc/grass/jungle, -/area/station/science/explab) "kQX" = ( /obj/machinery/computer/security{ dir = 1 @@ -37162,6 +37138,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) +"kRI" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 10 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/security/execution/transfer) "kRL" = ( /turf/closed/wall, /area/station/medical/coldroom) @@ -37172,9 +37155,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/service/bar/backroom) -"kRR" = ( -/turf/open/misc/grass/jungle, -/area/station/science/explab) "kSa" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -37253,10 +37233,6 @@ }, /turf/open/floor/wood, /area/station/command/meeting_room) -"kTe" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/misc/grass/jungle, -/area/station/science/explab) "kTi" = ( /obj/machinery/duct, /obj/structure/cable, @@ -37313,14 +37289,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"kTO" = ( -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/asteroid) "kTT" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 4 @@ -37469,6 +37437,16 @@ /obj/structure/sign/warning/no_smoking/circle/directional/west, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"kWo" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Civilian - Library East" + }, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/iron/vaporwave, +/area/station/service/library/upper) "kWp" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37487,6 +37465,10 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) +"kWv" = ( +/obj/structure/sign/directions/vault/directional/east, +/turf/closed/wall/r_wall, +/area/station/command/meeting_room) "kWx" = ( /obj/structure/industrial_lift/tram/subfloor/window, /obj/structure/window/reinforced/tram/front{ @@ -37538,12 +37520,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/cargo) -"kXk" = ( -/obj/structure/lattice/catwalk, -/obj/item/stack/cable_coil, -/obj/structure/cable, -/turf/open/space/openspace, -/area/station/solars/port) "kXr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -37606,28 +37582,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/right) -"kYl" = ( -/obj/structure/rack, -/obj/structure/table, -/obj/machinery/computer/security/telescreen{ - name = "Test Chamber Monitor"; - network = list("test"); - pixel_y = 28 - }, -/obj/item/storage/box/beakers{ - pixel_x = 5; - pixel_y = 3 - }, -/obj/item/grenade/chem_grenade{ - pixel_x = -7; - pixel_y = 7 - }, -/obj/item/grenade/chem_grenade{ - pixel_x = -7; - pixel_y = 1 - }, -/turf/open/floor/iron/dark, -/area/station/science/explab) "kYp" = ( /obj/structure/industrial_lift/tram, /obj/structure/window/reinforced/tram/right/directional/south, @@ -37799,12 +37753,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/break_room) -"kZS" = ( -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/security/brig) "lai" = ( /obj/structure/chair, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -37831,6 +37779,7 @@ }, /obj/structure/cable, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "laz" = ( @@ -38038,14 +37987,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/wood/parquet, /area/station/command/meeting_room) -"ldC" = ( -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/obj/machinery/door/airlock/grunge{ - name = "Dynamic Bar Docking Port"; - desc = "This airlock is a contingency to keep any funny business from the replacable bar system. If it opens to a wall, this is intentional!" - }, -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/security) "ldD" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 8 @@ -38084,6 +38025,19 @@ /obj/effect/turf_decal/trimline/white/warning, /turf/open/floor/iron, /area/station/maintenance/tram/mid) +"leh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/explab) +"lej" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 5 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/cargo/miningdock) "lew" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -38099,32 +38053,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"leN" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/cup/glass/mug/coco{ - pixel_x = -7; - pixel_y = 7 - }, -/obj/item/reagent_containers/cup/glass/mug/coco{ - pixel_x = -6; - pixel_y = -1 - }, -/obj/item/folder/yellow{ - pixel_x = 5; - pixel_y = 3 - }, -/obj/item/pen{ - pixel_x = 6 - }, -/obj/machinery/light/neon_lining{ - icon_state = "pink2_1" - }, -/obj/machinery/light/neon_lining{ - dir = 4; - icon_state = "pink2_1" - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/bitrunning/den) "leV" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch, @@ -38237,6 +38165,7 @@ "lgO" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "lgP" = ( @@ -38355,12 +38284,10 @@ }, /turf/open/floor/iron, /area/station/security/office) -"ljC" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/landmark/navigate_destination/lawyer, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/grimy, -/area/station/service/lawoffice) +"ljE" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/engine, +/area/station/science/lower) "ljI" = ( /obj/machinery/door/airlock/research/glass{ name = "Experimentation Lab" @@ -38379,6 +38306,20 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/auxlab/firing_range) +"ljQ" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/turf/open/floor/iron, +/area/station/security/brig) "ljU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -38568,14 +38509,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"lmx" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/asteroid) "lmy" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -38609,6 +38542,13 @@ /obj/machinery/door/poddoor/massdriver_chapel, /turf/open/floor/plating, /area/station/service/chapel/monastery) +"lni" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "lnk" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -38812,6 +38752,20 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/dorms) +"lpN" = ( +/obj/effect/turf_decal/siding/thinplating/corner, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/storage) "lpS" = ( /obj/effect/turf_decal/bot, /obj/structure/transit_tube, @@ -38849,6 +38803,21 @@ /obj/effect/turf_decal/trimline/neutral/corner, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"lqs" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "Air Outlet Pump" + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "lqy" = ( /obj/effect/turf_decal/tile/blue/half/contrasted, /obj/effect/turf_decal/tile/neutral{ @@ -39122,12 +39091,6 @@ }, /turf/open/floor/carpet, /area/station/service/library) -"lwy" = ( -/obj/machinery/porta_turret/ai, -/obj/machinery/light/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/hallway) "lwB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -39267,12 +39230,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) -"lyK" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "lyQ" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/iron/white, @@ -39330,6 +39287,13 @@ /obj/item/chair/stool, /turf/open/floor/iron, /area/station/maintenance/starboard/central) +"lzT" = ( +/obj/effect/turf_decal/siding/thinplating, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/glass/reinforced, +/area/station/security/brig) "lAk" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -39372,6 +39336,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, /area/station/engineering/atmospherics_engine) +"lAN" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 9 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/secondary/construction/engineering) "lAO" = ( /obj/machinery/atmospherics/pipe/smart/manifold/violet/visible{ dir = 4 @@ -39379,14 +39350,6 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos) -"lAR" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "lBP" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, @@ -39440,6 +39403,16 @@ /obj/machinery/light/directional/north, /turf/open/openspace, /area/station/security/brig) +"lCR" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "lCT" = ( /obj/effect/turf_decal/trimline/white/filled/line{ dir = 1 @@ -39469,16 +39442,6 @@ /obj/structure/sign/departments/medbay/alt, /turf/closed/wall, /area/station/medical/medbay/lobby) -"lDw" = ( -/obj/machinery/door/airlock/glass{ - name = "Break Room" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/supply/mining, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/cargo/miningdock/cafeteria) "lDM" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/item/radio/intercom/directional/south, @@ -39736,29 +39699,13 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) -"lIN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/filingcabinet/chestdrawer{ - pixel_y = 2 - }, -/obj/item/paper{ - default_raw_text = "what the hell is this thing....???? tell me ur secrets you devil machine!!! i will not be denied!!!!!"; - name = "scribbled notes" - }, -/obj/structure/sign/clock/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - location = "QM #6" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/mob/living/simple_animal/bot/mulebot{ - home_destination = "QM #6"; - suffix = "#6" +"lIK" = ( +/obj/structure/railing{ + dir = 4; + layer = 4.1 }, -/turf/open/floor/iron/smooth, -/area/station/cargo/drone_bay) +/turf/open/openspace, +/area/station/security/brig) "lIQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -39891,6 +39838,14 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/station/command/bridge) +"lMe" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 9 + }, +/obj/machinery/status_display/evac/directional/north, +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/iron, +/area/station/commons/dorms) "lMg" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -39912,6 +39867,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/gravity_generator) +"lMt" = ( +/obj/structure/sign/directions/upload{ + pixel_y = 25 + }, +/turf/closed/wall, +/area/station/commons/vacant_room/commissary) "lMw" = ( /obj/machinery/door/airlock{ id_tag = "Toilet3"; @@ -40110,29 +40071,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron, /area/station/cargo/storage) -"lPu" = ( -/obj/structure/sign/directions/supply{ - dir = 4; - pixel_y = -24 - }, -/obj/structure/sign/directions/security{ - dir = 8; - pixel_y = -32 - }, -/obj/structure/sign/directions/command{ - dir = 8; - pixel_y = -40 - }, -/obj/machinery/light/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/warning, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "lPM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -40381,6 +40319,15 @@ /obj/effect/spawner/random/engineering/material, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) +"lSL" = ( +/obj/machinery/computer/quantum_console{ + dir = 1 + }, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "lSQ" = ( /obj/structure/disposalpipe/sorting/wrap/flip{ dir = 1 @@ -40424,27 +40371,6 @@ /obj/structure/lattice/catwalk/mining, /turf/open/lava, /area/station/security/execution/education) -"lTM" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) "lTP" = ( /obj/structure/stairs/south, /turf/open/floor/iron/stairs/medium{ @@ -40493,17 +40419,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"lUa" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/lobby) "lUf" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /turf/open/floor/iron, @@ -40613,6 +40528,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"lVM" = ( +/obj/structure/ladder, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/vaporwave, +/area/station/service/library/upper) +"lWg" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on, +/obj/machinery/light/directional/north, +/turf/open/floor/engine, +/area/station/science/lower) "lWj" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -40737,6 +40662,15 @@ }, /turf/open/floor/iron/dark, /area/station/engineering) +"lYj" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/glass/reinforced, +/area/station/ai_monitored/turret_protected/aisat/hallway) "lYr" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -40801,6 +40735,18 @@ "lZl" = ( /turf/open/floor/iron/stairs/left, /area/station/command/gateway) +"lZq" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/escapepodbay) "lZJ" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2{ dir = 4 @@ -40965,6 +40911,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"mcP" = ( +/obj/structure/sign/directions/upload/directional/east, +/turf/open/floor/iron/stairs/right, +/area/station/science/lower) "mcU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41169,14 +41119,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"meO" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Bridge" - }, -/obj/effect/mapping_helpers/airlock/access/all/command/general, -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron, -/area/station/command/bridge) "mfB" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 1 @@ -41184,21 +41126,30 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos) +"mfC" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/lower) "mfF" = ( /obj/structure/sign/painting/library_private{ pixel_y = -32 }, /turf/open/floor/engine/cult, /area/station/service/library) -"mfL" = ( -/obj/structure/reagent_dispensers/foamtank{ - tank_volume = 1000; - reagent_id = /datum/reagent/lube/superlube; - desc = "A wheeled lubricant tank designed for clowns on interstellar voyages. There is a Donk Co logo on the front."; - name = "Lubricant Reservoir" +"mfH" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 8 }, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/glass/reinforced, +/area/station/security/brig) "mfT" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -41236,6 +41187,11 @@ }, /turf/open/floor/iron/freezer, /area/station/science/lower) +"mga" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/science/lower) "mgh" = ( /obj/structure/sign/clock/directional/north, /turf/open/openspace, @@ -41309,10 +41265,6 @@ "mgS" = ( /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"mgU" = ( -/obj/structure/sign/directions/cryo/directional/south, -/turf/closed/wall, -/area/station/security/checkpoint/arrivals) "mhl" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -41593,6 +41545,9 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "mmv" = ( @@ -41608,10 +41563,6 @@ }, /turf/open/floor/glass, /area/station/command/meeting_room) -"mmy" = ( -/obj/structure/flora/bush/jungle/c/style_random, -/turf/open/misc/grass/jungle, -/area/station/science/explab) "mmH" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "funnywindow" @@ -41657,6 +41608,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/cargo/miningdock) +"mnG" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/glass/reinforced, +/area/station/ai_monitored/turret_protected/aisat/hallway) "mnJ" = ( /obj/effect/turf_decal/box/white{ color = "#52B4E9" @@ -41723,12 +41683,6 @@ "moz" = ( /turf/open/floor/iron, /area/station/science/robotics/mechbay) -"moE" = ( -/obj/machinery/vending/wardrobe/science_wardrobe, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/sign/directions/upload/directional/south, -/turf/open/floor/iron/white, -/area/station/science/lower) "moH" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, @@ -41736,15 +41690,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/security/checkpoint/science) -"moP" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/airalarm/directional/west, -/obj/machinery/cassette/adv_cassette_deck, -/turf/open/floor/wood, -/area/station/service/library) "moU" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 5 @@ -41765,6 +41710,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/commons/vacant_room/office) +"mpd" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/powered/clownplanet) "mpe" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/effect/turf_decal/bot, @@ -42007,6 +41959,15 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/central) +"mtv" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/dark/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "mtw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/window/spawner/directional/east, @@ -42014,9 +41975,6 @@ /obj/effect/spawner/random/maintenance/five, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"mtI" = ( -/turf/closed/wall, -/area/station/science/explab) "mtJ" = ( /obj/structure/cable/layer1, /obj/effect/decal/cleanable/dirt, @@ -42128,6 +42086,15 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/cargo/drone_bay) +"mvu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/port/central) "mvy" = ( /obj/structure/chair/sofa/corner{ dir = 8 @@ -42201,6 +42168,16 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) +"mwO" = ( +/obj/machinery/door/airlock/research{ + name = "Artifact Lab" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/ordnance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron/white, +/area/station/science/ordnance) "mxf" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 @@ -42474,19 +42451,6 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron/freezer, /area/station/commons/toilet) -"mCR" = ( -/obj/effect/turf_decal/trimline/green/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/green/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/effect/turf_decal/trimline/yellow/corner{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) "mCS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -42660,6 +42624,11 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/maintenance/department/medical) +"mFF" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/grimy, +/area/ruin/powered/clownplanet) "mFG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/warning{ @@ -42667,6 +42636,16 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/department/medical) +"mFM" = ( +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "mFQ" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 1 @@ -42689,18 +42668,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"mFY" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "mGl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit, @@ -42762,6 +42729,10 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/hallway/primary/tram/left) +"mGY" = ( +/obj/effect/spawner/random/loafer, +/turf/open/floor/iron/smooth, +/area/station/maintenance/department/eva) "mHl" = ( /obj/structure/railing, /obj/effect/decal/cleanable/dirt, @@ -42786,6 +42757,29 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/department/science) +"mHI" = ( +/obj/structure/table, +/obj/item/multitool/circuit{ + pixel_x = -8 + }, +/obj/item/multitool/circuit{ + pixel_x = -4 + }, +/obj/item/multitool/circuit, +/obj/item/stock_parts/cell/high{ + pixel_x = 8; + pixel_y = 9 + }, +/obj/item/stock_parts/cell/high{ + pixel_x = 8; + pixel_y = -2 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Science - Testing Lab"; + network = list("ss13","rd") + }, +/turf/open/floor/iron, +/area/station/science/lower) "mHO" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -42881,6 +42875,20 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"mJg" = ( +/obj/structure/table, +/obj/machinery/camera/directional/north{ + c_tag = "Service - Hydroponics" + }, +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/machinery/plantgenes, +/obj/item/botanical_lexicon, +/obj/item/botanical_lexicon, +/obj/item/botanical_lexicon, +/obj/item/botanical_lexicon, +/obj/item/botanical_lexicon, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "mJh" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -42897,18 +42905,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/dorms) -"mJl" = ( -/obj/structure/sign/directions/security{ - dir = 1; - pixel_y = -32 - }, -/turf/open/openspace, -/area/station/hallway/primary/tram/left) "mJm" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/dark, /area/station/command/bridge) +"mJp" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/misc/grass/jungle, +/area/station/science/lower) "mJv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -43030,6 +43035,12 @@ /obj/effect/landmark/start/hangover/closet, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"mMk" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "mMn" = ( /obj/structure/closet/secure_closet/medical3, /obj/item/clothing/glasses/hud/health, @@ -43097,6 +43108,27 @@ /obj/structure/table, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/greater) +"mOb" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/effect/turf_decal/trimline/red/corner{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) +"mOc" = ( +/obj/structure/railing, +/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "mOi" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -43143,6 +43175,11 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/security) +"mOJ" = ( +/obj/effect/turf_decal/siding/thinplating/corner, +/obj/effect/turf_decal/trimline/red/corner, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) "mOM" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -43197,14 +43234,6 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"mPf" = ( -/obj/machinery/holopad, -/obj/effect/landmark/navigate_destination/bridge, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "mPm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/engineering/canister, @@ -43224,6 +43253,23 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, /area/station/engineering) +"mPD" = ( +/obj/machinery/component_printer, +/turf/open/floor/iron, +/area/station/science/lower) +"mPI" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/item/storage/box/beakers{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/reagent_containers/cup/watering_can, +/obj/item/reagent_containers/cup/watering_can, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "mPN" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, @@ -43256,14 +43302,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"mQi" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos) "mQk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -43292,17 +43330,6 @@ }, /turf/open/floor/iron, /area/station/security/courtroom/holding) -"mQF" = ( -/obj/effect/landmark/start/hangover, -/obj/machinery/duct, -/obj/structure/fluff{ - desc = "What, you think the water just magically soaks into the metallic flooring?"; - icon = 'icons/obj/lavaland/survival_pod.dmi'; - icon_state = "fan_tiny"; - name = "shower drain" - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) "mQS" = ( /obj/structure/chair/comfy/beige, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -43338,10 +43365,6 @@ /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/iron, /area/station/engineering/atmos) -"mRD" = ( -/obj/item/stack/ore/glass, -/turf/open/misc/asteroid, -/area/station/science/explab) "mRI" = ( /obj/structure/ore_box, /obj/effect/turf_decal/sand/plating, @@ -43482,17 +43505,6 @@ /obj/item/extinguisher, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"mTS" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "mUd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output{ dir = 1 @@ -43544,27 +43556,18 @@ dir = 1 }, /area/station/science/robotics/lab) -"mVd" = ( -/obj/machinery/door/airlock/atmos{ - name = "The Pipe Cave" - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) "mVu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/service/janitor) +"mVK" = ( +/obj/effect/turf_decal/siding/thinplating/corner, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/glass/reinforced, +/area/station/security/brig) "mVT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -43600,12 +43603,6 @@ /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating, /area/station/solars/starboard/fore) -"mWx" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/flora/tree/palm/style_random, -/obj/effect/overlay/coconut, -/turf/open/misc/grass/jungle, -/area/station/science/explab) "mWK" = ( /obj/structure/chair/stool/directional/south, /obj/effect/landmark/start/hangover, @@ -43656,6 +43653,17 @@ /obj/effect/turf_decal/siding/thinplating/dark, /turf/open/floor/iron, /area/station/security/execution/transfer) +"mXG" = ( +/obj/structure/industrial_lift/public, +/obj/machinery/elevator_control_panel/directional/north{ + linked_elevator_id = "tram_upper_center_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 1 + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/secondary/service) "mXH" = ( /obj/structure/chair/office{ dir = 4 @@ -43722,13 +43730,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) -"mZc" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/dark/visible{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) "mZt" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -43749,13 +43750,6 @@ "mZJ" = ( /turf/closed/wall/rust, /area/station/hallway/primary/tram/right) -"mZV" = ( -/obj/machinery/disposal/delivery_chute, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/indestructible/honk, -/area/ruin/powered/clownplanet) "nag" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43820,13 +43814,9 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"naI" = ( -/obj/item/toy/basketball{ - pixel_x = 8; - pixel_y = 14 - }, -/turf/open/floor/carpet/neon/simple/yellow, -/area/ruin/powered/clownplanet) +"naK" = ( +/turf/closed/wall/rock/porous, +/area/station/science/lower) "naN" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/grunge{ @@ -43837,13 +43827,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/service/library/lounge) -"nbh" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "nbi" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 6 @@ -43953,14 +43936,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"ncv" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/space/openspace, -/area/station/solars/starboard/fore) "ncE" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/cable, @@ -44056,13 +44031,6 @@ "ney" = ( /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) -"neC" = ( -/obj/effect/turf_decal/siding/thinplating, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/glass/reinforced, -/area/station/security/brig) "neE" = ( /obj/structure/table/optable, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -44086,6 +44054,13 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/asteroid) +"nfa" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "nfd" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -44095,10 +44070,18 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"nff" = ( +/obj/structure/flora/bush/jungle/b/style_random, +/turf/open/misc/grass/jungle, +/area/station/science/lower) "nfg" = ( /obj/machinery/mineral/processing_unit_console, /turf/closed/wall, /area/station/maintenance/department/cargo) +"nfy" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/station/bitrunning/den) "nfB" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -44115,6 +44098,7 @@ }, /obj/structure/cable, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "nfR" = ( @@ -44164,6 +44148,20 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/engineering/atmos) +"ngo" = ( +/mob/living/basic/clown{ + name = "The Forbidden One"; + limb_destroyer = 1; + health = 1000; + desc = "Imprisoned for his many sins."; + maxHealth = 1000; + wound_bonus = 10 + }, +/turf/open/floor/eighties/red{ + icon = 'goon/icons/turf/floors.dmi'; + icon_state = "clown_carpet" + }, +/area/station/security/execution/education) "ngp" = ( /turf/closed/wall, /area/station/tcommsat/computer) @@ -44284,6 +44282,10 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"niO" = ( +/obj/structure/sign/directions/arrival/directional/west, +/turf/closed/wall, +/area/station/command/heads_quarters/hop) "niS" = ( /obj/structure/table/glass, /obj/item/storage/backpack/duffelbag/sec/surgery{ @@ -44433,6 +44435,13 @@ }, /turf/open/floor/plating, /area/station/cargo/sorting) +"nkE" = ( +/obj/machinery/modular_computer/console/preset/civilian{ + dir = 8 + }, +/obj/structure/window/spawner/directional/north, +/turf/open/floor/iron/dark/small, +/area/ruin/powered/clownplanet) "nkU" = ( /obj/effect/turf_decal/sand/plating, /turf/open/floor/plating/airless, @@ -44505,6 +44514,11 @@ /obj/item/clothing/mask/gas, /turf/open/floor/iron/smooth, /area/station/maintenance/central/lesser) +"nly" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/plastic, +/turf/closed/wall/r_wall, +/area/ruin/powered/clownplanet) "nlD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44514,17 +44528,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"nlN" = ( -/obj/structure/railing{ - dir = 10; - layer = 3.1 - }, -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/turf/open/openspace, -/area/station/maintenance/department/security) "nlV" = ( /obj/machinery/firealarm/directional/south, /obj/structure/cable, @@ -44555,13 +44558,6 @@ /obj/effect/landmark/generic_maintenance_landmark, /turf/open/floor/carpet, /area/station/cargo/miningdock) -"nmK" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/obj/machinery/meter, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) "nmP" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -44695,6 +44691,14 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/commons/fitness/recreation/entertainment) +"noz" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/cassette/adv_cassette_deck, +/turf/open/floor/wood/large, +/area/station/service/library) "noG" = ( /obj/machinery/button/door/directional/east{ id = "armory"; @@ -44778,12 +44782,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/office) -"npL" = ( -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/turf/open/openspace, -/area/station/asteroid) "npR" = ( /obj/machinery/recharge_station, /obj/machinery/light/small/directional/east, @@ -44836,16 +44834,11 @@ /obj/machinery/door/airlock/public/glass, /turf/open/floor/catwalk_floor, /area/station/maintenance/central/greater) -"nqB" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) +"nqv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/effect/landmark/blobstart, +/turf/open/floor/engine, +/area/station/science/lower) "nqG" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -44968,13 +44961,6 @@ /obj/structure/cable, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/aisat_interior) -"nsv" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Science - Testing Chamber"; - network = list("test","rd") - }, -/turf/open/floor/engine, -/area/station/science/explab) "nsy" = ( /obj/structure/stairs/north, /obj/structure/railing{ @@ -45020,6 +45006,25 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"ntM" = ( +/obj/structure/table, +/obj/item/storage/bag/tray, +/obj/item/kitchen/rollingpin{ + pixel_x = 6 + }, +/obj/item/reagent_containers/condiment/enzyme{ + pixel_x = -5; + pixel_y = 9 + }, +/obj/structure/window/spawner/directional/west, +/obj/item/knife/kitchen, +/obj/machinery/chem_dispenser/drinks/beer{ + pixel_y = 30; + pixel_x = 3 + }, +/obj/item/reagent_containers/cup/beaker/large, +/turf/open/floor/iron/white, +/area/ruin/powered/clownplanet) "nuc" = ( /obj/structure/table/wood, /obj/structure/window/reinforced/spawner/directional/south{ @@ -45061,6 +45066,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/chapel, /area/station/service/chapel) +"nuQ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/asteroid) "nvd" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/cable, @@ -45103,13 +45118,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/hallway/primary/tram/right) -"nvA" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) "nvB" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -45118,6 +45126,14 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/left) +"nvC" = ( +/obj/structure/closet{ + name = "Evidence Closet 5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/contraband/narcotics, +/turf/open/floor/iron/dark, +/area/station/security/evidence) "nvE" = ( /obj/effect/turf_decal/sand, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45155,15 +45171,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"nwq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/rack, -/obj/item/mod/module/plasma_stabilizer, -/obj/item/mod/module/thermal_regulator, -/turf/open/floor/iron, -/area/station/engineering/main) "nwv" = ( /obj/machinery/shower{ pixel_y = 12 @@ -45252,6 +45259,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/security) +"nxQ" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/turf/open/floor/iron/white/side, +/area/station/science/lower) "nxT" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron, @@ -45304,18 +45318,6 @@ /obj/machinery/portable_atmospherics/canister/water_vapor, /turf/open/floor/iron/smooth, /area/station/maintenance/central/greater) -"nyV" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "nzd" = ( /obj/structure/chair{ dir = 1 @@ -45389,6 +45391,9 @@ /obj/machinery/clonepod, /turf/open/floor/iron/white, /area/station/science/genetics) +"nzy" = ( +/turf/open/floor/iron/dark/small, +/area/ruin/powered/clownplanet) "nzz" = ( /obj/effect/turf_decal/trimline/red/filled/line, /mob/living/basic/pet/dog/pug/mcgriff, @@ -45444,10 +45449,6 @@ /obj/structure/cable/layer1, /turf/open/floor/plating/airless, /area/station/solars/port) -"nzO" = ( -/mob/living/carbon/human/species/monkey, -/turf/open/misc/dirt/jungle, -/area/station/science/explab) "nzR" = ( /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) @@ -45470,6 +45471,10 @@ }, /turf/open/floor/iron, /area/station/service/janitor) +"nAc" = ( +/obj/structure/lattice/catwalk, +/turf/open/floor/plating, +/area/station/engineering/atmos) "nAr" = ( /obj/structure/rack, /obj/effect/spawner/random/trash/food_packaging, @@ -45516,6 +45521,13 @@ "nAY" = ( /turf/open/openspace, /area/station/maintenance/department/cargo) +"nBe" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "nBj" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -45675,16 +45687,6 @@ /obj/machinery/door/airlock/public/glass, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/center) -"nEB" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/white/side, -/area/station/science/explab) "nED" = ( /obj/structure/railing{ dir = 4 @@ -45725,31 +45727,6 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/cargo/miningdock/cafeteria) -"nFm" = ( -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_y = 24 - }, -/obj/structure/sign/directions/medical{ - dir = 8; - pixel_y = 32 - }, -/obj/structure/sign/directions/engineering{ - dir = 8; - pixel_y = 40 - }, -/obj/machinery/light/directional/north, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) "nFn" = ( /obj/structure/chair/office/light{ dir = 4 @@ -45780,29 +45757,6 @@ }, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/foyer) -"nFE" = ( -/obj/structure/sign/directions/supply{ - dir = 1; - pixel_y = -24 - }, -/obj/structure/sign/directions/security{ - dir = 8; - pixel_y = -32 - }, -/obj/structure/sign/directions/command{ - dir = 8; - pixel_y = -40 - }, -/obj/machinery/light/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/warning, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) "nFL" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -45848,6 +45802,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/parquet, /area/station/medical/psychology) +"nGO" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 9 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/secondary/service) "nGX" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -45905,15 +45866,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/checkpoint/science) -"nHV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/button/door/directional/east{ - id = "clownbunker"; - req_access = "theatre"; - name = "Shoe Storage Annex" - }, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "nHW" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -45943,6 +45895,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/virology) +"nIP" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/flora/tree/palm/style_random, +/obj/effect/overlay/coconut, +/turf/open/misc/grass/jungle, +/area/station/science/lower) "nJf" = ( /obj/structure/spider/sticky, /turf/open/floor/grass, @@ -46132,6 +46090,13 @@ /obj/structure/sign/directions/ptl/directional/west, /turf/open/floor/iron, /area/station/engineering/main) +"nMr" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 10 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/secondary/construction/engineering) "nMu" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, @@ -46156,10 +46121,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"nNh" = ( -/obj/structure/flora/bush/sunny/style_random, -/turf/open/misc/grass/jungle, -/area/station/science/explab) "nNk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -46284,26 +46245,13 @@ "nPb" = ( /turf/closed/mineral/random/stationside/asteroid/porus, /area/ruin/powered/clownplanet) +"nPd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "nPe" = ( /turf/open/floor/carpet, /area/station/medical/psychology) -"nPj" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/landmark/start/bitrunner, -/turf/open/floor/iron/dark/textured_large, -/area/station/bitrunning/den) -"nPp" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos) "nPv" = ( /obj/machinery/autolathe, /obj/machinery/door/window/left/directional/west{ @@ -46313,6 +46261,11 @@ }, /turf/open/floor/plating, /area/station/cargo/office) +"nPA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate, +/turf/open/floor/plating, +/area/station/maintenance/department/security) "nPB" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -46369,6 +46322,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/engine_smes) +"nPU" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/glass/reinforced, +/area/station/ai_monitored/turret_protected/aisat/hallway) "nQc" = ( /obj/structure/industrial_lift/tram, /obj/structure/window/reinforced/tram/right/directional/north, @@ -46380,24 +46342,6 @@ }, /turf/open/openspace, /area/station/hallway/primary/tram/center) -"nQi" = ( -/obj/effect/turf_decal/caution/stand_clear/red{ - dir = 1 - }, -/obj/structure/industrial_lift/public, -/obj/machinery/elevator_control_panel/directional/west{ - linked_elevator_id = "tram_perma_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/obj/effect/turf_decal/caution/stand_clear/red{ - dir = 1 - }, -/obj/machinery/elevator_control_panel/directional/west{ - linked_elevator_id = "tram_perma_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/security/execution/transfer) "nQo" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 1 @@ -46492,6 +46436,7 @@ /obj/machinery/camera/directional/west{ c_tag = "Departures - East Main" }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "nRT" = ( @@ -46558,15 +46503,6 @@ }, /turf/open/floor/iron/white, /area/station/security/medical) -"nSC" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron/dark/textured_large, -/area/station/bitrunning/den) "nSI" = ( /turf/closed/wall/r_wall, /area/station/commons/vacant_room/commissary) @@ -46592,12 +46528,29 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"nTd" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/misc/grass/jungle, +/area/station/science/lower) "nTg" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/warning, /obj/effect/turf_decal/siding/thinplating, /turf/open/floor/iron, /area/station/security/checkpoint/supply) +"nTj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/railing{ + layer = 3.1 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/cargo) "nTm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46612,13 +46565,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) -"nTy" = ( -/obj/structure/railing{ - dir = 4; - layer = 4.1 - }, -/turf/open/openspace, -/area/station/security/brig) "nTG" = ( /obj/structure/table, /obj/effect/turf_decal/tile/bar/opposingcorners, @@ -46709,15 +46655,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) -"nVg" = ( -/obj/machinery/door/airlock/hatch{ - name = "Radstorm Shelter" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/maintenance/radshelter/civil) "nVm" = ( /obj/machinery/door/airlock/research/glass{ name = "Break Room" @@ -46735,14 +46672,14 @@ }, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"nVx" = ( -/obj/structure/closet{ - name = "Evidence Closet 3" +"nVt" = ( +/obj/machinery/camera/motion/directional/south{ + c_tag = "Secure - AI Upper External North"; + network = list("aicore") }, -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/evidence) +/obj/structure/cable/multilayer/connected, +/turf/open/floor/engine/hull/reinforced, +/area/station/ai_monitored/turret_protected/aisat/hallway) "nVL" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -46795,12 +46732,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lower) -"nXk" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "nXn" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -46842,6 +46773,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood, /area/station/service/bar/backroom) +"nXV" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/glass/reinforced, +/area/station/ai_monitored/turret_protected/aisat/hallway) "nYr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46884,6 +46824,16 @@ }, /turf/open/floor/iron/white, /area/station/security/medical) +"nZJ" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new/corner, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/lower) "nZL" = ( /obj/effect/turf_decal/siding/thinplating/dark{ dir = 1 @@ -46958,16 +46908,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"oai" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "oar" = ( /obj/machinery/button/door/directional/west{ id = "private_p"; @@ -46979,6 +46919,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/commons/dorms) +"oat" = ( +/turf/closed/mineral/random/stationside/asteroid/porus, +/area/station/science/lower) "oax" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch{ @@ -47157,20 +47100,9 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) -"odl" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/light/small/directional/east, -/turf/open/space/openspace, -/area/station/solars/starboard/fore) "odr" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/glass/reinforced, -/area/station/security/brig) +/turf/open/space/basic, +/area/station/cargo/mining/asteroid_magnet) "odC" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -47243,12 +47175,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/goonplaque, /area/station/hallway/secondary/entry) -"oft" = ( -/obj/item/assembly/mousetrap/armed, -/obj/effect/turf_decal/siding/wideplating/dark, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth, -/area/station/maintenance/starboard/greater) "ofv" = ( /obj/structure/chair{ dir = 4 @@ -47355,6 +47281,13 @@ /obj/effect/turf_decal/tile/purple/fourcorners, /turf/open/floor/iron/white, /area/station/science/auxlab/firing_range) +"ogA" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 10 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/secondary/service) "ogN" = ( /obj/item/gps/mining, /obj/effect/turf_decal/sand/plating, @@ -47496,12 +47429,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/wood/large, /area/station/service/library) -"ojP" = ( -/obj/structure/cable/multilayer/multiz, -/obj/effect/turf_decal/stripes/box, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/solars/port) "ojQ" = ( /obj/effect/turf_decal/trimline/blue/filled/corner, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -47560,6 +47487,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"okv" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 5 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "okA" = ( /obj/structure/table, /obj/item/computer_disk{ @@ -47667,6 +47607,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"omj" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "omm" = ( /turf/closed/wall, /area/station/maintenance/department/security) @@ -47709,13 +47657,6 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) -"onb" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 5 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/commons/dorms) "onc" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -47861,15 +47802,6 @@ dir = 9 }, /area/station/service/chapel) -"oqT" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/structure/flora/bush/sparsegrass/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/structure/railing, -/turf/open/floor/grass, -/area/station/commons/dorms) "ora" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -47877,11 +47809,30 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/engineering/atmos) +"ore" = ( +/obj/structure/railing{ + dir = 4; + layer = 4.1 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/security/brig) "orh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /turf/open/floor/plating, /area/station/engineering/atmos) +"ork" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/glass/reinforced, +/area/station/security/brig) "orr" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -47970,10 +47921,6 @@ /obj/effect/turf_decal/siding/thinplating, /turf/open/floor/glass/reinforced, /area/station/security/warden) -"osN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/engine, -/area/station/science/explab) "osT" = ( /obj/structure/cable, /turf/open/floor/iron/dark/side{ @@ -47986,6 +47933,12 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron, /area/station/commons/fitness) +"otg" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 5 + }, +/turf/open/floor/glass/reinforced, +/area/station/security/brig) "otn" = ( /obj/machinery/hydroponics/soil, /obj/machinery/status_display/evac/directional/north, @@ -48094,12 +48047,24 @@ }, /turf/open/floor/iron, /area/station/ai_monitored/security/armory) +"ovb" = ( +/turf/open/floor/glass, +/area/station/commons/fitness/recreation) "ovu" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/window/spawner/directional/north, /obj/structure/closet/wardrobe/mixed, /turf/open/floor/plating, /area/station/maintenance/department/security) +"ovv" = ( +/obj/effect/turf_decal/siding/thinplating/corner, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "ovL" = ( /turf/open/floor/iron, /area/station/hallway/secondary/service) @@ -48150,6 +48115,18 @@ /obj/structure/grille, /turf/open/floor/iron/smooth, /area/station/maintenance/department/eva) +"owh" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/railing, +/turf/open/floor/grass, +/area/station/hallway/secondary/construction/engineering) "owl" = ( /obj/effect/turf_decal/weather/snow, /obj/effect/turf_decal/weather/snow/corner{ @@ -48161,6 +48138,23 @@ /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/iron/dark, /area/station/cargo/drone_bay) +"owq" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 + }, +/obj/machinery/smartfridge/petri/preloaded, +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "owI" = ( /obj/machinery/camera/directional/west{ c_tag = "Hallway - Port Tram Platform North-West" @@ -48179,24 +48173,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor, /area/station/maintenance/port/central) -"owO" = ( -/turf/open/floor/engine, -/area/station/science/explab) "owQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/grass, /area/station/medical/virology) -"oxf" = ( -/obj/structure/railing, -/obj/effect/turf_decal/trimline/dark_blue/arrow_cw, -/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) "oxr" = ( /obj/machinery/door/airlock{ name = "Courtroom" @@ -48252,10 +48233,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron, /area/station/security/prison) -"oxT" = ( -/obj/structure/sign/directions/arrival/directional/west, -/turf/closed/wall, -/area/station/construction/mining/aux_base) +"oyn" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/storage) "oyp" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -48291,9 +48274,6 @@ }, /turf/open/floor/wood, /area/station/service/library) -"oyR" = ( -/turf/closed/mineral/random/stationside/asteroid/porus, -/area/station/science/explab) "oyV" = ( /obj/structure/toilet{ dir = 4 @@ -48529,13 +48509,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"oCH" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 5 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/science/lower) "oCR" = ( /obj/effect/turf_decal/stripes/white/full, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -48603,20 +48576,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/engineering/main) -"oDF" = ( -/mob/living/simple_animal/hostile/retaliate/clown{ - name = "The Forbidden One"; - limb_destroyer = 1; - health = 1000; - desc = "Imprisoned for his many sins."; - maxHealth = 1000; - wound_bonus = 10 - }, -/turf/open/floor/eighties/red{ - icon = 'goon/icons/turf/floors.dmi'; - icon_state = "clown_carpet" - }, -/area/station/security/execution/education) "oEz" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/yellow/arrow_cw{ @@ -48694,6 +48653,17 @@ /obj/effect/spawner/random/engineering/tank, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) +"oFY" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/landmark/event_spawn, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/glass/reinforced, +/area/station/security/brig) "oGo" = ( /obj/structure/cable, /obj/structure/disposalpipe/sorting/mail{ @@ -48760,6 +48730,14 @@ }, /turf/open/floor/iron/white, /area/station/science/lab) +"oGR" = ( +/obj/structure/cable, +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/asteroid) "oGY" = ( /obj/structure/toilet{ pixel_y = 8 @@ -48774,18 +48752,6 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron/freezer, /area/station/commons/toilet) -"oHi" = ( -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/bitrunner, -/obj/machinery/light/neon_lining{ - icon_state = "pink2_1" - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/bitrunning/den) "oHp" = ( /obj/structure/bookcase/random/nonfiction, /turf/open/floor/wood/large, @@ -48798,6 +48764,15 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron, /area/station/tcommsat/computer) +"oHM" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Bridge" + }, +/obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/landmark/navigate_destination/bridge, +/turf/open/floor/iron, +/area/station/command/bridge) "oHO" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 8 @@ -48808,6 +48783,14 @@ "oIa" = ( /turf/closed/wall, /area/station/medical/morgue) +"oIb" = ( +/obj/structure/railing, +/obj/structure/railing{ + dir = 4; + layer = 4.1 + }, +/turf/open/openspace, +/area/station/security/brig) "oIc" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -48904,6 +48887,15 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/crew_quarters/dorms) +"oKT" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/holopad/secure, +/obj/structure/cable, +/obj/structure/cable/layer1, +/turf/open/floor/glass/reinforced, +/area/station/ai_monitored/turret_protected/aisat/hallway) "oKZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -48976,6 +48968,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"oLY" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = -26 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) "oMr" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -49003,14 +49003,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"oMX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/effect/spawner/random/decoration/ornament, -/obj/item/stack/sheet/mineral/bananium/five, -/obj/item/reagent_containers/cup/beaker, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) "oMZ" = ( /obj/machinery/holopad, /obj/structure/disposalpipe/segment{ @@ -49083,6 +49075,15 @@ }, /turf/open/floor/iron/freezer, /area/station/science/lower) +"oNW" = ( +/obj/structure/bed{ + dir = 1 + }, +/obj/item/bedsheet/syndie{ + dir = 1 + }, +/turf/open/floor/iron/grimy, +/area/ruin/powered/clownplanet) "oNX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/wood/poker, @@ -49105,23 +49106,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, /area/station/maintenance/central/greater) -"oOu" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/machinery/door/airlock/research/glass{ - name = "Aseembly Lab" - }, -/obj/structure/barricade/wooden/crude, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/maintenance/starboard/central) "oOJ" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -49182,11 +49166,15 @@ "oPQ" = ( /turf/closed/mineral/random/stationside/asteroid/porus, /area/station/maintenance/starboard/lesser) -"oPS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/closed/wall, -/area/station/service/library/upper) +"oQc" = ( +/obj/machinery/netpod, +/obj/item/radio/intercom/directional/north, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/carpet/neon/simple/purple/nodots, +/area/station/bitrunning/den) "oQd" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -49259,11 +49247,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"oRz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/explab) "oRE" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/decal/cleanable/dirt, @@ -49376,15 +49359,6 @@ }, /turf/open/floor/plating, /area/station/cargo/sorting) -"oTa" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) "oTc" = ( /obj/machinery/conveyor{ dir = 6; @@ -49447,15 +49421,6 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"oTJ" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/glass/reinforced, -/area/station/security/brig) "oTK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/blue{ @@ -49629,6 +49594,17 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/commons/vacant_room/office) +"oXj" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/obj/machinery/door/airlock/external/glass{ + name = "The Noise's Jam-Tastic Radical Listening Post" + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "oXq" = ( /obj/machinery/door/poddoor/shutters{ dir = 4; @@ -49950,18 +49926,6 @@ /obj/effect/turf_decal/trimline/white/warning, /turf/open/floor/iron, /area/station/maintenance/tram/right) -"pdE" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "pdZ" = ( /obj/machinery/door/airlock/research/glass{ name = "Robotics Lab" @@ -50028,6 +49992,21 @@ /obj/item/pillow/random, /turf/open/floor/carpet, /area/station/commons/dorms) +"pfM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/closed/wall, +/area/station/service/library/upper) +"pfO" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "pfR" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -50123,21 +50102,6 @@ "phl" = ( /turf/open/floor/carpet, /area/station/command/heads_quarters/captain) -"phm" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/turf/open/openspace, -/area/station/asteroid) -"phs" = ( -/obj/structure/railing, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/department/cargo) "phB" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 8 @@ -50182,16 +50146,6 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) -"piz" = ( -/obj/structure/railing{ - dir = 4; - layer = 4.1 - }, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/security/brig) "piE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, @@ -50201,22 +50155,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/station/maintenance/central/greater) -"piQ" = ( -/obj/effect/spawner/structure/window, -/obj/structure/sign/directions/engineering{ - pixel_y = 40 - }, -/turf/open/floor/plating, -/area/station/medical/medbay/lobby) -"piT" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/turretid{ - pixel_y = -24; - req_access = "theatre" - }, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "piX" = ( /turf/open/floor/engine/n2o, /area/station/engineering/atmos) @@ -50302,6 +50240,13 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) +"pkr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/crew_quarters/dorms) "pkD" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 10 @@ -50321,6 +50266,17 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) +"pkU" = ( +/obj/effect/turf_decal/trimline/green/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/turf_decal/trimline/yellow/corner, +/turf/open/floor/iron/dark, +/area/station/service/hydroponics) "plh" = ( /obj/effect/turf_decal/siding/thinplating/corner{ dir = 4 @@ -50664,6 +50620,14 @@ }, /turf/open/floor/iron/white, /area/station/science/research) +"prb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/science/lower) "pri" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/fluff/paper/stack{ @@ -50702,24 +50666,6 @@ }, /turf/open/floor/wood/large, /area/station/service/library) -"prI" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Testing Lab" - }, -/obj/machinery/door/firedoor/heavy, -/obj/effect/mapping_helpers/airlock/access/all/science/research, -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/explab) "prL" = ( /obj/structure/closet/crate/bin, /obj/effect/spawner/random/trash/food_packaging, @@ -50800,12 +50746,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/green, /area/station/ai_monitored/command/nuke_storage) -"pth" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/structure/sign/warning/secure_area/directional/north, -/obj/effect/turf_decal/box, -/turf/open/floor/iron/dark, -/area/station/science/explab) "ptn" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -50936,7 +50876,7 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/openspace, +/turf/open/floor/iron/dark, /area/station/security/courtroom/holding) "pum" = ( /obj/effect/turf_decal/sand/plating, @@ -51039,6 +50979,16 @@ /obj/structure/cable, /turf/open/floor/glass/reinforced, /area/station/engineering/break_room) +"pvG" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "pvU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -51073,11 +51023,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/tram/mid) -"pwm" = ( -/obj/structure/railing, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/command/gateway) "pwv" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine/air, @@ -51231,6 +51176,22 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"pyu" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction/engineering) +"pyx" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 9 + }, +/turf/open/floor/glass/reinforced, +/area/station/security/brig) "pyz" = ( /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -51283,6 +51244,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/port/central) +"pyX" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/security/brig) "pza" = ( /obj/machinery/computer/department_orders/medical{ dir = 1 @@ -51351,6 +51318,27 @@ /obj/effect/decal/cleanable/oil, /turf/open/floor/mineral/titanium/blue, /area/station/maintenance/starboard/central) +"pAg" = ( +/obj/effect/turf_decal/tile/brown/fourcorners, +/obj/effect/decal/cleanable/oil/streak, +/obj/structure/sign/poster/random/directional/north, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/obj/structure/cable, +/turf/open/floor/iron/dark/smooth_large, +/area/station/bitrunning/den) +"pAk" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/flora/bush/jungle/c/style_random, +/turf/open/misc/grass/jungle, +/area/station/science/lower) "pAl" = ( /obj/machinery/light/small/directional/east, /obj/machinery/plumbing/synthesizer{ @@ -51515,19 +51503,6 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"pCm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/moisture_trap, -/obj/structure/railing{ - dir = 4; - layer = 4.1 - }, -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/security) "pCr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -51535,6 +51510,22 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/catwalk_floor, /area/station/maintenance/central/lesser) +"pCx" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Barber Shop" + }, +/obj/effect/landmark/navigate_destination/common/barber, +/turf/open/floor/wood/large, +/area/station/service/barber) +"pCE" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/service/lawoffice) "pCL" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -51702,11 +51693,15 @@ }, /turf/open/space/openspace, /area/space) -"pEM" = ( +"pEL" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/dark/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing, -/turf/open/floor/catwalk_floor, -/area/station/command/gateway) +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "pEZ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/mecha_wreckage/ripley/mk2, @@ -51766,13 +51761,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/lesser) -"pFp" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 6 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/cargo/miningdock) "pFw" = ( /obj/machinery/vending/modularpc, /obj/item/radio/intercom/directional/east, @@ -51864,28 +51852,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"pGz" = ( -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_y = -24 - }, -/obj/structure/sign/directions/medical{ - pixel_y = -32 - }, -/obj/structure/sign/directions/engineering{ - pixel_y = -40 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/warning, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/center) "pGM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/generic_maintenance_landmark, @@ -52244,6 +52210,32 @@ /obj/structure/ladder, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"pMJ" = ( +/obj/structure/rack, +/obj/item/controller{ + pixel_x = -7 + }, +/obj/item/compact_remote{ + pixel_x = -7 + }, +/obj/item/compact_remote{ + pixel_x = -7 + }, +/obj/item/integrated_circuit/loaded/speech_relay{ + pixel_x = 7 + }, +/obj/item/integrated_circuit/loaded/hello_world{ + pixel_x = 7 + }, +/obj/structure/table, +/obj/item/integrated_circuit/loaded/hello_world{ + pixel_x = 7 + }, +/obj/item/integrated_circuit/loaded/hello_world{ + pixel_x = 7 + }, +/turf/open/floor/iron, +/area/station/science/lower) "pML" = ( /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) @@ -52372,19 +52364,18 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/tram/right) -"pOv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/railing{ - dir = 9; - layer = 3.1 +"pOz" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 }, -/obj/structure/railing{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/department/cargo) +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/cargo/warehouse) "pOA" = ( /obj/structure/window/reinforced/spawner, /obj/machinery/doppler_array{ @@ -52521,26 +52512,11 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/iron/smooth, /area/station/maintenance/department/medical) -"pQx" = ( -/turf/open/misc/asteroid/dug, -/area/station/science/explab) -"pQF" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/green/fourcorners, -/obj/item/storage/box/beakers{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/botanical_lexicon, -/obj/item/botanical_lexicon, -/obj/item/botanical_lexicon, -/obj/item/botanical_lexicon, -/obj/item/botanical_lexicon, -/obj/machinery/plantgenes, -/turf/open/floor/iron/dark, -/area/station/service/hydroponics) +"pQu" = ( +/obj/machinery/light/directional/west, +/obj/structure/lattice, +/turf/open/openspace, +/area/station/asteroid) "pQY" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on/layer2{ dir = 8 @@ -52613,22 +52589,21 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"pSk" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/effect/landmark/start/bitrunner, -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "pSr" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 9 }, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) +"pSs" = ( +/obj/machinery/asteroid_magnet{ + center_x = 215; + center_y = 87; + area_size = 3 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/explab) "pSx" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -52660,6 +52635,22 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/maintenance/department/security) +"pSJ" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 5 + }, +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/siding/thinplating/corner, +/obj/item/radio/intercom/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Civilian - Dormitories West Stairwell" + }, +/obj/structure/sign/flag/nanotrasen/directional/north, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/dorms) "pSU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -52671,10 +52662,6 @@ "pSV" = ( /turf/closed/wall, /area/station/security/checkpoint/escape) -"pTj" = ( -/obj/structure/flora/bush/fullgrass/style_random, -/turf/open/misc/dirt/jungle, -/area/station/science/explab) "pTl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -52748,13 +52735,15 @@ /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) "pUV" = ( -/obj/structure/table, -/obj/item/clipboard, -/obj/item/computer_disk/quartermaster, -/obj/item/computer_disk/quartermaster, /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/structure/table, +/obj/item/folder/yellow, +/obj/item/pen{ + pixel_x = 4; + pixel_y = 4 + }, /turf/open/floor/carpet, /area/station/command/heads_quarters/qm) "pVb" = ( @@ -52777,10 +52766,26 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/surgery/fore) -"pVy" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) +"pVA" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/machinery/door/airlock/command/glass{ + name = "AI Core" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "AI Core shutters"; + name = "AI Core Shutters" + }, +/obj/machinery/flasher/directional/west{ + id = "AI" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/command/ai_upload, +/obj/structure/cable, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "pVD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/warning, @@ -52820,6 +52825,13 @@ /obj/item/food/meat/rawcutlet/plain, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) +"pWt" = ( +/obj/machinery/door/window/left/directional/north{ + name = "The Monkey Pit"; + req_access = list("science") + }, +/turf/open/misc/grass/jungle, +/area/station/science/lower) "pWw" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 4 @@ -52932,6 +52944,16 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"pYS" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/landmark/start/bitrunner, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "pYZ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -52954,9 +52976,13 @@ /turf/open/misc/asteroid, /area/station/security/prison/workout) "pZv" = ( -/obj/machinery/light/directional/west, -/turf/open/openspace, -/area/station/asteroid) +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/escape) "pZz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/red/filled/line, @@ -53135,14 +53161,6 @@ }, /turf/open/floor/iron/smooth, /area/station/service/hydroponics) -"qcR" = ( -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/obj/structure/railing, -/turf/open/openspace, -/area/station/security/brig) "qcV" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch{ @@ -53167,6 +53185,10 @@ }, /turf/open/floor/iron, /area/station/tcommsat/computer) +"qdb" = ( +/obj/structure/sign/directions/dorms/directional/east, +/turf/closed/wall, +/area/station/maintenance/department/crew_quarters/dorms) "qdd" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -53202,6 +53224,11 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/white, /area/station/security/medical) +"qdv" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/light/small/directional/east, +/turf/open/space/openspace, +/area/station/solars/starboard/fore) "qdy" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -53246,19 +53273,6 @@ }, /turf/open/floor/glass/reinforced, /area/station/security/brig) -"qea" = ( -/obj/structure/ladder, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "qec" = ( /obj/effect/turf_decal/trimline/brown/filled/corner, /obj/structure/disposalpipe/segment{ @@ -53272,10 +53286,6 @@ }, /turf/open/floor/engine, /area/station/science/ordnance/burnchamber) -"qei" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/turf/open/floor/glass/reinforced, -/area/station/science/genetics) "qes" = ( /obj/machinery/door/airlock/grunge{ name = "Entertainment Center" @@ -53417,16 +53427,12 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/dorms) -"qgM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 +"qgL" = ( +/obj/effect/landmark/navigate_destination/common/holodeck, +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" }, -/turf/open/floor/iron/smooth, -/area/station/cargo/drone_bay) +/area/station/holodeck/rec_center) "qgP" = ( /obj/structure/table, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -53506,12 +53512,6 @@ }, /turf/open/floor/iron/dark, /area/station/command/bridge) -"qir" = ( -/obj/structure/railing, -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/plastic, -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/medical) "qit" = ( /obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ dir = 1 @@ -53652,6 +53652,12 @@ /obj/structure/cable, /turf/open/floor/glass/reinforced, /area/station/engineering/break_room) +"qkI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/science/lower) "qkO" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -53705,10 +53711,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/station/medical/treatment_center) -"qlE" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/misc/grass/jungle, -/area/station/science/explab) "qlH" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 4 @@ -53733,18 +53735,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) -"qmD" = ( -/obj/structure/cable/multilayer/multiz, -/obj/effect/turf_decal/stripes/end, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/railing{ - dir = 9; - layer = 3.1 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/cargo) "qmH" = ( /obj/structure/closet/secure_closet/quartermaster, /obj/effect/turf_decal/trimline/brown/filled/line{ @@ -53810,13 +53800,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) -"qnr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/closet/secure_closet/evidence{ - name = "secure evidence closet 2" +"qns" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + location = "QM #1" }, -/turf/open/floor/iron/dark, -/area/station/security/evidence) +/obj/effect/turf_decal/tile/brown/fourcorners, +/mob/living/simple_animal/bot/mulebot{ + home_destination = "QM #1"; + suffix = "#1" + }, +/turf/open/floor/iron/smooth, +/area/station/cargo/drone_bay) "qnv" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -53826,15 +53823,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"qnA" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/explab) "qnU" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -53876,14 +53864,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/cargo/drone_bay) -"qoD" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/structure/sign/poster/contraband/tipper_cream_soda{ - pixel_y = 35 - }, -/turf/open/floor/iron/white, -/area/ruin/powered/clownplanet) "qoE" = ( /obj/structure/table, /obj/item/papercutter, @@ -54012,13 +53992,11 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"qqv" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on, -/obj/machinery/light/directional/north, -/turf/open/floor/engine, -/area/station/science/explab) "qqw" = ( -/obj/machinery/pdapainter/supply, +/obj/item/computer_disk/quartermaster, +/obj/item/computer_disk/quartermaster, +/obj/item/clipboard, +/obj/structure/table, /turf/open/floor/carpet, /area/station/command/heads_quarters/qm) "qqx" = ( @@ -54039,48 +54017,20 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"qqX" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/asteroid) -"qrc" = ( -/obj/structure/railing, -/turf/open/openspace, -/area/station/security/brig) -"qrm" = ( -/obj/structure/sign/directions/supply{ - dir = 1; - pixel_y = 24 - }, -/obj/structure/sign/directions/security{ - dir = 8; - pixel_y = 32 - }, -/obj/structure/sign/directions/command{ - dir = 8; - pixel_y = 40 - }, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 +"qqH" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/dockescpod3, /turf/open/floor/iron, -/area/station/hallway/primary/tram/right) +/area/station/escapepodbay) +"qrj" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "qrs" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/decal/cleanable/dirt, @@ -54170,6 +54120,24 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/science) +"qsB" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/space/openspace, +/area/station/solars/starboard/fore) +"qsE" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/asteroid) "qsI" = ( /obj/structure/table/wood, /obj/structure/sign/flag/nanotrasen/directional/north, @@ -54183,11 +54151,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"qsZ" = ( -/obj/item/relic, -/obj/item/stack/ore/glass, -/turf/open/misc/asteroid/dug, -/area/station/maintenance/starboard/greater) "qtb" = ( /obj/machinery/atmospherics/pipe/smart/manifold/violet/visible{ dir = 8 @@ -54506,15 +54469,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) -"qye" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) "qyg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -54603,6 +54557,15 @@ /obj/machinery/vending/wardrobe/curator_wardrobe, /turf/open/floor/engine/cult, /area/station/service/library) +"qzr" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "qzw" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/plastic{ @@ -54610,15 +54573,6 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/department/science) -"qzI" = ( -/obj/structure/sign/warning/vacuum/external/directional/south, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) "qzJ" = ( /obj/effect/landmark/start/medical_doctor, /obj/machinery/duct, @@ -55034,20 +54988,6 @@ /obj/effect/turf_decal/trimline/white/warning, /turf/open/floor/iron, /area/station/maintenance/tram/mid) -"qFY" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 5 - }, -/obj/structure/table, -/obj/item/holosign_creator/atmos, -/obj/item/holosign_creator/atmos{ - pixel_x = 5; - pixel_y = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/ordnance) "qFZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55227,31 +55167,6 @@ /obj/item/clothing/mask/whistle, /turf/open/floor/iron, /area/station/security/checkpoint/arrivals) -"qIC" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 9 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/construction/engineering) -"qIE" = ( -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/refreshing_beverage, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -9; - pixel_y = 12 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = -1; - pixel_y = 13 - }, -/obj/item/kitchen/fork, -/obj/item/plate, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "qIL" = ( /obj/structure/chair/comfy/shuttle, /obj/effect/turf_decal/stripes/line{ @@ -55356,6 +55271,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"qKu" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 5 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/secondary/service) "qKx" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/light/directional/south, @@ -55526,14 +55451,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/maintenance/department/cargo) -"qNz" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/structure/cable/multilayer/multiz, -/turf/open/floor/iron/dark, -/area/station/command/bridge) "qNA" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -55689,6 +55606,12 @@ /obj/item/paper_bin, /turf/open/floor/iron/white, /area/station/science/lobby) +"qQg" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/structure/sign/warning/secure_area/directional/north, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/dark, +/area/station/science/lower) "qQm" = ( /turf/open/floor/iron/stairs/medium{ dir = 8 @@ -55772,6 +55695,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"qRW" = ( +/obj/structure/table/wood, +/obj/structure/cassette_rack{ + pixel_x = -5; + pixel_y = 12 + }, +/turf/open/floor/iron/vaporwave, +/area/station/service/library/upper) "qSg" = ( /obj/machinery/door/airlock/security/glass{ name = "Trial Cell B" @@ -55798,16 +55729,6 @@ /obj/machinery/computer/security/telescreen/interrogation, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"qSG" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/openspace/airless, -/area/station/asteroid) "qSJ" = ( /obj/structure/door_assembly/door_assembly_shuttle, /obj/effect/turf_decal/stripes/line{ @@ -55988,6 +55909,31 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/central/greater) +"qVE" = ( +/obj/structure/rack, +/obj/item/clothing/shoes/sneakers/black{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/clothing/head/soft/black{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/gloves/fingerless, +/obj/item/clothing/shoes/sneakers/black{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/clothing/gloves/fingerless, +/obj/item/clothing/head/soft/black{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/clothing/under/syndicate, +/obj/item/clothing/under/syndicate, +/obj/item/clothing/under/misc/syndicate_souvenir, +/turf/open/floor/iron/grimy, +/area/ruin/powered/clownplanet) "qVH" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/power/apc/auto_name/directional/south, @@ -56090,13 +56036,6 @@ /obj/structure/lattice/catwalk, /turf/open/misc/asteroid, /area/station/engineering/atmos) -"qWN" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/cassette/mailbox, -/turf/open/floor/wood/parquet, -/area/station/service/library) "qWQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -56125,6 +56064,18 @@ /obj/structure/fluff/tram_rail/floor, /turf/open/floor/glass/reinforced/tram, /area/station/hallway/primary/tram/left) +"qWZ" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/construction/engineering) "qXf" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56161,11 +56112,25 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"qXA" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) +"qXI" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 6 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/science/lower) +"qXP" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 8 + }, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/structure/railing, +/turf/open/floor/grass, +/area/station/hallway/secondary/construction/engineering) "qXS" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -56336,14 +56301,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/ai_monitored/security/armory) -"ral" = ( -/obj/machinery/door/airlock/grunge{ - name = "Dynamic Bar Docking Port"; - desc = "This airlock is a contingency to keep any funny business from the replacable bar system. If it opens to a wall, this is intentional!" - }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance, -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/cargo) "ram" = ( /obj/machinery/atmospherics/pipe/smart/manifold/violet/visible{ dir = 4 @@ -56387,6 +56344,21 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lobby) +"raQ" = ( +/obj/machinery/door/airlock{ + name = "Law Office" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/service/lawyer, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/lawyer, +/turf/open/floor/wood, +/area/station/service/lawoffice) "raX" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -56519,6 +56491,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) +"rcw" = ( +/obj/structure/hoop, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "rcA" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -56533,19 +56509,16 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/carpet, /area/station/medical/psychology) -"rcH" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/openspace, -/area/station/security/brig) "rcI" = ( /obj/machinery/blackbox_recorder, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"rcR" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "rcU" = ( /obj/structure/chair{ dir = 4; @@ -56602,11 +56575,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/xenobiology) -"rec" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/closed/wall, -/area/station/bitrunning/den) "rem" = ( /obj/machinery/button/door/directional/west{ id = "private_e"; @@ -56643,13 +56611,6 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/tram/right) -"rff" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 10 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/cargo/miningdock) "rfk" = ( /obj/machinery/computer/operating, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -56916,6 +56877,11 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/smooth, /area/station/maintenance/tram/mid) +"rjk" = ( +/obj/machinery/light/directional/east, +/obj/structure/lattice, +/turf/open/openspace, +/area/station/asteroid) "rjm" = ( /obj/machinery/mineral/processing_unit{ dir = 1; @@ -56997,6 +56963,13 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/medical/medbay/lobby) +"rkx" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/all/science/ordnance, +/turf/open/floor/plating, +/area/station/science/explab) "rkI" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -57068,6 +57041,13 @@ }, /turf/open/openspace, /area/station/hallway/primary/tram/center) +"rlQ" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/storage) "rlU" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 1 @@ -57100,6 +57080,25 @@ }, /turf/open/floor/iron, /area/station/security/prison) +"rmp" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/pen{ + pixel_x = -4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + location = "QM #4" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron/smooth, +/area/station/cargo/drone_bay) +"rmr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/science/explab) "rmz" = ( /obj/effect/turf_decal/siding/thinplating/dark, /obj/structure/table, @@ -57134,6 +57133,13 @@ /obj/machinery/telecomms/broadcaster/preset_left, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"rmQ" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 5 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/commons/dorms) "rnc" = ( /obj/structure/table/wood, /obj/item/folder/blue, @@ -57209,6 +57215,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/left) +"rnX" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "rnY" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, @@ -57419,6 +57432,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/science/lobby) +"rro" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "rrv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -57511,6 +57538,21 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"rsQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/camera/directional/north{ + c_tag = "Science Firing Range"; + network = list("ss13","rd") + }, +/obj/structure/rack, +/obj/item/storage/bag/ore, +/obj/item/storage/bag/ore, +/obj/item/storage/bag/ore, +/obj/item/pickaxe, +/obj/item/pickaxe, +/obj/item/pickaxe, +/turf/open/floor/iron/dark, +/area/station/science/explab) "rsY" = ( /obj/machinery/chem_master/condimaster{ desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; @@ -57546,6 +57588,16 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"rtM" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/effect/landmark/start/bitrunner, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) "rtO" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/random/trash/bucket, @@ -57567,12 +57619,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"ruA" = ( -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/glass/reinforced, -/area/station/security/brig) "ruD" = ( /obj/effect/turf_decal/trimline/dark_green/filled/line, /obj/effect/turf_decal/trimline/purple/filled/warning, @@ -57588,6 +57634,10 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/security/prison) +"ruS" = ( +/obj/structure/sign/directions/arrival/directional/west, +/turf/closed/wall, +/area/station/construction/mining/aux_base) "ruV" = ( /obj/machinery/computer/accounting{ dir = 1 @@ -57696,6 +57746,19 @@ /obj/machinery/door/airlock/maintenance_hatch, /turf/open/floor/iron/smooth, /area/station/maintenance/department/security) +"rxs" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "rxw" = ( /obj/structure/girder, /obj/structure/grille, @@ -57877,6 +57940,15 @@ /obj/item/stock_parts/cell/high, /turf/open/floor/engine, /area/station/science/xenobiology) +"rAI" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/generic, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "rAS" = ( /turf/closed/wall, /area/station/service/library/lounge) @@ -57979,10 +58051,6 @@ "rBT" = ( /turf/closed/wall/rock, /area/station/engineering) -"rBV" = ( -/obj/item/relic, -/turf/open/misc/asteroid/dug, -/area/station/maintenance/starboard/lesser) "rBW" = ( /obj/structure/cable, /turf/open/floor/iron/dark, @@ -58006,6 +58074,10 @@ /obj/machinery/smartfridge, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"rCG" = ( +/obj/structure/sign/directions/dorms/directional/west, +/turf/closed/wall, +/area/station/maintenance/department/crew_quarters/dorms) "rCH" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -58205,22 +58277,6 @@ /obj/effect/mapping_helpers/airlock/access/any/science/robotics, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/medical) -"rHv" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/ladder, -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/turf/open/openspace, -/area/station/maintenance/department/crew_quarters/dorms) "rHC" = ( /obj/machinery/teleport/hub, /turf/open/floor/plating, @@ -58489,6 +58545,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) +"rLU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/smooth, +/area/station/cargo/drone_bay) "rMa" = ( /obj/structure/toilet{ pixel_y = 8 @@ -58526,6 +58594,13 @@ /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/station/cargo/miningdock/cafeteria) +"rMA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/landmark/navigate_destination/dockaux, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "rMB" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -58536,17 +58611,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"rMJ" = ( -/obj/machinery/light/floor/has_bulb, -/obj/effect/landmark/event_spawn, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/glass/reinforced, -/area/station/security/brig) "rMP" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, @@ -58652,20 +58716,6 @@ "rOu" = ( /turf/open/floor/iron, /area/station/hallway/primary/tram/center) -"rOx" = ( -/obj/machinery/door/airlock{ - name = "Law Office" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/service/lawyer, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/service/lawoffice) "rOB" = ( /obj/structure/rack, /obj/item/stack/cable_coil/five, @@ -58680,9 +58730,6 @@ /obj/item/clothing/gloves/latex, /turf/open/floor/iron/dark, /area/station/maintenance/department/medical) -"rOQ" = ( -/turf/closed/wall, -/area/station/service/library/upper) "rOT" = ( /obj/machinery/airalarm/directional/north, /obj/structure/cable, @@ -58692,30 +58739,6 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai) -"rOX" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/multitool{ - pixel_y = -7; - pixel_x = -8 - }, -/obj/item/screwdriver{ - pixel_y = 11 - }, -/obj/item/assembly/signaler{ - pixel_x = 2; - pixel_y = 4 - }, -/obj/structure/sign/calendar/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - location = "QM #5" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron/smooth, -/area/station/cargo/drone_bay) "rPc" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/extinguisher_cabinet/directional/north, @@ -58846,11 +58869,6 @@ }, /turf/open/misc/asteroid/dug, /area/station/maintenance/department/cargo) -"rQR" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/turf/open/space/openspace, -/area/station/solars/starboard/fore) "rQT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58986,15 +59004,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"rSK" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) "rSZ" = ( /obj/effect/turf_decal/stripes/end{ dir = 1 @@ -59007,6 +59016,18 @@ }, /turf/open/floor/plating, /area/station/ai_monitored/command/nuke_storage) +"rTc" = ( +/obj/structure/railing{ + layer = 3.1; + dir = 4 + }, +/obj/machinery/netpod, +/obj/machinery/light/neon_lining{ + dir = 1; + icon_state = "pink2_1" + }, +/turf/open/floor/carpet/neon/simple/purple/nodots, +/area/station/bitrunning/den) "rTm" = ( /obj/structure/sign/warning/vacuum/external{ pixel_x = 32 @@ -59023,6 +59044,13 @@ }, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"rTz" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/landmark/navigate_destination/dockescpod2, +/turf/open/floor/iron, +/area/station/escapepodbay) "rTP" = ( /obj/effect/turf_decal/box/white{ color = "#52B4E9" @@ -59152,15 +59180,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"rXQ" = ( -/obj/machinery/netpod, -/obj/item/radio/intercom/directional/north, -/obj/machinery/light/neon_lining{ - dir = 1; - icon_state = "pink2_1" - }, -/turf/open/floor/carpet/neon/simple/purple/nodots, -/area/station/bitrunning/den) "rYd" = ( /obj/structure/bodycontainer/morgue{ dir = 2 @@ -59244,6 +59263,13 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/crew_quarters/dorms) +"rZt" = ( +/obj/effect/spawner/structure/window, +/obj/structure/sign/directions/upload/directional/south{ + pixel_y = -39 + }, +/turf/open/floor/plating, +/area/station/science/lobby) "rZu" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/engineering/tank, @@ -59267,19 +59293,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison) -"rZH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery/white{ - color = "#52B4E9" - }, -/obj/effect/landmark/generic_maintenance_landmark, -/obj/structure/closet/body_bag, -/mob/living/simple_animal/hostile/skeleton{ - name = "Jim"; - desc = "Left to rot in maintenance, a poor soul whose green light was never noticed by the doctor..." - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/department/medical) "rZI" = ( /obj/machinery/hydroponics/soil, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -59330,6 +59343,16 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"sap" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/smooth, +/area/station/maintenance/port/central) "sau" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -59373,6 +59396,13 @@ /mob/living/basic/pet/dog/corgi/puppy, /turf/open/floor/grass, /area/station/maintenance/department/medical) +"sba" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/greater) "sbh" = ( /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/engine/air, @@ -59432,6 +59462,15 @@ /obj/item/key/security, /turf/open/floor/iron, /area/station/security/checkpoint/science) +"sbR" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/station/security/brig) "sbV" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/yellow/warning{ @@ -59698,6 +59737,12 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) +"sgL" = ( +/obj/item/assembly/mousetrap/armed, +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/maintenance/starboard/greater) "sgN" = ( /obj/machinery/computer/atmos_control/plasma_tank{ dir = 8 @@ -59729,10 +59774,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/lower) -"sha" = ( -/mob/living/simple_animal/sloth/paperwork, -/turf/open/floor/glass, -/area/station/cargo/storage) "shg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59748,6 +59789,27 @@ dir = 1 }, /area/station/maintenance/starboard/lesser) +"shA" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 1 + }, +/obj/machinery/camera/emp_proof/directional/south{ + c_tag = "Engineering - Atmospherics South-East"; + network = list("ss13","engineering") + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/machinery/firealarm/directional/south, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 9 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "shF" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/binary/pump{ @@ -59804,6 +59866,30 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/lower) +"siU" = ( +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_y = 24 + }, +/obj/structure/sign/directions/security{ + dir = 8; + pixel_y = 32 + }, +/obj/structure/sign/directions/command{ + dir = 8; + pixel_y = 40 + }, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/center) "siX" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 5 @@ -59879,16 +59965,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"skh" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 5 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/secondary/service) "ski" = ( /turf/open/floor/carpet, /area/station/hallway/secondary/entry) @@ -59946,26 +60022,6 @@ /obj/item/ai_module/zeroth/coderedmartiallaw, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) -"slw" = ( -/obj/structure/table, -/obj/item/storage/bag/tray, -/obj/item/kitchen/rollingpin{ - pixel_x = 6 - }, -/obj/item/reagent_containers/condiment/enzyme{ - pixel_x = -5; - pixel_y = 9 - }, -/obj/structure/window/spawner/directional/west, -/obj/item/knife/kitchen, -/obj/machinery/chem_dispenser/drinks/beer{ - pixel_y = 30; - pixel_x = 3 - }, -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/cup/beaker/large, -/turf/open/floor/iron/white, -/area/ruin/powered/clownplanet) "slx" = ( /obj/structure/hoop{ dir = 4 @@ -60008,6 +60064,16 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) +"sme" = ( +/obj/machinery/door/airlock/hatch{ + name = "Radstorm Shelter" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/navigate_destination/tram/radshelter, +/turf/open/floor/iron/dark, +/area/station/maintenance/radshelter/civil) "smj" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60082,6 +60148,15 @@ }, /turf/open/floor/iron, /area/station/commons/fitness) +"snG" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/turf/open/openspace, +/area/station/asteroid) "snK" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -60118,6 +60193,13 @@ "soq" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/science) +"sou" = ( +/obj/structure/railing, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/openspace, +/area/station/security/brig) "soL" = ( /obj/structure/table/glass, /obj/item/stack/sheet/mineral/plasma{ @@ -60143,6 +60225,14 @@ /obj/machinery/duct, /turf/open/floor/catwalk_floor, /area/station/maintenance/central/greater) +"soY" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace, +/area/station/asteroid) "sph" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -60351,18 +60441,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"ssA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/smooth, -/area/station/cargo/drone_bay) "ssC" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -60401,6 +60479,20 @@ /obj/machinery/portable_atmospherics/scrubber, /turf/open/floor/iron, /area/station/engineering/atmos) +"sts" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/light/neon_lining{ + dir = 8; + icon_state = "pink2_1" + }, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 4 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Cargo - Bitrunning Den" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "stt" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/warning, @@ -60441,14 +60533,6 @@ /obj/item/food/cakeslice/birthday, /turf/open/floor/eighties/red, /area/station/commons/fitness/recreation/entertainment) -"sue" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 9 - }, -/obj/machinery/status_display/evac/directional/north, -/obj/structure/closet/secure_closet/personal, -/turf/open/floor/iron, -/area/station/commons/dorms) "sui" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 1 @@ -60634,6 +60718,14 @@ /obj/structure/mirror/directional/east, /turf/open/floor/iron/freezer, /area/station/security/prison) +"swO" = ( +/obj/machinery/button/door/directional/south{ + req_access = "theatre"; + id_tag = "honkbunker"; + name = "Deadbolt" + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "swR" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch{ @@ -60643,16 +60735,6 @@ /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/central) -"swV" = ( -/obj/machinery/porta_turret/syndicate/teleport{ - desc = "A ballistic banana gun auto-turret that fires banana bullets. What the fuck?"; - name = "Banana Turret"; - req_access = "theatre"; - lethal_projectile = /obj/projectile/bullet/honker; - stun_projectile = /obj/projectile/bullet/honker - }, -/turf/open/indestructible/dark, -/area/ruin/powered/clownplanet) "swZ" = ( /obj/structure/ladder, /turf/open/floor/catwalk_floor/iron_smooth, @@ -60702,13 +60784,6 @@ dir = 5 }, /area/station/service/chapel) -"sxL" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 8 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/secondary/construction/engineering) "sxR" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 8 @@ -60782,6 +60857,12 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/station/science/lower) +"szd" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "szf" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -60932,20 +61013,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/storage) -"sBd" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "sBr" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -61075,6 +61142,20 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) +"sEp" = ( +/obj/structure/industrial_lift/public, +/obj/machinery/elevator_control_panel/directional/east{ + linked_elevator_id = "tram_lower_center_lift"; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 4 + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/secondary/construction/engineering) "sEx" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 @@ -61222,9 +61303,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/solars/starboard/fore) -"sGF" = ( -/turf/open/misc/dirt/jungle, -/area/station/science/explab) "sGG" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -61365,6 +61443,14 @@ /obj/item/wrench/medical, /turf/open/floor/iron/dark, /area/station/medical/treatment_center) +"sIr" = ( +/obj/structure/cable, +/obj/machinery/door/airlock/grunge{ + name = "Dynamic Bar Docking Port"; + desc = "This airlock is a contingency to keep any funny business from the replacable bar system. If it opens to a wall, this is intentional!" + }, +/turf/open/floor/iron/smooth, +/area/station/maintenance/department/cargo) "sIx" = ( /obj/structure/lattice/catwalk, /obj/machinery/power/tracker, @@ -61413,13 +61499,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"sJp" = ( -/obj/structure/sign/clock/directional/south, -/obj/machinery/computer/camera_advanced/syndie{ - dir = 1 - }, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "sJx" = ( /obj/structure/chair{ dir = 1 @@ -61450,21 +61529,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"sJZ" = ( -/obj/structure/table, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/newscaster/directional/east, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_y = -37 - }, -/turf/open/floor/iron/dark, -/area/station/commons/vacant_room/commissary) "sKg" = ( /turf/closed/wall, /area/station/commons/fitness) @@ -61616,10 +61680,31 @@ /obj/effect/spawner/random/engineering/atmospherics_portable, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/dorms) +"sMa" = ( +/obj/structure/lattice/catwalk, +/obj/structure/ladder, +/obj/machinery/light/small/directional/west, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/openspace, +/area/station/maintenance/department/security) +"sMf" = ( +/obj/structure/cable, +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/turf/open/openspace, +/area/station/asteroid) "sMr" = ( /obj/structure/cable, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) +"sMJ" = ( +/obj/structure/filingcabinet, +/obj/structure/window/spawner/directional/north, +/obj/item/paper/crumpled, +/turf/open/floor/iron/dark/small, +/area/ruin/powered/clownplanet) "sML" = ( /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/left) @@ -61644,17 +61729,6 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) -"sNb" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/effect/turf_decal/trimline/red/corner{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "sNe" = ( /obj/machinery/door/airlock/engineering{ name = "Power Access Hatch" @@ -61727,6 +61801,30 @@ "sOr" = ( /turf/open/floor/iron/smooth, /area/station/maintenance/central/greater) +"sOG" = ( +/obj/structure/sign/directions/supply{ + dir = 4; + pixel_y = -24 + }, +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = -32 + }, +/obj/structure/sign/directions/command{ + dir = 1; + pixel_y = -40 + }, +/obj/machinery/light/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/neutral/filled/warning, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/left) "sOI" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -61801,6 +61899,15 @@ }, /turf/open/floor/iron, /area/station/maintenance/tram/right) +"sPC" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 5 + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "sPI" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 @@ -61886,9 +61993,16 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/storage) -"sQY" = ( -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/eva) +"sQR" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external/glass{ + name = "The Noise's Jam-Tastic Radical Listening Post" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "sQZ" = ( /turf/closed/wall/r_wall, /area/station/science/explab) @@ -61970,6 +62084,16 @@ "sSH" = ( /turf/open/floor/iron/dark, /area/station/security/courtroom/holding) +"sSL" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/storage/toolbox/electrical{ + pixel_x = 4; + pixel_y = 9 + }, +/obj/item/stock_parts/cell/high, +/turf/open/floor/iron/dark, +/area/station/science/lower) "sSU" = ( /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/greater) @@ -62175,14 +62299,6 @@ /obj/structure/window/reinforced/spawner, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) -"sVz" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/holopad/secure, -/obj/structure/cable, -/turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) "sVA" = ( /obj/structure/railing{ dir = 4 @@ -62588,13 +62704,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"tcu" = ( -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/turf/open/openspace, -/area/station/maintenance/department/security) "tcH" = ( /obj/machinery/light/directional/south, /turf/open/floor/grass, @@ -62630,6 +62739,11 @@ }, /turf/open/floor/iron, /area/station/science/lab) +"tdw" = ( +/obj/structure/cable, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "tdx" = ( /turf/closed/wall, /area/station/maintenance/port/aft) @@ -62682,10 +62796,6 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) -"tdY" = ( -/obj/structure/flora/bush/jungle/c/style_random, -/turf/open/misc/dirt/jungle, -/area/station/science/explab) "tea" = ( /obj/machinery/vending/coffee, /obj/effect/turf_decal/stripes/line{ @@ -62782,13 +62892,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/office) -"tfp" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/glass/reinforced, -/area/station/security/brig) "tft" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -62804,6 +62907,10 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal/incinerator) +"tfx" = ( +/obj/machinery/bci_implanter, +/turf/open/floor/iron, +/area/station/science/lower) "tfL" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 @@ -62831,16 +62938,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/storage) -"tfS" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 10 - }, -/obj/structure/industrial_lift/public, -/obj/effect/landmark/lift_id{ - specific_lift_id = "tram_sci_lift" - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/science/lower) "tfW" = ( /turf/open/floor/iron/chapel{ dir = 8 @@ -62922,6 +63019,11 @@ /obj/machinery/shower/directional/south, /turf/open/floor/iron/freezer, /area/station/commons/toilet) +"tho" = ( +/obj/machinery/light/directional/south, +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/iron/dark, +/area/station/science/explab) "thz" = ( /obj/effect/spawner/random/trash/graffiti, /obj/effect/decal/cleanable/dirt/dust, @@ -62986,6 +63088,16 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/medical/morgue) +"tic" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 6 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace/airless, +/area/station/asteroid) "tis" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -63008,10 +63120,31 @@ /obj/effect/mapping_helpers/mail_sorting/supply/disposals, /turf/closed/wall, /area/station/maintenance/disposal) +"tiB" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/arrow_cw{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/arrow_ccw, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/landmark/navigate_destination/hop, +/obj/structure/railing, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) "tiC" = ( /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/grass, /area/station/service/hydroponics) +"tiF" = ( +/obj/machinery/door/airlock/research/glass{ + name = "Test Chamber" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/station/science/lower) "tiG" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -63119,9 +63252,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/medical/surgery/aft) -"tkp" = ( -/turf/open/floor/carpet/neon/simple/yellow, -/area/ruin/powered/clownplanet) "tkv" = ( /obj/structure/ladder, /obj/effect/decal/cleanable/dirt, @@ -63172,12 +63302,6 @@ }, /turf/open/floor/wood, /area/station/command/meeting_room) -"tld" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/landmark/navigate_destination/dockescpod1, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "tlg" = ( /obj/machinery/door/airlock/security{ name = "Detective's Office" @@ -63350,6 +63474,21 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security/office) +"tof" = ( +/obj/structure/ladder, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/obj/structure/railing{ + dir = 4; + layer = 4.1 + }, +/turf/open/floor/glass/reinforced, +/area/station/command/bridge) "too" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/plastic{ @@ -63436,6 +63575,13 @@ }, /turf/open/floor/iron, /area/station/escapepodbay) +"tpr" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/lower) "tpB" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Chapel Maintenance Hatch" @@ -63579,6 +63725,22 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"trt" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/openspace, +/area/station/solars/port) +"trx" = ( +/obj/effect/turf_decal/caution/stand_clear/red{ + dir = 1 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/security/execution/transfer) "trK" = ( /obj/machinery/disposal/bin, /obj/item/radio/intercom/directional/west, @@ -63693,20 +63855,6 @@ /obj/structure/chair, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"tsR" = ( -/obj/item/paper{ - default_raw_text = "Congradulations, agent 'INSERT NAME HERE'! You have been assigned reconnaissance duty among the orbiting rocks of Indecipheres! As this location was previously scouted as a potential build site for a Nanotrasen outpost, one of our benefactors has taken the oppertunity to pre-emptively construct a listening outpost within the region! You have been tasked with monitoring the potentially active future crew and logging all events onboard. If you are a Nanotrasen official who has stumbled upon this outpost before it could be properly established: Please ignore this entire paper."; - name = "initiation paperwork" - }, -/obj/machinery/computer/records/medical/syndie{ - dir = 1; - req_access = list("syndicate") - }, -/obj/structure/sign/poster/contraband/clown{ - pixel_y = -27 - }, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "tsY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -63728,12 +63876,6 @@ }, /turf/open/floor/iron, /area/station/engineering/engine_smes) -"tte" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) "tth" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -63811,38 +63953,30 @@ }, /turf/open/space/basic, /area/space/nearstation) -"tun" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) -"tur" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Engineering Foyer" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 +"tuj" = ( +/obj/machinery/power/terminal{ + dir = 1 }, -/obj/effect/mapping_helpers/airlock/access/any/engineering/construction, -/obj/effect/mapping_helpers/airlock/access/any/engineering/general, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "engi-entrance" +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"tuu" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "Engineering3" +/obj/machinery/firealarm/directional/south{ + pixel_x = 4 }, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ +/obj/machinery/light_switch/directional/south{ + pixel_x = -9 + }, +/obj/structure/disposalpipe/trunk{ dir = 1 }, -/turf/open/floor/iron, -/area/station/engineering/break_room) +/obj/machinery/disposal/bin, +/turf/open/floor/iron/white, +/area/station/science/lower) "tuC" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering{ @@ -63859,6 +63993,9 @@ /obj/effect/mapping_helpers/airlock/access/any/command/general, /turf/open/floor/iron, /area/station/tcommsat/computer) +"tuN" = ( +/turf/open/floor/engine, +/area/station/science/lower) "tvf" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet, @@ -63877,11 +64014,6 @@ }, /turf/open/floor/iron/white, /area/station/science/genetics) -"tvX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/department/crew_quarters/dorms) "twb" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/grille, @@ -63918,11 +64050,6 @@ }, /turf/open/floor/plastic, /area/station/engineering/break_room) -"twt" = ( -/obj/structure/ladder, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/vaporwave, -/area/station/service/library/upper) "twz" = ( /turf/open/openspace, /area/station/hallway/secondary/entry) @@ -63970,14 +64097,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"txd" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/obj/effect/decal/cleanable/oil/streak, -/obj/effect/landmark/start/bitrunner, -/turf/open/floor/iron/dark/textured_large, -/area/station/bitrunning/den) "txh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64019,37 +64138,6 @@ }, /turf/open/floor/engine/o2, /area/station/science/ordnance/storage) -"tyi" = ( -/obj/structure/table, -/obj/machinery/button/door{ - id = "testlab"; - name = "Test Chamber Blast Doors"; - pixel_x = 4; - pixel_y = 2; - req_access = list("xenobiology") - }, -/obj/machinery/button/ignition{ - id = "testigniter"; - pixel_x = -6; - pixel_y = 2 - }, -/turf/open/floor/iron/dark, -/area/station/science/explab) -"tyr" = ( -/obj/structure/sign/directions/security{ - dir = 1; - pixel_y = 40 - }, -/turf/closed/wall/r_wall, -/area/station/command/teleporter) -"tyx" = ( -/obj/structure/closet{ - name = "Evidence Closet 5" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/contraband/narcotics, -/turf/open/floor/iron/dark, -/area/station/security/evidence) "tyE" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -64238,6 +64326,13 @@ /obj/effect/spawner/random/bureaucracy/stamp, /turf/open/floor/plastic, /area/station/engineering/break_room) +"tAW" = ( +/obj/machinery/light/very_dim/directional/south, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) +"tAX" = ( +/turf/closed/wall, +/area/station/bitrunning/den) "tBa" = ( /obj/structure/table, /obj/item/raw_anomaly_core/random{ @@ -64299,6 +64394,13 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/central) +"tBF" = ( +/obj/structure/table/wood, +/obj/machinery/cassette/adv_cassette_deck, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/vaporwave, +/area/station/service/library/upper) "tBN" = ( /obj/effect/turf_decal/trimline/red/filled/corner, /obj/effect/turf_decal/trimline/red/filled/corner{ @@ -64449,14 +64551,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) -"tFl" = ( -/obj/structure/table/wood, -/obj/structure/cassette_rack{ - pixel_x = -5; - pixel_y = 12 - }, -/turf/open/floor/iron/vaporwave, -/area/station/service/library/upper) "tFF" = ( /obj/structure/grille, /obj/structure/window/spawner/directional/east, @@ -64491,6 +64585,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/port/central) +"tGg" = ( +/obj/structure/cable/layer1, +/turf/closed/wall/r_wall, +/area/station/ai_monitored/turret_protected/aisat/hallway) "tGo" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/siding/thinplating/dark{ @@ -64542,13 +64640,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"tHy" = ( -/obj/machinery/cassette/dj_station{ - pixel_y = 12 - }, -/obj/structure/table/wood, -/turf/open/floor/iron/vaporwave, -/area/station/service/library/upper) +"tHz" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/machinery/meter, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "tIi" = ( /mob/living/simple_animal/bot/floorbot, /turf/open/floor/iron/dark, @@ -64561,44 +64661,11 @@ /obj/structure/sign/warning/electric_shock/directional/south, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"tIw" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 - }, -/obj/structure/window/spawner/directional/north, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "tIA" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/multilayer/connected, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/greater) -"tIJ" = ( -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_y = 24 - }, -/obj/structure/sign/directions/medical{ - dir = 4; - pixel_y = 32 - }, -/obj/structure/sign/directions/engineering{ - dir = 4; - pixel_y = 40 - }, -/obj/machinery/light/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/left) "tIW" = ( /obj/structure/plasticflaps/opaque{ name = "airtight delivery flaps" @@ -64772,6 +64839,15 @@ }, /turf/open/floor/wood/parquet, /area/station/service/library) +"tLr" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/structure/flora/bush/sparsegrass/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/railing, +/turf/open/floor/grass, +/area/station/commons/dorms) "tLs" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64779,15 +64855,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/tcommsat/computer) -"tLu" = ( -/obj/machinery/computer/quantum_console{ - dir = 1 - }, -/obj/machinery/light/neon_lining{ - icon_state = "pink2_1" - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/bitrunning/den) "tLz" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, @@ -64842,6 +64909,12 @@ /obj/effect/landmark/start/chemist, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"tMq" = ( +/obj/structure/ladder, +/obj/effect/turf_decal/stripes/box, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/solars/port) "tMw" = ( /obj/effect/turf_decal/trimline/purple/filled/corner{ dir = 1 @@ -64902,14 +64975,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/open/floor/iron, /area/station/engineering/atmos) -"tNG" = ( -/obj/machinery/camera/motion/directional/south{ - c_tag = "Secure - AI Upper External North"; - network = list("aicore") - }, -/obj/structure/cable, -/turf/open/floor/engine/hull/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) "tNJ" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 4 @@ -65055,6 +65120,15 @@ "tPE" = ( /turf/closed/wall, /area/station/hallway/secondary/entry) +"tPQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/lower) "tPW" = ( /obj/machinery/suit_storage_unit/engine, /obj/effect/turf_decal/bot{ @@ -65130,6 +65204,15 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/crew_quarters/dorms) +"tRI" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/obj/structure/flora/bush/flowers_yw/style_random, +/obj/structure/flora/bush/grassy/style_random, +/obj/structure/railing, +/turf/open/floor/grass, +/area/station/commons/dorms) "tRO" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -65215,6 +65298,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"tTq" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Civilian - Recreational Area South" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "tTs" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -65241,15 +65337,6 @@ /obj/effect/turf_decal/trimline/neutral/filled/warning, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) -"tTJ" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/turf/open/floor/glass/reinforced, -/area/station/security/brig) "tTK" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/canister, @@ -65276,23 +65363,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"tUd" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/neon_lining{ - dir = 8; - icon_state = "pink2_1" - }, -/obj/machinery/light/neon_lining{ - dir = 1; - icon_state = "pink2_1" - }, -/obj/machinery/computer/order_console/bitrunning, -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/bitrunning/den) "tUH" = ( /obj/structure/rack, /obj/item/clothing/under/color/blue, @@ -65323,6 +65393,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"tUX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/station/science/explab) "tVb" = ( /obj/structure/lattice/catwalk, /turf/open/openspace, @@ -65369,6 +65445,13 @@ /obj/item/rwd/loaded, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"tVm" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Science - Testing Chamber"; + network = list("test","rd") + }, +/turf/open/floor/engine, +/area/station/science/lower) "tVp" = ( /obj/machinery/light/small/directional/north, /turf/open/floor/iron, @@ -65403,15 +65486,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/smooth, /area/station/maintenance/port/aft) -"tVK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/explab) "tWe" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -65432,15 +65506,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/command) -"tWw" = ( -/obj/effect/turf_decal/siding/thinplating/corner, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "tWy" = ( /obj/machinery/biogenerator, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -65685,6 +65750,10 @@ }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) +"uac" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark/herringbone, +/area/ruin/powered/clownplanet) "uaq" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -66512,6 +66581,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"uoS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/closed/wall, +/area/station/service/library/upper) "upb" = ( /obj/structure/bed/double, /obj/item/bedsheet/dorms_double, @@ -66585,22 +66661,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison) -"uqm" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 5 - }, -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/siding/thinplating/corner, -/obj/item/radio/intercom/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Civilian - Dormitories West Stairwell" - }, -/obj/structure/sign/flag/nanotrasen/directional/north, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "uqo" = ( /obj/machinery/telecomms/processor/preset_three, /turf/open/floor/iron/dark/telecomms, @@ -66610,6 +66670,9 @@ dir = 8 }, /obj/machinery/light/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "uqC" = ( @@ -66650,10 +66713,16 @@ }, /turf/open/floor/iron/dark/airless, /area/station/science/ordnance/freezerchamber) -"urq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/atmos) +"urs" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/ladder, +/turf/open/floor/engine/cult, +/area/station/service/library) "urv" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/firecloset, @@ -66713,6 +66782,73 @@ }, /turf/open/floor/plating, /area/station/science/robotics/mechbay) +"usb" = ( +/obj/structure/table/wood, +/obj/item/device/walkman{ + pixel_y = 7; + pixel_x = -8 + }, +/obj/item/device/walkman{ + pixel_y = 7; + pixel_x = -8 + }, +/obj/item/device/walkman{ + pixel_y = 7; + pixel_x = -8 + }, +/obj/item/device/walkman{ + pixel_y = 7; + pixel_x = -8 + }, +/obj/item/device/walkman{ + pixel_y = 7; + pixel_x = -8 + }, +/obj/item/device/walkman{ + pixel_y = 7; + pixel_x = -8 + }, +/obj/item/device/walkman{ + pixel_y = 7; + pixel_x = -8 + }, +/obj/item/device/walkman{ + pixel_y = 7; + pixel_x = -8 + }, +/obj/item/device/walkman{ + pixel_y = 7; + pixel_x = -8 + }, +/obj/item/device/cassette_tape/blank, +/obj/item/device/cassette_tape/blank, +/obj/item/device/cassette_tape/blank, +/obj/item/device/cassette_tape/blank, +/obj/item/device/cassette_tape/blank, +/obj/item/device/cassette_tape/blank, +/obj/item/device/cassette_tape/blank, +/obj/item/device/cassette_tape/blank, +/obj/item/device/cassette_tape/random{ + pixel_y = 8 + }, +/obj/item/device/cassette_tape/random{ + pixel_y = 8 + }, +/obj/item/device/cassette_tape/random{ + pixel_y = 8 + }, +/obj/item/device/cassette_tape/random{ + pixel_y = 8 + }, +/obj/item/device/cassette_tape/random{ + pixel_y = 8 + }, +/obj/item/device/cassette_tape/friday{ + pixel_y = 2; + pixel_x = 9 + }, +/turf/open/floor/iron/vaporwave, +/area/station/service/library/upper) "uss" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -66859,6 +66995,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/station/service/chapel) +"uuy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/station/science/explab) "uuC" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -66937,6 +67079,35 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) +"uvR" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/machinery/button/door/directional/west{ + id = "atmos"; + name = "Atmospherics Lockdown"; + pixel_y = 8; + req_access = list("atmospherics") + }, +/obj/machinery/button/door/directional/west{ + id = "Secure Storage"; + name = "Engineering Secure Storage"; + req_access = list("engine_equip") + }, +/obj/machinery/button/door/directional/west{ + id = "Engineering"; + name = "Engineering Lockdown"; + pixel_y = -8; + req_access = list("engineering") + }, +/mob/living/basic/parrot/poly, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) "uvU" = ( /obj/machinery/atmospherics/components/unary/passive_vent{ dir = 4; @@ -67058,17 +67229,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) -"uxn" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) "uxq" = ( /obj/effect/decal/cleanable/dirt, /obj/item/food/cheese/wheel, @@ -67133,6 +67293,12 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"uyu" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/directions/dorms/directional/west, +/turf/open/floor/iron, +/area/station/commons/fitness) "uyJ" = ( /turf/open/floor/iron, /area/station/security/prison/workout) @@ -67171,6 +67337,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"uzw" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 8 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/secondary/service) "uzD" = ( /obj/effect/turf_decal/siding/thinplating_new/corner{ dir = 1 @@ -67191,6 +67364,27 @@ }, /turf/open/floor/plating, /area/station/science/robotics/mechbay) +"uzT" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/storage) "uzX" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 4 @@ -67318,15 +67512,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/smooth, /area/station/maintenance/disposal/incinerator) -"uCh" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) "uCo" = ( /obj/effect/turf_decal/siding/thinplating, /turf/open/floor/iron, @@ -67500,6 +67685,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"uFa" = ( +/obj/machinery/light/directional/north, +/obj/structure/ladder, +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/turf/open/openspace, +/area/station/asteroid) "uFr" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -67509,12 +67701,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"uFC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/vaporwave, -/area/station/service/library/upper) "uFD" = ( /obj/effect/turf_decal/trimline/neutral/filled/warning{ dir = 4 @@ -67637,34 +67823,12 @@ "uGW" = ( /turf/closed/wall, /area/station/cargo/miningdock) -"uGY" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 5 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/cargo/miningdock) "uHb" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/photocopier, /obj/effect/turf_decal/tile/brown/fourcorners, /turf/open/floor/iron, /area/station/cargo/sorting) -"uHk" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/white/full, -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/structure/sign/directions/upload/directional/south{ - pixel_y = -39 - }, -/turf/open/floor/iron/white, -/area/station/science/research) "uHm" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner{ dir = 8 @@ -67734,12 +67898,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"uHW" = ( -/obj/structure/ladder, -/obj/effect/turf_decal/stripes/box, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/solars/port) "uIc" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/purple/filled/line{ @@ -68235,6 +68393,12 @@ /obj/effect/turf_decal/trimline/white/warning, /turf/open/floor/iron, /area/station/maintenance/tram/right) +"uOJ" = ( +/obj/structure/closet/secure_closet/freezer/fridge/open, +/obj/structure/window/spawner/directional/west, +/obj/item/toy/plush/goatplushie, +/turf/open/floor/iron/white, +/area/ruin/powered/clownplanet) "uOL" = ( /obj/structure/industrial_lift/tram/white, /obj/machinery/door/window/tram/right/directional/north{ @@ -68326,14 +68490,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"uQP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/railing, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 5 - }, -/turf/open/floor/iron/smooth, -/area/station/maintenance/starboard/lesser) "uQR" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair, @@ -68371,6 +68527,13 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/security/evidence) +"uRP" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 8 + }, +/obj/effect/landmark/navigate_destination/common/fitness, +/turf/open/floor/iron, +/area/station/commons/fitness) "uRR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/bar/opposingcorners, @@ -68380,12 +68543,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/checkpoint/arrivals) -"uSi" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/light/small/directional/east, -/obj/structure/cable, -/turf/open/space/openspace, -/area/station/solars/port) "uSL" = ( /obj/effect/turf_decal/delivery/white, /obj/structure/fluff/tram_rail/floor, @@ -68421,12 +68578,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/maint) -"uTu" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/sign/directions/dorms/directional/east, -/turf/open/floor/iron, -/area/station/commons/fitness) "uTz" = ( /obj/structure/railing{ dir = 8 @@ -68605,12 +68756,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"uVS" = ( -/obj/structure/railing{ - dir = 4 - }, -/turf/open/openspace, -/area/station/security/brig) "uVW" = ( /obj/machinery/camera/directional/west{ c_tag = "Medical - Cryo Treatment"; @@ -68619,6 +68764,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/iron/dark, /area/station/medical/treatment_center) +"uWe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/vaporwave, +/area/station/service/library/upper) "uWi" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -68642,6 +68793,18 @@ }, /turf/open/floor/plating, /area/station/cargo/office) +"uWq" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/escapepodbay) "uWr" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/external{ @@ -68873,16 +69036,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"uZy" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 6 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/secondary/service) "uZD" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -68899,6 +69052,14 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark, /area/station/maintenance/department/security) +"uZJ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "uZQ" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/trimline/blue/filled/corner{ @@ -68962,25 +69123,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/xenobiology) -"vaK" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 1 - }, -/obj/machinery/camera/emp_proof/directional/south{ - c_tag = "Engineering - Atmospherics South-East"; - network = list("ss13","engineering") - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/corner, -/obj/machinery/firealarm/directional/south, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) "vaR" = ( /obj/item/radio/intercom/directional/north, /obj/structure/easel, @@ -68995,6 +69137,13 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/commons/storage/art) +"vaS" = ( +/obj/structure/showcase/cyborg/old{ + pixel_y = 20 + }, +/obj/structure/cable/layer1, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) "vbg" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -69076,6 +69225,12 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/central) +"vcp" = ( +/obj/structure/curtain, +/obj/machinery/shower/directional/north, +/obj/machinery/duct, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet) "vcu" = ( /obj/effect/turf_decal/sand/plating, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -69167,15 +69322,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"vep" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/explab) "veA" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/siding/thinplating/dark{ @@ -69185,6 +69331,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit) +"veH" = ( +/obj/structure/flora/bush/jungle/c/style_random, +/turf/open/misc/grass/jungle, +/area/station/science/lower) "veL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -69215,10 +69365,6 @@ /obj/machinery/power/emitter, /turf/open/floor/plating, /area/station/engineering/main) -"vfW" = ( -/obj/machinery/component_printer, -/turf/open/floor/iron, -/area/station/science/explab) "vfX" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -69252,25 +69398,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured, /area/station/engineering/main) -"vgl" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/turf/open/floor/iron, -/area/station/security/brig) "vgm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sink{ @@ -69341,43 +69468,11 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/grimy, /area/station/service/library/lounge) -"vhG" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/delivery/white, -/obj/effect/mapping_helpers/trapdoor_placer, -/obj/structure/railing, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) "vhU" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/secure_closet/freezer/cream_pie, /turf/open/floor/iron/white, /area/station/maintenance/department/cargo) -"vie" = ( -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_y = -24 - }, -/obj/structure/sign/directions/medical{ - dir = 8; - pixel_y = -32 - }, -/obj/structure/sign/directions/engineering{ - dir = 8; - pixel_y = -40 - }, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/warning, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/right) "vih" = ( /obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -69689,6 +69784,13 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/science) +"vlp" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/maintenance/central/greater) "vlr" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/machinery/door/firedoor, @@ -69791,6 +69893,29 @@ }, /turf/open/floor/iron, /area/station/commons/dorms) +"vmE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/artifact_heatingpad{ + dir = 4 + }, +/obj/effect/artifact_spawner, +/turf/open/floor/engine, +/area/station/science/explab) +"vnd" = ( +/obj/structure/ladder, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "vnk" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -69932,6 +70057,11 @@ }, /turf/open/floor/iron/white, /area/station/science/genetics) +"vpu" = ( +/obj/effect/turf_decal/siding/wideplating/dark, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/smooth, +/area/station/maintenance/starboard/greater) "vpz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/rack, @@ -69939,6 +70069,13 @@ /obj/effect/spawner/random/engineering/toolbox, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) +"vpA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/closet/secure_closet/evidence{ + name = "secure evidence closet 2" + }, +/turf/open/floor/iron/dark, +/area/station/security/evidence) "vpC" = ( /obj/machinery/light/directional/west, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -70012,10 +70149,6 @@ /obj/machinery/duct, /turf/open/floor/catwalk_floor, /area/station/maintenance/central/lesser) -"vqq" = ( -/obj/structure/sign/directions/vault/directional/north, -/turf/closed/wall/r_wall, -/area/station/maintenance/port/central) "vqz" = ( /obj/machinery/button/door/directional/north{ pixel_x = 9; @@ -70180,6 +70313,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/medical/virology) +"vrM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/cigbutt, +/turf/open/floor/iron/smooth, +/area/station/maintenance/department/crew_quarters/dorms) "vrN" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ @@ -70202,6 +70340,31 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/tram/right) +"vsa" = ( +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = 40 + }, +/turf/closed/wall/r_wall, +/area/station/command/teleporter) +"vsb" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 9 + }, +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 8 + }, +/obj/item/radio/intercom/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Civilian - Dormitories East Stairwell" + }, +/obj/structure/sign/flag/terragov/directional/north, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/dorms) "vsd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair{ @@ -70209,15 +70372,6 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/lesser) -"vsg" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 4 - }, -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/iron/smooth, -/area/station/maintenance/central/greater) "vsn" = ( /obj/effect/turf_decal/siding/thinplating, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -70274,19 +70428,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/ai_monitored/turret_protected/aisat/foyer) -"vsN" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/door/airlock/mining/glass{ - name = "MULE Storage" - }, -/obj/effect/mapping_helpers/airlock/access/all/supply/general, -/turf/open/floor/iron, -/area/station/cargo/warehouse) "vsU" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -70337,6 +70478,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"vtC" = ( +/obj/structure/chair/office, +/turf/open/floor/iron/dark/small, +/area/ruin/powered/clownplanet) "vtP" = ( /obj/structure/fluff/tram_rail, /obj/structure/industrial_lift/tram, @@ -70364,6 +70509,13 @@ "vua" = ( /turf/open/floor/carpet, /area/station/service/chapel/monastery) +"vuc" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/obj/structure/cable, +/obj/machinery/light/floor/has_bulb, +/turf/open/openspace, +/area/station/solars/starboard/fore) "vud" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -70391,6 +70543,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) +"vuU" = ( +/obj/structure/rack, +/obj/structure/table, +/obj/machinery/computer/security/telescreen{ + name = "Test Chamber Monitor"; + network = list("test"); + pixel_y = 28 + }, +/obj/item/storage/box/beakers{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = -7; + pixel_y = 7 + }, +/obj/item/grenade/chem_grenade{ + pixel_x = -7; + pixel_y = 1 + }, +/turf/open/floor/iron/dark, +/area/station/science/lower) "vvb" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -70430,6 +70604,13 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/command/gateway) +"vvD" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Science - Monkey Pit"; + network = list("ss13","rd") + }, +/turf/open/misc/dirt/jungle, +/area/station/science/lower) "vvK" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -70448,15 +70629,12 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/cargo/office) -"vwc" = ( -/obj/machinery/elevator_control_panel{ - layer = 3.1; - linked_elevator_id = "tram_xeno_lift"; - pixel_y = 2; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") +"vvV" = ( +/obj/structure/railing{ + dir = 8 }, -/turf/closed/wall, -/area/station/science/xenobiology) +/turf/open/openspace, +/area/station/security/brig) "vwd" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 @@ -70493,6 +70671,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"vwR" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "vwT" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -70505,31 +70689,19 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"vxe" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/external{ - name = "Port Docking Bay 1" - }, -/obj/effect/landmark/navigate_destination{ - location = "Arrival Shuttle" - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"vxB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/department/crew_quarters/dorms) "vxD" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 4 +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/commons/dorms) +/obj/effect/landmark/generic_maintenance_landmark, +/obj/structure/closet/body_bag, +/mob/living/basic/skeleton{ + name = "Jim"; + desc = "Left to rot in maintenance, a poor soul whose green light was never noticed by the doctor..." + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/medical) "vyo" = ( /obj/machinery/duct, /obj/structure/cable, @@ -70629,14 +70801,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"vzF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/smooth, -/area/station/hallway/primary/tram/left) "vzQ" = ( /obj/structure/closet/cardboard, /obj/effect/spawner/random/maintenance/four, @@ -70679,6 +70843,10 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/miningdock/oresilo) +"vAs" = ( +/obj/structure/railing, +/turf/open/openspace, +/area/station/security/brig) "vAv" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 @@ -70785,14 +70953,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/heads_quarters/hop) -"vBB" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/spawner/random/trash/garbage, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) "vBG" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -70851,83 +71011,6 @@ }, /turf/open/floor/noslip/tram_platform, /area/station/hallway/primary/tram/right) -"vCp" = ( -/obj/structure/table/wood, -/obj/item/device/walkman{ - pixel_y = 7; - pixel_x = -8 - }, -/obj/item/device/walkman{ - pixel_y = 7; - pixel_x = -8 - }, -/obj/item/device/walkman{ - pixel_y = 7; - pixel_x = -8 - }, -/obj/item/device/walkman{ - pixel_y = 7; - pixel_x = -8 - }, -/obj/item/device/walkman{ - pixel_y = 7; - pixel_x = -8 - }, -/obj/item/device/walkman{ - pixel_y = 7; - pixel_x = -8 - }, -/obj/item/device/walkman{ - pixel_y = 7; - pixel_x = -8 - }, -/obj/item/device/walkman{ - pixel_y = 7; - pixel_x = -8 - }, -/obj/item/device/walkman{ - pixel_y = 7; - pixel_x = -8 - }, -/obj/item/device/cassette_tape/blank, -/obj/item/device/cassette_tape/blank, -/obj/item/device/cassette_tape/blank, -/obj/item/device/cassette_tape/blank, -/obj/item/device/cassette_tape/blank, -/obj/item/device/cassette_tape/blank, -/obj/item/device/cassette_tape/blank, -/obj/item/device/cassette_tape/blank, -/obj/item/device/cassette_tape/random{ - pixel_y = 8 - }, -/obj/item/device/cassette_tape/random{ - pixel_y = 8 - }, -/obj/item/device/cassette_tape/random{ - pixel_y = 8 - }, -/obj/item/device/cassette_tape/random{ - pixel_y = 8 - }, -/obj/item/device/cassette_tape/random{ - pixel_y = 8 - }, -/obj/item/device/cassette_tape/friday{ - pixel_y = 2; - pixel_x = 9 - }, -/turf/open/floor/iron/vaporwave, -/area/station/service/library/upper) -"vCr" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) "vCt" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -70985,10 +71068,6 @@ }, /turf/open/floor/plating, /area/station/hallway/primary/tram/right) -"vCY" = ( -/obj/structure/flora/tree/palm/style_random, -/turf/open/misc/grass/jungle, -/area/station/science/explab) "vCZ" = ( /turf/closed/wall, /area/station/service/chapel/monastery) @@ -71024,17 +71103,13 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) -"vDE" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +"vDm" = ( +/obj/effect/spawner/random{ + loot = list(/obj/effect/decal/cleanable/oil/slippery=10,/obj/effect/decal/cleanable/oil=90); + name = "funny slipper :)" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/airalarm/directional/west, -/obj/effect/spawner/random/trash/garbage, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) +/turf/open/floor/noslip/tram_plate, +/area/station/hallway/primary/tram/center) "vDG" = ( /obj/structure/window/reinforced/spawner, /obj/machinery/computer/records/security{ @@ -71079,6 +71154,13 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai) +"vEm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/railing, +/turf/open/floor/iron/smooth, +/area/station/command/gateway) "vEn" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -71205,13 +71287,6 @@ }, /turf/open/floor/wood, /area/station/service/bar/backroom) -"vGH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/smooth, -/area/station/maintenance/port/central) "vGI" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -71324,12 +71399,6 @@ /obj/effect/spawner/random/clothing/beret_or_rabbitears, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/dorms) -"vIF" = ( -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/explab) "vIK" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/decal/cleanable/dirt, @@ -71365,15 +71434,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/engineering/break_room) -"vJC" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/white, -/area/station/science/ordnance) "vJF" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 10 @@ -71414,10 +71474,6 @@ }, /turf/open/space/openspace, /area/station/solars/port) -"vKr" = ( -/obj/machinery/light/directional/east, -/turf/open/misc/asteroid/dug, -/area/station/science/explab) "vKD" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 @@ -71516,6 +71572,17 @@ }, /turf/open/floor/carpet, /area/station/service/chapel/monastery) +"vML" = ( +/obj/structure/railing{ + dir = 10; + layer = 3.1 + }, +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/turf/open/openspace, +/area/station/maintenance/department/security) "vMP" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -71632,16 +71699,15 @@ /obj/structure/girder, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/dorms) -"vNV" = ( +"vOu" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 1 + }, /obj/structure/disposalpipe/segment{ - dir = 6 + dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/port/central) +/turf/open/floor/iron, +/area/station/commons/dorms) "vOx" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 @@ -71774,6 +71840,15 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/grimy, /area/station/security/detectives_office) +"vPU" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/dorms) "vQd" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/turf_decal/tile/neutral{ @@ -71834,6 +71909,13 @@ dir = 1 }, /area/station/ai_monitored/command/storage/eva) +"vRr" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 10 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/commons/dorms) "vRv" = ( /turf/open/floor/iron, /area/station/command/heads_quarters/ce) @@ -71884,19 +71966,6 @@ }, /turf/open/floor/circuit/telecomms/server, /area/station/science/server) -"vSh" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/siding/thinplating/corner, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) "vSt" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/power/apc/auto_name/directional/south, @@ -71968,6 +72037,30 @@ /obj/machinery/meter, /turf/open/floor/iron/white, /area/station/science/ordnance) +"vTu" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/multitool{ + pixel_y = -7; + pixel_x = -8 + }, +/obj/item/screwdriver{ + pixel_y = 11 + }, +/obj/item/assembly/signaler{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/structure/sign/calendar/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + location = "QM #5" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron/smooth, +/area/station/cargo/drone_bay) "vTv" = ( /obj/structure/stairs/north, /turf/open/floor/iron/stairs/left, @@ -72047,19 +72140,9 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron, /area/station/commons/dorms) -"vUk" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 9 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/commons/dorms) "vUu" = ( /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) -"vUz" = ( -/turf/open/misc/asteroid, -/area/station/science/explab) "vUE" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/tram/right) @@ -72080,15 +72163,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/courtroom) -"vUP" = ( -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/maintenance/central/greater) "vUW" = ( /obj/structure/sign/warning/pods/directional/north, /turf/open/openspace, @@ -72111,6 +72185,9 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"vVA" = ( +/turf/open/floor/plating, +/area/station/science/explab) "vVY" = ( /obj/structure/fluff/tram_rail{ dir = 1 @@ -72127,15 +72204,6 @@ /obj/item/pickaxe/rusted, /turf/open/misc/asteroid, /area/station/asteroid) -"vWw" = ( -/obj/structure/railing{ - dir = 6 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/glass/reinforced, -/area/station/ai_monitored/turret_protected/aisat/hallway) "vWx" = ( /turf/closed/wall/r_wall, /area/station/cargo/miningdock/oresilo) @@ -72303,14 +72371,6 @@ /obj/structure/cable, /turf/open/openspace, /area/station/solars/starboard/fore) -"vZY" = ( -/obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/structure/sign/directions/evac{ - dir = 4; - pixel_y = -26 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit) "vZZ" = ( /obj/machinery/duct, /obj/structure/cable, @@ -72368,6 +72428,18 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"wbf" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/dorms) "wbC" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/bot, @@ -72494,6 +72566,16 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"wdd" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/structure/sign/directions/vault{ + dir = 1; + pixel_y = 30 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) "wdg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/delivery, @@ -72554,14 +72636,6 @@ /obj/effect/spawner/random/entertainment/cigarette_pack, /turf/open/floor/iron/smooth, /area/station/maintenance/central/greater) -"wdQ" = ( -/obj/structure/table, -/obj/machinery/computer/security/wooden_tv{ - name = "Old TV"; - desc = "An old TV, at some point, a clown watched too much TV on this." - }, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) "wdU" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -72630,6 +72704,13 @@ /obj/structure/closet/crate/coffin, /turf/open/floor/plating, /area/station/service/chapel/monastery) +"wfc" = ( +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/turf/open/openspace, +/area/station/maintenance/department/security) "wfF" = ( /obj/structure/chair{ dir = 1 @@ -72775,6 +72856,16 @@ "whz" = ( /turf/closed/wall, /area/station/maintenance/department/medical) +"whE" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "whF" = ( /obj/structure/table/glass, /obj/item/storage/box/beakers, @@ -72789,6 +72880,13 @@ /obj/effect/turf_decal/trimline/brown/filled/line, /turf/open/floor/iron, /area/station/cargo/office) +"whJ" = ( +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/turf/open/openspace, +/area/station/security/brig) "whL" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/supply) @@ -72887,6 +72985,18 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"wjX" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/bitrunner, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "wki" = ( /obj/machinery/navbeacon{ codes_txt = "delivery;dir=4"; @@ -72977,17 +73087,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat/maint) -"wlo" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Maintenance Hatch" - }, -/obj/effect/mapping_helpers/airlock/access/any/security/maintenance, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/central/greater) "wlK" = ( /obj/machinery/vending/cigarette, /obj/machinery/status_display/evac/directional/west, @@ -73110,23 +73209,24 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel/monastery) -"wnM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/decoration/material, -/obj/structure/table, -/obj/effect/spawner/random/engineering/material_cheap, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) -"wnN" = ( -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 +"wox" = ( +/obj/machinery/door/airlock/atmos{ + name = "The Pipe Cave" }, -/obj/machinery/computer/cryopod{ - pixel_y = -32; +/obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms/laundry) +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "woJ" = ( /obj/structure/closet/wardrobe/white, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -73144,6 +73244,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/central/lesser) +"woQ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/stairs/old{ + dir = 8 + }, +/area/station/maintenance/central/greater) "woR" = ( /obj/effect/turf_decal/bot, /obj/machinery/portable_atmospherics/pump, @@ -73226,30 +73336,6 @@ /obj/effect/spawner/random/engineering/material_cheap, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/dorms) -"wqg" = ( -/obj/structure/sign/directions/supply{ - dir = 4; - pixel_y = -24 - }, -/obj/structure/sign/directions/security{ - dir = 1; - pixel_y = -32 - }, -/obj/structure/sign/directions/command{ - dir = 1; - pixel_y = -40 - }, -/obj/machinery/light/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/neutral/filled/warning, -/turf/open/floor/iron, -/area/station/hallway/primary/tram/left) "wqr" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -73271,13 +73357,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"wqC" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/openspace, -/area/station/solars/starboard/fore) "wqI" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/window/reinforced/spawner/directional/east, @@ -73342,6 +73421,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"wro" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 6 + }, +/obj/structure/industrial_lift/public, +/obj/effect/landmark/lift_id{ + specific_lift_id = "tram_perma_lift" + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/security/execution/transfer) "wrr" = ( /obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron, @@ -73412,6 +73501,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/security) +"wrV" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "wrW" = ( /obj/machinery/light/directional/west, /turf/open/floor/engine, @@ -73476,11 +73576,12 @@ /obj/effect/mapping_helpers/airlock/access/all/science/robotics, /turf/open/floor/iron/dark, /area/station/medical/morgue) -"wtK" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/structure/tank_dispenser/oxygen, -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) +"wtP" = ( +/obj/structure/closet{ + name = "Evidence Closet 2" + }, +/turf/open/floor/iron/dark, +/area/station/security/evidence) "wtQ" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 4 @@ -73493,6 +73594,35 @@ }, /turf/open/floor/iron, /area/station/security/processing) +"wtT" = ( +/obj/structure/sign/directions/evac{ + dir = 4; + pixel_y = 24 + }, +/obj/structure/sign/directions/medical{ + dir = 8; + pixel_y = 32 + }, +/obj/structure/sign/directions/engineering{ + dir = 8; + pixel_y = 40 + }, +/obj/machinery/light/directional/north, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/tram/right) +"wtX" = ( +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/misc/grass/jungle, +/area/station/science/lower) "wuc" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 1 @@ -73513,20 +73643,13 @@ /turf/open/floor/iron, /area/station/hallway/secondary/entry) "wuC" = ( -/obj/structure/table, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 }, /obj/structure/sign/calendar/directional/west, -/obj/machinery/fax{ - fax_name = "Quartermaster's Office"; - name = "Quartermaster's Fax Machine" - }, +/obj/machinery/pdapainter/supply, /turf/open/floor/iron, /area/station/command/heads_quarters/qm) -"wuE" = ( -/turf/open/floor/glass, -/area/station/commons/fitness/recreation) "wuF" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 @@ -73724,16 +73847,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"wxg" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 6 - }, -/obj/structure/industrial_lift/public, -/obj/effect/landmark/lift_id{ - specific_lift_id = "tram_perma_lift" - }, -/turf/open/floor/plating/elevatorshaft, -/area/station/security/execution/transfer) "wxv" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 4 @@ -73967,16 +74080,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/tram/mid) -"wAs" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) "wAA" = ( /obj/machinery/door/window/left/directional/east{ name = "Coffin Storage"; @@ -74037,6 +74140,17 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/commons/dorms) +"wBk" = ( +/obj/machinery/quantum_server, +/obj/machinery/light/neon_lining{ + icon_state = "pink2_1" + }, +/obj/machinery/light/neon_lining{ + dir = 4; + icon_state = "pink2_1" + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/bitrunning/den) "wBp" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/lattice/catwalk, @@ -74048,13 +74162,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/tram/mid) -"wBq" = ( -/obj/effect/spawner/structure/window, -/obj/structure/sign/directions/upload/directional/south{ - pixel_y = -39 - }, -/turf/open/floor/plating, -/area/station/science/lobby) "wBw" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -74092,12 +74199,9 @@ /turf/open/floor/iron, /area/station/cargo/sorting) "wCg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/department/crew_quarters/dorms) +/obj/structure/flora/bush/fullgrass/style_random, +/turf/open/misc/dirt/jungle, +/area/station/science/lower) "wCl" = ( /obj/effect/turf_decal/sand/plating, /obj/item/paper{ @@ -74131,6 +74235,25 @@ /obj/structure/disposalpipe/trunk, /turf/open/floor/iron/white, /area/station/science/xenobiology) +"wCT" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/obj/structure/railing, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) +"wDg" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) "wDh" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/yellow/filled/line{ @@ -74151,32 +74274,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/virology) -"wDv" = ( -/obj/structure/rack, -/obj/item/controller{ - pixel_x = -7 - }, -/obj/item/compact_remote{ - pixel_x = -7 - }, -/obj/item/compact_remote{ - pixel_x = -7 - }, -/obj/item/integrated_circuit/loaded/speech_relay{ - pixel_x = 7 - }, -/obj/item/integrated_circuit/loaded/hello_world{ - pixel_x = 7 - }, -/obj/structure/table, -/obj/item/integrated_circuit/loaded/hello_world{ - pixel_x = 7 - }, -/obj/item/integrated_circuit/loaded/hello_world{ - pixel_x = 7 - }, -/turf/open/floor/iron, -/area/station/science/explab) "wDw" = ( /obj/machinery/chem_master/condimaster{ desc = "Used to separate out liquids - useful for purifying botanical extracts. Also dispenses condiments."; @@ -74232,15 +74329,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"wEp" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/light/floor/has_bulb, -/turf/open/openspace, -/area/station/solars/port) "wEx" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/cable, @@ -74376,15 +74464,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"wGg" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "wGs" = ( /obj/machinery/light/small/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -74455,6 +74534,29 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/cargo/miningdock/oresilo) +"wHz" = ( +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/science/lower) +"wHC" = ( +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/effect/turf_decal/weather/snow, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/mob/living/basic/goat/pete, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/service/kitchen/coldroom) "wHH" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -74492,22 +74594,28 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) +"wId" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "wIg" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/command/heads_quarters/ce) -"wIt" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 9 - }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/hallway/secondary/service) "wIP" = ( /obj/structure/lattice, /turf/open/space/openspace, /area/space) +"wIW" = ( +/obj/machinery/computer/records/medical/syndie{ + dir = 1; + req_access = list("syndicate") + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/dark/small, +/area/ruin/powered/clownplanet) "wIY" = ( /obj/effect/turf_decal/trimline/brown/filled/corner{ dir = 1 @@ -74526,6 +74634,35 @@ /obj/item/pillow/random, /turf/open/floor/wood, /area/station/commons/dorms) +"wJf" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/turf/open/floor/iron, +/area/station/security/brig) +"wJh" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace/airless, +/area/station/asteroid) "wJt" = ( /obj/machinery/door/poddoor{ id = "Secure Storage"; @@ -74979,10 +75116,6 @@ /obj/effect/spawner/random/engineering/material_cheap, /turf/open/floor/iron/smooth, /area/station/maintenance/department/crew_quarters/dorms) -"wSp" = ( -/obj/structure/flora/bush/jungle/b/style_random, -/turf/open/misc/grass/jungle, -/area/station/science/explab) "wSx" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -75217,6 +75350,11 @@ }, /turf/open/floor/iron, /area/station/security/prison) +"wXe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/crew_quarters/dorms) "wXi" = ( /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 @@ -75294,24 +75432,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/center) -"wYz" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/door/airlock/vault{ - name = "Bank of Cargo" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/supply/vault, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/cargo/miningdock/oresilo) "wYE" = ( /obj/structure/table, /obj/structure/reagent_dispensers/wall/peppertank/directional/west, @@ -75443,6 +75563,13 @@ }, /turf/open/floor/iron, /area/station/security/processing) +"xbB" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/science/explab) "xbU" = ( /obj/structure/table, /obj/machinery/requests_console/directional/east{ @@ -75548,6 +75675,16 @@ /obj/machinery/hydroponics/constructable, /turf/open/floor/grass, /area/station/service/hydroponics) +"xez" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 10 + }, +/obj/structure/industrial_lift/public, +/obj/effect/landmark/lift_id{ + specific_lift_id = "tram_sci_lift" + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/science/lower) "xeG" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -75603,11 +75740,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/service/lawoffice) -"xgi" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/carpet/neon/simple/yellow, -/area/ruin/powered/clownplanet) "xgp" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/effect/turf_decal/siding/thinplating/dark, @@ -75638,20 +75770,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"xgW" = ( -/obj/effect/turf_decal/trimline/dark_red/warning, -/obj/structure/industrial_lift/public, -/obj/machinery/elevator_control_panel/directional/south{ - linked_elevator_id = "tram_dorm_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") +"xgQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/railing{ + dir = 1 }, -/obj/effect/turf_decal/trimline/dark_red/warning, -/obj/machinery/elevator_control_panel/directional/south{ - linked_elevator_id = "tram_dorm_lift"; - preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 5 }, -/turf/open/floor/plating/elevatorshaft, -/area/station/commons/dorms) +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/maintenance/starboard/lesser) "xhd" = ( /obj/machinery/airalarm/directional/north, /obj/structure/rack, @@ -75682,11 +75813,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/commons/fitness) -"xhN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/engineering/canister, -/turf/open/floor/iron/smooth, -/area/station/maintenance/department/security) "xhW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -75695,6 +75821,13 @@ "xhX" = ( /turf/open/misc/asteroid, /area/station/maintenance/starboard/lesser) +"xim" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/iron/dark, +/area/station/science/explab) "xip" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -75841,6 +75974,10 @@ /obj/structure/table, /turf/open/floor/iron/smooth, /area/station/maintenance/starboard/greater) +"xkr" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space) "xks" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/neutral/filled/line{ @@ -75913,6 +76050,18 @@ /obj/item/stack/cable_coil/five, /turf/open/misc/asteroid, /area/station/maintenance/central/lesser) +"xlp" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/white/full, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/escapepodbay) "xly" = ( /obj/structure/closet/emcloset{ anchored = 1 @@ -75938,6 +76087,16 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) +"xlV" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 5 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/secondary/construction/engineering) "xlW" = ( /obj/effect/turf_decal/sand/plating, /turf/closed/wall, @@ -76001,6 +76160,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/exit) +"xnf" = ( +/obj/item/storage/toolbox/syndicate, +/turf/closed/mineral/random/stationside/asteroid/porus, +/area/ruin/powered/clownplanet) "xng" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -76053,6 +76216,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"xnV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + location = "QM #2" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/mob/living/simple_animal/bot/mulebot{ + home_destination = "QM #2"; + suffix = "#2" + }, +/turf/open/floor/iron/smooth, +/area/station/cargo/drone_bay) "xog" = ( /obj/machinery/door/airlock/security/glass{ name = "Isolation Wing" @@ -76075,6 +76252,13 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"xoo" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/science/lower) "xoM" = ( /obj/structure/chair/stool/bar/directional/east, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -76269,6 +76453,19 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) +"xta" = ( +/obj/structure/industrial_lift/public, +/obj/machinery/elevator_control_panel{ + linked_elevator_id = "tram_xeno_lift"; + pixel_y = 2; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/obj/structure/table, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 9 + }, +/turf/open/floor/plating/elevatorshaft, +/area/station/science/xenobiology) "xtb" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 8 @@ -76400,18 +76597,6 @@ "xvl" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/foyer) -"xvv" = ( -/obj/machinery/netpod, -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/neon_lining{ - dir = 1; - icon_state = "pink2_1" - }, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/carpet/neon/simple/purple/nodots, -/area/station/bitrunning/den) "xvC" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/garbage, @@ -76432,19 +76617,6 @@ /obj/item/fish_feed, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"xwa" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/thinplating/dark/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/brig) "xwd" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -76454,10 +76626,23 @@ "xwf" = ( /turf/closed/wall/r_wall, /area/station/maintenance/central/greater) -"xwi" = ( -/obj/effect/spawner/random/trash/garbage, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) +"xwt" = ( +/obj/machinery/vending/wardrobe/science_wardrobe, +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/structure/sign/directions/upload/directional/south, +/turf/open/floor/iron/white, +/area/station/science/lower) +"xwu" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/plastic, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/iron/smooth, +/area/station/maintenance/department/medical) "xwz" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -76629,35 +76814,12 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) -"xzo" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Barber Shop" - }, -/turf/open/floor/wood/large, -/area/station/service/barber) "xzq" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 8 }, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) -"xzA" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Secure External Operations" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/any/command/eva, -/obj/effect/mapping_helpers/airlock/access/any/command/gateway, -/obj/effect/mapping_helpers/airlock/access/any/command/teleporter, -/turf/open/floor/iron, -/area/station/command/teleporter) "xzI" = ( /obj/machinery/vending/games, /obj/structure/sign/clock/directional/north, @@ -76776,6 +76938,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/work) +"xAT" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/openspace, +/area/station/security/brig) "xAW" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/cable, @@ -76854,6 +77025,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/storage/tools) +"xCw" = ( +/turf/open/misc/asteroid/dug, +/area/station/science/lower) "xCK" = ( /obj/structure/rack, /obj/structure/window/spawner/directional/east, @@ -76878,9 +77052,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/department/science) -"xDf" = ( -/turf/open/indestructible/honk, -/area/ruin/powered/clownplanet) "xDn" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -76892,6 +77063,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) +"xDu" = ( +/obj/machinery/elevator_control_panel{ + layer = 3.1; + linked_elevator_id = "tram_xeno_lift"; + pixel_y = 2; + preset_destination_names = list("2"="Lower Deck","3"="Upper Deck") + }, +/turf/closed/wall/r_wall, +/area/station/science/xenobiology) "xDy" = ( /obj/machinery/door/airlock/external{ name = "Solar Maintenance" @@ -76902,23 +77082,19 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/station/solars/starboard/fore) +"xDP" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 6 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/hallway/secondary/construction/engineering) "xDQ" = ( /turf/closed/wall, /area/station/security/processing) -"xDW" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/mining/glass{ - name = "Bitrunning Den" - }, -/obj/effect/mapping_helpers/airlock/access/any/supply/bit_den, -/turf/open/floor/iron, -/area/station/bitrunning/den) "xEo" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/captain) @@ -76979,6 +77155,15 @@ dir = 1 }, /area/station/service/chapel) +"xFj" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/dorms) "xFm" = ( /obj/structure/bed{ dir = 4 @@ -76986,9 +77171,19 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/security/courtroom/holding) +"xFp" = ( +/obj/machinery/light/directional/east, +/turf/open/misc/asteroid/dug, +/area/station/science/lower) "xFx" = ( /turf/open/floor/iron, /area/station/commons/fitness) +"xGd" = ( +/obj/machinery/computer/old{ + dir = 8 + }, +/turf/open/floor/iron/dark/small, +/area/ruin/powered/clownplanet) "xGe" = ( /obj/machinery/light/directional/north, /obj/machinery/camera{ @@ -77030,10 +77225,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/security) -"xHK" = ( -/obj/structure/sign/directions/arrival/directional/west, -/turf/closed/wall, -/area/station/service/hydroponics/garden) "xHL" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Tunnel Access Hatch" @@ -77123,15 +77314,6 @@ }, /turf/open/floor/iron, /area/station/cargo/drone_bay) -"xJt" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) "xJA" = ( /obj/structure/chair{ dir = 4 @@ -77201,6 +77383,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) +"xLb" = ( +/obj/structure/dresser, +/obj/item/clothing/mask/cigarette/cigar/havana, +/turf/open/floor/iron/grimy, +/area/ruin/powered/clownplanet) "xLi" = ( /obj/machinery/door/airlock/command/glass{ name = "Bridge" @@ -77246,6 +77433,18 @@ /obj/structure/closet/secure_closet/personal, /turf/open/floor/iron, /area/station/commons/dorms) +"xLN" = ( +/turf/open/floor/iron/dark, +/area/station/science/explab) +"xLO" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 4 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 8 + }, +/turf/open/floor/glass/reinforced, +/area/station/security/brig) "xMa" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 @@ -77307,24 +77506,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/freezer, /area/station/medical/coldroom) -"xMV" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) "xNj" = ( /obj/effect/turf_decal/trimline/red/filled/line, /obj/structure/table, @@ -77364,18 +77545,6 @@ /obj/item/lighter, /turf/open/floor/carpet, /area/station/security/detectives_office) -"xNB" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/structure/flora/bush/flowers_yw/style_random, -/obj/structure/flora/bush/grassy/style_random, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/structure/railing, -/turf/open/floor/grass, -/area/station/hallway/secondary/construction/engineering) "xNH" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -77409,6 +77578,13 @@ }, /turf/open/space/openspace, /area/station/solars/starboard/fore) +"xNZ" = ( +/obj/machinery/door/airlock/grunge{ + name = "Dynamic Bar Docking Port"; + desc = "This airlock is a contingency to keep any funny business from the replacable bar system. If it opens to a wall, this is intentional!" + }, +/turf/open/floor/iron/smooth, +/area/station/maintenance/department/cargo) "xOk" = ( /obj/effect/spawner/random/food_or_drink/booze, /obj/machinery/light/small/directional/north, @@ -77512,15 +77688,6 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance) -"xPB" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) "xPH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/engineering/tank, @@ -77531,19 +77698,6 @@ /obj/effect/turf_decal/tile/blue/full, /turf/open/floor/iron/dark/smooth_large, /area/station/commons/fitness/recreation/entertainment) -"xPP" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atm, -/turf/open/floor/iron, -/area/station/commons/dorms) "xPQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -77559,6 +77713,17 @@ }, /turf/open/floor/glass/reinforced, /area/station/command/heads_quarters/rd) +"xPZ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/ladder, +/obj/structure/railing{ + layer = 3.1 + }, +/turf/open/openspace, +/area/station/maintenance/department/cargo) "xQc" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/south, @@ -77650,15 +77815,6 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/smooth, /area/station/maintenance/department/medical) -"xSj" = ( -/obj/structure/sign/warning/electric_shock/directional/east{ - pixel_x = 0; - pixel_y = 32 - }, -/obj/structure/rack, -/obj/item/clothing/shoes/sneakers, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) "xSr" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -77753,30 +77909,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/security/execution/education) +"xUa" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/science/ordnance) "xUb" = ( /obj/machinery/smartfridge/organ, /obj/structure/sign/warning/cold_temp/directional/east, /obj/effect/turf_decal/tile/blue/opposingcorners, /turf/open/floor/iron/freezer, /area/station/medical/coldroom) -"xUp" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/turf/open/openspace, -/area/station/maintenance/department/crew_quarters/dorms) -"xUC" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/engineering/atmos) "xUG" = ( /obj/structure/railing{ dir = 4 @@ -77971,13 +78118,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/prison/safe) -"xXE" = ( -/obj/effect/turf_decal/trimline/dark_red/warning{ - dir = 1 +"xXH" = ( +/obj/machinery/door/firedoor/border_only{ + dir = 8 }, -/obj/structure/industrial_lift/public, -/turf/open/floor/plating/elevatorshaft, -/area/station/commons/dorms) +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/structure/railing{ + dir = 8; + layer = 4.1 + }, +/turf/open/floor/iron/white, +/area/station/science/xenobiology) "xXL" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -77997,6 +78150,10 @@ /obj/item/storage/backpack/duffelbag/med/surgery, /turf/open/floor/iron/smooth, /area/station/maintenance/department/medical) +"xYf" = ( +/obj/structure/flora/bush/jungle/c/style_random, +/turf/open/misc/dirt/jungle, +/area/station/science/lower) "xYg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/caution/stand_clear, @@ -78038,26 +78195,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/ai_monitored/security/armory) -"xYD" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 6 - }, -/mob/living/simple_animal/pet/cat/kitten{ - name = "Blu"; - gender = "female" - }, -/obj/structure/bed/dogbed{ - desc = "A comfy-looking cat bed. You can even strap your pet in, in case the gravity turns off."; - name = "cat bed" - }, -/obj/machinery/conveyor_switch/oneway{ - id = "hydrodropoff"; - name = "Shipment Delivery Chute Activator"; - pixel_x = 10; - pixel_y = 20 - }, -/turf/open/floor/plastic, -/area/station/engineering/break_room) "xYV" = ( /turf/open/floor/noslip, /area/station/hallway/primary/tram/right) @@ -78249,12 +78386,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/medical) -"ybF" = ( -/obj/machinery/module_duplicator, -/obj/machinery/light/directional/south, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/station/science/explab) "ybL" = ( /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/sand, @@ -78269,6 +78400,13 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/science) +"ybX" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/cassette/mailbox, +/turf/open/floor/wood/parquet, +/area/station/service/library) "ycg" = ( /obj/effect/landmark/start/station_engineer, /obj/effect/turf_decal/trimline/yellow/arrow_cw{ @@ -78277,15 +78415,6 @@ /obj/effect/turf_decal/trimline/yellow/corner, /turf/open/floor/iron, /area/station/engineering/main) -"ycm" = ( -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 1 - }, -/turf/open/floor/glass/reinforced, -/area/station/security/brig) "yct" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 4 @@ -78350,17 +78479,6 @@ /obj/structure/industrial_lift/tram, /turf/open/openspace, /area/station/hallway/primary/tram/center) -"ycH" = ( -/obj/structure/lattice/catwalk, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/openspace, -/area/station/asteroid) "ycI" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 8 @@ -78511,13 +78629,6 @@ /obj/effect/turf_decal/trimline/yellow/filled/line, /turf/open/floor/iron, /area/station/tcommsat/computer) -"yeZ" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 4 - }, -/turf/open/floor/iron/white/side, -/area/station/science/explab) "yfa" = ( /obj/machinery/light/dim/directional/south, /turf/open/floor/iron/freezer, @@ -78536,6 +78647,10 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"yfz" = ( +/obj/structure/sign/directions/arrival/directional/west, +/turf/closed/wall, +/area/station/service/hydroponics/garden) "yfB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/landmark/event_spawn, @@ -78608,6 +78723,15 @@ }, /turf/open/floor/wood, /area/station/service/bar/backroom) +"ygO" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/obj/structure/railing{ + dir = 4; + layer = 4.1 + }, +/turf/open/openspace, +/area/station/asteroid) "ygR" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -78637,6 +78761,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison) +"yhN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) "yhR" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -78695,6 +78828,13 @@ }, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"yiG" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/openspace/airless, +/area/station/asteroid) "yiL" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/caution/stand_clear{ @@ -78752,10 +78892,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/starboard/central) -"yjs" = ( -/obj/structure/sign/directions/arrival/directional/west, -/turf/closed/wall, -/area/station/command/heads_quarters/hop) "yjz" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, @@ -78984,6 +79120,13 @@ "ylV" = ( /turf/open/lava, /area/station/security/execution/education) +"ymh" = ( +/obj/effect/turf_decal/trimline/dark_red/warning{ + dir = 9 + }, +/obj/structure/industrial_lift/public, +/turf/open/floor/plating/elevatorshaft, +/area/station/commons/dorms) (1,1,1) = {" vXM @@ -81266,9 +81409,9 @@ cdf nPb pkp pjA -mZV -xDf -xDf +kCh +pkp +pkp pkp nPb vXM @@ -83316,9 +83459,9 @@ nPb gcp cMf gcp -wdQ -qIE -dLE +deN +cAu +szd gcp gcp gcp @@ -83571,13 +83714,13 @@ nPb oVB nPb gcp -gNy -knr -tkp -tkp -cmx +jQq +uac +jQq +jQq +swO gcp -cBi +gLq gcp agK coN @@ -83828,14 +83971,14 @@ oVB nPb nPb gcp -atl -naI -tkp -tkp -tun -iOC -aaA -dbr +rcw +kxX +jQq +jQq +eZw +sQR +eZw +oXj coN coN nPb @@ -84085,11 +84228,11 @@ nPb nPb nPb gcp -jGN -tkp -tkp -tkp -bSM +nfa +jQq +jQq +jQq +gsU gcp gcp gcp @@ -84343,15 +84486,15 @@ nPb nPb gcp qQm -fTI -agz -tun -nHV -piT +giT +kCb +eZw +ceJ +rcR gcp -eES coN -swV +coN +coN nPb nPb uww @@ -84600,9 +84743,9 @@ nPb nPb gcp cKm -agF -tun -eJA +aOK +eZw +tAW gcp xAc gcp @@ -84857,12 +85000,12 @@ nPb nPb gcp gcp -slw +ntM wSx -blW +uOJ gcp -agv -vDE +aSk +hhX eSI gXd nPb @@ -85119,7 +85262,7 @@ nim vIM gcp rLB -vBB +mpd plz gcp nPb @@ -85371,13 +85514,13 @@ pkp nPb nPb gcp -qoD -iSw +gBU +eMv oCu gcp -xSj -gxi -gWk +deB +nly +hdo gcp nPb nPb @@ -85632,10 +85775,10 @@ gcp gcp gcp gcp -mfL -xwi -wnM -gcp +nPb +nPb +nPb +nPb nPb nPb pkp @@ -85888,11 +86031,11 @@ nPb nPb nPb nPb -gcp -gcp -oMX -jjY -gcp +nPb +nPb +nPb +nPb +nPb nPb pkp pkp @@ -86146,10 +86289,10 @@ nPb nPb nPb nPb -gcp -gcp -gcp -gcp +nPb +nPb +nPb +nPb nPb pkp nPb @@ -86402,7 +86545,7 @@ pkp nPb nPb oVB -nPb +xnf nPb nPb nPb @@ -90442,13 +90585,13 @@ aac aac apC lgu -vxB -vxB -vxB -wCg -tvX -vxB -vxB +eCE +eCE +eCE +pkr +wXe +eCE +eCE lgu lgu lgu @@ -90699,12 +90842,12 @@ aac aac apC lgu -vxB -oPS -oPS -oPS -kMJ -oPS +eCE +pfM +pfM +pfM +uoS +pfM lZP lZP lZP @@ -90956,12 +91099,12 @@ buG dDk apC lgu -vxB -oPS -tHy -vCp -aDQ -rOQ +eCE +pfM +jBm +usb +tBF +abD apC apC apC @@ -91213,12 +91356,12 @@ dDk dDk apC lgu -vxB -oPS -tFl -jqH -uFC -rOQ +eCE +pfM +qRW +jxe +uWe +abD hAD hAD hAD @@ -91433,7 +91576,7 @@ mQc vAI tbp cnQ -oDF +ngo jzw ylV gfK @@ -91470,12 +91613,12 @@ abC dDk apC lgu -vxB -oPS -bcu -twt -aMy -rOQ +eCE +pfM +cai +lVM +kWo +abD hAD buv yeE @@ -91727,12 +91870,12 @@ dDk dDk apC lgu -vxB -oPS -rOQ -rOQ -rOQ -rOQ +eCE +pfM +abD +abD +abD +abD veV alT anq @@ -91961,35 +92104,35 @@ aaV aaV dDk mXt -abA +cqu itN dDk dDk dDk mXt -abA +rTz itN dDk dDk dDk mXt -abA +qqH itN dDk dDk dDk mXt -abA +dTg itN dDk apC lgu -vxB +eCE lZP apC thi -mQF -bhK +iBp +vcp amr alT hAD @@ -92482,8 +92625,8 @@ abm abm abf abf -abf -acA +hhu +boN acN acT acA @@ -92739,9 +92882,9 @@ abf abX acf acp -acp -acB -acO +lZq +uWq +xlp acU acY adl @@ -93503,7 +93646,7 @@ aaa aaa aaa pZW -vGH +sap bGu abJ abO @@ -93760,7 +93903,7 @@ aaa aaa aaa pZW -vNV +mvu pZW abK abR @@ -93792,7 +93935,7 @@ xkx lMw hAD hAD -hAD +hZi hAD hAD hAD @@ -94248,10 +94391,10 @@ aaa aaa jWs rIP -eLB +gpW abU aci -acv +aMo acH sXc cDa @@ -94512,8 +94655,8 @@ jWs xlk ucA rau -nQi -gTv +cnD +kRI jWs aaa aaa @@ -94769,8 +94912,8 @@ jWs fIH yly kYr -dHy -wxg +trx +wro jWs aaa aaa @@ -96109,7 +96252,7 @@ nhL npe xmm sKg -hHu +uyu dzF xhL aXo @@ -96357,19 +96500,19 @@ elr fOs ala toy -iMh +rCG eAE apC -uqm +pSJ trd taB -xJt +vPU aJC mlI jsA wPE wPE -wPE +uRP wPE wPE wPE @@ -96619,8 +96762,8 @@ eAE apC elr dwp -oqT -drw +tLr +xFj wbb xFx tAs @@ -96841,7 +96984,7 @@ rUR hMQ uaC lQM -vqq +jlI hWa pZW pVD @@ -96877,7 +97020,7 @@ apC itn pWC pWC -nyV +wbf wbb xFx kzQ @@ -97134,7 +97277,7 @@ apC qSs vYD vYD -nyV +wbf wbb xFx vAF @@ -97391,7 +97534,7 @@ apC elr elr elr -xPP +hnT guI xFx vAF @@ -97648,7 +97791,7 @@ apC itn pWC pWC -nyV +wbf wbb xFx otf @@ -97869,7 +98012,7 @@ rUR jVG tVe lQM -vqq +jlI hWa pZW pVD @@ -97905,7 +98048,7 @@ apC qSs vYD vYD -nyV +wbf wbb xFx kzQ @@ -98124,7 +98267,7 @@ rUR aaa rUR pnp -fkc +bJM lQM iqe hWa @@ -98161,8 +98304,8 @@ lgu apC elr tzJ -hVa -drw +tRI +xFj wbb xFx bPo @@ -98413,13 +98556,13 @@ elr fOs alb toy -hTK +qdb lgu apC -dXm +vsb sLR sKP -wGg +vOu tRU nel nel @@ -98679,7 +98822,7 @@ qPK scx bsM sKg -uTu +dEr hqN xhL aXo @@ -99193,7 +99336,7 @@ vmB pwe uLO elr -sue +lMe eAZ eAZ eAZ @@ -100460,9 +100603,9 @@ ncF nvE hdP ncF -vUk +ymh oWX -ixf +vRr elr bTb elr @@ -100717,9 +100860,9 @@ ncF hUY ncF ncF -xXE +cLf iDJ -xgW +cot elr elr elr @@ -100974,9 +101117,9 @@ acD acx aaa elr -onb -vxD -kFD +rmQ +hVq +gRF elr aaa aaa @@ -106072,9 +106215,9 @@ qxf qxf jIN ldD -vUP -vUP -wlo +cyT +hMq +iRg hSy hSy hSy @@ -106339,11 +106482,11 @@ hFr hFr avt hFr -vsg -ekX +bjR +vlp oOj -ekX -ekX +vlp +vlp hFr aaa aaa @@ -106596,11 +106739,11 @@ htb hFr avt hFr -mTS -gaX -hWh -sBd -mTS +wrV +wCT +woQ +rro +wrV hFr hFr hFr @@ -106830,7 +106973,7 @@ wyP hFr cGo hFr -aFk +ira gHq hFr jVU @@ -106897,7 +107040,7 @@ bdI wns sAK jIG -nwq +iJj pCi pCi rvo @@ -107897,9 +108040,9 @@ dFU xPd mky ekB -wIt -hQz -jAH +nGO +uzw +ogA dJJ coX fvQ @@ -108138,7 +108281,7 @@ aSB iTz wUL izL -ljC +pCE bZh hFr nyH @@ -108154,9 +108297,9 @@ uTz hJM nAa ekB -gEE +mXG wAo -jMr +gqn dJJ ufY cDp @@ -108411,9 +108554,9 @@ oAH hBr hiu ekB -skh +qKu oYz -uZy +frN dJJ nvU nag @@ -108908,7 +109051,7 @@ lUw lUw iTz iTz -rOx +raQ vSW iTz iTz @@ -109202,8 +109345,8 @@ hxz jnq kbi kbi -xNB -qIC +owh +ifu nQo fhA cAz @@ -109460,7 +109603,7 @@ jnq kTr pXG pXG -hfW +qWZ oFd dJR mpq @@ -109717,7 +109860,7 @@ jnq nsy nhZ nhZ -gBV +edF oFd ers bIC @@ -109973,8 +110116,8 @@ wrD xHL oQW oQW -aVq -ksP +qXP +pyu iJd qKx ulV @@ -110504,7 +110647,7 @@ fXQ srY roB roB -apZ +uvR mqw rnf xBD @@ -110697,17 +110840,17 @@ eVz wHX mYg nUP -pQF +mPI wHX nWT adg ykN qMf -dyC +pkU fIl nUP gvC -aep +wHC dQt iRL snQ @@ -110958,7 +111101,7 @@ wDw ale moV ptR -flP +tto feC sbv yka @@ -111005,7 +111148,7 @@ qZE vHb epB cUZ -tur +eQY fsa nYF uHI @@ -111211,13 +111354,13 @@ eVz wHX qoZ nUP -cAc +mJg wHX nWT adg ykN qMf -mCR +fNE pPN nUP cQY @@ -111283,7 +111426,7 @@ utU qzf qcw sHH -bXp +ihr aeL aeL aeL @@ -112242,7 +112385,7 @@ nUP nUP riu thM -adj +aQy thM xcp thM @@ -112283,9 +112426,9 @@ qjU qjU aaa ghz -hrB -sxL -fWd +lAN +aTK +nMr ajI kIM cgd @@ -112306,13 +112449,13 @@ hmF iQU gqL xat -urq -urq -urq -urq -urq -urq -urq +gqL +gqL +gqL +gqL +gqL +gqL +gqL wQm wQm wQm @@ -112569,7 +112712,7 @@ mfB mfB mfB mfB -jKV +yhN nrQ mfB mfB @@ -112797,9 +112940,9 @@ byW qjU aaa ghz -cgr -cZP -bsu +xlV +sEp +xDP ajI bSg vuT @@ -112826,8 +112969,8 @@ wQm fja wQm wQm -urq -bZW +gqL +uZJ wQm kdw aOV @@ -113033,7 +113176,7 @@ iRL iRL mGw sKp -xzo +pCx sKp xYu xpb @@ -113084,7 +113227,7 @@ oqh wQm wQm eaq -bZW +uZJ wQm oaX tsp @@ -113341,7 +113484,7 @@ lrX wQm wQm wQm -bJN +aYB wQm oaX lLP @@ -113598,7 +113741,7 @@ ram vRm fMm kkc -acg +kkb wQm oaX fhG @@ -113855,7 +113998,7 @@ rvK vkO sjc wQm -xUC +dxd wQm lXH riD @@ -114094,7 +114237,7 @@ bia ulV hqb hRj -xYD +htW mwK pgS beG @@ -114112,7 +114255,7 @@ tts tts lKI gjC -fTi +sPC wQm oaX vwz @@ -114369,7 +114512,7 @@ ora qkS vEq wQm -lyK +omj wQm oaX sGQ @@ -114626,7 +114769,7 @@ taw taw taw ngl -iQF +pEL taw ssw fja @@ -114883,11 +115026,11 @@ tNs dKI jaD dbc -mZc -qXA -nvA -nmK -dys +mtv +nBe +hyR +tHz +lqs rpd uFX aNd @@ -115144,7 +115287,7 @@ uOg jEd wIY btw -vaK +shA hZr pHM fjQ @@ -115401,12 +115544,12 @@ lEp xxf hZr hAW -mVd +wox hZr pHM hZr djX -mQi +hYn ixc ixc bNz @@ -115658,7 +115801,7 @@ nYX jUW mHw orh -uxn +okv inb pHM oNq @@ -115915,7 +116058,7 @@ ahD pNk hZr cPM -hif +dGw hZr hZr hZr @@ -116172,7 +116315,7 @@ mDC tnq hZr ykm -gWu +rxs lDj slb slb @@ -116429,7 +116572,7 @@ ueZ fjb hZr diq -csN +pvG lDj djX ixc @@ -116686,7 +116829,7 @@ tLM fjb hZr bQQ -qzI +hUw vWZ lDj lDj @@ -117206,11 +117349,11 @@ dkm dww cjG djX -nPp +nAc gTl -bKe +eYo eno -nqB +qud vXM vXM mzx @@ -117397,8 +117540,8 @@ rMP wlR quF quF -asK -vCr +vpu +dvZ ykX pdq sFb @@ -117654,8 +117797,8 @@ kBR wlR quF iBj -asK -rSK +vpu +dYa ykX cOx sVV @@ -117911,7 +118054,7 @@ faZ wlR nTV dke -hBB +sba ecw qhN quF @@ -118168,8 +118311,8 @@ iRL iRL iRL deH -oft -vCr +sgL +dvZ ykX quF quF @@ -118425,8 +118568,8 @@ quF quF quF quF -asK -vCr +vpu +dvZ hjN quF coY @@ -118467,7 +118610,7 @@ wQP vsd qwy xdN -uQP +xgQ lcN jVf wQP @@ -118489,7 +118632,7 @@ vde atC gqV atP -atP +efz auf aum aup @@ -118742,7 +118885,7 @@ dfH haI qWU pts -gEs +tuj atD rnA hBY @@ -118950,7 +119093,7 @@ crh kPE kPE vlD -qsZ +seu vlD acy acx @@ -120513,7 +120656,7 @@ psP tHh bcj lQw -rBV +lQw lQw aWg oPQ @@ -121761,9 +121904,9 @@ aaa aaa aaa uGW -jdU -ijW -rff +efS +bmO +cns uGW aaa aaa @@ -122018,9 +122161,9 @@ aaa aaa aaa uGW -uGY +lej aXu -pFp +eed uGW aaa aaa @@ -122030,10 +122173,10 @@ arE tEP uAn wmK -eXL +mOJ alA whL -erw +vfm rvV mbJ jBC @@ -122060,8 +122203,8 @@ qxm qxm nZX iix -eJX -tfS +bSs +xez wQP nkw wQP @@ -122317,8 +122460,8 @@ nQT nQT wwN iix -oCH -jpP +bQa +qXI wQP gUD qFq @@ -122801,7 +122944,7 @@ arE arE arE aha -xPB +ijk lXv whL bXk @@ -123353,7 +123496,7 @@ qwX dUT kEN eHE -fVL +mcP asc rin dUT @@ -124398,7 +124541,7 @@ asv mln tjz asv -hQg +xta oYQ gCY whn @@ -124599,7 +124742,7 @@ pIb pIb pIb jbp -wYz +iIM wHy xBU aSi @@ -124654,7 +124797,7 @@ hDT keT iEF fof -vwc +aMB sXX akC kMh @@ -124844,7 +124987,7 @@ oNp rMq qBT oCe -lDw +eFQ lJt oTd cJX @@ -125138,12 +125281,12 @@ uJu uJu uJu jJi -sQZ -sQZ -sQZ -sQZ -sQZ -sQZ +iix +iix +iix +iix +iix +iix pOg rwN fWT @@ -125390,17 +125533,17 @@ qxm gDw icR gDw -sQZ -sQZ -sQZ -sQZ -sQZ -sQZ -pth -bUI -bPv -iis -sQZ +iix +iix +iix +iix +iix +iix +qQg +prb +xoo +tfx +iix vOx rwN fWT @@ -125647,17 +125790,17 @@ qxm gDw icR gDw -sQZ -bOV -hde -owO -owO -cJS -tyi -qnA -oRz -vfW -sQZ +iix +ljE +jNA +tuN +tuN +kIn +dPo +jhb +mga +mPD +iix vOx rwN fWT @@ -125903,18 +126046,18 @@ mrr qxm rlM icR -sQZ -sQZ -owO -owO -owO -nhj -cJS -nhj -hYg -oRz -ybF -sQZ +iix +iix +tuN +tuN +tuN +pRm +kIn +pRm +gbu +mga +eku +iix lUR rwN uJV @@ -126160,18 +126303,18 @@ mrr qxm mDD icR -sQZ -qqv -osN -aFj -osN -dpv -epJ -dpv -hYg -gfA -wDv -sQZ +iix +lWg +bYJ +nqv +bYJ +tiF +its +tiF +gbu +iyh +pMJ +iix bYZ xAe sxX @@ -126417,22 +126560,22 @@ adD qxm qxm icR -sQZ -sQZ -nsv -owO -owO -nhj -cJS -nhj -cVU -oRz -ipP -sQZ -nhj -prI -nhj -mtI +iix +iix +tVm +tuN +tuN +pRm +kIn +pRm +qkI +mga +mHI +iix +pRm +bpQ +pRm +dUT tEe dUT kEN @@ -126675,20 +126818,20 @@ xks qxm icR icR -sQZ -owO -owO -owO -owO -cJS -iih -cVU -cFW -cFW -nEB -vep -eYN -bDk +iix +tuN +tuN +tuN +tuN +kIn +sSL +qkI +iyC +iyC +cBd +mfC +kfl +tuu gzw gzw gzw @@ -126932,20 +127075,20 @@ fUQ qxm qxm icR -sQZ -sQZ -sQZ -sQZ -sQZ -sQZ -kYl -hIY -tVK -vIF -yeZ -hTg -kKo -gjn +iix +iix +iix +iix +iix +iix +vuU +gfu +tPQ +dFw +nxQ +nZJ +wHz +tpr gzw fVy uTL @@ -127194,15 +127337,15 @@ aZc nCG cjb oNR -sQZ -mtI -dmG -dkY -qlE -mWx -gHv -kTe -czu +iix +dUT +juy +nTd +jZf +nIP +pAk +mJp +bAr gzw gzw qPX @@ -127221,7 +127364,7 @@ fip fip dUT aaa -duu +jto qiI gNz bfH @@ -127451,16 +127594,16 @@ dCe ieq lzQ oNR -sQZ -wSp -nNh -gXo -sGF -gXo -sGF -gkF -kRR -nNh +iix +nff +ahG +wtX +hwe +wtX +hwe +pWt +dpd +ahG gzw stC xBC @@ -127708,16 +127851,16 @@ jmx cwB iBG oNR -sQZ -kRR -vCY -kQR -bpn -kRR -wSp -cwU -kRR -gXo +iix +dpd +elo +fdK +gWc +dpd +nff +bzn +dpd +wtX gzw dNH eyD @@ -127960,20 +128103,20 @@ gDw gDw nop nop -oOu +hPn eyE cwB yhZ oNR -sQZ -sQZ -aBl -kRR -mmy -nNh -vCY -iBT -czu +iix +iix +vvD +dpd +veH +ahG +elo +jQb +bAr gzw gzw ulz @@ -128222,15 +128365,15 @@ pom cwB iBG oys -sQZ -tdY -pTj -kRR -pTj -pQx -kRR -sQZ -sQZ +iix +xYf +wCg +dpd +wCg +xCw +dpd +iix +iix gzw mAC iSF @@ -128238,7 +128381,7 @@ nJJ vri gzw vrS -moE +xwt iix sNS sNS @@ -128479,15 +128622,15 @@ nie pPk qPF oys -pQx -vUz -nzO -pTj -pTj -hgN -mRD -asu -oyR +xCw +hfM +iPu +wCg +wCg +aOq +gjA +naK +oat gzw tnA tnA @@ -128736,15 +128879,15 @@ oaI cwB iBG oys -asu -oyR -mRD -vUz -vUz -vUz -vUz -oyR -oyR +naK +oat +gjA +hfM +hfM +hfM +hfM +oat +oat kkK gOL aMc @@ -128993,15 +129136,15 @@ nai sDD jky oys -oyR -oyR -oyR -vKr -hgN -oyR -oyR -oyR -oyR +oat +oat +oat +xFp +aOq +oat +oat +oat +oat hfZ mwy joS @@ -129252,16 +129395,16 @@ oys oys aaa aaa -oyR -asu -oyR +oat +naK +oat dfz dfz kkK jXE lwF dfz -beq +fGj qCP urA ygC @@ -131067,8 +131210,8 @@ mPV xjx gKc frV -qFY -vJC +fmC +xUa qWf rLG eOZ @@ -131325,14 +131468,14 @@ qME mon frV wBV -wBV +mwO jLH jLH jLH -aaa -aaa -aaa -aaa +fyu +gip +fLd +sQZ aac aac aac @@ -131580,16 +131723,16 @@ nMB nMB nMB ryI -ign -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +frV +ghB +leh +bFN +bFN +xLN +uuy +vmE +tUX +sQZ aaa aac aac @@ -131837,16 +131980,16 @@ nMB nMB nMB abh -ign -aac -aac -vXM -vXM -aaa -aaa -aaa -aaa -aaa +frV +hlb +rmr +xLN +xim +sQZ +hSu +aiT +xbB +sQZ aaa aaa aaa @@ -132093,17 +132236,17 @@ cvw vjA eSH dWM -ign -ign -aac -vXM -vXM -vXM -vXM -vXM -vXM -aaa -aaa +frV +frV +rsQ +rmr +xLN +tho +sQZ +sQZ +sQZ +sQZ +sQZ aaa aaa vXM @@ -132350,16 +132493,16 @@ pOA eaJ wTG ign -ign -aac -aac -vXM -vXM -vXM -vXM -vXM -vXM -vXM +frV +pSs +xLN +xLN +xLN +xLN +rkx +vVA +vVA +sQZ vXM vXM vXM @@ -132607,16 +132750,16 @@ ign wgM ign ign -aac -aac -vXM -vXM -vXM -vXM -vXM -vXM -vXM -vXM +sQZ +sQZ +nhj +nhj +nhj +sQZ +sQZ +sQZ +ezD +sQZ vXM vXM vXM @@ -132865,12 +133008,12 @@ vXM pHM aac aac +kfT vXM vXM vXM vXM -vXM -vXM +kfT vXM vXM vXM @@ -133122,13 +133265,13 @@ vXM pHM aac aac -vXM -vXM -vXM -vXM -vXM -vXM -vXM +xkr +xkr +xkr +xkr +xkr +xkr +xkr vXM vXM vXM @@ -133378,14 +133521,14 @@ pHM vXM pHM aac -vXM -vXM -vXM -vXM -vXM -vXM -vXM -vXM +odr +odr +odr +odr +odr +odr +odr +xkr vXM vXM vXM @@ -133634,15 +133777,15 @@ vXM pHM pHM pHM -vXM -vXM -vXM -vXM -vXM -vXM -vXM -vXM -vXM +xkr +odr +odr +odr +odr +odr +odr +odr +xkr vXM vXM vXM @@ -133891,15 +134034,15 @@ vXM pHM vXM pHM -vXM -vXM -vXM -vXM -vXM -vXM -vXM -vXM -vXM +xkr +odr +odr +odr +odr +odr +odr +odr +xkr vXM vXM vXM @@ -134148,15 +134291,15 @@ vXM pHM vXM pHM -vXM -vXM -vXM -vXM -vXM -vXM -vXM -vXM -vXM +xkr +odr +odr +odr +odr +odr +odr +odr +xkr vXM vXM vXM @@ -134405,15 +134548,15 @@ vXM pHM vXM pHM -vXM -vXM -vXM -vXM -vXM -vXM -vXM -vXM -vXM +xkr +odr +odr +odr +odr +odr +odr +odr +xkr vXM vXM vXM @@ -134662,15 +134805,15 @@ vXM pHM pHM pHM -vXM -vXM -vXM -vXM -vXM -vXM -vXM -vXM -vXM +xkr +odr +odr +odr +odr +odr +odr +odr +xkr vXM vXM vXM @@ -134919,15 +135062,15 @@ vXM pHM vXM pHM -vXM -vXM -vXM -vXM -vXM -vXM -vXM -vXM -vXM +xkr +odr +odr +odr +odr +odr +odr +odr +xkr vXM vXM vXM @@ -135176,15 +135319,15 @@ vXM pHM vXM pHM -vXM -vXM -vXM -vXM -vXM -vXM -vXM -vXM -vXM +xkr +xkr +xkr +xkr +xkr +xkr +xkr +xkr +xkr vXM vXM vXM @@ -149621,9 +149764,9 @@ cdf cdf nPb gcp -jFt -pVy -wtK +gEl +uac +icL gcp gcp gcp @@ -149879,11 +150022,11 @@ cdf nPb gcp qBq -exv -gNy -agx -aBI -sJp +iuK +jQq +sMJ +nzy +hiQ gcp nPb nPb @@ -150136,11 +150279,11 @@ nPb nPb gcp qBq -exv -gNy -tkp -jap -tsR +iuK +jQq +nzy +vtC +wIW gcp nPb nPb @@ -150392,12 +150535,12 @@ cdf nPb nPb gcp -iOh -aQh -gNy -tIw -agt -bxd +dnL +dnU +jQq +nkE +xGd +eKE gcp nPb nPb @@ -150651,7 +150794,7 @@ nPb gcp gcp gcp -bhG +fKx auz gcp gcp @@ -150908,8 +151051,8 @@ nPb oVB nPb gcp -xgi -kFs +mFF +oNW gcp nPb nPb @@ -151165,8 +151308,8 @@ nPb nPb nPb gcp -agw -agG +qVE +xLb gcp nPb nPb @@ -152354,7 +152497,7 @@ jhd jhd tPE qnv -tld +wId nmY fXf nmY @@ -154423,7 +154566,7 @@ jhd jhd bfM tCT -vxe +hEb nQG dfL nmY @@ -155459,7 +155602,7 @@ etC jEu kqf dFP -dFP +rMA dFP ste jEu @@ -156217,7 +156360,7 @@ oca uhv vyI biI -oxT +ruS jNb qsa wdU @@ -156229,7 +156372,7 @@ jNb fLN tRo jNb -xHK +yfz nEF jBy iHr @@ -156709,7 +156852,7 @@ aaa aaa osk oRe -sQY +mGY pKz jSZ jta @@ -157009,7 +157152,7 @@ tdx mQa tdx aJN -fmu +urs mfF tdx kSq @@ -157272,7 +157415,7 @@ cSr fxP xVV cSr -qWN +ybX tLg nJF tdx @@ -157531,7 +157674,7 @@ gFt cSr gCQ evs -edK +dyx tdx tVH tdx @@ -157779,7 +157922,7 @@ mpw ckM rrM puN -moP +iIx wFq sQu vin @@ -158768,7 +158911,7 @@ jta ayR dsF dsF -idW +vEm hzN hzN hzN @@ -158813,7 +158956,7 @@ ahZ kgd rWe gYD -hNz +noz kgd kgd uuC @@ -159025,7 +159168,7 @@ jta ayR eeL kHZ -pEM +fBe lOK hSH dxC @@ -159550,7 +159693,7 @@ bNJ bNJ bNJ dIY -eFk +dlb aBH mFQ wHT @@ -159820,8 +159963,8 @@ daU swc wHT omH -jKZ -ghY +mOc +hyH mHX jtg jvf @@ -160053,7 +160196,7 @@ nca yji rbT ndP -pwm +efA qpb hAv dxC @@ -160076,8 +160219,8 @@ fMN iHL tLA sNr -jmR -oxf +tiB +jTj qit qIN gFx @@ -160310,16 +160453,16 @@ nca yji dsF dsF -eQR +bir dxC dxC dxC -tyr +vsa ief ujt ujt ief -xzA +eQn ief aBV cCR @@ -160333,12 +160476,12 @@ sik iOm ofA lcS -vhG -jSd +cem +eqv mof -aGh +iNe cKd -yjs +niO rRK tel yiM @@ -160601,20 +160744,20 @@ mGQ yiM fpg heY -wuE +ovb mQp mQp mQp mQp mQp -wuE -wuE +ovb +ovb mQp mQp mQp mQp mQp -wuE +ovb mzD lUf pUw @@ -160812,10 +160955,10 @@ xSX rOh rco awp -hWL -vgl -iCu -xwa +ljQ +wJf +irF +dyc wEC pPP qKd @@ -161071,10 +161214,10 @@ xay foz ftw bfr -ird -oTJ -oTJ -oTJ +pyx +dWK +dWK +dWK qdY uCZ dSo @@ -161328,11 +161471,11 @@ plQ awr awy eSM -tfp -jrK -fCh -qcR -neC +iJh +hla +whJ +cvC +lzT iUE rxE jyR @@ -161346,7 +161489,7 @@ qyZ qyZ qyZ qyZ -gFi +kWv lvo qVN vpa @@ -161372,20 +161515,20 @@ wDB qqi fpg gpH -wuE +ovb nqH nqH nqH nqH nqH -wuE -wuE +ovb +ovb nqH nqH nqH nqH nqH -wuE +ovb mzD oxE pUw @@ -161585,11 +161728,11 @@ lUr awp dob cmH -tfp -kZS +iJh +pyX nca -qrc -neC +vAs +lzT jNw yji ehd @@ -161616,15 +161759,15 @@ aQO aQO aQO qhM -wqg +sOG yiM cFs lNP nJq vVY -mJl +drp yiM -iLh +kya rLP mlj yjQ @@ -161842,11 +161985,11 @@ mbX iUh iUh iEm -tfp -kZS +iJh +pyX nca -qrc -neC +vAs +lzT niZ yeG oZA @@ -161886,7 +162029,7 @@ uHT fSr fSr pjg -mgU +jKU fSr qOF qOF @@ -162099,11 +162242,11 @@ hwv bjv awz rOh -tfp -kZS +iJh +pyX nca -qrc -neC +vAs +lzT eOh mwg ceF @@ -162152,11 +162295,11 @@ wri gHC qOF aKV -tWw +ovv vjv ifg xUG -lAR +gsq ijj pUw pUw @@ -162356,11 +162499,11 @@ hhN wOU awz rOh -tfp -kZS +iJh +pyX nca -qrc -ycm +vAs +mfH qdY eOh pJJ @@ -162613,11 +162756,11 @@ osB kCm awz rOh -tfp -piz -nTy -gOA -ruA +iJh +ore +lIK +oIb +hPw nyt phB qdY @@ -162632,9 +162775,9 @@ hEq njq kVV eQE -nbh -qNz -pdE +lni +jGW +beg cNc mEK pKq @@ -162870,10 +163013,10 @@ hvZ mGN gNK rOh -gAO -odr -rMJ -odr +anD +ork +oFY +ork lSo lSo lSo @@ -162889,11 +163032,11 @@ hHI nUM bNF pWN -jdF -heE +gcF +tof fOQ gkr -mPf +qrj lMd mJm sTH @@ -162916,18 +163059,18 @@ gbl uSe kGJ fSr -wnN +dap qOF xmR xmR qOF aKL aKX -vSh +jgY fsC fsC fsC -aMm +tTq srN ckb jkt @@ -163127,11 +163270,11 @@ iLs kQy awz rOh -tfp -rcH -eaY -eGs -ruA +iJh +sbR +vvV +sou +hPw otz kTT hMA @@ -163146,9 +163289,9 @@ qti pRB kVV uST -hZP -oai -kqs +fzz +pfO +lCR qiq crR ioV @@ -163384,11 +163527,11 @@ pLO nzz awz rOh -tfp -kZS +iJh +pyX nca -qrc -hYN +vAs +mVK hMA gvQ gvQ @@ -163411,7 +163554,7 @@ pHs ozv aCB vtj -czX +wdd vrN lPY eaT @@ -163641,11 +163784,11 @@ hzk wsw awz rOh -tfp -kZS +iJh +pyX nca -qrc -neC +vAs +lzT gvQ gvQ xum @@ -163694,11 +163837,11 @@ woJ tdR qOF aKZ -gsO +wDg aLi aLQ aMd -aMn +ddA dzz pUw pUw @@ -163898,11 +164041,11 @@ hEK iUh iUh dHn -tfp -kZS +iJh +pyX nca -qrc -neC +vAs +lzT iBO blo fxK @@ -163918,7 +164061,7 @@ uVo ltM qyZ xLi -meO +oHM aQO hSi dAc @@ -163942,7 +164085,7 @@ kll fSr fSr lwd -mgU +jKU fSr qOF qOF @@ -164155,11 +164298,11 @@ mtd awu wOb nCy -tfp -kZS +iJh +pyX nca -qrc -neC +vAs +lzT uXt yji qAB @@ -164186,7 +164329,7 @@ aQO aQO aQO qhM -ieY +iiF yiM cFs lNP @@ -164194,7 +164337,7 @@ nJq vVY cFs yiM -tIJ +jFV vNF prs gtQ @@ -164412,11 +164555,11 @@ iZN rLf dUj mjF -tfp -fqc -uVS -cTH -neC +iJh +xAT +fXd +cZb +lzT fph sHw kil @@ -164430,7 +164573,7 @@ qyZ qyZ qyZ qyZ -dUy +ezs vaj aBY aBq @@ -164456,20 +164599,20 @@ oDj qqi fpg jGi -wuE +ovb mQp mQp mQp mQp mQp -wuE -wuE +ovb +ovb mQp mQp mQp mQp mQp -wuE +ovb uEE oxE pUw @@ -164669,10 +164812,10 @@ sgB moo nHW bfr -bVN -tTJ -tTJ -tTJ +otg +xLO +xLO +xLO hMA wEx dSo @@ -164953,7 +165096,7 @@ myc jtk nsn nsn -hPM +jPi fmJ jAY fRW @@ -165227,20 +165370,20 @@ lQv yiM qJf gyz -wuE +ovb nqH nqH nqH nqH nqH -wuE -wuE +ovb +ovb nqH nqH nqH nqH nqH -wuE +ovb uMk vGi ptO @@ -165454,7 +165597,7 @@ vdh tFJ ltw ltw -kKC +cwh ltw ltw ltw @@ -165470,7 +165613,7 @@ ihu pUJ vPD yiM -fNI +ePD szW yiM jcr @@ -165737,7 +165880,7 @@ afX afy iPy rnR -vzF +eJh yiM qqi hMb @@ -165777,7 +165920,7 @@ tCf bOF tMW tMW -uSi +dEe mAG mAG sdb @@ -166291,7 +166434,7 @@ aac tMW aST aST -uHW +tMq aST aST aST @@ -166805,7 +166948,7 @@ fxW jQm aST srF -wEp +trt qZq qZq mnp @@ -166813,7 +166956,7 @@ iFN feN mAG vKe -kXk +kjg oOJ mAG jhd @@ -166974,9 +167117,9 @@ omm wPe tFJ uRA -nVx -tyx -qnr +dDd +nvC +vpA jKq pTr ohd @@ -167032,7 +167175,7 @@ tnu ndb ndb ndb -ndb +qgL ndb ndb ndb @@ -167269,17 +167412,17 @@ abM abW abM afy -afA -agf -pZv +nuQ +gbD +iLx afy afP nJq afX afy -pZv -lmx -phm +iLx +soY +kgL afy afg abS @@ -167319,7 +167462,7 @@ aac aac aST aST -ojP +ifq aST aST aST @@ -167488,9 +167631,9 @@ omm wPe tFJ tYg -csL -jil -fsQ +wtP +gwQ +ekv jKq rMp awc @@ -167526,8 +167669,8 @@ abW abW abS afy -afA -agf +nuQ +gbD afy afy afP @@ -167535,8 +167678,8 @@ nJq afX afy afy -lmx -phm +soY +kgL afy acm abW @@ -167783,8 +167926,8 @@ afg afg afy afy -afA -agf +nuQ +gbD afy afy afP @@ -167792,8 +167935,8 @@ nJq afX afy afy -lmx -phm +soY +kgL afy abW afo @@ -168040,8 +168183,8 @@ afg afg abS afy -afA -agf +nuQ +gbD afy afy afP @@ -168049,8 +168192,8 @@ nJq afX afy afy -lmx -phm +soY +kgL afy afy afo @@ -168297,8 +168440,8 @@ abS acm abS afy -ycH -agf +iKq +gbD afy afy afP @@ -168306,8 +168449,8 @@ nJq afX afy afy -lmx -phm +soY +kgL afy afy abS @@ -168554,17 +168697,17 @@ abW abW abW afy -ycH +iKq age -afJ +snG afy afP nJq afX afy -agb +qsE afN -agf +gbD afy afy abW @@ -168813,13 +168956,13 @@ afv age aHf vFt -afK +uFa afy afP cPu afX afy -agc +kJS yiM afN age @@ -169068,17 +169211,17 @@ afg acm afg afy -ycH +iKq age -afM +ygO afy afP nJq afX afy -agd +gLu age -agf +gbD afy afy abW @@ -169099,7 +169242,7 @@ cYh wqe aSU aSU -idk +vrM jPK apC aaa @@ -169302,7 +169445,7 @@ dpk omm vdh omm -pCm +jCA hXQ omm aaa @@ -169325,8 +169468,8 @@ abS abS afo afy -ycH -phm +iKq +kgL afy afy afP @@ -169334,8 +169477,8 @@ nJq afX afy afy -cYj -agf +feL +gbD afy abW abW @@ -169582,8 +169725,8 @@ abW abS afo afy -ycH -phm +iKq +kgL afy afy afP @@ -169591,8 +169734,8 @@ nJq afX afy afy -cYj -agf +feL +gbD afy afo abW @@ -169839,8 +169982,8 @@ acm acm afo afy -ycH -phm +iKq +kgL afy afy afP @@ -169848,8 +169991,8 @@ omp afX afy afy -cYj -agf +feL +gbD afy abS acm @@ -169866,11 +170009,11 @@ abS abS abS apC -rHv -xUp -xUp -xUp -aSQ +icH +dQl +dQl +dQl +eBV jPK apC aaa @@ -170096,8 +170239,8 @@ acm acm abW afy -ycH -phm +iKq +kgL afy afy afP @@ -170105,8 +170248,8 @@ omp afX afy afy -cYj -agf +feL +gbD afy abW acm @@ -170353,17 +170496,17 @@ abW abW afg afy -ycH +iKq age -afJ +snG afy afP omp afX afy -agb +qsE age -agf +gbD afy afg abW @@ -170612,13 +170755,13 @@ age age aHf izU -afK +uFa afy afP omp afX afy -agc +kJS qas afN age @@ -170867,17 +171010,17 @@ afg abW abW afy -ycH +iKq age -afM +ygO afy afP omp afX afy -agd +gLu age -agf +gbD afy abW abW @@ -171124,8 +171267,8 @@ abW abS abW afy -ycH -agf +iKq +gbD afy afy afP @@ -171133,8 +171276,8 @@ omp afX afy afy -lmx -agf +soY +gbD afy abW abS @@ -171347,14 +171490,14 @@ oeY oeY oeY vQt -iwi +nPA sMW omm dtA dtA dtA omm -xhN +cUY oeY vdh omm @@ -171363,7 +171506,7 @@ gFp omm eLv jqp -jhb +sMa paw eLv omm @@ -171381,8 +171524,8 @@ abW afo abS afy -afA -agf +nuQ +gbD afy afy afP @@ -171390,8 +171533,8 @@ omp afX afy afy -lmx -phm +soY +kgL afy abW abS @@ -171611,8 +171754,8 @@ dtA nLi dtA omm -tcu -nlN +wfc +vML vdh omm gPW @@ -171620,7 +171763,7 @@ oni omm eLv eLv -ftO +hPv eLv eLv omm @@ -171638,8 +171781,8 @@ abM abW abW afy -afA -agf +nuQ +gbD afy afy afP @@ -171647,8 +171790,8 @@ omp afX afy afy -lmx -phm +soY +kgL afy abS acm @@ -171877,7 +172020,7 @@ gxy omm eLv eLv -ftO +hPv eLv eLv omm @@ -171895,8 +172038,8 @@ aaa abM abM afy -afA -agf +nuQ +gbD afy afy afP @@ -171904,8 +172047,8 @@ omp afX afy afy -lmx -phm +soY +kgL afy abW abW @@ -172134,7 +172277,7 @@ omm omm eLv eLv -ftO +hPv eLv eLv omm @@ -172152,8 +172295,8 @@ aaa aaa abM afy -afA -agf +nuQ +gbD afy afy afP @@ -172161,8 +172304,8 @@ omp afX afy afy -lmx -phm +soY +kgL afy abW afg @@ -172388,10 +172531,10 @@ vdh vdh vdh vdh -jDQ +gZY ehP ehP -ilo +klx ehP ehP vdh @@ -172409,17 +172552,17 @@ aaa aaa afv afz -afA -agf -afO +nuQ +gbD +rjk afy afP omp afX afy -afO -lmx -phm +rjk +soY +kgL afz afv aaa @@ -172650,7 +172793,7 @@ tVF tVF tVF tVF -ldC +jQs tVF omm lTx @@ -175206,7 +175349,7 @@ apj nIh dbA xaW -kpo +dbA itB hDd itB @@ -175237,7 +175380,7 @@ vXM vXM izU tAL -lPu +dex izU irw fNs @@ -175245,7 +175388,7 @@ gOz hCt nxf izU -aGN +siU lRC ofT ofT @@ -175506,7 +175649,7 @@ mTM ocU wyd wyd -piQ +iWT rks rks wyd @@ -175762,7 +175905,7 @@ jJV mTM iVr wyd -kLV +inc xJA gHh cen @@ -176520,7 +176663,7 @@ vXM vXM vXM vXM -aEj +dRv veL nOB fld @@ -177807,7 +177950,7 @@ izU izU izU aEm -pGz +jAQ izU gjM fNs @@ -177815,7 +177958,7 @@ kWx hCt cNT izU -aGQ +dfX ycx xzq fnb @@ -180330,7 +180473,7 @@ avE aTY iCA fZL -bEA +hkb fZL fZL aTY @@ -180615,35 +180758,35 @@ lZW lZW lZW lZW -jPF +sIr lZW lZW lZW lZW lZW lZW -jPF +sIr lZW lZW lZW lZW lZW -ral +xNZ lZW lZW aaS aaS -qqX -npL -ayT +eWA +sMf +pQu afy afP omp afX afy -ayT -kTO -phm +pQu +oGR +kgL whz vNN whz @@ -180890,17 +181033,17 @@ lZW aaS afy afy -afA -agf -pZv +nuQ +gbD +iLx afy afP omp afX afy -pZv -lmx -phm +iLx +soY +kgL hOm vNN vNN @@ -181147,8 +181290,8 @@ lZW abW afy afy -afA -agf +nuQ +gbD afy afy afP @@ -181156,8 +181299,8 @@ omp afX afy afy -lmx -phm +soY +kgL hOm srC srC @@ -181404,8 +181547,8 @@ aaa aaa afy afy -afA -agf +nuQ +gbD afy afy afP @@ -181413,8 +181556,8 @@ omp afX afy afy -lmx -phm +soY +kgL whz whz whz @@ -181661,8 +181804,8 @@ aaa abW abS afy -afA -agf +nuQ +gbD afy afy afP @@ -181670,8 +181813,8 @@ omp afX afy afy -lmx -phm +soY +kgL afy afy whz @@ -181918,8 +182061,8 @@ abW afo abS afy -ycH -agf +iKq +gbD afy afy afP @@ -181927,8 +182070,8 @@ omp afX afy afy -lmx -phm +soY +kgL afy afy whz @@ -181951,7 +182094,7 @@ srC srC cgy rNg -rZH +vxD vja miZ tqZ @@ -182175,17 +182318,17 @@ abW abS abW afy -ycH +iKq age -afJ +snG afy afP omp afX afy -agb +qsE afN -agf +gbD afy afy whz @@ -182434,13 +182577,13 @@ afv age aHf qas -afK +uFa afy afP -eTI +vDm afX afy -agc +kJS izU afN age @@ -182689,17 +182832,17 @@ afo afg afy afy -ycH +iKq age -afM +ygO afy afP omp afX afy -agd +gLu age -agf +gbD afy afy abW @@ -182717,7 +182860,7 @@ gqk vNN iyg kSi -qir +xwu vLu yjM whz @@ -182934,7 +183077,7 @@ sAO qHl qHl sVA -pOv +nTj nAY idM agm @@ -182946,8 +183089,8 @@ afo afy afy afy -ycH -phm +iKq +kgL afy afy afP @@ -182955,8 +183098,8 @@ omp afX afy afy -cYj -agf +feL +gbD afy abW abW @@ -183189,7 +183332,7 @@ aaa lZW sAO qHl -hur +dOJ nAY nAY nAY @@ -183203,8 +183346,8 @@ abS abW afy afy -ycH -phm +iKq +kgL afy afy afP @@ -183212,8 +183355,8 @@ omp afX afy afy -cYj -agf +feL +gbD afy abS afg @@ -183446,7 +183589,7 @@ aaa lZW vkR qHl -dZP +xPZ nAY nAY nAY @@ -183460,8 +183603,8 @@ abS abW afg afy -ycH -phm +iKq +kgL afy afy afP @@ -183469,8 +183612,8 @@ ozQ afX afy afy -cYj -agf +feL +gbD afy abW abS @@ -183674,7 +183817,7 @@ jhd jhd jhd csA -rQR +iDl uRv jhd jhd @@ -183703,7 +183846,7 @@ aaa lZW sAO qHl -qmD +cma nAY nAY nAY @@ -183717,8 +183860,8 @@ abW abS afo afy -ycH -phm +iKq +kgL afy afy afP @@ -183726,8 +183869,8 @@ ozQ afX afy afy -cYj -agf +feL +gbD afy afy abS @@ -183974,17 +184117,17 @@ abW abW abW afy -ycH +iKq age -afJ +snG afy afP ozQ afX afy -agb +qsE age -agf +gbD afy afy afo @@ -184215,11 +184358,11 @@ aaa aaa aaa lZW -fDd +iMO qHl ena ena -phs +iUv nAY idM sLI @@ -184233,13 +184376,13 @@ afv age aHf bMb -afK +uFa afy afP ozQ afX afy -agc +kJS mZJ afN age @@ -184445,7 +184588,7 @@ jhd jhd fZL fZL -odl +qdv fZL fZL jhd @@ -184488,17 +184631,17 @@ abW abW afy afy -ycH +iKq age -afM +ygO afy afP ozQ afX afy -agd +gLu age -agf +gbD afy afy abS @@ -184745,8 +184888,8 @@ abS abW afy afy -ycH -agf +iKq +gbD afy afy afP @@ -184754,8 +184897,8 @@ ozQ afX afy afy -lmx -agf +soY +gbD afy afy abW @@ -185002,8 +185145,8 @@ abW abW afy afy -afA -agf +nuQ +gbD afy afy afP @@ -185011,8 +185154,8 @@ ozQ afX afy afy -lmx -phm +soY +kgL afy lVi lVi @@ -185259,8 +185402,8 @@ abW acm afy afy -afA -agf +nuQ +gbD afy afy afP @@ -185268,8 +185411,8 @@ ozQ afX afy afy -lmx -phm +soY +kgL afy lVi mHE @@ -185473,7 +185616,7 @@ lzc sGx cko iXe -wqC +vuc nOd plk ceQ @@ -185516,8 +185659,8 @@ aaa abW abM afy -afA -agf +nuQ +gbD afy afy afP @@ -185525,8 +185668,8 @@ ozQ afX afy afy -lmx -phm +soY +kgL lVi lVi kCF @@ -185773,8 +185916,8 @@ aaa aaa abM afy -afA -agf +nuQ +gbD afy afy afP @@ -185782,8 +185925,8 @@ ozQ afX afy afy -lmx -phm +soY +kgL lVi kCF kCF @@ -186030,17 +186173,17 @@ aaa aaa afv afz -afA -agf -afO +nuQ +gbD +rjk afy afP ozQ afX afy -afO -lmx -phm +rjk +soY +kgL lVi kCF soq @@ -186275,7 +186418,7 @@ aaa aaa aaa lZW -cjx +cNV nAY lZW kXi @@ -186501,7 +186644,7 @@ jhd jhd fZL fZL -bEA +hkb fZL fZL jhd @@ -186586,7 +186729,7 @@ aaa aaa aaa aaa -iAt +yiG mSE lGu bFw @@ -186778,11 +186921,11 @@ aaa aaa aaa aaa -iTi -iTi -iTi -iTi -iTi +tAX +tAX +tAX +tAX +tAX aaa aaa aaa @@ -186843,9 +186986,9 @@ aaa aac aac bFw -qSG +wJh iWf -gpr +tic bFw aac aac @@ -187035,11 +187178,11 @@ aaa aaa aaa aaa -iTi -tUd -eyl -ixs -iTi +tAX +cKy +sts +mFM +tAX lZW lZW lZW @@ -187272,7 +187415,7 @@ jhd jhd jhd uRv -ncv +qsB csA jhd jhd @@ -187292,11 +187435,11 @@ aaa aaa aaa aaa -iTi -xvv -txd -tLu -iTi +tAX +kna +fwh +lSL +tAX vSI vSI vSI @@ -187549,11 +187692,11 @@ aaa aaa aaa aaa -iTi -rXQ -nPj -gmI -iTi +tAX +oQc +pYS +wBk +tAX vSI vSI vSI @@ -187568,7 +187711,7 @@ sAO wPD usY kiT -sNb +mOb usY usY usY @@ -187805,12 +187948,12 @@ aaa aaa aaa aaa -iTi -rec -jTQ -oHi -iTi -iTi +tAX +gLM +rTc +wjX +tAX +tAX ohS eaI ohS @@ -188062,11 +188205,11 @@ aac aaa aaa aaa -iTi -aeA -nSC -ksx -iTi +tAX +pAg +rAI +hDt +tAX exr pZA uax @@ -188319,11 +188462,11 @@ aac aac aaa aaa -iTi -afk -aTR -leN -iTi +tAX +cbA +fXV +aNA +tAX kqy pZA uax @@ -188576,11 +188719,11 @@ aac aaa aaa cTU -iTi -bub -xDW -bub -iTi +tAX +nfy +icw +nfy +tAX nnb pZA ayr @@ -188835,9 +188978,9 @@ aaa cTU aSo tAJ -lTM -pSk -axF +uzT +rtM +qzr rwo dij uax @@ -188858,7 +189001,7 @@ kNf whL esQ ken -nFE +bfJ bMb brm iOd @@ -188866,7 +189009,7 @@ ozQ vPi brm bMb -qrm +ekz vju lfQ cnV @@ -189092,13 +189235,13 @@ aaa akr tjS hFV -igG +cZl dzw dzw dzw dzw -gUL -foU +rlQ +oyn dzw msn qza @@ -189140,7 +189283,7 @@ wwP wwP auc fDm -aXE +kId tYp emP mdf @@ -189353,9 +189496,9 @@ uax uax uax uax -tte -nXk -hDU +eEg +mMk +dTV dzw sxR skb @@ -189613,7 +189756,7 @@ icO tCe eOk hRs -gtr +lpN cya sdl oAV @@ -189676,9 +189819,9 @@ uGJ pTP qyQ qyQ -gun -qea -mFY +jMd +vnd +iJF qVr aaa aaa @@ -189936,7 +190079,7 @@ eJQ bNx aSt aSt -cyO +xDu aaa aaa aaa @@ -190125,7 +190268,7 @@ uax axH bTx kwD -sha +hbq eOk mdD vSI @@ -190134,7 +190277,7 @@ vYl oGF cwG kum -bHB +dPu vbA nrM nLe @@ -190616,7 +190759,7 @@ avE aTY iCA fZL -odl +qdv fZL fZL aTY @@ -190641,7 +190784,7 @@ xGX boS eOk gUn -xMV +hYs tkP roj rSb @@ -190651,7 +190794,7 @@ dPu tXI rqD npp -lUa +gpL xeG rlo nzd @@ -190704,9 +190847,9 @@ ijR ecg rUh rUh -wAs -fjA -aDn +whE +xXH +owq qVr aaa aaa @@ -191185,7 +191328,7 @@ wpK lfQ ehz fIc -wBq +rZt wpK oxL oxL @@ -191196,7 +191339,7 @@ wwP wwP xiL gEU -uHk +eww tYp mdf mdf @@ -191428,7 +191571,7 @@ dOC bIp evu qtF -vie +iQt bMb brm iOd @@ -191436,7 +191579,7 @@ ozQ vPi brm bMb -nFm +wtT aHs aHt sSr @@ -191664,7 +191807,7 @@ udQ udQ udQ udQ -axN +jBF pxD ayd ayt @@ -191770,13 +191913,13 @@ gFf oMI oMI oMI -oTa +nXV tDn tDn tAC tDn tDn -bJP +ddd oMI oMI gFf @@ -191917,9 +192060,9 @@ aac aac xxZ hQM -lIN -rOX -axO +gEN +vTu +rmp udQ glA pxD @@ -192024,7 +192167,7 @@ vUu gFf gFf oMI -oTa +nXV tDn tDn uqS @@ -192035,7 +192178,7 @@ dVM dVM uqS tDn -bJP +ddd oMI gFf gFf @@ -192174,11 +192317,11 @@ aac aac xxZ mhQ -ssA -qgM -eab -vsN -kyc +rLU +fDF +ilm +kqT +pOz kXr aye rgg @@ -192211,7 +192354,7 @@ qTv vrW tXz tXz -hIb +lMt tiG mYy xNT @@ -192431,9 +192574,9 @@ aac aac xxZ mhQ -foa -cSc -jcJ +xnV +bvT +qns udQ kSa cDP @@ -192737,7 +192880,7 @@ xSD aZx fVX vvt -qei +bSI rQt kvt syv @@ -193054,7 +193197,7 @@ gFf tXU gVd dVM -iqO +vaS njC aCl dVM @@ -193224,7 +193367,7 @@ lSQ duO goC wxb -vZY +oLY bMb bMb bMb @@ -193238,7 +193381,7 @@ nSI qrs enV oNa -sJZ +izZ tXz fEd qpZ @@ -193305,13 +193448,13 @@ xSS lwj tqN tqN -tNG -jfu -jfu -lwy -sVz -bNr -aoh +nVt +tGg +tGg +hVs +oKT +pVA +tdw fyX ffe mgi @@ -193508,7 +193651,7 @@ mKQ ivI mfU lXd -btO +iph aso syv syv @@ -193992,7 +194135,7 @@ fUh cQH lBP sBt -nVg +sme xBh qYi fZS @@ -194594,7 +194737,7 @@ vUu gFf gFf oMI -qye +nPU hic hic uqS @@ -194605,7 +194748,7 @@ dVM dVM uqS hic -vWw +mnG oMI gFf gFf @@ -194854,13 +194997,13 @@ gFf oMI oMI oMI -uCh +lYj hic hic lNd hic hic -vWw +mnG oMI oMI gFf @@ -195023,7 +195166,7 @@ aaa pSV noI kOf -nvd +pZv wzg tiM qSm @@ -195548,7 +195691,7 @@ fmy aGs qSm fFx -qSm +gYR iSc miE fmy @@ -195793,11 +195936,11 @@ jhd jhd pSV wOW -kOf +iFz aDN wzg tiM -qSm +vwR qSm qSm sJx @@ -196833,7 +196976,7 @@ xWu nTJ qSm aDX -qSm +vwR orX rmz fmy @@ -197084,13 +197227,13 @@ qtD aEH uCy tiM -qSm -eKD +gYR +rnX nRO -joi -qSm -qSm -qSm +bxg +nPd +nPd +nPd swr aXD fmy @@ -197121,11 +197264,11 @@ aac aac aac aac -jhd -jhd -jhd -jhd -jhd +eui +eui +eui +eui +eui jhd jhd jhd @@ -197374,15 +197517,15 @@ aaa aaa aaa aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +eui +eui +eui +eui +eui +eui +eui +eui +eui jhd jhd jhd @@ -197631,15 +197774,15 @@ aaa aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +eui +eui +eui +eui +eui +eui +eui +eui +eui jhd jhd jhd @@ -197888,14 +198031,14 @@ aaa aaa aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +eui +eui +eui +eui +eui +eui +eui +eui jhd jhd jhd @@ -198145,14 +198288,14 @@ aaa aac aac aac -jhd -jhd -jhd -jhd -jhd -jhd -jhd -jhd +eui +eui +eui +eui +eui +eui +eui +eui jhd jhd jhd diff --git a/_maps/safehouses/bathroom.dmm b/_maps/safehouses/bathroom.dmm new file mode 100644 index 000000000000..62e928ac0543 --- /dev/null +++ b/_maps/safehouses/bathroom.dmm @@ -0,0 +1,155 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"c" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"e" = ( +/obj/effect/spawner/structure/window, +/obj/effect/decal/cleanable/blood/splatter/over_window, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"q" = ( +/obj/structure/urinal/directional/west, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"s" = ( +/obj/effect/landmark/bitrunning/cache_goal_turf, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/obj/machinery/light/small/blacklight/directional/east, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"v" = ( +/obj/machinery/light/small/blacklight/directional/east, +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/tracks, +/obj/vehicle/ridden/wheelchair, +/obj/effect/spawner/random/medical/injector, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"x" = ( +/obj/structure/railing/corner/end{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"y" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/blacklight/directional/west, +/obj/effect/spawner/random/medical/medkit, +/obj/effect/spawner/random/medical/medkit, +/obj/effect/spawner/random/medical/minor_healing, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"z" = ( +/obj/structure/sign/poster/abductor/random/directional/east, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"D" = ( +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"G" = ( +/turf/closed/wall/mineral/silver, +/area/virtual_domain/safehouse) +"J" = ( +/obj/structure/railing, +/obj/effect/landmark/bitrunning/cache_goal_turf, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/safehouse) +"M" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/toilet{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"N" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"T" = ( +/obj/effect/landmark/bitrunning/hololadder_spawn, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"V" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"X" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/airlock/freezer, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) +"Z" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/blacklight/directional/west, +/turf/open/floor/iron/freezer, +/area/virtual_domain/safehouse) + +(1,1,1) = {" +G +G +G +G +G +G +"} +(2,1,1) = {" +G +Z +M +q +y +G +"} +(3,1,1) = {" +G +c +D +a +T +G +"} +(4,1,1) = {" +X +a +D +D +T +G +"} +(5,1,1) = {" +G +V +x +N +T +G +"} +(6,1,1) = {" +G +s +J +z +v +e +"} +(7,1,1) = {" +G +G +G +G +G +G +"} diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index 5f248c384609..01023ed050e3 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -252,7 +252,7 @@ /turf/open/floor/iron/grimy, /area/shuttle/escape) "aX" = ( -/mob/living/simple_animal/drone/snowflake/bardrone, +/mob/living/basic/drone/snowflake/bardrone, /obj/effect/turf_decal/tile/bar/opposingcorners, /turf/open/floor/iron, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_cruise.dmm b/_maps/shuttles/emergency_cruise.dmm index a6d02332e064..6d1ca3b9e5a4 100644 --- a/_maps/shuttles/emergency_cruise.dmm +++ b/_maps/shuttles/emergency_cruise.dmm @@ -133,7 +133,7 @@ /obj/structure/disposalpipe/segment{ dir = 8 }, -/mob/living/simple_animal/hostile/retaliate/clown, +/mob/living/basic/clown, /turf/open/floor/eighties, /area/shuttle/escape/luxury) "cZ" = ( @@ -659,7 +659,7 @@ "ld" = ( /obj/effect/decal/cleanable/confetti, /obj/structure/window/reinforced/spawner/directional/west, -/mob/living/simple_animal/hostile/retaliate/clown{ +/mob/living/basic/clown{ health = 300; name = "Honk-E-Clown"; desc = "This clown looks pretty tough, better stay on his good side..."; @@ -1823,7 +1823,7 @@ /turf/open/floor/iron/dark/textured, /area/shuttle/escape/brig) "Ht" = ( -/mob/living/simple_animal/hostile/retaliate/clown, +/mob/living/basic/clown, /turf/open/floor/eighties, /area/shuttle/escape/luxury) "HA" = ( @@ -2618,6 +2618,13 @@ }, /turf/open/floor/iron/dark/textured, /area/shuttle/escape/brig) +"Wa" = ( +/obj/structure/chair/comfy/teal{ + dir = 4 + }, +/mob/living/basic/drone/snowflake/bardrone, +/turf/open/floor/wood/tile, +/area/shuttle/escape) "Wc" = ( /obj/effect/turf_decal/trimline/red/corner{ dir = 4 @@ -3541,7 +3548,7 @@ xf xf mw mw -mw +Wa xf Ov uV diff --git a/_maps/shuttles/emergency_hugcage.dmm b/_maps/shuttles/emergency_hugcage.dmm index b1162a76a137..cd8d4e7ff00d 100644 --- a/_maps/shuttles/emergency_hugcage.dmm +++ b/_maps/shuttles/emergency_hugcage.dmm @@ -30,7 +30,7 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "dz" = ( -/mob/living/simple_animal/parrot/natural{ +/mob/living/basic/parrot{ melee_damage_upper = 5 }, /turf/open/floor/mineral/titanium/blue, diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency_narnar.dmm index 835a6054a874..d6c48664e08e 100644 --- a/_maps/shuttles/emergency_narnar.dmm +++ b/_maps/shuttles/emergency_narnar.dmm @@ -111,7 +111,7 @@ /turf/open/floor/cult, /area/shuttle/escape) "w" = ( -/mob/living/simple_animal/hostile/construct/artificer, +/mob/living/basic/construct/artificer, /turf/open/floor/cult, /area/shuttle/escape) "x" = ( @@ -139,7 +139,7 @@ /turf/open/floor/cult, /area/shuttle/escape) "C" = ( -/mob/living/simple_animal/hostile/construct/juggernaut, +/mob/living/basic/construct/juggernaut, /turf/open/floor/cult, /area/shuttle/escape) "D" = ( @@ -166,7 +166,7 @@ /turf/open/floor/cult, /area/shuttle/escape) "H" = ( -/mob/living/simple_animal/hostile/construct/wraith, +/mob/living/basic/construct/wraith, /turf/open/floor/cult, /area/shuttle/escape) "I" = ( diff --git a/_maps/shuttles/emergency_rollerdome.dmm b/_maps/shuttles/emergency_rollerdome.dmm index f6cec0091aa9..0518c951e1ba 100644 --- a/_maps/shuttles/emergency_rollerdome.dmm +++ b/_maps/shuttles/emergency_rollerdome.dmm @@ -238,6 +238,10 @@ /obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/plating/airless, /area/shuttle/escape) +"KO" = ( +/mob/living/basic/drone/snowflake/bardrone, +/turf/open/floor/wood, +/area/shuttle/escape) "Ow" = ( /obj/structure/table, /obj/item/storage/box/drinkingglasses, @@ -270,10 +274,6 @@ }, /turf/open/floor/wood, /area/shuttle/escape) -"Qv" = ( -/mob/living/simple_animal/drone/snowflake/bardrone, -/turf/open/floor/wood, -/area/shuttle/escape) "QO" = ( /obj/machinery/door/airlock/gold/glass, /turf/open/floor/wood, @@ -469,7 +469,7 @@ Cg Cg ce ns -Qv +KO JR KJ od @@ -517,7 +517,7 @@ Cg Cg ce uN -Ky +KO Ow KJ od diff --git a/_maps/shuttles/ruin_caravan_victim.dmm b/_maps/shuttles/ruin_caravan_victim.dmm index 614ae713c7b1..6b95b857f153 100644 --- a/_maps/shuttles/ruin_caravan_victim.dmm +++ b/_maps/shuttles/ruin_caravan_victim.dmm @@ -13,7 +13,7 @@ /turf/closed/wall/mineral/titanium/nodiagonal, /area/shuttle/ruin/caravan/freighter1) "cu" = ( -/mob/living/basic/syndicate/ranged/smg/space, +/mob/living/basic/trooper/syndicate/ranged/smg/space, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark/airless, /area/shuttle/ruin/caravan/freighter1) @@ -458,7 +458,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/mob/living/basic/syndicate/ranged/smg/space, +/mob/living/basic/trooper/syndicate/ranged/smg/space, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, @@ -468,7 +468,7 @@ /area/shuttle/ruin/caravan/freighter1) "Fu" = ( /obj/effect/decal/cleanable/blood, -/mob/living/basic/syndicate/melee/sword/space/stormtrooper, +/mob/living/basic/trooper/syndicate/melee/sword/space/stormtrooper, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -606,7 +606,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/mob/living/basic/syndicate/ranged/smg/space, +/mob/living/basic/trooper/syndicate/ranged/smg/space, /turf/open/floor/iron/airless, /area/shuttle/ruin/caravan/freighter1) "Ld" = ( diff --git a/_maps/shuttles/ruin_pirate_cutter.dmm b/_maps/shuttles/ruin_pirate_cutter.dmm index 615cb8b255c3..db75b1eff6c2 100644 --- a/_maps/shuttles/ruin_pirate_cutter.dmm +++ b/_maps/shuttles/ruin_pirate_cutter.dmm @@ -713,7 +713,7 @@ "Ry" = ( /obj/structure/rack, /obj/item/storage/bag/money/vault, -/mob/living/simple_animal/parrot{ +/mob/living/basic/parrot{ faction = list("pirate"); name = "Pegwing" }, diff --git a/_maps/shuttles/ruin_syndicate_dropship.dmm b/_maps/shuttles/ruin_syndicate_dropship.dmm index e3987b39ed54..b1f3f00897b7 100644 --- a/_maps/shuttles/ruin_syndicate_dropship.dmm +++ b/_maps/shuttles/ruin_syndicate_dropship.dmm @@ -215,7 +215,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/mob/living/basic/syndicate/ranged/smg/pilot{ +/mob/living/basic/trooper/syndicate/ranged/smg/pilot{ environment_smash = 0 }, /turf/open/floor/iron/dark, diff --git a/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm b/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm index be8b4c2bad9f..7c2903773389 100644 --- a/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm +++ b/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm @@ -20,7 +20,7 @@ req_access = list("syndicate") }, /obj/structure/cable, -/mob/living/basic/syndicate/ranged/smg/pilot{ +/mob/living/basic/trooper/syndicate/ranged/smg/pilot{ environment_smash = 0 }, /turf/open/floor/mineral/plastitanium/red, diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm index a62e34436770..b2e669767791 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -1821,7 +1821,6 @@ }, /obj/structure/closet/crate, /obj/item/grenade/chem_grenade/metalfoam, -/obj/item/relic, /obj/item/t_scanner, /obj/effect/spawner/random/maintenance/three, /obj/effect/turf_decal/tile/neutral/fourcorners, diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm index d13fccbf7016..0e3c921935f6 100644 --- a/_maps/shuttles/whiteship_meta.dmm +++ b/_maps/shuttles/whiteship_meta.dmm @@ -286,7 +286,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/mob/living/basic/syndicate/ranged{ +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/mob/living/basic/trooper/syndicate/ranged{ environment_smash = 0; name = "Syndicate Salvage Worker" }, @@ -1649,7 +1654,12 @@ dir = 8 }, /obj/effect/decal/cleanable/blood/gibs/old, -/mob/living/basic/syndicate/melee{ +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood/gibs/old, +/mob/living/basic/trooper/syndicate/melee{ environment_smash = 0 }, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -1709,8 +1719,9 @@ /area/shuttle/abandoned/crew) "qc" = ( /obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on, -/mob/living/basic/syndicate/melee{ +/mob/living/basic/trooper/syndicate/melee{ environment_smash = 0 }, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -1730,7 +1741,11 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt/dust, -/mob/living/basic/syndicate/melee{ +/obj/effect/turf_decal/box/white/corners{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/trooper/syndicate/melee{ environment_smash = 0 }, /turf/open/floor/iron/dark, diff --git a/_maps/shuttles/whiteship_obelisk.dmm b/_maps/shuttles/whiteship_obelisk.dmm index 303b0912c9f2..05b17d19b71e 100644 --- a/_maps/shuttles/whiteship_obelisk.dmm +++ b/_maps/shuttles/whiteship_obelisk.dmm @@ -112,7 +112,7 @@ /area/shuttle/abandoned/engine) "gw" = ( /obj/structure/cable, -/mob/living/simple_animal/hostile/construct/proteon/hostile, +/mob/living/basic/construct/proteon/hostile, /obj/effect/decal/cleanable/crayon{ icon_state = "rune4"; paint_colour = "#DC143C" @@ -124,7 +124,7 @@ /turf/open/floor/catwalk_floor/iron_smooth, /area/shuttle/abandoned/engine) "hg" = ( -/mob/living/simple_animal/hostile/construct/proteon/hostile, +/mob/living/basic/construct/proteon/hostile, /obj/effect/decal/cleanable/blood/old, /obj/structure/cable, /turf/open/floor/mineral/titanium/white, @@ -156,7 +156,7 @@ /area/shuttle/abandoned/engine) "ji" = ( /obj/structure/cable, -/mob/living/simple_animal/hostile/construct/proteon/hostile, +/mob/living/basic/construct/proteon/hostile, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -398,7 +398,7 @@ /area/shuttle/abandoned/crew) "yo" = ( /obj/structure/cable, -/mob/living/simple_animal/hostile/construct/proteon/hostile, +/mob/living/basic/construct/proteon/hostile, /obj/effect/decal/cleanable/crayon{ icon_state = "rune4"; paint_colour = "#DC143C" @@ -570,7 +570,7 @@ /area/shuttle/abandoned) "HU" = ( /obj/structure/cable, -/mob/living/simple_animal/hostile/construct/juggernaut/hostile, +/mob/living/basic/construct/juggernaut/hostile, /obj/effect/decal/cleanable/crayon{ icon_state = "rune4"; paint_colour = "#DC143C" @@ -590,7 +590,7 @@ /area/shuttle/abandoned) "IH" = ( /obj/structure/cable, -/mob/living/simple_animal/hostile/construct/proteon/hostile, +/mob/living/basic/construct/proteon/hostile, /obj/effect/decal/cleanable/blood/gibs/core, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 @@ -789,7 +789,7 @@ /area/shuttle/abandoned/medbay) "SE" = ( /obj/structure/cable, -/mob/living/simple_animal/hostile/construct/proteon/hostile, +/mob/living/basic/construct/proteon/hostile, /obj/effect/decal/cleanable/crayon{ icon_state = "rune4"; paint_colour = "#DC143C" diff --git a/_maps/virtual_domains/beach_bar.dmm b/_maps/virtual_domains/beach_bar.dmm index c64b07f12421..b9a7990e454f 100644 --- a/_maps/virtual_domains/beach_bar.dmm +++ b/_maps/virtual_domains/beach_bar.dmm @@ -15,6 +15,15 @@ /obj/machinery/grill, /turf/open/floor/wood, /area/virtual_domain/powered) +"ax" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/virtual_domain{ + pixel_y = 7; + pixel_x = 4 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/virtual_domain, +/turf/open/floor/wood, +/area/virtual_domain/powered) "aE" = ( /turf/open/floor/pod/light, /area/virtual_domain/powered) @@ -50,10 +59,12 @@ /obj/structure/fluff/beach_umbrella/cap, /turf/open/misc/beach/sand, /area/virtual_domain/powered) -"bZ" = ( -/obj/item/stack/sheet/iron/fifty, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, +"bS" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo"; + pixel_x = -4 + }, +/turf/open/floor/wood, /area/virtual_domain/powered) "cb" = ( /obj/structure/table/wood, @@ -119,6 +130,10 @@ /obj/machinery/light/directional/south, /turf/open/floor/wood, /area/virtual_domain/powered) +"dZ" = ( +/obj/structure/bookcase/random/reference, +/turf/open/floor/wood, +/area/virtual_domain/powered) "ed" = ( /obj/machinery/atmospherics/components/tank/air{ dir = 1 @@ -129,37 +144,24 @@ /obj/structure/noticeboard/staff, /turf/closed/wall/mineral/wood/nonmetal, /area/virtual_domain/powered) -"es" = ( -/obj/structure/bookcase/random/reference, -/turf/open/floor/wood, -/area/virtual_domain/powered) -"eT" = ( -/obj/structure/table/wood/poker, -/obj/item/storage/dice, -/obj/item/stack/spacecash/c1000, -/turf/open/floor/wood, -/area/virtual_domain/powered) -"eU" = ( -/turf/open/misc/beach/sand/coastline_b, +"fr" = ( +/obj/item/melee/skateboard/hoverboard, +/obj/machinery/light/directional/west, +/turf/open/floor/pod/light, /area/virtual_domain/powered) -"fc" = ( +"fN" = ( /obj/structure/table/wood, /obj/item/reagent_containers/pill/happy, /obj/item/toy/figure/bartender{ pixel_x = -8; pixel_y = -1 }, -/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain{ +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/virtual_domain{ pixel_y = 8; pixel_x = 5 }, /turf/open/floor/wood, /area/virtual_domain/powered) -"fr" = ( -/obj/item/melee/skateboard/hoverboard, -/obj/machinery/light/directional/west, -/turf/open/floor/pod/light, -/area/virtual_domain/powered) "gh" = ( /obj/structure/flora/bush/stalky/style_random, /obj/structure/flora/bush/sparsegrass/style_random, @@ -172,9 +174,9 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/pod/light, /area/virtual_domain/powered) -"hx" = ( -/obj/effect/baseturf_helper/virtual_domain, -/turf/closed/wall/mineral/sandstone, +"hy" = ( +/obj/machinery/light/directional/south, +/turf/open/misc/beach/sand/coastline_b, /area/virtual_domain/powered) "hE" = ( /obj/structure/sign/departments/restroom/directional/east, @@ -186,6 +188,13 @@ }, /turf/open/floor/wood, /area/virtual_domain/powered) +"is" = ( +/obj/effect/turf_decal/sand, +/obj/item/coin/gold, +/obj/structure/railing, +/obj/machinery/media/jukebox, +/turf/open/floor/sepia, +/area/virtual_domain/powered) "iz" = ( /turf/closed/indestructible/binary, /area/lavaland/surface/outdoors/virtual_domain) @@ -238,6 +247,11 @@ /obj/machinery/reagentgrinder, /turf/open/floor/wood, /area/virtual_domain/powered) +"kK" = ( +/obj/structure/mirror/directional/west, +/obj/structure/sink/kitchen/directional/south, +/turf/open/floor/wood, +/area/virtual_domain/powered) "kT" = ( /obj/structure/chair/stool/bar/directional/south, /turf/open/floor/wood, @@ -262,11 +276,21 @@ /obj/item/canvas/twentythree_twentythree, /turf/open/misc/beach/sand, /area/virtual_domain/powered) +"nP" = ( +/obj/item/stack/sheet/iron/fifty, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/virtual_domain/powered) "oP" = ( /obj/structure/table/wood, /obj/machinery/reagentgrinder, /turf/open/floor/wood, /area/virtual_domain/powered) +"pi" = ( +/obj/machinery/vending/cigarette/beach, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron, +/area/virtual_domain/powered) "pr" = ( /turf/template_noop, /area/template_noop) @@ -282,6 +306,18 @@ /obj/structure/extinguisher_cabinet/directional/south, /turf/open/misc/beach/sand, /area/virtual_domain/powered) +"qd" = ( +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/mayonnaise, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/flour, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"qR" = ( +/obj/effect/spawner/structure/window, +/obj/structure/curtain, +/turf/open/floor/plating, +/area/virtual_domain/powered) "qW" = ( /obj/item/melee/skateboard/hoverboard, /mob/living/basic/chicken{ @@ -289,6 +325,15 @@ }, /turf/open/misc/beach/sand, /area/virtual_domain/powered) +"ra" = ( +/obj/item/food/meat/rawbacon, +/obj/item/food/meat/rawbacon, +/obj/item/food/meat/rawcutlet, +/obj/item/food/meat/rawcutlet, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/meat/slab/rawcrab, +/turf/open/floor/wood, +/area/virtual_domain/powered) "rc" = ( /obj/machinery/light/directional/east, /turf/open/floor/wood, @@ -305,32 +350,37 @@ /obj/item/canvas/twentythree_twentythree, /turf/open/misc/beach/sand, /area/virtual_domain/powered) -"rL" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/wood, +"rs" = ( +/obj/machinery/light/directional/east, +/turf/open/misc/beach/sand/coastline_b, /area/virtual_domain/powered) "rT" = ( /obj/item/toy/seashell, /turf/open/misc/beach/sand, /area/virtual_domain/powered) -"sj" = ( -/obj/machinery/seed_extractor, -/turf/open/floor/pod/light, -/area/virtual_domain/powered) "sT" = ( /obj/effect/baseturf_helper/virtual_domain, /turf/template_noop, /area/virtual_domain/safehouse) -"tj" = ( +"tE" = ( /obj/machinery/door/airlock/public/glass{ - name = "Resort Lobby" + name = "Resort Casino" }, /turf/open/floor/wood, /area/virtual_domain/powered) +"tF" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/wood, +/area/virtual_domain/powered) "tZ" = ( /obj/structure/toilet, /turf/open/floor/wood, /area/virtual_domain/powered) +"uc" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/virtual_domain/powered) "ug" = ( /obj/structure/closet/secure_closet{ icon_state = "cabinet"; @@ -354,23 +404,23 @@ /obj/item/cultivator, /turf/open/floor/iron/grimy, /area/virtual_domain/powered) -"uq" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain, -/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain{ - pixel_x = -4; - pixel_y = 8 - }, -/turf/open/floor/wood, -/area/virtual_domain/powered) -"uI" = ( -/obj/structure/sign/warning/gas_mask/directional/west, -/turf/open/floor/plating, -/area/virtual_domain/powered) "uU" = ( /obj/effect/turf_decal/sand, /turf/open/floor/sepia, /area/virtual_domain/powered) +"ve" = ( +/obj/item/toy/dodgeball, +/obj/item/toy/dodgeball, +/obj/item/toy/dodgeball, +/obj/item/toy/dodgeball, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"vp" = ( +/obj/machinery/light/directional/east, +/obj/structure/chair/stool/bar/directional/south, +/turf/open/floor/wood, +/area/virtual_domain/powered) "vq" = ( /obj/machinery/oven/range, /turf/open/floor/wood, @@ -379,14 +429,6 @@ /obj/structure/chair/stool/directional/south, /turf/open/misc/beach/sand, /area/virtual_domain/powered) -"vC" = ( -/obj/machinery/chem_dispenser/drinks/fullupgrade{ - dir = 1 - }, -/obj/structure/table/wood, -/obj/machinery/light/small/directional/east, -/turf/open/floor/wood, -/area/virtual_domain/powered) "vN" = ( /obj/structure/table/wood, /obj/item/reagent_containers/pill/morphine, @@ -418,31 +460,18 @@ /obj/item/reagent_containers/cup/glass/bottle/beer/light, /turf/open/misc/beach/sand, /area/virtual_domain/powered) -"wm" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Resort Casino" - }, -/turf/open/floor/wood, -/area/virtual_domain/powered) -"wo" = ( -/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ - dir = 1 - }, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/virtual_domain/powered) -"ws" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Supply Room" - }, -/turf/open/floor/plating, -/area/virtual_domain/powered) "wD" = ( /turf/open/misc/beach/sand, /area/virtual_domain/powered) "xb" = ( /turf/open/misc/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors/virtual_domain) +"xk" = ( +/obj/structure/table/wood/poker, +/obj/item/storage/dice, +/obj/item/stack/spacecash/c1000, +/turf/open/floor/wood, +/area/virtual_domain/powered) "xq" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/south, @@ -517,25 +546,18 @@ /obj/machinery/food_cart, /turf/open/misc/beach/sand, /area/virtual_domain/powered) -"yB" = ( -/obj/item/instrument/guitar, -/turf/open/floor/carpet/blue, -/area/virtual_domain/powered) -"yF" = ( -/obj/item/bedsheet/dorms{ - dir = 4 - }, -/obj/structure/bed{ - dir = 4 +"yx" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/virtual_domain, +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/virtual_domain{ + pixel_x = -4; + pixel_y = 8 }, /turf/open/floor/wood, /area/virtual_domain/powered) -"yQ" = ( -/obj/machinery/chem_master/condimaster{ - name = "CondiMaster Neo"; - pixel_x = -4 - }, -/turf/open/floor/wood, +"yB" = ( +/obj/item/instrument/guitar, +/turf/open/floor/carpet/blue, /area/virtual_domain/powered) "yU" = ( /obj/structure/sign/warning/gas_mask/directional/north, @@ -577,10 +599,22 @@ /obj/machinery/reagentgrinder, /turf/open/floor/pod/light, /area/virtual_domain/powered) -"Bk" = ( -/obj/structure/urinal/directional/north, +"AP" = ( +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ + dir = 1 + }, +/obj/structure/table/wood, /turf/open/floor/wood, /area/virtual_domain/powered) +"AS" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/misc/beach/sand/coastline_b, +/area/virtual_domain/powered) +"AZ" = ( +/turf/open/misc/beach/sand/coastline_b, +/area/virtual_domain/powered) "Br" = ( /obj/structure/table/wood/poker, /obj/item/toy/cards/deck/cas{ @@ -601,9 +635,18 @@ /obj/item/reagent_containers/condiment/saltshaker, /turf/open/floor/wood, /area/virtual_domain/powered) +"BJ" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck, +/turf/open/floor/wood, +/area/virtual_domain/powered) "BM" = ( /turf/closed/wall/mineral/wood/nonmetal, /area/virtual_domain/powered) +"BQ" = ( +/obj/machinery/seed_extractor, +/turf/open/floor/pod/light, +/area/virtual_domain/powered) "Cb" = ( /obj/machinery/light/directional/north, /mob/living/basic/crab{ @@ -620,22 +663,37 @@ /obj/effect/mob_spawn/ghost_role/human/beach/lifeguard, /turf/open/floor/wood, /area/virtual_domain/powered) -"CG" = ( -/obj/structure/table/wood/poker, -/obj/item/toy/cards/deck, -/turf/open/floor/wood, -/area/virtual_domain/powered) "CO" = ( /obj/machinery/vending/dinnerware, /obj/machinery/light/directional/east, /turf/open/floor/wood, /area/virtual_domain/powered) +"CW" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/stripes/asteroid/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/obj/structure/railing, +/turf/open/floor/sepia, +/area/virtual_domain/powered) "Db" = ( /obj/machinery/barsign/all_access, /turf/closed/wall/mineral/wood/nonmetal, /area/virtual_domain/powered) -"Dk" = ( -/obj/structure/sign/warning/secure_area, +"Ds" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Resort Lobby" + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Dt" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/sand, +/turf/open/misc/beach/sand, +/area/virtual_domain/powered) +"DL" = ( +/obj/effect/baseturf_helper/virtual_domain, /turf/closed/wall/mineral/sandstone, /area/virtual_domain/powered) "Em" = ( @@ -648,18 +706,22 @@ /obj/structure/table, /turf/open/floor/wood, /area/virtual_domain/powered) -"Eq" = ( -/obj/effect/mob_spawn/ghost_role/human/bartender{ - dir = 4 - }, -/turf/open/floor/wood, +"Et" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, /area/virtual_domain/powered) "Ev" = ( /obj/structure/reagent_dispensers/beerkeg, /turf/open/floor/wood, /area/virtual_domain/powered) -"EH" = ( -/obj/machinery/deepfryer, +"EC" = ( +/obj/structure/sign/warning/gas_mask/directional/west, +/turf/open/floor/plating, +/area/virtual_domain/powered) +"EP" = ( +/obj/machinery/light/directional/north, +/obj/machinery/washing_machine, /turf/open/floor/wood, /area/virtual_domain/powered) "Fn" = ( @@ -685,15 +747,6 @@ /obj/structure/mineral_door/wood, /turf/open/floor/wood, /area/virtual_domain/powered) -"Gt" = ( -/obj/item/food/meat/rawbacon, -/obj/item/food/meat/rawbacon, -/obj/item/food/meat/rawcutlet, -/obj/item/food/meat/rawcutlet, -/obj/item/food/meat/slab/rawcrab, -/obj/item/food/meat/slab/rawcrab, -/turf/open/floor/wood, -/area/virtual_domain/powered) "Gz" = ( /obj/structure/flora/tree/palm, /turf/open/misc/beach/sand, @@ -707,14 +760,21 @@ /obj/item/storage/medkit/brute, /turf/open/floor/wood, /area/virtual_domain/powered) -"GV" = ( -/obj/machinery/light/directional/south, -/turf/open/misc/beach/sand/coastline_b, +"GQ" = ( +/turf/open/floor/iron/grimy, /area/virtual_domain/powered) "Hs" = ( /obj/machinery/shower/directional/west, /turf/open/floor/iron/white, /area/virtual_domain/powered) +"HF" = ( +/obj/machinery/deepfryer, +/turf/open/floor/wood, +/area/virtual_domain/powered) +"Ia" = ( +/obj/structure/urinal/directional/north, +/turf/open/floor/wood, +/area/virtual_domain/powered) "Ii" = ( /obj/machinery/light/directional/west, /turf/open/floor/iron/stairs/left, @@ -756,44 +816,27 @@ /obj/structure/flora/rock/style_random, /turf/open/misc/beach/sand, /area/virtual_domain/powered) -"KZ" = ( -/obj/structure/flora/bush/stalky/style_random, -/turf/open/water/beach, +"Kd" = ( +/obj/structure/sign/warning/secure_area, +/turf/closed/wall/mineral/sandstone, /area/virtual_domain/powered) -"Ll" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 +"KH" = ( +/obj/structure/mineral_door/wood{ + name = "Croupier's Booth" }, -/obj/machinery/light/directional/west, -/obj/structure/railing, -/turf/open/floor/sepia, +/turf/open/floor/wood, /area/virtual_domain/powered) -"Lu" = ( -/obj/machinery/light/directional/east, -/turf/open/misc/beach/sand/coastline_b, +"KZ" = ( +/obj/structure/flora/bush/stalky/style_random, +/turf/open/water/beach, /area/virtual_domain/powered) "LD" = ( /turf/open/floor/plating, /area/virtual_domain/powered) -"LP" = ( -/obj/effect/turf_decal/sand, -/obj/structure/railing, -/turf/open/floor/sepia, -/area/virtual_domain/powered) "LW" = ( /obj/item/storage/cans/sixbeer, /turf/open/floor/carpet/orange, /area/virtual_domain/powered) -"Mp" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain{ - pixel_y = 7; - pixel_x = 4 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain, -/turf/open/floor/wood, -/area/virtual_domain/powered) "Mw" = ( /obj/structure/chair/sofa/right/brown, /turf/open/floor/wood, @@ -802,21 +845,19 @@ /obj/structure/chair/sofa/left/brown, /turf/open/floor/wood, /area/virtual_domain/powered) -"MS" = ( -/obj/structure/mineral_door/wood{ - name = "Croupier's Booth" - }, -/turf/open/floor/wood, -/area/virtual_domain/powered) -"Ng" = ( -/obj/effect/spawner/structure/window, -/obj/structure/curtain, -/turf/open/floor/plating, -/area/virtual_domain/powered) "Nr" = ( /obj/machinery/light/directional/north, /turf/open/misc/beach/sand, /area/virtual_domain/powered) +"Nw" = ( +/obj/item/bedsheet/dorms{ + dir = 4 + }, +/obj/structure/bed{ + dir = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain/powered) "NM" = ( /obj/structure/closet/crate/hydroponics, /obj/item/food/grown/ambrosia/vulgaris, @@ -845,6 +886,11 @@ /obj/structure/sign/warning/gas_mask/directional/north, /turf/open/misc/beach/sand, /area/virtual_domain/powered) +"OO" = ( +/obj/effect/turf_decal/sand, +/obj/structure/railing, +/turf/open/floor/sepia, +/area/virtual_domain/powered) "OR" = ( /obj/machinery/light/directional/south, /turf/open/misc/beach/sand, @@ -865,14 +911,6 @@ /obj/machinery/light/directional/west, /turf/open/misc/beach/sand, /area/virtual_domain/powered) -"Pk" = ( -/obj/item/toy/dodgeball, -/obj/item/toy/dodgeball, -/obj/item/toy/dodgeball, -/obj/item/toy/dodgeball, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/virtual_domain/powered) "PM" = ( /obj/machinery/door/airlock/external/ruin, /turf/open/floor/plating, @@ -885,15 +923,18 @@ /obj/structure/curtain, /turf/open/floor/iron/white, /area/virtual_domain/powered) -"QO" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/virtual_domain/powered) "QP" = ( /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/wood, /area/virtual_domain/powered) +"QX" = ( +/obj/machinery/chem_dispenser/drinks/fullupgrade{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/virtual_domain/powered) "Rx" = ( /turf/open/floor/iron/stairs/medium, /area/virtual_domain/powered) @@ -909,12 +950,6 @@ /obj/item/clothing/neck/beads, /turf/open/floor/wood, /area/virtual_domain/powered) -"St" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/misc/beach/sand/coastline_b, -/area/virtual_domain/powered) "SB" = ( /obj/machinery/door/airlock/sandstone{ name = "Resort Bathroom" @@ -940,14 +975,6 @@ /obj/structure/fluff/beach_umbrella/security, /turf/open/misc/beach/sand, /area/virtual_domain/powered) -"TN" = ( -/obj/structure/mirror/directional/west, -/obj/structure/sink/kitchen/directional/south, -/turf/open/floor/wood, -/area/virtual_domain/powered) -"TR" = ( -/turf/open/floor/iron/grimy, -/area/virtual_domain/powered) "Ud" = ( /obj/effect/turf_decal/sand, /turf/open/misc/beach/sand, @@ -968,11 +995,6 @@ /obj/machinery/processor, /turf/open/floor/wood, /area/virtual_domain/powered) -"Vt" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/light/small/directional/east, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/virtual_domain/powered) "VA" = ( /obj/machinery/computer/slot_machine, /turf/open/floor/wood, @@ -999,10 +1021,11 @@ "Ww" = ( /turf/open/water/beach, /area/virtual_domain/powered) -"WA" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, +"WC" = ( +/obj/effect/mob_spawn/ghost_role/human/bartender{ + dir = 4 + }, +/turf/open/floor/wood, /area/virtual_domain/powered) "WL" = ( /obj/machinery/light/directional/north, @@ -1012,11 +1035,6 @@ /obj/structure/flora/bush/jungle/a/style_random, /turf/open/misc/beach/sand, /area/virtual_domain/powered) -"WP" = ( -/obj/machinery/light/directional/north, -/obj/machinery/washing_machine, -/turf/open/floor/wood, -/area/virtual_domain/powered) "WW" = ( /obj/effect/turf_decal/sand, /obj/machinery/icecream_vat, @@ -1054,14 +1072,15 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plating, /area/virtual_domain/powered) +"YI" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Supply Room" + }, +/turf/open/floor/plating, +/area/virtual_domain/powered) "YJ" = ( /turf/open/floor/carpet/purple, /area/virtual_domain/powered) -"YL" = ( -/obj/machinery/vending/cigarette/beach, -/obj/effect/turf_decal/sand, -/turf/open/floor/iron, -/area/virtual_domain/powered) "YN" = ( /obj/effect/turf_decal/sand, /obj/machinery/light/directional/west, @@ -1072,31 +1091,12 @@ /obj/machinery/microwave, /turf/open/floor/wood, /area/virtual_domain/powered) -"Zp" = ( -/obj/machinery/light/directional/east, -/obj/structure/chair/stool/bar/directional/south, -/turf/open/floor/wood, -/area/virtual_domain/powered) "Zt" = ( /obj/structure/table/wood, /obj/item/reagent_containers/pill/morphine, /obj/item/storage/fancy/donut_box, /turf/open/floor/wood, /area/virtual_domain/powered) -"ZI" = ( -/obj/effect/turf_decal/sand, -/obj/item/coin/gold, -/obj/structure/railing, -/obj/machinery/media/jukebox, -/turf/open/floor/sepia, -/area/virtual_domain/powered) -"ZS" = ( -/obj/item/reagent_containers/condiment/milk, -/obj/item/reagent_containers/condiment/mayonnaise, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/flour, -/turf/open/floor/wood, -/area/virtual_domain/powered) (1,1,1) = {" pr @@ -1497,7 +1497,7 @@ Al Al xb xb -Vt +uc Al Al gl @@ -1553,12 +1553,12 @@ bf Bw Fn Ev -Eq +WC iR kG di Fn -hx +DL Al gl ml @@ -1586,7 +1586,7 @@ LD LD Fn Fn -Dk +Kd Fn Fn bQ @@ -1600,7 +1600,7 @@ TG TG TG TG -wo +AP Fn Al gl @@ -1627,7 +1627,7 @@ Fn LD pT LD -uI +EC LD pT PM @@ -1643,7 +1643,7 @@ TG TG TG TG -vC +QX Fn Al gl @@ -1670,7 +1670,7 @@ Fn Fn yU LD -QO +Et LD LD PM @@ -1683,9 +1683,9 @@ qc Fn Fn SD -Mp -uq -fc +ax +yx +fN Fn Fn Al @@ -1729,7 +1729,7 @@ dx kn kn kn -Ll +CW Fn Al gl @@ -1751,11 +1751,11 @@ pC yX ag kT -CG +BJ kT Fn as -YL +pi Ir IP YN @@ -1772,7 +1772,7 @@ uU lS lS lS -LP +OO Fn Al gl @@ -1793,8 +1793,8 @@ Fn Mw ag ag -Zp -eT +vp +xk TG Fn Ud @@ -1815,7 +1815,7 @@ uU lS NX lS -ZI +is Fn Al gl @@ -1838,7 +1838,7 @@ TG TG Fn Fn -MS +KH Fn wD wD @@ -1858,7 +1858,7 @@ uU lS lS lS -LP +OO Fn Al gl @@ -1877,8 +1877,8 @@ iz Al Fn Fn -wm -wm +tE +tE Fn wD wD @@ -1901,7 +1901,7 @@ uU uU uU uU -LP +OO Fn Fn gl @@ -1924,7 +1924,7 @@ wD wD wD wD -WA +Dt Ud Ud Ud @@ -1939,13 +1939,13 @@ TJ wb wD wD -St -St -St -St -St -St -GV +AS +AS +AS +AS +AS +AS +hy Fn gl gl @@ -1982,13 +1982,13 @@ yl ag wD wD -eU +AZ KZ Ww Ww Ww cG -eU +AZ Fn Al Al @@ -2017,7 +2017,7 @@ TG TG TG TG -Gt +ra BM wD wD @@ -2025,13 +2025,13 @@ Au wD rT wD -eU +AZ Ww Ww Ww Ww Ww -eU +AZ Fn Al iz @@ -2054,9 +2054,9 @@ wD JC wD BM -EH +HF TG -ZS +qd BM aw TG @@ -2068,13 +2068,13 @@ YJ YJ wD wD -eU +AZ Ww Ww Ww Ww Ww -eU +AZ Fn Al iz @@ -2111,13 +2111,13 @@ bQ wD wD wD -eU +AZ Ww Ww KZ KZ Ww -GV +hy Fn Al iz @@ -2140,7 +2140,7 @@ Gz LW wD BM -yQ +bS TG oP BM @@ -2154,13 +2154,13 @@ XP yB wD wD -eU +AZ KZ Ww KZ gh Ww -eU +AZ Fn Al iz @@ -2197,13 +2197,13 @@ XL wD wD wD -eU +AZ Ww Ww Ww Ww Ww -eU +AZ Fn Al iz @@ -2240,13 +2240,13 @@ xq jy wD wD -eU +AZ Ww cG Ww Ww KZ -eU +AZ Fn Al iz @@ -2283,13 +2283,13 @@ CA Uh wD qW -eU +AZ Ww Ww Ww Ww Ww -GV +hy Fn Al iz @@ -2325,14 +2325,14 @@ wD wD wD Jt -eU -eU -Lu -eU -eU -eU -eU -eU +AZ +AZ +rs +AZ +AZ +AZ +AZ +AZ Fn Al iz @@ -2349,8 +2349,8 @@ xW iz Al Fn -tj -tj +Ds +Ds Fn VX wD @@ -2399,7 +2399,7 @@ Fn jl Fn Fn -Ng +qR Fn Fn WO @@ -2441,12 +2441,12 @@ TG Fn Fn Fn -es +dZ OE -yF +Nw Fn Fn -Ng +qR Fn Fn wD @@ -2478,7 +2478,7 @@ xW iz Al Fn -WP +EP TG TG TG @@ -2488,9 +2488,9 @@ TG TG TG Fn -es +dZ OE -yF +Nw Fn Gz wD @@ -2588,7 +2588,7 @@ aE aE aE AI -sj +BQ aE NM Fn @@ -2607,7 +2607,7 @@ xW iz Al Fn -TN +kK TG Fn TG @@ -2621,14 +2621,14 @@ Fn SY Fn Fn -tj -tj +Ds +Ds Fn -ws +YI Fn Fn Fn -TR +GQ aE aE aE @@ -2650,7 +2650,7 @@ xW iz Al Fn -Bk +Ia dI Fn Fn @@ -2667,8 +2667,8 @@ TG TG TG Fn -Pk -bZ +ve +nP ed Fn Cv @@ -2705,7 +2705,7 @@ rc TG TG TG -rL +tF rc TG TG diff --git a/_maps/virtual_domains/clown_planet.dmm b/_maps/virtual_domains/clown_planet.dmm index 01d7b88a5efb..5ec58519e402 100644 --- a/_maps/virtual_domains/clown_planet.dmm +++ b/_maps/virtual_domains/clown_planet.dmm @@ -127,7 +127,6 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/obj/effect/baseturf_helper/virtual_domain, /turf/open/floor/plating, /area/virtual_domain/powered) "gH" = ( @@ -347,7 +346,6 @@ /area/virtual_domain/powered) "uX" = ( /obj/effect/mapping_helpers/no_lava, -/mob/living/basic/clown, /turf/open/floor/noslip, /area/virtual_domain/powered) "uY" = ( @@ -366,7 +364,6 @@ "wz" = ( /obj/machinery/light/small/directional/south, /obj/effect/mapping_helpers/no_lava, -/mob/living/basic/clown, /turf/open/floor/noslip, /area/virtual_domain/powered) "xt" = ( @@ -769,7 +766,7 @@ /area/virtual_domain/powered) "WT" = ( /obj/machinery/door/airlock/bananium, -/turf/open/indestructible/honk, +/turf/open/floor/carpet, /area/virtual_domain/powered) "WX" = ( /turf/open/indestructible/white, diff --git a/_maps/virtual_domains/gondola_asteroid.dmm b/_maps/virtual_domains/gondola_asteroid.dmm index 0fcd583ef25d..906ccbffbb9c 100644 --- a/_maps/virtual_domains/gondola_asteroid.dmm +++ b/_maps/virtual_domains/gondola_asteroid.dmm @@ -108,10 +108,6 @@ /obj/structure/flora/bush/sunny/style_random, /turf/open/floor/grass, /area/ruin/space/has_grav/powered/virtual_domain) -"V" = ( -/obj/structure/flora/coconuts, -/turf/open/floor/grass, -/area/ruin/space/has_grav/powered/virtual_domain) "W" = ( /obj/structure/flora/bush/ferny/style_random, /turf/open/floor/grass, @@ -504,7 +500,7 @@ C C C C -V +C C C C @@ -543,7 +539,7 @@ C W C C -V +C C C q @@ -636,7 +632,7 @@ C g C C -V +C C z C @@ -994,7 +990,7 @@ h C C q -V +C C C C @@ -1164,7 +1160,7 @@ h h C C -V +C C C C @@ -1317,7 +1313,7 @@ C q C C -V +C C h h @@ -1488,7 +1484,7 @@ C C C C -V +C C C C diff --git a/_maps/virtual_domains/pipedream.dmm b/_maps/virtual_domains/pipedream.dmm index 44bd845477a1..9a706f613e88 100644 --- a/_maps/virtual_domains/pipedream.dmm +++ b/_maps/virtual_domains/pipedream.dmm @@ -44,7 +44,6 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/closet/crate/preopen, /turf/open/floor/plating, /area/virtual_domain/powered) "bx" = ( @@ -58,14 +57,6 @@ /obj/structure/chair/plastic, /turf/open/floor/plating, /area/virtual_domain/powered) -"bG" = ( -/obj/structure/lattice/catwalk{ - name = "industrial lift" - }, -/obj/structure/closet/crate/preopen, -/obj/structure/railing, -/turf/open/chasm, -/area/virtual_domain/powered) "bS" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 1 @@ -181,10 +172,6 @@ dir = 8 }, /area/virtual_domain/powered) -"fj" = ( -/obj/structure/closet/crate/preopen, -/turf/open/floor/plating, -/area/virtual_domain/powered) "fl" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 1 @@ -277,10 +264,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron, /area/virtual_domain/powered) -"iz" = ( -/obj/structure/broken_flooring/corner, -/turf/open/floor/plating, -/area/virtual_domain/powered) "iI" = ( /obj/effect/turf_decal/trimline/yellow/corner{ dir = 8 @@ -400,12 +383,6 @@ }, /turf/open/floor/plating, /area/virtual_domain/powered) -"mh" = ( -/obj/structure/broken_flooring/pile{ - dir = 4 - }, -/turf/open/floor/plating, -/area/virtual_domain/powered) "mu" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, @@ -423,23 +400,6 @@ }, /turf/open/floor/iron, /area/virtual_domain/powered) -"nc" = ( -/obj/effect/turf_decal/trimline/yellow/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/poster/official/safety_internals/directional/south, -/turf/open/floor/iron, -/area/virtual_domain/powered) -"nz" = ( -/obj/structure/broken_flooring/side/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/virtual_domain/powered) "nD" = ( /obj/structure/disposalpipe/trunk/multiz, /turf/open/floor/plating, @@ -470,27 +430,12 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating, /area/virtual_domain/powered) -"oX" = ( -/obj/structure/broken_flooring/corner/directional/north, -/turf/open/floor/plating, -/area/virtual_domain/powered) "pa" = ( /obj/machinery/light/small/red/dim{ dir = 1 }, /turf/open/floor/carpet/orange, /area/virtual_domain/powered) -"pb" = ( -/obj/structure/broken_flooring/corner{ - dir = 4 - }, -/turf/open/floor/plating, -/area/virtual_domain/powered) -"pf" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/mapping_helpers/damaged_window, -/turf/open/floor/plating, -/area/virtual_domain/powered) "pi" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -500,12 +445,6 @@ /obj/structure/closet/crate/maint, /turf/open/floor/iron, /area/virtual_domain/powered) -"pv" = ( -/obj/structure/broken_flooring/side{ - dir = 4 - }, -/turf/open/floor/plating, -/area/virtual_domain/powered) "pI" = ( /obj/effect/turf_decal/tile/yellow/fourcorners, /obj/machinery/light/small/red/dim{ @@ -513,12 +452,6 @@ }, /turf/open/floor/iron, /area/virtual_domain/powered) -"pJ" = ( -/obj/structure/broken_flooring/pile{ - dir = 1 - }, -/turf/open/floor/plating, -/area/virtual_domain/powered) "qc" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 8 @@ -662,15 +595,6 @@ }, /turf/open/floor/iron/cafeteria, /area/virtual_domain/powered) -"uv" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/broken_flooring/pile{ - dir = 1 - }, -/turf/open/floor/plating, -/area/virtual_domain/powered) "uz" = ( /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, @@ -689,10 +613,6 @@ icon_state = "carpet_royalblue-55" }, /area/virtual_domain/powered) -"uU" = ( -/obj/structure/broken_flooring/side, -/turf/open/floor/plating, -/area/virtual_domain/powered) "vb" = ( /obj/effect/turf_decal/trimline/yellow/line, /obj/effect/turf_decal/trimline/yellow/line{ @@ -734,7 +654,6 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/preopen, /turf/open/floor/plating, /area/virtual_domain/powered) "wh" = ( @@ -799,13 +718,6 @@ }, /turf/open/floor/plating, /area/virtual_domain/powered) -"xj" = ( -/obj/structure/railing/corner/end{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/virtual_domain/powered) "xk" = ( /obj/machinery/light/dim{ dir = 4 @@ -929,10 +841,6 @@ /obj/item/ammo_casing/shotgun/buckshot, /turf/open/floor/iron, /area/virtual_domain/powered) -"Bh" = ( -/obj/structure/broken_flooring/corner/directional/east, -/turf/open/floor/plating, -/area/virtual_domain/powered) "Bx" = ( /obj/structure/table/reinforced, /obj/machinery/microwave{ @@ -941,10 +849,6 @@ }, /turf/open/floor/iron, /area/virtual_domain/powered) -"BA" = ( -/obj/structure/broken_flooring/corner/directional/south, -/turf/open/floor/plating, -/area/virtual_domain/powered) "BI" = ( /obj/machinery/door/airlock/command/glass{ name = "Quartermaster's Office" @@ -998,13 +902,6 @@ icon_state = "carpet_royalblue-157" }, /area/virtual_domain/powered) -"CA" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/broken_flooring/side{ - dir = 4 - }, -/turf/open/floor/plating, -/area/virtual_domain/powered) "CQ" = ( /obj/effect/spawner/random/trash/botanical_waste, /obj/item/trash/chips, @@ -1086,11 +983,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/cafeteria, /area/virtual_domain/powered) -"Fr" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/closet/crate/preopen, -/turf/open/floor/iron, -/area/virtual_domain/powered) "Fw" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/rock/pile/style_random, @@ -1170,10 +1062,6 @@ "Hn" = ( /turf/open/floor/iron/cafeteria, /area/virtual_domain/powered) -"HI" = ( -/obj/structure/broken_flooring/pile/directional/north, -/turf/open/floor/plating, -/area/virtual_domain/powered) "Ib" = ( /obj/structure/chair/sofa/corp/left{ dir = 1 @@ -1213,7 +1101,6 @@ /turf/open/floor/iron, /area/virtual_domain/powered) "Jm" = ( -/obj/structure/broken_flooring/pile/directional/north, /obj/machinery/light/dim, /turf/open/floor/plating, /area/virtual_domain/powered) @@ -1222,16 +1109,10 @@ dir = 4 }, /obj/structure/disposalpipe/segment, -/obj/structure/railing/corner/end/flip{ - dir = 8 - }, /obj/structure/sign/warning/doors/directional/east, /turf/open/floor/iron, /area/virtual_domain/powered) "Jq" = ( -/obj/structure/broken_flooring/pile{ - dir = 1 - }, /obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/plating, /area/virtual_domain/powered) @@ -1262,11 +1143,6 @@ }, /turf/open/floor/plating, /area/virtual_domain/powered) -"KO" = ( -/obj/structure/broken_flooring/side/directional/north, -/obj/machinery/light/small/red/dim, -/turf/open/floor/plating, -/area/virtual_domain/powered) "KX" = ( /obj/structure/lattice/catwalk{ name = "industrial lift" @@ -1386,9 +1262,6 @@ /turf/open/floor/iron, /area/virtual_domain/powered) "On" = ( -/obj/structure/broken_flooring/side{ - dir = 4 - }, /obj/machinery/light/broken{ dir = 4 }, @@ -1410,7 +1283,6 @@ /area/virtual_domain/powered) "OQ" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/sign/poster/ripped/directional/west, /turf/open/floor/carpet/orange, /area/virtual_domain/powered) "OR" = ( @@ -1422,7 +1294,6 @@ dir = 4 }, /obj/structure/disposalpipe/segment, -/obj/structure/broken_flooring/corner, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/virtual_domain/powered) @@ -1436,13 +1307,6 @@ /obj/structure/sign/poster/official/random/directional/east, /turf/open/floor/iron, /area/virtual_domain/powered) -"PH" = ( -/obj/structure/railing/corner/end/flip{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/virtual_domain/powered) "Qd" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 8 @@ -1607,9 +1471,6 @@ /turf/open/floor/iron, /area/virtual_domain/powered) "Tn" = ( -/obj/structure/broken_flooring/corner{ - dir = 4 - }, /mob/living/basic/hivebot, /turf/open/floor/plating, /area/virtual_domain/powered) @@ -1629,17 +1490,11 @@ }, /turf/open/floor/plating, /area/virtual_domain/powered) -"TH" = ( -/obj/structure/broken_flooring/corner/directional/south, -/obj/item/ammo_casing/shotgun/buckshot/spent, -/turf/open/floor/plating, -/area/virtual_domain/powered) "Ue" = ( /obj/structure/table/reinforced, /obj/machinery/light/small/red/dim{ dir = 8 }, -/obj/structure/sign/poster/official/cleanliness/directional/west, /turf/open/floor/iron, /area/virtual_domain/powered) "Uw" = ( @@ -1648,10 +1503,6 @@ }, /turf/open/floor/plating, /area/virtual_domain/powered) -"UO" = ( -/obj/structure/broken_flooring/side/directional/north, -/turf/open/floor/plating, -/area/virtual_domain/powered) "UV" = ( /obj/effect/turf_decal/trimline/yellow/line{ dir = 1 @@ -1696,13 +1547,6 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/cafeteria, /area/virtual_domain/powered) -"Vy" = ( -/obj/structure/broken_flooring/singular{ - dir = 4 - }, -/obj/effect/mob_spawn/corpse/human/factory/guard, -/turf/open/floor/plating, -/area/virtual_domain/powered) "VA" = ( /obj/machinery/light/small/red/dim{ dir = 1 @@ -1710,12 +1554,6 @@ /obj/structure/table, /turf/open/floor/plating, /area/virtual_domain/powered) -"VJ" = ( -/obj/structure/broken_flooring/corner{ - dir = 1 - }, -/turf/open/floor/plating, -/area/virtual_domain/powered) "VL" = ( /obj/structure/sign/warning/secure_area/directional/south, /turf/open/floor/plating, @@ -1812,13 +1650,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/virtual_domain/powered) -"XP" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/railing/corner/end{ - dir = 4 - }, -/turf/open/floor/plating, -/area/virtual_domain/powered) "XQ" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 4 @@ -1839,10 +1670,6 @@ /obj/item/gun/ballistic/revolver, /turf/open/floor/plating, /area/virtual_domain/powered) -"Yl" = ( -/obj/structure/broken_flooring/corner/directional/west, -/turf/open/floor/plating, -/area/virtual_domain/powered) "Ym" = ( /mob/living/simple_animal/pet/cat/space, /obj/structure/bed/dogbed{ @@ -1852,8 +1679,6 @@ pixel_x = 3; pixel_y = 4 }, -/obj/machinery/light/small/dim/directional/south, -/obj/structure/sign/poster/official/moth_hardhat/directional/west, /turf/open/floor/plating, /area/virtual_domain/powered) "Yt" = ( @@ -2282,7 +2107,7 @@ yQ yQ RJ eg -uU +kU gj kU Tn @@ -2292,8 +2117,8 @@ RJ eg eg uk -pf -pf +tr +tr eg eg qV @@ -2347,7 +2172,7 @@ nS kU Qj FK -nc +Sg eY aK aK @@ -2442,7 +2267,7 @@ eg eg VO kU -Fr +lN jw qk XR @@ -2479,10 +2304,10 @@ yM eg GV WT -xj +pi qk Qh -XP +mu lW ww EI @@ -2491,9 +2316,9 @@ Qh mu Yz xl -HI kU -Bh +kU +kU Kb kU hi @@ -2526,14 +2351,14 @@ eg kU sB WT -mh kU -pv +kU +kU AP IZ KX Wd -uv +gj DE Mi gj @@ -2582,7 +2407,7 @@ xl AP KX JT -bG +Wd qk DA DA @@ -2626,7 +2451,7 @@ eg qT Gb Uw -iz +kU jS gj rJ @@ -2645,7 +2470,7 @@ mu mu xl kU -oX +kU hi cF cw @@ -2679,13 +2504,13 @@ eg eg kU qk -PH +mu dA Po Jn aw OJ -CA +mu QN kU Uw @@ -2694,7 +2519,7 @@ kU Mc kU kh -fj +kU kU FK CX @@ -2742,7 +2567,7 @@ eg eg op kU -BA +kU iw kU kU @@ -2795,7 +2620,7 @@ Zb kU Yt kU -UO +kU hi CX eY @@ -2825,7 +2650,7 @@ ve Tt Xo DE -oX +kU eg Sl gV @@ -2834,11 +2659,11 @@ eg uC eg qK -mh +kU kU kU Qj -VJ +kU eg kU kU @@ -2878,11 +2703,11 @@ kU kU mE Mu -Yl -pJ +kU +kU eg kn -pb +kU kU kU kU @@ -2891,7 +2716,7 @@ kU YF eg eg -pf +tr tr XN eg @@ -2945,7 +2770,7 @@ qc ax bS fe -pf +tr hi hi af @@ -2973,7 +2798,7 @@ FO eg eg wg -uU +kU lN uz eg @@ -3027,7 +2852,7 @@ Mj Mj eY eY -UO +kU jH Nu eg @@ -3074,7 +2899,7 @@ Mj RJ Mj Mj -Vy +Kb hi eY CX @@ -3124,13 +2949,13 @@ RJ RJ eY Xm -TH +kU fw eY qW hi dx -pf +tr UV sn uP @@ -3275,7 +3100,7 @@ RJ eY NW UY -KO +YF eY fl jH @@ -3330,7 +3155,7 @@ eY CX jH Nu -pf +tr Xw MI ZI @@ -3478,7 +3303,7 @@ yQ RJ eg Ok -nz +gj IK eg RJ diff --git a/_maps/virtual_domains/pirates.dmm b/_maps/virtual_domains/pirates.dmm index 5356f53d1932..805c7bc061cc 100644 --- a/_maps/virtual_domains/pirates.dmm +++ b/_maps/virtual_domains/pirates.dmm @@ -752,7 +752,7 @@ /area/virtual_domain/powered) "Pz" = ( /obj/structure/table/wood, -/mob/living/simple_animal/parrot{ +/mob/living/basic/parrot{ name = "pepper" }, /turf/open/floor/carpet/blue, diff --git a/_maps/virtual_domains/psyker_shuffle.dmm b/_maps/virtual_domains/psyker_shuffle.dmm new file mode 100644 index 000000000000..9c846c650da6 --- /dev/null +++ b/_maps/virtual_domains/psyker_shuffle.dmm @@ -0,0 +1,1074 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/structure/closet/crate/secure, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"b" = ( +/obj/item/restraints/legcuffs/beartrap/prearmed, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"e" = ( +/obj/item/gun/ballistic/shotgun/lethal, +/obj/structure/closet/crate/preopen, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"h" = ( +/obj/structure/closet/crate/preopen, +/obj/item/gun/ballistic/automatic/mini_uzi, +/obj/item/gun/ballistic/revolver{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/gun/ballistic/revolver{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/gun/ballistic/revolver{ + pixel_x = 1; + pixel_y = 1 + }, +/obj/item/gun/ballistic/revolver{ + pixel_x = -1; + pixel_y = 5 + }, +/obj/item/gun/ballistic/revolver{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/gun/ballistic/revolver{ + pixel_x = -3 + }, +/obj/item/gun/ballistic/revolver{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/item/gun/ballistic/revolver{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/gun/ballistic/revolver, +/turf/template_noop, +/area/virtual_domain/safehouse) +"k" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"m" = ( +/obj/item/toy/gun{ + pixel_y = 3 + }, +/obj/structure/closet/crate/wooden, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"o" = ( +/turf/template_noop, +/area/template_noop) +"q" = ( +/obj/effect/landmark/bitrunning/crate_replacer, +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"r" = ( +/mob/living/simple_animal/hostile/mimic, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"s" = ( +/mob/living/simple_animal/hostile/mimic/crate, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"t" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"v" = ( +/obj/structure/closet/crate/hydroponics, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"x" = ( +/obj/item/gun/ballistic/shotgun/lethal, +/obj/item/gun/ballistic/revolver/mateba, +/obj/structure/closet/crate/preopen, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"B" = ( +/turf/template_noop, +/area/ruin/space/has_grav/powered/virtual_domain) +"F" = ( +/obj/structure/closet/crate/internals, +/obj/item/gun/ballistic/revolver/mateba, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"G" = ( +/obj/structure/closet/crate, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"K" = ( +/obj/structure/closet/crate/eva, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"M" = ( +/obj/machinery/door/airlock/abductor, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"N" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"O" = ( +/obj/structure/closet/crate/freezer/surplus_limbs, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"P" = ( +/obj/structure/closet/crate/wooden, +/obj/item/gun/ballistic/revolver/mateba, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"Q" = ( +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"R" = ( +/obj/structure/closet/crate/secure/loot, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"S" = ( +/obj/structure/closet/crate/secure/bitrunning/encrypted, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"U" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"X" = ( +/obj/item/gun/ballistic/shotgun/lethal, +/obj/structure/closet/crate/preopen, +/obj/projectile/bullet/shotgun_frag12, +/obj/projectile/bullet/shotgun_frag12, +/obj/projectile/bullet/shotgun_frag12, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"Y" = ( +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) + +(1,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} +(2,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} +(3,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} +(4,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} +(5,1,1) = {" +o +o +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +k +o +o +o +o +o +o +o +o +"} +(6,1,1) = {" +o +o +Y +Y +r +Q +Q +Q +Q +Q +Q +Q +Q +Q +a +Y +Y +Y +o +o +o +o +o +o +o +o +"} +(7,1,1) = {" +o +o +Y +Y +Y +K +Q +a +Q +Q +Y +Q +Q +Q +Q +Q +Y +Y +o +o +o +o +o +o +o +o +"} +(8,1,1) = {" +o +o +Y +Y +Y +m +Q +Q +Q +Y +Y +Y +Q +Q +Q +Q +Y +Y +o +o +o +o +o +o +o +o +"} +(9,1,1) = {" +o +o +Y +X +Y +Y +Q +Q +Q +Q +K +Y +Q +r +Y +Q +Y +Y +o +o +o +o +o +o +o +o +"} +(10,1,1) = {" +o +o +Y +b +Q +Y +Y +Q +Q +Q +Q +Q +Q +Y +Y +Q +Q +Y +o +o +o +o +o +o +o +o +"} +(11,1,1) = {" +o +o +Y +Q +Q +Q +Q +Q +Q +Y +Q +Q +Q +Q +Q +Q +Q +Y +o +o +o +o +o +o +o +o +"} +(12,1,1) = {" +o +o +Y +a +Q +b +Q +O +Q +Y +Q +Q +S +Q +Q +Q +Q +Y +o +o +o +o +o +o +o +o +"} +(13,1,1) = {" +o +o +Y +b +Q +Y +Q +Q +Q +Q +Q +Q +Q +Q +Y +Y +Q +Y +Y +Y +Y +Y +Y +Y +Y +o +"} +(14,1,1) = {" +o +o +Y +a +a +Y +Q +Q +Q +Q +Q +Q +Q +Q +Y +Q +Q +Q +t +t +t +t +t +U +Y +Y +"} +(15,1,1) = {" +o +o +Y +Y +Y +Y +Q +G +Q +Y +Y +Y +Q +Q +Q +Q +Q +Q +t +t +t +t +t +t +B +Y +"} +(16,1,1) = {" +o +o +Y +r +Q +Q +Q +Q +Q +Y +Y +Y +a +Q +Q +Q +Q +Q +t +h +t +t +t +t +B +Y +"} +(17,1,1) = {" +o +o +Y +Q +Y +Q +Q +Q +O +Y +Y +Y +a +Q +Q +Q +Q +Q +t +t +t +t +t +t +B +Y +"} +(18,1,1) = {" +o +o +Y +Q +Y +Q +Y +Y +Y +Y +Y +Y +Q +Q +Q +Q +Q +Q +t +t +t +t +t +t +B +Y +"} +(19,1,1) = {" +o +o +Y +Q +Y +Q +Q +P +Y +Y +Q +Q +Q +Q +Y +Y +Q +Q +t +t +t +t +t +t +B +Y +"} +(20,1,1) = {" +o +o +Y +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Y +Q +Q +t +t +t +t +t +N +B +Y +"} +(21,1,1) = {" +o +o +Y +a +Q +Q +Y +Q +Q +Y +Y +Q +Q +R +Q +Q +Q +Y +Y +Y +Y +Y +Y +Y +B +Y +"} +(22,1,1) = {" +o +o +Y +Y +Q +Q +Y +Q +Q +v +Q +Q +Q +Q +Q +Q +Q +Y +o +o +o +o +o +Y +B +Y +"} +(23,1,1) = {" +o +o +o +Y +Y +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Y +o +o +o +o +o +Y +Y +Y +"} +(24,1,1) = {" +o +o +Y +Y +Y +Y +Q +Q +Q +Q +Q +Y +Q +Q +Q +Q +Q +Y +o +o +o +o +o +o +o +o +"} +(25,1,1) = {" +Y +Y +Y +a +Y +Y +Y +Y +Q +Q +Q +Y +Q +Y +Q +Q +Y +Y +o +o +o +o +o +o +o +o +"} +(26,1,1) = {" +Y +a +Q +e +Q +Y +a +Q +Q +Q +Q +Y +Q +Y +Y +a +Y +Y +o +o +o +o +o +o +o +o +"} +(27,1,1) = {" +Y +Q +Q +Q +s +M +Q +Q +Q +Q +Y +Y +Q +Y +Q +Q +Q +Y +Y +o +o +o +o +o +o +o +"} +(28,1,1) = {" +Y +Y +Q +Q +a +Y +Q +a +Q +Q +Q +F +Q +Y +s +Q +Q +a +Y +o +o +o +o +o +o +o +"} +(29,1,1) = {" +Y +Y +Q +Q +Q +Y +Y +Y +Y +Y +Y +Y +Y +Y +Q +K +Q +Q +Y +o +o +o +o +o +o +o +"} +(30,1,1) = {" +Y +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +Q +a +Q +Q +Q +K +Y +o +o +o +o +o +o +o +"} +(31,1,1) = {" +Y +a +Q +s +Y +Y +Y +s +Q +Q +Q +Q +Y +Y +x +Y +Q +Y +Y +o +o +o +o +o +o +o +"} +(32,1,1) = {" +Y +a +Y +Y +Y +o +Y +Y +Q +a +Y +Y +Y +Y +Y +Y +Y +q +o +o +o +o +o +o +o +o +"} +(33,1,1) = {" +Y +Y +Y +o +o +o +o +Y +Y +Y +Y +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} diff --git a/_maps/virtual_domains/psyker_zombies.dmm b/_maps/virtual_domains/psyker_zombies.dmm new file mode 100644 index 000000000000..339c4e15e4c6 --- /dev/null +++ b/_maps/virtual_domains/psyker_zombies.dmm @@ -0,0 +1,1215 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"b" = ( +/obj/item/pizzabox/bomb/armed, +/obj/structure/rack, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"c" = ( +/obj/structure/sign/warning/directional/west, +/turf/open/chasm/lavaland, +/area/ruin/space/has_grav/powered/virtual_domain) +"h" = ( +/obj/structure/rack, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"i" = ( +/obj/structure/sign/warning/directional/east, +/turf/open/chasm/lavaland, +/area/ruin/space/has_grav/powered/virtual_domain) +"o" = ( +/turf/template_noop, +/area/template_noop) +"p" = ( +/obj/structure/rack, +/obj/item/reagent_containers/cup/glass/bottle/rootbeer{ + pixel_x = 3 + }, +/obj/item/reagent_containers/cup/glass/bottle/rootbeer{ + pixel_x = -3 + }, +/obj/item/reagent_containers/cup/glass/bottle/rootbeer{ + pixel_y = 1 + }, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"r" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/template_noop, +/area/virtual_domain/safehouse) +"t" = ( +/turf/template_noop, +/area/virtual_domain/safehouse) +"x" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/abductor, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"A" = ( +/obj/effect/spawner/random/trash/caution_sign, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"B" = ( +/obj/machinery/door/airlock/abductor, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"F" = ( +/obj/structure/mystery_box/guns, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"K" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/ruin/space/has_grav/powered/virtual_domain) +"M" = ( +/obj/effect/mob_spawn/corpse/human/zombie, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"O" = ( +/obj/effect/landmark/bitrunning/safehouse_spawn, +/turf/template_noop, +/area/virtual_domain/safehouse) +"Q" = ( +/turf/open/chasm/lavaland, +/area/ruin/space/has_grav/powered/virtual_domain) +"R" = ( +/obj/effect/mine/explosive/light, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"T" = ( +/obj/machinery/door/airlock/abductor, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"U" = ( +/obj/effect/landmark/bitrunning/cache_spawn, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"V" = ( +/obj/structure/sign/warning/directional/east, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"W" = ( +/obj/effect/mob_spawn/corpse/human/cyber_police, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"X" = ( +/mob/living/simple_animal/hostile/zombie, +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) +"Y" = ( +/turf/open/indestructible/dark, +/area/ruin/space/has_grav/powered/virtual_domain) + +(1,1,1) = {" +o +o +o +o +o +o +o +o +o +o +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +o +o +"} +(2,1,1) = {" +o +o +o +o +o +o +o +o +a +a +a +Y +Y +Y +Y +Y +Y +a +a +o +o +o +o +o +o +o +o +o +"} +(3,1,1) = {" +o +o +a +a +a +a +a +a +a +Y +Y +Y +Y +Y +Y +Y +Y +Y +a +a +K +o +o +o +o +o +o +o +"} +(4,1,1) = {" +o +o +a +W +X +Y +B +Y +Y +Y +Y +R +a +a +X +Y +Y +Y +Y +a +a +o +o +o +o +o +o +o +"} +(5,1,1) = {" +o +o +a +b +b +p +a +R +Y +Y +Y +a +a +a +a +X +Y +Y +Y +Y +a +o +o +o +o +o +o +o +"} +(6,1,1) = {" +o +o +a +a +a +a +a +Y +Y +Y +a +a +Y +Y +a +a +a +a +Y +Y +a +o +o +o +o +o +o +o +"} +(7,1,1) = {" +o +o +a +a +a +a +a +a +Y +Y +a +Y +Y +Y +a +a +a +Y +Y +Y +a +o +o +o +o +o +o +o +"} +(8,1,1) = {" +o +o +a +a +X +Y +Y +Y +Y +Y +a +Y +Y +Y +Y +Y +Y +Y +R +a +a +o +o +o +o +o +o +o +"} +(9,1,1) = {" +o +o +a +a +W +Y +Y +Y +A +Y +a +X +Y +Y +Y +Y +Y +Y +Y +a +o +o +o +o +o +o +o +o +"} +(10,1,1) = {" +o +o +a +a +Y +Q +Q +Q +Q +Y +a +a +Y +Q +Q +Q +Q +Q +Y +a +o +o +o +o +o +o +o +o +"} +(11,1,1) = {" +o +o +a +Y +Y +Q +Q +Q +Q +Y +Y +a +Y +Q +Q +Q +Q +Q +Y +a +o +o +o +o +o +o +o +o +"} +(12,1,1) = {" +o +o +a +Y +Y +Y +Y +Y +Y +Y +Y +a +Y +Y +Y +Y +A +Y +Y +a +o +o +o +o +o +o +o +o +"} +(13,1,1) = {" +o +o +a +Y +Y +Y +a +a +Y +Y +Y +a +Y +a +Y +Y +Y +Y +Y +a +o +o +o +o +o +o +o +o +"} +(14,1,1) = {" +o +o +a +Y +Y +Y +Y +a +Y +Y +a +a +Y +a +Y +Y +Y +Y +Y +a +o +o +o +o +o +o +o +o +"} +(15,1,1) = {" +o +o +a +Y +R +Y +a +a +Y +Y +a +a +Y +a +a +Y +Y +Y +X +a +o +o +o +o +o +o +o +o +"} +(16,1,1) = {" +o +o +a +Y +Y +Y +X +a +Y +Y +X +a +Y +Y +a +Y +a +a +a +a +a +a +a +a +a +a +a +o +"} +(17,1,1) = {" +o +o +a +Y +V +Y +a +a +Y +Y +Y +x +Y +Y +Y +Y +a +h +Y +Y +t +t +t +t +t +O +a +o +"} +(18,1,1) = {" +o +o +a +Y +a +Q +a +a +Y +Y +a +a +X +Y +Y +Y +a +F +Y +Y +t +t +t +t +t +t +a +o +"} +(19,1,1) = {" +o +o +a +Q +Q +Q +a +X +Y +Y +a +a +a +Y +Y +Y +a +Y +Y +Y +t +t +t +t +t +t +a +o +"} +(20,1,1) = {" +o +o +a +Q +Q +Q +a +Y +Y +Y +a +Y +Y +Y +Y +Y +T +Y +Y +Y +t +t +t +t +t +t +a +o +"} +(21,1,1) = {" +o +o +a +a +Q +Q +a +a +Y +Y +a +a +Y +R +Y +Y +a +Y +Y +Y +t +t +t +t +t +t +a +o +"} +(22,1,1) = {" +o +o +a +a +Q +a +a +a +Y +Y +a +a +Y +Y +Y +Y +a +F +Y +Y +t +t +t +t +t +t +a +o +"} +(23,1,1) = {" +o +o +a +a +Q +a +a +a +Y +Y +a +a +a +a +Y +Y +a +h +Y +Y +t +t +t +t +t +r +a +o +"} +(24,1,1) = {" +o +o +a +a +Q +a +a +a +Y +Y +a +a +a +a +a +Y +a +a +a +a +a +a +a +a +a +a +a +o +"} +(25,1,1) = {" +o +o +a +c +Q +a +a +a +T +a +a +a +a +a +a +Y +Y +R +a +a +o +o +o +o +o +o +o +o +"} +(26,1,1) = {" +o +o +a +Q +Q +a +a +W +Y +W +a +a +a +Y +Y +Y +Y +Y +a +o +o +o +o +o +o +o +o +o +"} +(27,1,1) = {" +o +o +a +Y +Y +T +Y +Y +Y +a +a +a +Y +Y +R +Y +Y +a +a +o +o +o +o +o +o +o +o +o +"} +(28,1,1) = {" +o +o +a +Y +X +a +U +X +X +a +X +a +Y +Y +Y +Y +R +a +o +o +o +o +o +o +o +o +o +o +"} +(29,1,1) = {" +o +o +a +Y +a +a +a +a +a +a +Y +Y +Y +Y +a +a +a +a +o +o +o +o +o +o +o +o +o +o +"} +(30,1,1) = {" +o +o +a +Y +Y +R +a +a +R +Y +Y +Y +Y +Y +Y +Y +X +a +o +o +o +o +o +o +o +o +o +o +"} +(31,1,1) = {" +o +o +a +Y +Y +Y +a +Y +Y +Y +a +a +Y +Y +Y +M +a +a +o +o +o +o +o +o +o +o +o +o +"} +(32,1,1) = {" +o +o +a +Y +Y +Y +a +Y +R +a +a +a +a +Y +Y +Y +a +a +a +a +a +o +o +o +o +o +o +o +"} +(33,1,1) = {" +o +o +a +a +R +Y +a +Y +a +a +Y +Y +R +Y +Y +Y +Y +Y +Q +Q +a +o +o +o +o +o +o +o +"} +(34,1,1) = {" +o +o +o +a +Y +Y +Y +Y +Y +Y +Y +a +a +a +Y +M +Y +W +i +Q +a +o +o +o +o +o +o +o +"} +(35,1,1) = {" +o +o +o +a +Y +Y +Y +Y +X +a +a +a +a +a +a +a +a +a +a +a +a +o +o +o +o +o +o +o +"} +(36,1,1) = {" +o +o +o +a +a +a +a +a +a +a +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} +(37,1,1) = {" +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +o +"} diff --git a/_maps/virtual_domains/stairs_and_cliffs.dmm b/_maps/virtual_domains/stairs_and_cliffs.dmm index 82e15fcc0909..8534a513098b 100644 --- a/_maps/virtual_domains/stairs_and_cliffs.dmm +++ b/_maps/virtual_domains/stairs_and_cliffs.dmm @@ -34,15 +34,6 @@ /obj/structure/railing/corner, /turf/open/cliff/snowrock/virtual_domain, /area/icemoon/underground/explored/virtual_domain) -"hc" = ( -/obj/structure/railing/corner/end{ - dir = 8 - }, -/obj/structure/railing/corner/end/flip{ - dir = 8 - }, -/turf/open/misc/asteroid/snow, -/area/icemoon/underground/explored/virtual_domain) "hE" = ( /turf/open/floor/wood, /area/icemoon/underground/explored/virtual_domain) @@ -155,15 +146,6 @@ /obj/effect/decal/remains/plasma, /turf/open/misc/asteroid/snow, /area/icemoon/underground/explored/virtual_domain) -"Dz" = ( -/obj/structure/railing/corner/end{ - dir = 4 - }, -/obj/structure/railing/corner/end/flip{ - dir = 4 - }, -/turf/open/misc/asteroid/snow, -/area/icemoon/underground/explored/virtual_domain) "DB" = ( /obj/structure/flora/rock/icy/style_random, /obj/structure/flora/rock/pile/icy/style_random, @@ -213,15 +195,6 @@ /obj/structure/flora/grass/green/style_random, /turf/open/misc/asteroid/snow, /area/icemoon/underground/explored/virtual_domain) -"MP" = ( -/obj/structure/railing/corner/end/flip{ - dir = 4 - }, -/obj/structure/railing/corner/end{ - dir = 4 - }, -/turf/open/misc/asteroid/snow, -/area/icemoon/underground/explored/virtual_domain) "MT" = ( /obj/structure/railing/corner{ dir = 8 @@ -231,15 +204,6 @@ "Nv" = ( /turf/open/floor/iron/stairs, /area/icemoon/underground/explored/virtual_domain) -"NM" = ( -/obj/structure/railing/corner/end/flip{ - dir = 8 - }, -/obj/structure/railing/corner/end{ - dir = 8 - }, -/turf/open/misc/asteroid/snow, -/area/icemoon/underground/explored/virtual_domain) "Pl" = ( /obj/effect/turf_decal/weather/snow/corner{ dir = 4 @@ -2465,7 +2429,7 @@ sM sM sM sM -MP +dR sM sM sM @@ -2773,7 +2737,7 @@ dR sM sM sM -NM +dR sM sM sM @@ -4303,7 +4267,7 @@ sM sM sM sw -Dz +dR sM sM sM @@ -4688,7 +4652,7 @@ sM sM sM dR -hc +dR sM sM sM diff --git a/_maps/virtual_domains/syndicate_assault.dmm b/_maps/virtual_domains/syndicate_assault.dmm index 770f0967404c..a41275e20187 100644 --- a/_maps/virtual_domains/syndicate_assault.dmm +++ b/_maps/virtual_domains/syndicate_assault.dmm @@ -41,7 +41,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/mob/living/basic/syndicate/ranged/shotgun/space/stormtrooper, +/mob/living/basic/trooper/syndicate/ranged/shotgun/space/stormtrooper, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) "bh" = ( @@ -131,8 +131,13 @@ /area/ruin/space/has_grav/powered/virtual_domain) "cZ" = ( /obj/structure/table/reinforced, -/obj/item/gun/ballistic/automatic/l6_saw/unrestricted, -/obj/item/ammo_box/magazine/m7mm, +/obj/item/gun/ballistic/automatic/l6_saw/unrestricted{ + pixel_y = 10 + }, +/obj/item/ammo_box/magazine/mm712x82{ + pixel_y = -4; + pixel_x = 3 + }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) "da" = ( @@ -236,7 +241,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) "ip" = ( -/mob/living/basic/syndicate/melee/sword/space/stormtrooper, +/mob/living/basic/trooper/syndicate/melee/sword/space/stormtrooper, /turf/open/floor/plastic, /area/ruin/space/has_grav/powered/virtual_domain) "iB" = ( @@ -274,7 +279,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/mob/living/basic/syndicate/ranged/smg/space/stormtrooper, +/mob/living/basic/trooper/syndicate/ranged/smg/space/stormtrooper, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) "ja" = ( @@ -293,7 +298,7 @@ /area/ruin/space/has_grav/powered/virtual_domain) "jA" = ( /obj/structure/cable, -/mob/living/basic/syndicate/melee/space/stormtrooper, +/mob/living/basic/trooper/syndicate/melee/space/stormtrooper, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) "jJ" = ( @@ -412,7 +417,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) "oZ" = ( -/mob/living/basic/syndicate/melee/sword/space/stormtrooper, +/mob/living/basic/trooper/syndicate/melee/sword/space/stormtrooper, /turf/open/floor/carpet/royalblack, /area/ruin/space/has_grav/powered/virtual_domain) "pl" = ( @@ -481,8 +486,10 @@ /turf/closed/wall/r_wall/syndicate, /area/ruin/space/has_grav/powered/virtual_domain) "rH" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/syndicate_access, +/obj/machinery/airalarm/syndicate{ + dir = 1; + pixel_y = 20 + }, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) "rM" = ( @@ -641,7 +648,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) "yD" = ( -/mob/living/basic/syndicate/ranged/smg/space/stormtrooper, +/mob/living/basic/trooper/syndicate/ranged/smg/space/stormtrooper, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) "yJ" = ( @@ -692,7 +699,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/mob/living/basic/syndicate/ranged/smg/space/stormtrooper, +/mob/living/basic/trooper/syndicate/ranged/smg/space/stormtrooper, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) "Bm" = ( @@ -738,7 +745,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/mob/living/basic/syndicate/ranged/smg/pilot, +/mob/living/basic/trooper/syndicate/ranged/smg/pilot, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) "CR" = ( @@ -788,7 +795,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/powered/virtual_domain) "EX" = ( -/mob/living/basic/syndicate/ranged/shotgun/space/stormtrooper, +/mob/living/basic/trooper/syndicate/ranged/shotgun/space/stormtrooper, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) "Fp" = ( @@ -1077,7 +1084,7 @@ /turf/closed/mineral/random, /area/space) "QX" = ( -/mob/living/basic/syndicate/ranged/space/stormtrooper, +/mob/living/basic/trooper/syndicate/ranged/space/stormtrooper, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/virtual_domain) "Ra" = ( diff --git a/_maps/virtual_domains/vaporwave.dmm b/_maps/virtual_domains/vaporwave.dmm index 984bbbe29148..495ca28d9782 100644 --- a/_maps/virtual_domains/vaporwave.dmm +++ b/_maps/virtual_domains/vaporwave.dmm @@ -83,7 +83,9 @@ }, /area/ruin/space/has_grav/powered/virtual_domain) "ll" = ( -/obj/structure/sign/poster/contraband/clown/directional/north, +/obj/structure/sign/poster/contraband/clown{ + pixel_y = 34 + }, /turf/open/floor/iron/vaporwave, /area/ruin/space/has_grav/powered/virtual_domain) "lu" = ( @@ -168,7 +170,7 @@ }, /area/ruin/space/has_grav/powered/virtual_domain) "HA" = ( -/turf/open/floor/holofloor/beach/coast, +/turf/open/floor/holofloor/beach/coast_t, /area/ruin/space/has_grav/powered/virtual_domain) "HV" = ( /obj/structure/chair/comfy/black{ diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 34a165ccf6db..759ff992d075 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -80,24 +80,25 @@ #define SKINTONES 12 #define ANIME 13 #define MUTCOLORS_SECONDARY 14 +#define SPECIES_FUR 15 /// Use this if you want to change the race's color without the player being able to pick their own color. AKA special color shifting -#define DYNCOLORS 15 -#define AGENDER 16 +#define DYNCOLORS 16 +#define AGENDER 17 /// Do not draw eyes or eyeless overlay -#define NOEYESPRITES 17 +#define NOEYESPRITES 18 ///If we have a limb-specific overlay sprite -#define HAS_MARKINGS 18 +#define HAS_MARKINGS 19 /// Do not draw blood overlay -#define NOBLOODOVERLAY 19 +#define NOBLOODOVERLAY 20 ///No augments, for monkeys in specific because they will turn into fucking freakazoids https://cdn.discordapp.com/attachments/326831214667235328/791313258912153640/102707682-fa7cad80-4294-11eb-8f13-8c689468aeb0.png -#define NOAUGMENTS 20 +#define NOAUGMENTS 21 ///will be assigned a universal vampire themed last name shared by their department. this is preferenced! -#define BLOOD_CLANS 21 +#define BLOOD_CLANS 22 -#define REVIVESBYHEALING 22 -#define NOHUSK 23 -#define NOMOUTH 24 +#define REVIVESBYHEALING 23 +#define NOHUSK 24 +#define NOMOUTH 25 //organ slots #define ORGAN_SLOT_ADAMANTINE_RESONATOR "adamantine_resonator" @@ -139,6 +140,7 @@ #define ORGAN_SLOT_EXTERNAL_ANIME_HEAD "anime_head" #define ORGAN_SLOT_EXTERNAL_ANIME_CHEST "anime_chest" #define ORGAN_SLOT_EXTERNAL_ANIME_BOTTOM "anime_bottom" +#define ORGAN_SLOT_EXTERNAL_FLORAN_LEAVES "floran_leaves" /// Xenomorph organ slots #define ORGAN_SLOT_XENO_ACIDGLAND "acid_gland" diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index 13bda0bba916..c62272232938 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -6,6 +6,12 @@ #define ACHIEVEMENT_DEFAULT "default" #define ACHIEVEMENT_SCORE "score" +/// preferences for the sound played when unlocking an achievement +#define CHEEVO_SOUND_TADA "Tada Fanfare" +#define CHEEVO_SOUND_JINGLE "Beeps Jingle" +#define CHEEVO_SOUND_PING "Success Ping" +#define CHEEVO_SOUND_OFF "Disabled" + //Misc Medal hub IDs #define MEDAL_METEOR "Your Life Before Your Eyes" #define MEDAL_PULSE "Jackpot" @@ -46,6 +52,9 @@ #define MEDAL_NARSUPREME "Narsupreme" #define MEDAL_SPRINGLOCK "The Man Inside the Modsuit" #define MEDAL_HEALTHY "Heart Healthy" +#define MEDAL_DEBT_EXTINGUISHED "Debt Extinguished" +#define MEDAL_ARCHMAGE "Archmage" +#define MEDAL_THEORETICAL_LIMITS "All Within Theoretical Limits" //Skill medal hub IDs #define MEDAL_LEGENDARY_MINER "Legendary Miner" @@ -127,6 +136,9 @@ // DB ID for style point count #define STYLE_SCORE "Style Score" +/// DB ID for the amount of achievements unlocked by the player. +#define ACHIEVEMENTS_SCORE "Achievements Score" + // Tourist related achievements and scores //centcom grades (achievement) diff --git a/code/__DEFINES/ai/ai.dm b/code/__DEFINES/ai/ai.dm index 1a6829946a14..eee874a041c9 100644 --- a/code/__DEFINES/ai/ai.dm +++ b/code/__DEFINES/ai/ai.dm @@ -1,4 +1,5 @@ #define GET_AI_BEHAVIOR(behavior_type) SSai_behaviors.ai_behaviors[behavior_type] +#define GET_TARGETING_STRATEGY(targeting_type) SSai_behaviors.targeting_strategies[targeting_type] #define HAS_AI_CONTROLLER_TYPE(thing, type) istype(thing?.ai_controller, type) #define AI_STATUS_ON 1 @@ -29,7 +30,11 @@ /// Don't move if being pulled #define STOP_MOVING_WHEN_PULLED (1<<0) /// Continue processing even if dead -#define CAN_ACT_WHILE_DEAD (1<<1) +#define CAN_ACT_WHILE_DEAD (1<<1) +/// Stop processing while in a progress bar +#define PAUSE_DURING_DO_AFTER (1<<2) +/// Continue processing while in stasis +#define CAN_ACT_IN_STASIS (1<<3) //Base Subtree defines diff --git a/code/__DEFINES/ai/ai_blackboard.dm b/code/__DEFINES/ai/ai_blackboard.dm index fe8e9541bf33..1e7c0e892e8c 100644 --- a/code/__DEFINES/ai/ai_blackboard.dm +++ b/code/__DEFINES/ai/ai_blackboard.dm @@ -8,6 +8,27 @@ #define BB_FOOD_TARGET "bb_food_target" ///Path we should use next time we use the JPS movement datum #define BB_PATH_TO_USE "BB_path_to_use" +///How close a mob must be for us to select it as a target, if that is less than how far we can maintain it as a target +#define BB_AGGRO_RANGE "BB_aggro_range" +///are we hungry? determined by the udder compnent +#define BB_CHECK_HUNGRY "BB_check_hungry" +///are we ready to breed? +#define BB_BREED_READY "BB_breed_ready" +///maximum kids we can have +#define BB_MAX_CHILDREN "BB_max_children" + +/// Store a single or list of emotes at this key +#define BB_EMOTE_KEY "BB_emotes" +/// Chance to perform an emote per second +#define BB_EMOTE_CHANCE "BB_EMOTE_CHANCE" + +/// Something the mob will say when calling reinforcements +#define BB_REINFORCEMENTS_SAY "BB_reinforcements_say" +/// Something the mob will remote when calling reinforcements +#define BB_REINFORCEMENTS_EMOTE "BB_reinforcements_emote" + +///Turf we want a mob to move to +#define BB_TRAVEL_DESTINATION "BB_travel_destination" ///song instrument blackboard, set by instrument subtrees #define BB_SONG_INSTRUMENT "BB_SONG_INSTRUMENT" @@ -25,25 +46,39 @@ ///Basic Mob Keys -///Targetting subtrees +///Targeting subtrees #define BB_BASIC_MOB_CURRENT_TARGET "BB_basic_current_target" #define BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION "BB_basic_current_target_hiding_location" -#define BB_TARGETTING_DATUM "targetting_datum" +#define BB_TARGETING_STRATEGY "targeting_strategy" ///some behaviors that check current_target also set this on deep crit mobs #define BB_BASIC_MOB_EXECUTION_TARGET "BB_basic_execution_target" ///Blackboard key for a whitelist typecache of "things we can target while trying to move" -#define BB_OBSTACLE_TARGETTING_WHITELIST "BB_targetting_whitelist" - -/// Blackboard key storing how long your targetting datum has held a particular target +#define BB_OBSTACLE_TARGETING_WHITELIST "BB_targeting_whitelist" +/// Key for the minimum status at which we want to target mobs (does not need to be specified if CONSCIOUS) +#define BB_TARGET_MINIMUM_STAT "BB_target_minimum_stat" +/// Flag for whether to target only wounded mobs +#define BB_TARGET_WOUNDED_ONLY "BB_target_wounded_only" +/// What typepath the holding object targeting strategy should look for +#define BB_TARGET_HELD_ITEM "BB_target_held_item" + +/// Blackboard key storing how long your targeting strategy has held a particular target #define BB_BASIC_MOB_HAS_TARGET_TIME "BB_basic_mob_has_target_time" -///Targetting keys for something to run away from, if you need to store this separately from current target +///Targeting keys for something to run away from, if you need to store this separately from current target #define BB_BASIC_MOB_FLEE_TARGET "BB_basic_flee_target" #define BB_BASIC_MOB_FLEE_TARGET_HIDING_LOCATION "BB_basic_flee_target_hiding_location" -#define BB_FLEE_TARGETTING_DATUM "flee_targetting_datum" +#define BB_FLEE_TARGETING_STRATEGY "flee_targeting_strategy" +#define BB_BASIC_MOB_FLEE_DISTANCE "BB_basic_flee_distance" +#define DEFAULT_BASIC_FLEE_DISTANCE 9 + +/// Generic key for a non-specific targeted action +#define BB_TARGETED_ACTION "BB_targeted_action" -/// Generic key for a non-specific targetted action -#define BB_TARGETTED_ACTION "BB_targetted_action" +/// Generic key for a non-specific action +#define BB_GENERIC_ACTION "BB_generic_action" + +/// Generic key for a shapeshifting action +#define BB_SHAPESHIFT_ACTION "BB_shapeshift_action" ///How long have we spent with no target? #define BB_TARGETLESS_TIME "BB_targetless_time" @@ -68,8 +103,13 @@ ///List of mobs who have damaged us #define BB_BASIC_MOB_RETALIATE_LIST "BB_basic_mob_shitlist" -/// Flag to set on or off if you want your mob to prioritise running away -#define BB_BASIC_MOB_FLEEING "BB_basic_fleeing" +/// Chance to randomly acquire a new target +#define BB_RANDOM_AGGRO_CHANCE "BB_random_aggro_chance" +/// Chance to randomly drop all of our targets +#define BB_RANDOM_DEAGGRO_CHANCE "BB_random_deaggro_chance" + +/// Flag to set on if you want your mob to STOP running away +#define BB_BASIC_MOB_STOP_FLEEING "BB_basic_stop_fleeing" ///list of foods this mob likes #define BB_BASIC_FOODS "BB_basic_foods" @@ -85,3 +125,20 @@ #define MOD_AI_RANGE 200 #define BB_GROUP_DATUM "BB_group_datum" +///should we skip the faction check for the targeting strategy? +#define BB_ALWAYS_IGNORE_FACTION "BB_always_ignore_factions" +///are we in some kind of temporary state of ignoring factions when targeting? can result in volatile results if multiple behaviours touch this +#define BB_TEMPORARILY_IGNORE_FACTION "BB_temporarily_ignore_factions" + +///currently only used by clowns, a list of what can the mob speak randomly +#define BB_BASIC_MOB_SPEAK_LINES "BB_speech_lines" +#define BB_EMOTE_SAY "emote_say" +#define BB_EMOTE_HEAR "emote_hear" +#define BB_EMOTE_SEE "emote_see" +#define BB_EMOTE_SOUND "emote_sound" +#define BB_SPEAK_CHANCE "emote_chance" + +/// A target that has called this mob for reinforcements +#define BB_BASIC_MOB_REINFORCEMENT_TARGET "BB_basic_mob_reinforcement_target" +/// The next time at which this mob can call for reinforcements +#define BB_BASIC_MOB_REINFORCEMENTS_COOLDOWN "BB_basic_mob_reinforcements_cooldown" diff --git a/code/__DEFINES/ai/carp.dm b/code/__DEFINES/ai/carp.dm index 8286f3262077..459b98ffb020 100644 --- a/code/__DEFINES/ai/carp.dm +++ b/code/__DEFINES/ai/carp.dm @@ -7,9 +7,9 @@ /// Current target turf in your migration #define BB_CARP_MIGRATION_TARGET "BB_carp_migration_target" -/// Targetting keys for magicarp spells +/// Targeting keys for magicarp spells #define BB_MAGICARP_SPELL_TARGET "BB_magicarp_spell_target" -#define BB_MAGICARP_SPELL_SPECIAL_TARGETTING "BB_magicarp_spell_special_targetting" +#define BB_MAGICARP_SPELL_SPECIAL_TARGETING "BB_magicarp_spell_special_targeting" #define MAGICARP_SPELL_CORPSES "magicarp_spell_corpses" #define MAGICARP_SPELL_WALLS "magicarp_spell_walls" #define MAGICARP_SPELL_OBJECTS "magicarp_spell_objects" diff --git a/code/__DEFINES/ai/monsters.dm b/code/__DEFINES/ai/monsters.dm index 4915ff9cbc86..2b2a55ebe0f8 100644 --- a/code/__DEFINES/ai/monsters.dm +++ b/code/__DEFINES/ai/monsters.dm @@ -119,3 +119,106 @@ #define BB_ORE_TARGET "BB_ore_target" /// which ore types we will not eat #define BB_ORE_IGNORE_TYPES "BB_ore_ignore_types" + +// minebot keys +/// key that stores our toggle light ability +#define BB_MINEBOT_LIGHT_ABILITY "minebot_light_ability" +/// key that stores our dump ore ability +#define BB_MINEBOT_DUMP_ABILITY "minebot_dump_ability" +/// key that stores our target turf +#define BB_TARGET_MINERAL_TURF "target_mineral_turf" +/// key that stores list of the turfs we ignore +#define BB_BLACKLIST_MINERAL_TURFS "blacklist_mineral_turfs" +/// key that stores the previous blocked wall +#define BB_PREVIOUS_UNREACHABLE_WALL "previous_unreachable_wall" +/// key that stores our mining mode +#define BB_AUTOMATED_MINING "automated_mining" +/// key that stores the nearest dead human +#define BB_NEARBY_DEAD_MINER "nearby_dead_miner" + +//seedling keys +/// the water can we will pick up +#define BB_WATERCAN_TARGET "watercan_target" +/// the hydrotray we will heal +#define BB_HYDROPLANT_TARGET "hydroplant_target" +/// minimum weed levels for us to cure +#define BB_WEEDLEVEL_THRESHOLD "weedlevel_threshold" +/// minimum water levels for us to refill +#define BB_WATERLEVEL_THRESHOLD "waterlevel_threshold" +/// key holds our solarbeam ability +#define BB_SOLARBEAM_ABILITY "solarbeam_ability" +/// key holds our rapid seeds ability +#define BB_RAPIDSEEDS_ABILITY "rapidseeds_ability" +/// key holds the tray we will beam +#define BB_BEAMABLE_HYDROPLANT_TARGET "beamable_hydroplant_target" + +//ice demons +///the list of items we are afraid of +#define BB_LIST_SCARY_ITEMS "list_scary_items" +///our teleportation ability +#define BB_DEMON_TELEPORT_ABILITY "demon_teleport_ability" +///the destination of our teleport ability +#define BB_TELEPORT_DESTINATION "teleport_destination" +///the ability to clone ourself +#define BB_DEMON_CLONE_ABILITY "demon_clone_ability" +///our slippery ice ability +#define BB_DEMON_SLIP_ABILITY "demon_slip_ability" +///the turf we are escaping to +#define BB_ESCAPE_DESTINATION "escape_destination" + +/// Corpse we have consumed +#define BB_LEGION_CORPSE "legion_corpse" +/// Things our target recently said +#define BB_LEGION_RECENT_LINES "legion_recent_lines" +/// The creator of our legion skull +#define BB_LEGION_BROOD_CREATOR "legion_brood_creator" + +//mook keys +/// our home landmark +#define BB_HOME_VILLAGE "home_village" +/// maximum distance we can be from home during a storm +#define BB_MAXIMUM_DISTANCE_TO_VILLAGE "maximum_distance_to_village" +/// stand where we deposit our ores +#define BB_MATERIAL_STAND_TARGET "material_stand_target" +/// our jump ability +#define BB_MOOK_JUMP_ABILITY "mook_jump_ability" +/// our leap ability +#define BB_MOOK_LEAP_ABILITY "mook_leap_ability" +/// the chief we must obey +#define BB_MOOK_TRIBAL_CHIEF "mook_tribal_chief" +/// the injured mook we must heal +#define BB_INJURED_MOOK "injured_mook" +/// the player we will follow and play music for +#define BB_MOOK_MUSIC_AUDIENCE "music_audience" +/// the bonfire we will light up +#define BB_MOOK_BONFIRE_TARGET "bonfire_target" + +//gutlunch keys +///the trough we will eat from +#define BB_TROUGH_TARGET "trough_target" +//leaper keys +///key holds our volley ability +#define BB_LEAPER_VOLLEY "leaper_volley" +///key holds our flop ability +#define BB_LEAPER_FLOP "leaper_flop" +///key holds our bubble ability +#define BB_LEAPER_BUBBLE "leaper_bubble" +///key holds our summon ability +#define BB_LEAPER_SUMMON "leaper_summon" +///key holds the world timer for swimming +#define BB_KEY_SWIM_TIME "key_swim_time" +///key holds the water or land target turf +#define BB_SWIM_ALTERNATE_TURF "swim_alternate_turf" +///key holds our state of swimming +#define BB_CURRENTLY_SWIMMING "currently_swimming" +///key holds how long we will be swimming for +#define BB_KEY_SWIMMER_COOLDOWN "key_swimmer_cooldown" +//Wizard AI keys +/// Key where we store our main targeted spell +#define BB_WIZARD_TARGETED_SPELL "BB_wizard_targeted_spell" +/// Key where we store our secondary, untargeted spell +#define BB_WIZARD_SECONDARY_SPELL "BB_wizard_secondary_spell" +/// Key where we store our blink spell +#define BB_WIZARD_BLINK_SPELL "BB_wizard_blink_spell" +/// Key for the next time we can cast a spell +#define BB_WIZARD_SPELL_COOLDOWN "BB_wizard_spell_cooldown" diff --git a/code/__DEFINES/ai/pet_commands.dm b/code/__DEFINES/ai/pet_commands.dm index 5894aedff14d..1e692b9f805a 100644 --- a/code/__DEFINES/ai/pet_commands.dm +++ b/code/__DEFINES/ai/pet_commands.dm @@ -4,6 +4,6 @@ /// Blackboard field for what we actually want the pet to target #define BB_CURRENT_PET_TARGET "BB_current_pet_target" /// Blackboard field for how we target things, as usually we want to be more permissive than normal -#define BB_PET_TARGETTING_DATUM "BB_pet_targetting" +#define BB_PET_TARGETING_STRATEGY "BB_pet_targeting" /// Typecache of weakrefs to mobs this mob is friends with, will follow their instructions and won't attack them #define BB_FRIENDS_LIST "BB_friends_list" diff --git a/code/__DEFINES/ai/pets.dm b/code/__DEFINES/ai/pets.dm index b3ad67ecc068..e41c9ac0c3ff 100644 --- a/code/__DEFINES/ai/pets.dm +++ b/code/__DEFINES/ai/pets.dm @@ -27,3 +27,27 @@ #define BB_FIND_MOM_TYPES "BB_find_mom_types" ///list of types of mobs we must ignore #define BB_IGNORE_MOM_TYPES "BB_ignore_mom_types" + +/// The current string that this parrot will repeat back to someone +#define BB_PARROT_REPEAT_STRING "BB_parrot_repeat_string" +/// The odds that this parrot will repeat back a string +#define BB_PARROT_REPEAT_PROBABILITY "BB_parrot_repeat_probability" +/// The odds that this parrot will choose another string to repeat +#define BB_PARROT_PHRASE_CHANGE_PROBABILITY "BB_parrot_phrase_change_probability" +/// A copy of the string buffer that we end the shift with. DO NOT ACCESS THIS DIRECTLY - YOU SHOULD USE THE COMPONENT IN MOST CASES +#define BB_EXPORTABLE_STRING_BUFFER_LIST "BB_parrot_repeat_string_buffer" +/// The types of perches we desire to use +#define BB_PARROT_PERCH_TYPES "BB_parrot_perch_types" +/// key that holds our perch target +#define BB_PERCH_TARGET "perch_target" +/// key that holds our theft item target +#define BB_HOARD_ITEM_TARGET "hoard_item_target" +/// key that holds the mob we will steal from +#define BB_THEFT_VICTIM "theft_victim" +/// key that holds the turf we will be hauling stolen items to +#define BB_HOARD_LOCATION "hoard_location" +/// key that holds the minimum range we must be from the hoard spot +#define BB_HOARD_LOCATION_RANGE "hoard_location_range" +/// key that holds items we arent interested in hoarding +#define BB_IGNORE_ITEMS "ignore_items" + diff --git a/code/__DEFINES/ai/trader.dm b/code/__DEFINES/ai/trader.dm new file mode 100644 index 000000000000..853dd8736b64 --- /dev/null +++ b/code/__DEFINES/ai/trader.dm @@ -0,0 +1,6 @@ +///The ability to setup our "shop" +#define BB_SETUP_SHOP "BB_setup_shop" +///Reference to the plastic chair that is considered as our shop +#define BB_SHOP_SPOT "BB_shop_spot" +///Reference to our first customer to harass with deals +#define BB_FIRST_CUSTOMER "BB_first_customer" diff --git a/code/__DEFINES/ai/ventcrawling.dm b/code/__DEFINES/ai/ventcrawling.dm index f981ef3bba5d..a60b7fd59401 100644 --- a/code/__DEFINES/ai/ventcrawling.dm +++ b/code/__DEFINES/ai/ventcrawling.dm @@ -3,7 +3,7 @@ /// Key that holds a vent that we want to exit out of (when we're already in a pipenet) #define BB_EXIT_VENT_TARGET "BB_exit_vent_target" /// Do we plan on going inside a vent? Boolean. -#define BB_CURRENTLY_TARGETTING_VENT "BB_currently_targetting_vent" +#define BB_CURRENTLY_TARGETING_VENT "BB_currently_targeting_vent" /// How long should we wait before we try and enter a vent again? #define BB_VENTCRAWL_COOLDOWN "BB_ventcrawl_cooldown" /// The least amount of time (in seconds) we take to go through the vents. diff --git a/code/__DEFINES/basic_mobs.dm b/code/__DEFINES/basic_mobs.dm index 5a4aebaee23e..6c8a3022e8fa 100644 --- a/code/__DEFINES/basic_mobs.dm +++ b/code/__DEFINES/basic_mobs.dm @@ -19,3 +19,10 @@ /// Above this speed we stop gliding because it looks silly #define END_GLIDE_SPEED 10 + +///mook attack status flags +#define MOOK_ATTACK_NEUTRAL 0 +#define MOOK_ATTACK_WARMUP 1 +#define MOOK_ATTACK_ACTIVE 2 +#define MOOK_ATTACK_STRIKE 3 + diff --git a/code/__DEFINES/blob_defines.dm b/code/__DEFINES/blob_defines.dm index 6a6e9d5c75c8..81edf9a02085 100644 --- a/code/__DEFINES/blob_defines.dm +++ b/code/__DEFINES/blob_defines.dm @@ -32,7 +32,6 @@ #define BLOB_CORE_EXPAND_RANGE 3 // Radius of automatic expansion #define BLOB_CORE_STRONG_REINFORCE_RANGE 1 // The radius of tiles surrounding the core that get upgraded #define BLOB_CORE_REFLECTOR_REINFORCE_RANGE 0 -#define BLOB_CORE_MAX_SPORES 0 // Spores that the core can produce for free #define BLOB_NODE_MAX_HP 200 #define BLOB_NODE_HP_REGEN 3 @@ -42,7 +41,6 @@ #define BLOB_NODE_EXPAND_RANGE 2 // Radius of automatic expansion #define BLOB_NODE_STRONG_REINFORCE_RANGE 0 // The radius of tiles surrounding the node that get upgraded #define BLOB_NODE_REFLECTOR_REINFORCE_RANGE 0 -#define BLOB_NODE_MAX_SPORES 0 // Spores that nodes can maintain #define BLOB_FACTORY_MAX_HP 200 #define BLOB_FACTORY_HP_REGEN 1 diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 11828510f341..deb84d0f0b0f 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -45,6 +45,7 @@ #define COLOR_SOFT_RED "#FA8282" #define COLOR_CULT_RED "#960000" #define COLOR_BUBBLEGUM_RED "#950A0A" +#define COLOR_CARP_RIFT_RED "#ff330030" #define COLOR_YELLOW "#FFFF00" #define COLOR_VIVID_YELLOW "#FBFF23" diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 03b8514e0cf1..f28dc8ec7dc6 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -270,6 +270,8 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define BODY_ZONE_L_LEG "l_leg" #define BODY_ZONE_R_LEG "r_leg" +GLOBAL_LIST_INIT(arm_zones, list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + #define BODY_ZONE_PRECISE_EYES "eyes" #define BODY_ZONE_PRECISE_MOUTH "mouth" #define BODY_ZONE_PRECISE_GROIN "groin" @@ -335,6 +337,8 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define ARMOR_WEAKENED_MULTIPLIER 2 /// Armor can't block more than this as a percentage #define ARMOR_MAX_BLOCK 90 +/// Calculates the new armour value after armour penetration. Can return negative values, and those must be caught. +#define PENETRATE_ARMOUR(armour, penetration) (penetration == 100 ? 0 : 100 * (armour - penetration) / (100 - penetration)) /// Return values used in item/melee/baton/baton_attack. /// Does a normal item attack. diff --git a/code/__DEFINES/computers.dm b/code/__DEFINES/computers.dm index ba3294ae6833..86bd44d30201 100644 --- a/code/__DEFINES/computers.dm +++ b/code/__DEFINES/computers.dm @@ -11,3 +11,5 @@ #define CATEGORY_BEPIS "Bepis Tech" #define CATEGORY_BITRUNNING_FLAIR "Misc" #define CATEGORY_BITRUNNING_TECH "Tech" +#define CATEGORY_BITRUNNING_COMBAT_GEAR "Combat gear" // monkeystation addition: bitrunning tech split up +#define CATEGORY_BITRUNNING_ABILITIES "Abilities" // monkeystation addition: bitrunning tech split up diff --git a/code/__DEFINES/crushing.dm b/code/__DEFINES/crushing.dm new file mode 100644 index 000000000000..1261b98e730e --- /dev/null +++ b/code/__DEFINES/crushing.dm @@ -0,0 +1,15 @@ +// from _vending.dm + +/// Set if the tipped object successfully crushed a subtype of /mob/living. +#define SUCCESSFULLY_CRUSHED_MOB (1<<0) +/// Set if the tipped object successfully crushed a subtype of /atom. +#define SUCCESSFULLY_CRUSHED_ATOM (1<<1) +/// Set if the tipped object successfully actually fell over, which can fail if it couldn't enter the turf it tried to fall into. +#define SUCCESSFULLY_FELL_OVER (1<<2) + +#define CRUSH_CRIT_SHATTER_LEGS "crush_crit_shatter_legs" +#define CRUSH_CRIT_PARAPALEGIC "crush_crit_parapalegic" +#define CRUSH_CRIT_SQUISH_LIMB "crush_crit_pin" +#define CRUSH_CRIT_HEADGIB "crush_crit_headgib" +#define VENDOR_CRUSH_CRIT_PIN "vendor_crush_crit_pin" +#define VENDOR_CRUSH_CRIT_GLASSCANDY "vendor_crush_crit_glasscandy" diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm index 3f3db0212b6d..fb93e3a337a0 100644 --- a/code/__DEFINES/dcs/flags.dm +++ b/code/__DEFINES/dcs/flags.dm @@ -1,4 +1,4 @@ -/// Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type. +/// Return this from `/datum/component/Initialize` or `/datum/component/OnTransfer` or `/datum/component/on_source_add` to have the component be deleted if it's applied to an incorrect type. /// `parent` must not be modified if this is to be returned. /// This will be noted in the runtime logs #define COMPONENT_INCOMPATIBLE 1 @@ -33,8 +33,8 @@ /** * Component uses source tracking to manage adding and removal logic. * Add a source/spawn to/the component by using AddComponentFrom(source, component_type, args...) - * Only the first args will be respected, and you should instead handle most of your logic in the on_source_added proc. * Removing the last source will automatically remove the component from the parent. + * Arguments will be passed to on_source_add(source, args...); ensure that Initialize and on_source_add have the same signature. */ #define COMPONENT_DUPE_SOURCES 3 /// old component is given the initialization args of the new 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 5191d7e8c68d..55a19a4347ad 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm @@ -52,7 +52,15 @@ #define COMSIG_ATOM_ATTACK_ROBOT_SECONDARY "atom_attack_robot_secondary" ///from relay_attackers element: (atom/attacker, attack_flags) #define COMSIG_ATOM_WAS_ATTACKED "atom_was_attacked" +///Called before a atom gets something tilted on them. If [COMPONENT_IMMUNE_TO_TILT_AND_CRUSH] is returned in a signal, the atom will be unaffected. +#define COMSIG_PRE_TILT_AND_CRUSH "atom_pre_tilt_and_crush" + #define COMPONENT_IMMUNE_TO_TILT_AND_CRUSH (1<<0) +///Called when a atom gets something tilted on them +#define COMSIG_POST_TILT_AND_CRUSH "atom_post_tilt_and_crush" + ///The damage type of the weapon projectile is non-lethal stamina #define ATTACKER_STAMINA_ATTACK (1<<0) ///the attacker is shoving the source #define ATTACKER_SHOVING (1<<1) + /// The attack is a damaging-type attack + #define ATTACKER_DAMAGING_ATTACK (1<<2) 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 dc4d5a25ea0c..5e6f50a1d654 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm @@ -47,13 +47,17 @@ #define COMSIG_MOVABLE_THROW_LANDED "movable_throw_landed" ///from base of atom/movable/on_changed_z_level(): (turf/old_turf, turf/new_turf, same_z_layer) #define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" +///called before hearing a message from atom/movable/Hear(): +#define COMSIG_MOVABLE_PRE_HEAR "movable_pre_hear" + ///cancel hearing the message because we're doing something else presumably + #define COMSIG_MOVABLE_CANCEL_HEARING (1<<0) ///from base of atom/movable/Hear(): (proc args list(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range)) #define COMSIG_MOVABLE_HEAR "movable_hear" - //#define HEARING_MESSAGE 1 - (I'm pretty sure this is never really used and can be gutted) + #define HEARING_MESSAGE 1 #define HEARING_SPEAKER 2 #define HEARING_LANGUAGE 3 #define HEARING_RAW_MESSAGE 4 - //#define HEARING_RADIO_FREQ 5 + #define HEARING_RADIO_FREQ 5 #define HEARING_SPANS 6 #define HEARING_MESSAGE_MODE 7 #define HEARING_RANGE 8 diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm index a4f19e29979b..d21e6b286ec4 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm @@ -15,6 +15,9 @@ #define COMSIG_ATOM_ON_Z_IMPACT "movable_on_z_impact" ///called on a movable (NOT living) when it starts pulling (atom/movable/pulled, state, force) #define COMSIG_ATOM_START_PULL "movable_start_pull" +/// called on /atom when something attempts to pass through it (atom/movable/source, atom/movable/passing, dir) +#define COMSIG_ATOM_TRIED_PASS "atom_tried_pass" + #define COMSIG_COMPONENT_PERMIT_PASSAGE (1 << 0) ///called on /living when someone starts pulling (atom/movable/pulled, state, force) #define COMSIG_LIVING_START_PULL "living_start_pull" ///called on /living when someone is pulled (mob/living/puller) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm index 23e91ad86b23..a40436e77365 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_x_act.dm @@ -2,6 +2,10 @@ // When the signal is called: (signal arguments) // All signals send the source datum of the signal as the first argument +///from the [EX_ACT] wrapper macro: (severity, target) +#define COMSIG_ATOM_PRE_EX_ACT "atom_pre_ex_act" + /// if returned, don't let the explosion act on this atom + #define COMPONENT_CANCEL_EX_ACT (1<<0) ///from the [EX_ACT] wrapper macro: (severity, target) #define COMSIG_ATOM_EX_ACT "atom_ex_act" ///from base of atom/emp_act(): (severity) @@ -9,6 +13,14 @@ ///from base of atom/fire_act(): (exposed_temperature, exposed_volume) #define COMSIG_ATOM_FIRE_ACT "atom_fire_act" ///from base of atom/bullet_act(): (/obj/projectile, def_zone) +#define COMSIG_ATOM_PRE_BULLET_ACT "pre_atom_bullet_act" + /// All this does is prevent default bullet on_hit from being called, [BULLET_ACT_HIT] being return is implied + #define COMPONENT_BULLET_ACTED (1<<0) + /// Forces bullet act to return [BULLET_ACT_BLOCK], takes priority over above + #define COMPONENT_BULLET_BLOCKED (1<<1) + /// Forces bullet act to return [BULLET_ACT_FORCE_PIERCE], takes priority over above + #define COMPONENT_BULLET_PIERCED (1<<2) +///from base of atom/bullet_act(): (/obj/projectile, def_zone) #define COMSIG_ATOM_BULLET_ACT "atom_bullet_act" ///from base of atom/CheckParts(): (list/parts_list, datum/crafting_recipe/R) #define COMSIG_ATOM_CHECKPARTS "atom_checkparts" diff --git a/code/__DEFINES/dcs/signals/signals_bitrunning.dm b/code/__DEFINES/dcs/signals/signals_bitrunning.dm index 3d008449ee7b..957e61ae303c 100644 --- a/code/__DEFINES/dcs/signals/signals_bitrunning.dm +++ b/code/__DEFINES/dcs/signals/signals_bitrunning.dm @@ -29,3 +29,6 @@ /// from /obj/machinery/quantum_server/refreshParts(): (servo rating) #define COMSIG_BITRUNNER_SERVER_UPGRADED "bitrunner_server_upgraded" + +/// from /obj/machinery/quantum_server/scrub_vdom() +#define COMSIG_BITRUNNER_DOMAIN_SCRUBBED "bitrunner_domain_scrubbed" diff --git a/code/__DEFINES/dcs/signals/signals_blob.dm b/code/__DEFINES/dcs/signals/signals_blob.dm new file mode 100644 index 000000000000..afd4737bdd96 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_blob.dm @@ -0,0 +1,4 @@ +/// Signal sent when a blob overmind picked a new strain (/mob/camera/blob/overmind, /datum/blobstrain/new_strain) +#define COMSIG_BLOB_SELECTED_STRAIN "blob_selected_strain" +/// Signal sent by a blob spore when it creates a zombie (/mob/living/basic/blob_minion/spore/spore, //mob/living/basic/blob_minion/zombie/zombie) +#define COMSIG_BLOB_ZOMBIFIED "blob_zombified" diff --git a/code/__DEFINES/dcs/signals/signals_datum.dm b/code/__DEFINES/dcs/signals/signals_datum.dm index 98750ef5e7b3..847a07bf6f6f 100644 --- a/code/__DEFINES/dcs/signals/signals_datum.dm +++ b/code/__DEFINES/dcs/signals/signals_datum.dm @@ -51,3 +51,6 @@ #define COMSIG_MODULAR_COMPUTER_FILE_DELETING "comsig_modular_computer_file_deleting" /// From /obj/item/modular_computer/proc/store_file: () #define COMSIG_MODULAR_COMPUTER_FILE_DELETED "comsig_modular_computer_file_deleted" + +///from /datum/bank_account/pay_debt(), after a portion or all the debt has been paid. +#define COMSIG_BANK_ACCOUNT_DEBT_PAID "bank_account_debt_paid" diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index 5d78f2b63836..b1cafb083c0a 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -51,6 +51,8 @@ #define LINKED_UP (1<<0) /// an obj/item is created! (obj/item/created_item) #define COMSIG_GLOB_NEW_ITEM "!new_item" +/// called post /obj/item initialize (obj/item/created_item) +#define COMSIG_GLOB_ATOM_AFTER_POST_INIT "!atom_after_post_init" /// an obj/machinery is created! (obj/machinery/created_machine) #define COMSIG_GLOB_NEW_MACHINE "!new_machine" /// a client (re)connected, after all /client/New() checks have passed : (client/connected_client) diff --git a/code/__DEFINES/dcs/signals/signals_leash.dm b/code/__DEFINES/dcs/signals/signals_leash.dm new file mode 100644 index 000000000000..4f83d7909034 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_leash.dm @@ -0,0 +1,11 @@ +/// Called when a /datum/component/leash must forcibly teleport the parent to the owner. +/// Fired on the object with the leash component. +#define COMSIG_LEASH_FORCE_TELEPORT "leash_force_teleport" + +/// Called when a /datum/component/leash plans on pathfinding to the target, if out of range. +/// Fired on the object with the leash component. +#define COMSIG_LEASH_PATH_STARTED "leash_path_started" + +/// Called when a /datum/component/leash finishes its pathfinding to the target. +/// Fired on the object with the leash component. +#define COMSIG_LEASH_PATH_COMPLETE "leash_path_complete" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm index 85630c8e8f04..a04b8e751a0c 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_ai.dm @@ -3,3 +3,4 @@ /// Signal sent when a blackboard key is cleared #define COMSIG_AI_BLACKBOARD_KEY_CLEARED(blackboard_key) "ai_blackboard_key_clear_[blackboard_key]" + diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm index 18c6c651435b..8420a4864172 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm @@ -5,3 +5,10 @@ ///from the ranged_attacks component for basic mobs: (mob/living/basic/firer, atom/target, modifiers) #define COMSIG_BASICMOB_POST_ATTACK_RANGED "basicmob_post_attack_ranged" + +/// Sent from /datum/ai_planning_subtree/parrot_as_in_repeat() : () +#define COMSIG_NEEDS_NEW_PHRASE "parrot_needs_new_phrase" + #define NO_NEW_PHRASE_AVAILABLE (1<<0) //! Cancel to try again later for when we actually get a new phrase + +/// Called whenever an animal is pet via the /datum/element/pet_bonus element: (mob/living/petter, modifiers) +#define COMSIG_ANIMAL_PET "animal_pet" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm index adae4324d59e..42934c3c7fa9 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm @@ -22,11 +22,11 @@ ///When a carbon slips. Called on /turf/open/handle_slip() #define COMSIG_ON_CARBON_SLIP "carbon_slip" -///When a carbon gets a vending machine tilted on them -#define COMSIG_ON_VENDOR_CRUSH "carbon_vendor_crush" // /mob/living/carbon physiology signals #define COMSIG_CARBON_GAIN_WOUND "carbon_gain_wound" //from /datum/wound/proc/apply_wound() (/mob/living/carbon/C, /datum/wound/W, /obj/item/bodypart/L) #define COMSIG_CARBON_LOSE_WOUND "carbon_lose_wound" //from /datum/wound/proc/remove_wound() (/mob/living/carbon/C, /datum/wound/W, /obj/item/bodypart/L) +/// Called after limb AND victim has been unset +#define COMSIG_CARBON_POST_LOSE_WOUND "carbon_post_lose_wound" //from /datum/wound/proc/remove_wound() (/datum/wound/lost_wound, /obj/item/bodypart/part, ignore_limb, replaced) ///from base of /obj/item/bodypart/proc/can_attach_limb(): (new_limb, special) allows you to fail limb attachment #define COMSIG_ATTEMPT_CARBON_ATTACH_LIMB "attempt_carbon_attach_limb" #define COMPONENT_NO_ATTACH (1<<0) @@ -36,6 +36,14 @@ #define COMSIG_CARBON_POST_ATTACH_LIMB "carbon_post_attach_limb" #define COMSIG_BODYPART_GAUZED "bodypart_gauzed" // from /obj/item/bodypart/proc/apply_gauze(/obj/item/stack/gauze) #define COMSIG_BODYPART_GAUZE_DESTROYED "bodypart_degauzed" // from [/obj/item/bodypart/proc/seep_gauze] when it runs out of absorption +///from /obj/item/bodypart/proc/receive_damage, sent from the limb owner (limb, brute, burn) +#define COMSIG_CARBON_LIMB_DAMAGED "carbon_limb_damaged" + #define COMPONENT_PREVENT_LIMB_DAMAGE (1 << 0) +/// from /obj/item/stack/medical/gauze/Destroy(): (/obj/item/stack/medical/gauze/removed_gauze) +#define COMSIG_BODYPART_UNGAUZED "bodypart_ungauzed" + +/// Called from bodypart changing owner, which could be on attach or detachment. Either argument can be null. (mob/living/carbon/new_owner, mob/living/carbon/old_owner) +#define COMSIG_BODYPART_CHANGED_OWNER "bodypart_changed_owner" /// Called from update_health_hud, whenever a bodypart is being updated on the health doll #define COMSIG_BODYPART_UPDATING_HEALTH_HUD "bodypart_updating_health_hud" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_guardian.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_guardian.dm new file mode 100644 index 000000000000..9f4819de7974 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_guardian.dm @@ -0,0 +1,7 @@ +/// Sent when a guardian is manifested +#define COMSIG_GUARDIAN_MANIFESTED "guardian_manifested" +/// Sent when a guardian is recalled +#define COMSIG_GUARDIAN_RECALLED "guardian_recalled" + +/// Sent when an assassin guardian is forced to exit stealth +#define COMSIG_GUARDIAN_ASSASSIN_REVEALED "guardian_assassin_revealed" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index 63fd640d77f9..2466f770827e 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -40,12 +40,50 @@ #define COMSIG_LIVING_TRY_SYRINGE "living_try_syringe" ///From living/Life(). (deltatime, times_fired) #define COMSIG_LIVING_LIFE "living_life" + /// Block the Life() proc from proceeding... this should really only be done in some really wacky situations. + #define COMPONENT_LIVING_CANCEL_LIFE_PROCESSING (1<<0) ///From living/set_resting(): (new_resting, silent, instant) #define COMSIG_LIVING_RESTING "living_resting" ///from base of element/bane/activate(): (item/weapon, mob/user) #define COMSIG_LIVING_BANED "living_baned" +///from base of element/bane/activate(): (item/weapon, mob/user) +#define COMSIG_OBJECT_PRE_BANING "obj_pre_baning" + #define COMPONENT_CANCEL_BANING (1<<0) + +///from base of element/bane/activate(): (item/weapon, mob/user) +#define COMSIG_OBJECT_ON_BANING "obj_on_baning" + +// adjust_x_loss messages sent from /mob/living/proc/adjust[x]Loss +/// Returned from all the following messages if you actually aren't going to apply any change +#define COMPONENT_IGNORE_CHANGE (1<<0) +// Each of these messages sends the damagetype even though it is inferred by the signal so you can pass all of them to the same proc if required +/// Send when bruteloss is modified (type, amount, forced) +#define COMSIG_LIVING_ADJUST_BRUTE_DAMAGE "living_adjust_brute_damage" +/// Send when fireloss is modified (type, amount, forced) +#define COMSIG_LIVING_ADJUST_BURN_DAMAGE "living_adjust_burn_damage" +/// Send when oxyloss is modified (type, amount, forced) +#define COMSIG_LIVING_ADJUST_OXY_DAMAGE "living_adjust_oxy_damage" +/// Send when toxloss is modified (type, amount, forced) +#define COMSIG_LIVING_ADJUST_TOX_DAMAGE "living_adjust_tox_damage" +/// Send when cloneloss is modified (type, amount, forced) +#define COMSIG_LIVING_ADJUST_CLONE_DAMAGE "living_adjust_clone_damage" +/// Send when staminaloss is modified (type, amount, forced) +#define COMSIG_LIVING_ADJUST_STAMINA_DAMAGE "living_adjust_stamina_damage" + +/// List of signals sent when you receive any damage except stamina +#define COMSIG_LIVING_ADJUST_STANDARD_DAMAGE_TYPES list(\ + COMSIG_LIVING_ADJUST_BRUTE_DAMAGE,\ + COMSIG_LIVING_ADJUST_BURN_DAMAGE,\ + COMSIG_LIVING_ADJUST_CLONE_DAMAGE,\ + COMSIG_LIVING_ADJUST_OXY_DAMAGE,\ + COMSIG_LIVING_ADJUST_TOX_DAMAGE,\ +) +/// List of signals sent when you receive any kind of damage at all +#define COMSIG_LIVING_ADJUST_ALL_DAMAGE_TYPES (COMSIG_LIVING_ADJUST_STANDARD_DAMAGE_TYPES + COMSIG_LIVING_ADJUST_STAMINA_DAMAGE) + + /// from base of mob/living/updatehealth() #define COMSIG_LIVING_HEALTH_UPDATE "living_health_update" ///from base of mob/living/death(): (gibbed) @@ -97,6 +135,10 @@ #define COMSIG_LIVING_UNARMED_ATTACK "living_unarmed_attack" ///From base of mob/living/MobBump() (mob/living) #define COMSIG_LIVING_MOB_BUMP "living_mob_bump" +///From base of mob/living/Bump() (turf/closed) +#define COMSIG_LIVING_WALL_BUMP "living_wall_bump" +///From base of turf/closed/Exited() (turf/closed) +#define COMSIG_LIVING_WALL_EXITED "living_wall_exited" ///From base of mob/living/ZImpactDamage() (mob/living, levels, turf/t) #define COMSIG_LIVING_Z_IMPACT "living_z_impact" #define NO_Z_IMPACT_DAMAGE (1<<0) @@ -168,3 +210,10 @@ /// From /datum/ai/behavior/climb_tree/perform() : (mob/living/basic/living_pawn) #define COMSIG_LIVING_CLIMB_TREE "living_climb_tree" + +/// Sent on a mob from /datum/component/mob_chain when component is attached with it as the "front" : (mob/living/basic/tail) +#define COMSIG_MOB_GAINED_CHAIN_TAIL "living_gained_chain_tail" +/// Sent on a mob from /datum/component/mob_chain when component is detached from it as the "front" : (mob/living/basic/tail) +#define COMSIG_MOB_LOST_CHAIN_TAIL "living_detached_chain_tail" +/// Sent from a 'contract chain' button on a mob chain +#define COMSIG_MOB_CHAIN_CONTRACT "living_chain_contracted" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index fc9fcf22893f..a7a04b7dfdd3 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -7,6 +7,8 @@ #define COMSIG_MOB_LOGIN "mob_login" ///from base of /mob/Logout(): () #define COMSIG_MOB_LOGOUT "mob_logout" +///from base of /mob/mind_initialize +#define COMSIG_MOB_MIND_INITIALIZED "mob_mind_inited" ///from base of mob/set_stat(): (new_stat, old_stat) #define COMSIG_MOB_STATCHANGE "mob_statchange" ///from base of mob/clickon(): (atom/A, params) @@ -25,7 +27,10 @@ /// From base of /mob/living/simple_animal/bot/proc/bot_step() #define COMSIG_MOB_BOT_STEP "mob_bot_step" -/// From base of /client/Move() +/// From base of /mob/proc/update_held_items +#define COMSIG_MOB_UPDATE_HELD_ITEMS "mob_update_held_items" + +/// From base of /client/Move(): (list/move_args) #define COMSIG_MOB_CLIENT_PRE_LIVING_MOVE "mob_client_pre_living_move" /// Should we stop the current living movement attempt #define COMSIG_MOB_CLIENT_BLOCK_PRE_LIVING_MOVE COMPONENT_MOVABLE_BLOCK_PRE_MOVE @@ -83,11 +88,15 @@ ///from base of mob/set_invis_see(): (new_invis, old_invis) #define COMSIG_MOB_SEE_INVIS_CHANGE "mob_see_invis_change" - +/// from /mob/living/proc/apply_damage(): (list/damage_mods, damage, damagetype, def_zone, sharpness, attack_direction, attacking_item) +/// allows you to add multiplicative damage modifiers to the damage mods argument to adjust incoming damage +/// not sent if the apply damage call was forced +#define COMSIG_MOB_APPLY_DAMAGE_MODIFIERS "mob_apply_damage_modifiers" ///from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction) #define COMSIG_MOB_APPLY_DAMAGE "mob_apply_damage" ///from /mob/living/proc/apply_damage(), works like above but after the damage is actually inflicted: (damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction) #define COMSIG_MOB_AFTER_APPLY_DAMAGE "mob_after_apply_damage" + ///from base of /mob/living/attack_alien(): (user) #define COMSIG_MOB_ATTACK_ALIEN "mob_attack_alien" ///from base of /mob/throw_item(): (atom/target) @@ -209,3 +218,6 @@ /// from mob/proc/dropItemToGround() #define COMSIG_MOB_DROPPING_ITEM "mob_dropping_item" + +/// from /mob/proc/change_mob_type_unchecked() : () +#define COMSIG_MOB_CHANGED_TYPE "mob_changed_type" diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 5fd653fd600f..08d80b05ad6e 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -129,6 +129,15 @@ #define COMSIG_ITEM_DROPPED "item_drop" ///from base of obj/item/pickup(): (/mob/taker) #define COMSIG_ITEM_PICKUP "item_pickup" +///from base of obj/item/on_outfit_equip(): (mob/equipper, visuals_only, slot) +#define COMSIG_ITEM_EQUIPPED_AS_OUTFIT "item_equip_as_outfit" +///from base of datum/storage/attempt_insert(): () +#define COMSIG_ITEM_STORED "item_stored" + +///from base of obj/item/apply_fantasy_bonuses(): (bonus) +#define COMSIG_ITEM_APPLY_FANTASY_BONUSES "item_apply_fantasy_bonuses" +///from base of obj/item/remove_fantasy_bonuses(): (bonus) +#define COMSIG_ITEM_REMOVE_FANTASY_BONUSES "item_remove_fantasy_bonuses" /// Sebt from obj/item/ui_action_click(): (mob/user, datum/action) #define COMSIG_ITEM_UI_ACTION_CLICK "item_action_click" @@ -175,7 +184,11 @@ ///from [/obj/structure/closet/supplypod/proc/preOpen]: #define COMSIG_SUPPLYPOD_LANDED "supplypodgoboom" -///from /obj/item/storage/book/bible/afterattack(): (mob/user, proximity) +/// from [/obj/item/stack/proc/can_merge]: (obj/item/stack/merge_with, in_hand) +#define COMSIG_STACK_CAN_MERGE "stack_can_merge" + #define CANCEL_STACK_MERGE (1<<0) + +///from /obj/item/book/bible/afterattack(): (mob/user, proximity) #define COMSIG_BIBLE_SMACKED "bible_smacked" ///stops the bible chain from continuing. When all of the effects of the bible smacking have been moved to a signal we can kill this #define COMSIG_END_BIBLE_CHAIN (1<<0) @@ -221,6 +234,11 @@ ///called when getting the item's exact ratio for cargo's profit, without selling the item. #define COMSIG_ITEM_SPLIT_PROFIT_DRY "item_split_profits_dry" +/// Called on component/uplink/OnAttackBy(..) +#define COMSIG_ITEM_ATTEMPT_TC_REIMBURSE "item_attempt_tc_reimburse" +///Called when a holoparasite/guardiancreator is used. +#define COMSIG_TRAITOR_ITEM_USED(type) "traitor_item_used_[type]" + // /obj/item/clothing signals ///from [/mob/living/carbon/human/Move]: () diff --git a/code/__DEFINES/dcs/signals/signals_reagent.dm b/code/__DEFINES/dcs/signals/signals_reagent.dm index 00fdddc6c9e7..a73d59a234c2 100644 --- a/code/__DEFINES/dcs/signals/signals_reagent.dm +++ b/code/__DEFINES/dcs/signals/signals_reagent.dm @@ -6,6 +6,8 @@ #define COMSIG_ATOM_EXPOSE_REAGENTS "atom_expose_reagents" /// Prevents the atom from being exposed to reagents if returned on [COMSIG_ATOM_EXPOSE_REAGENTS] #define COMPONENT_NO_EXPOSE_REAGENTS (1<<0) +///from base of atom/expose_reagents(): (/list, /datum/reagents, methods, volume_modifier, show_message) +#define COMSIG_ATOM_AFTER_EXPOSE_REAGENTS "atom_after_expose_reagents" ///from base of [/datum/reagent/proc/expose_atom]: (/datum/reagent, reac_volume) #define COMSIG_ATOM_EXPOSE_REAGENT "atom_expose_reagent" ///from base of [/datum/reagent/proc/expose_atom]: (/atom, reac_volume) diff --git a/code/__DEFINES/dcs/signals/signals_sticker.dm b/code/__DEFINES/dcs/signals/signals_sticker.dm new file mode 100644 index 000000000000..4b18efbff5b2 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_sticker.dm @@ -0,0 +1,6 @@ +//Stickers + +/// Called on an object when a sticker is sticked to it (sticker item, user) +#define COMSIG_STICKER_STICKED "comsig_sticker_stick" +/// Called on an object when a sticker is unsticked from it (sticker item) +#define COMSIG_STICKER_UNSTICKED "comsig_sticker_unstick" diff --git a/code/__DEFINES/dcs/signals/signals_turf.dm b/code/__DEFINES/dcs/signals/signals_turf.dm index ea4791f5629b..7ea0a9631096 100644 --- a/code/__DEFINES/dcs/signals/signals_turf.dm +++ b/code/__DEFINES/dcs/signals/signals_turf.dm @@ -39,3 +39,5 @@ #define COMSIG_TURF_PREPARE_STEP_SOUND "turf_prepare_step_sound" ///from base of datum/thrownthing/finalize(): (turf/turf, atom/movable/thrownthing) when something is thrown and lands on us #define COMSIG_TURF_MOVABLE_THROW_LANDED "turf_movable_throw_landed" +///from /obj/item/pushbroom/sweep(): (broom, user, items_to_sweep) +#define COMSIG_TURF_RECEIVE_SWEEPED_ITEMS "turf_receive_sweeped_items" diff --git a/code/__DEFINES/drone.dm b/code/__DEFINES/drone.dm index 46c19fdbaf41..caf8f5015ecd 100644 --- a/code/__DEFINES/drone.dm +++ b/code/__DEFINES/drone.dm @@ -2,9 +2,8 @@ /// If drones are blacklisted from certain sensitive machines GLOBAL_VAR_INIT(drone_machine_blacklist_enabled, TRUE) -#define DRONE_HANDS_LAYER 1 -#define DRONE_HEAD_LAYER 2 -#define DRONE_TOTAL_LAYERS 2 +#define DRONE_HEAD_LAYER 1 +#define DRONE_TOTAL_LAYERS 1 /// Message displayed when new drone spawns in drone network #define DRONE_NET_CONNECT span_notice("DRONE NETWORK: [name] connected.") diff --git a/code/__DEFINES/economy.dm b/code/__DEFINES/economy.dm index 9e4a48398360..84a2af566cb1 100644 --- a/code/__DEFINES/economy.dm +++ b/code/__DEFINES/economy.dm @@ -22,7 +22,8 @@ #define STATION_TARGET_BUFFER 25 - +///The coefficient for the amount of dosh that's collected everytime some is earned or received. +#define DEBT_COLLECTION_COEFF 0.75 #define MAX_GRANT_DPT 500 diff --git a/code/__DEFINES/explosions.dm b/code/__DEFINES/explosions.dm index 0ce9644af1c2..a1645b659d1c 100644 --- a/code/__DEFINES/explosions.dm +++ b/code/__DEFINES/explosions.dm @@ -23,8 +23,10 @@ if(!(target.flags_1 & PREVENT_CONTENTS_EXPLOSION_1)) { \ target.contents_explosion(##args);\ };\ - SEND_SIGNAL(target, COMSIG_ATOM_EX_ACT, ##args);\ - target.ex_act(##args); + if(!(SEND_SIGNAL(target, COMSIG_ATOM_PRE_EX_ACT, ##args) & COMPONENT_CANCEL_EX_ACT)) { \ + SEND_SIGNAL(target, COMSIG_ATOM_EX_ACT, ##args);\ + target.ex_act(##args);\ + } // Internal explosion argument list keys. // Must match the arguments to [/datum/controller/subsystem/explosions/proc/propagate_blastwave] diff --git a/code/__DEFINES/external_organs.dm b/code/__DEFINES/external_organs.dm index 766feb141491..ce71b0913d8a 100644 --- a/code/__DEFINES/external_organs.dm +++ b/code/__DEFINES/external_organs.dm @@ -6,6 +6,9 @@ #define ORGAN_COLOR_HAIR (1<<2) ///uses the parents anime color #define ORGAN_COLOR_ANIME (1<<3) +///uses the parents mutcolor secondary +#define ORGAN_COLOR_MUTSECONDARY (1<<4) + ///Tail wagging #define WAG_ABLE (1<<0) #define WAG_WAGGING (1<<1) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index dd653a8d7900..5a1bdb0c2b71 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -70,6 +70,9 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 /// Yes I know this is a stupid flag, no you can't take him from me #define DECAL_INIT_UPDATE_EXPERIENCED_1 (1<<20) +/// Used for items that cannot be used directly to harm people with, ex. loafs +#define CANNOT_ATTACK_WITH (1<<21) + // Update flags for [/atom/proc/update_appearance] /// Update the atom's name #define UPDATE_NAME (1<<0) @@ -151,6 +154,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define GHOST_AREA (1<<18) ///can we explode during rounds? #define NO_EXPLOSIONS_DURING (1<<19) +///are ghosts not allowed to enter during round +#define NO_GHOSTS_DURING_ROUND (1<<20) /* These defines are used specifically with the atom/pass_flags bitmask diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm index 4ec2ce0f90d2..fd88a17ce9f5 100644 --- a/code/__DEFINES/footsteps.dm +++ b/code/__DEFINES/footsteps.dm @@ -18,15 +18,25 @@ //misc footstep sounds #define FOOTSTEP_GENERIC_HEAVY "heavy" + //footstep mob defines -#define FOOTSTEP_MOB_CLAW 1 -#define FOOTSTEP_MOB_BAREFOOT 2 -#define FOOTSTEP_MOB_HEAVY 3 -#define FOOTSTEP_MOB_SHOE 4 -#define FOOTSTEP_MOB_HUMAN 5 //Warning: Only works on /mob/living/carbon/human -#define FOOTSTEP_MOB_SLIME 6 -#define FOOTSTEP_OBJ_MACHINE 7 -#define FOOTSTEP_OBJ_ROBOT 8 +#define FOOTSTEP_MOB_CLAW "footstep_claw" +#define FOOTSTEP_MOB_BAREFOOT "footstep_barefoot" +#define FOOTSTEP_MOB_HEAVY "footstep_heavy" +#define FOOTSTEP_MOB_SHOE "footstep_shoe" +#define FOOTSTEP_MOB_HUMAN "footstep_human" //Warning: Only works on /mob/living/carbon/human +#define FOOTSTEP_MOB_SLIME "footstep_slime" +#define FOOTSTEP_MOB_RUST "footstep_rust" +#define FOOTSTEP_OBJ_MACHINE "footstep_machine" +#define FOOTSTEP_OBJ_ROBOT "footstep_robot" + +//priority defines for the footstep_override element +#define STEP_SOUND_NO_PRIORITY 0 +#define STEP_SOUND_CONVEYOR_PRIORITY 1 +#define STEP_SOUND_TABLE_PRIORITY 2 + +///the name of the index key for priority +#define STEP_SOUND_PRIORITY "step_sound_priority" /* diff --git a/code/__DEFINES/guardian_defines.dm b/code/__DEFINES/guardian_defines.dm index d7aae6965a75..ae2c3175b4a6 100644 --- a/code/__DEFINES/guardian_defines.dm +++ b/code/__DEFINES/guardian_defines.dm @@ -3,6 +3,28 @@ #define GUARDIAN_THEME_CARP "carp" #define GUARDIAN_THEME_MINER "miner" -#define GUARDIAN_COLOR_LAYER 2 -#define GUARDIAN_HANDS_LAYER 1 -#define GUARDIAN_TOTAL_LAYERS 2 +#define GUARDIAN_MAGIC "magic" +#define GUARDIAN_TECH "tech" + +#define GUARDIAN_ASSASSIN "assassin" +#define GUARDIAN_CHARGER "charger" +#define GUARDIAN_DEXTROUS "dextrous" +#define GUARDIAN_EXPLOSIVE "explosive" +#define GUARDIAN_GASEOUS "gaseous" +#define GUARDIAN_GRAVITOKINETIC "gravitokinetic" +#define GUARDIAN_LIGHTNING "lightning" +#define GUARDIAN_PROTECTOR "protector" +#define GUARDIAN_RANGED "ranged" +#define GUARDIAN_STANDARD "standard" +#define GUARDIAN_SUPPORT "support" + +/// List of all guardians currently extant +GLOBAL_LIST_EMPTY(parasites) + +/// Assoc list of guardian theme singletons +GLOBAL_LIST_INIT(guardian_themes, list( + GUARDIAN_THEME_TECH = new /datum/guardian_fluff/tech, + GUARDIAN_THEME_MAGIC = new /datum/guardian_fluff, + GUARDIAN_THEME_CARP = new /datum/guardian_fluff/carp, + GUARDIAN_THEME_MINER = new /datum/guardian_fluff/miner, +)) diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 4eb05400649f..74ab51f6b384 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -201,6 +201,10 @@ #define ui_ghost_minigames "SOUTH: 6, CENTER+2:24" #define ui_ghost_language_menu "SOUTH: 22, CENTER+3:8" +//Team finder + +#define ui_team_finder "CENTER,CENTER" + //Blobbernauts #define ui_blobbernaut_overmind_health "EAST-1:28,CENTER+0:19" diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 1c936e837ca9..b34fc1e5b16d 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -137,6 +137,8 @@ #define CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON (1<<2) ///has a sprite for monkeys #define CLOTHING_MONKEY_VARIATION (1<<3) +///Has a sprite for snouted heads specifically. +#define CLOTHING_SNOUTED_VARIATION (1<<4) //flags for covering body parts #define GLASSESCOVERSEYES (1<<0) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 87bf13cca894..4f139d26e5aa 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -80,8 +80,9 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define isabductor(A) (is_species(A, /datum/species/abductor)) #define isgolem(A) (is_species(A, /datum/species/golem)) #define islizard(A) (is_species(A, /datum/species/lizard)) +#define isashwalker(A) (is_species(A, /datum/species/lizard/ashwalker)) #define isplasmaman(A) (is_species(A, /datum/species/plasmaman)) -#define issimian(A) (is_species(A, /datum/species/simian)) +#define issimian(A) (is_species(A, /datum/species/simian)) //Monkestation Addition #define ispodperson(A) (is_species(A, /datum/species/pod)) #define isflyperson(A) (is_species(A, /datum/species/fly)) #define isjellyperson(A) (is_species(A, /datum/species/jelly)) @@ -97,7 +98,8 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define isandroid(A) (is_species(A, /datum/species/android)) #define isnightmare(A) (is_species(A, /datum/species/shadow/nightmare)) #define isipc(A) (is_species(A, /datum/species/ipc)) -#define isgoblin(A) (is_species(A, /datum/species/goblin))//monkestation addition +#define isgoblin(A) (is_species(A, /datum/species/goblin)) //Monkestation Addition +#define isfloran(A) (is_species(A, /datum/species/floran)) //Monkestation Addition //More carbon mobs @@ -129,8 +131,16 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( // basic mobs #define isbasicmob(A) (istype(A, /mob/living/basic)) +#define isconstruct(A) (istype(A, /mob/living/basic/construct)) + #define iscow(A) (istype(A, /mob/living/basic/cow)) +#define isgorilla(A) (istype(A, /mob/living/basic/gorilla)) + +#define isshade(A) (istype(A, /mob/living/basic/shade)) + +#define is_simian(A) (isgorilla(A) || ismonkey(A)) + /// returns whether or not the atom is either a basic mob OR simple animal #define isanimal_or_basicmob(A) (istype(A, /mob/living/simple_animal) || istype(A, /mob/living/basic)) @@ -142,17 +152,15 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( //Simple animals #define isanimal(A) (istype(A, /mob/living/simple_animal)) -#define isrevenant(A) (istype(A, /mob/living/simple_animal/revenant)) +#define isrevenant(A) (istype(A, /mob/living/basic/revenant)) #define isbot(A) (istype(A, /mob/living/simple_animal/bot)) -#define isshade(A) (istype(A, /mob/living/simple_animal/shade)) - #define ismouse(A) (istype(A, /mob/living/basic/mouse)) #define isslime(A) (istype(A, /mob/living/simple_animal/slime)) -#define isdrone(A) (istype(A, /mob/living/simple_animal/drone)) +#define isdrone(A) (istype(A, /mob/living/basic/drone)) #define iscat(A) (istype(A, /mob/living/simple_animal/pet/cat)) @@ -164,13 +172,11 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define isregalrat(A) (istype(A, /mob/living/basic/regal_rat)) -#define isguardian(A) (istype(A, /mob/living/simple_animal/hostile/guardian)) - -#define isconstruct(A) (istype(A, /mob/living/simple_animal/hostile/construct)) +#define isguardian(A) (istype(A, /mob/living/basic/guardian)) #define ismegafauna(A) (istype(A, /mob/living/simple_animal/hostile/megafauna)) -#define isclown(A) (istype(A, /mob/living/simple_animal/hostile/retaliate/clown)) +#define isclown(A) (istype(A, /mob/living/basic/clown)) #define isspider(A) (istype(A, /mob/living/basic/spider/giant)) @@ -215,6 +221,8 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define ismachinery(A) (istype(A, /obj/machinery)) +#define isvendor(A) (istype(A, /obj/machinery/vending)) + #define isvehicle(A) (istype(A, /obj/vehicle)) #define ismecha(A) (istype(A, /obj/vehicle/sealed/mecha)) @@ -266,8 +274,6 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define isholoeffect(O) (istype(O, /obj/effect/holodeck_effect)) -#define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob)) - #define isshuttleturf(T) (!isnull(T.depth_to_find_baseturf(/turf/baseturf_skipover/shuttle))) #define isProbablyWallMounted(O) (O.pixel_x > 20 || O.pixel_x < -20 || O.pixel_y > 20 || O.pixel_y < -20) @@ -293,3 +299,5 @@ GLOBAL_LIST_INIT(book_types, typecacheof(list( #define isprojectilespell(thing) (istype(thing, /datum/action/cooldown/spell/pointed/projectile)) #define is_multi_tile_object(atom) (atom.bound_width > world.icon_size || atom.bound_height > world.icon_size) + +#define isartifact(thing) (istype(thing, /obj/structure/artifact) || istype(thing, /obj/item/melee/artifact) || istype(thing, /obj/item/gun/magic/artifact) || istype(thing, /obj/item/stock_parts/cell/artifact)) diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index f7d18b3fe158..39d8be41b99a 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -80,6 +80,14 @@ #define JOB_LAWYER "Lawyer" #define JOB_CHAPLAIN "Chaplain" #define JOB_PSYCHOLOGIST "Psychologist" +//Spooktober +#define JOB_SPOOKTOBER_GHOST "Ghost" +#define JOB_SPOOKTOBER_GODZILLA "Discount Godzilla" +#define JOB_SPOOKTOBER_WIZARD "Diet Wizard" +#define JOB_SPOOKTOBER_YELLOWCLOWN "Yellow Clown" +#define JOB_SPOOKTOBER_SKELETON "Skeleton" +#define JOB_SPOOKTOBER_CANDYSALESMAN "Candy Salesman" +#define JOB_SPOOKTOBER_GORILLA "Gorilla" //ERTs #define JOB_ERT_DEATHSQUAD "Death Commando" #define JOB_ERT_COMMANDER "Emergency Response Team Commander" @@ -164,6 +172,8 @@ #define DEPARTMENT_ASSISTANT "Assistant" #define DEPARTMENT_BITFLAG_CAPTAIN (1<<9) #define DEPARTMENT_CAPTAIN "Captain" +#define DEPARTMENT_BITFLAG_SPOOKTOBER (1<<10) +#define DEPARTMENT_SPOOKTOBER "Spooktober" /* Job datum job_flags */ /// Whether the mob is announced on arrival. @@ -184,6 +194,8 @@ #define JOB_ASSIGN_QUIRKS (1<<7) /// Whether this job can be an intern. #define JOB_CAN_BE_INTERN (1<<8) +/// Whether this job is enabled/disabled by the spooktober config +#define JOB_SPOOKTOBER (1<<9) #define FACTION_NONE "None" #define FACTION_STATION "Station" diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index e7f91f42aad2..7694ecfada7a 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -6,7 +6,6 @@ #define INVESTIGATE_CRAFTING "crafting" #define INVESTIGATE_DEATHS "deaths" #define INVESTIGATE_ENGINE "engine" -#define INVESTIGATE_EXPERIMENTOR "experimentor" #define INVESTIGATE_GRAVITY "gravity" #define INVESTIGATE_HALLUCINATIONS "hallucinations" #define INVESTIGATE_HYPERTORUS "hypertorus" @@ -17,6 +16,7 @@ #define INVESTIGATE_RESEARCH "research" #define INVESTIGATE_WIRES "wires" #define INVESTIGATE_NANITES "nanites" +#define INVESTIGATE_ARTIFACT "artifact" // Logging types for log_message() #define LOG_ATTACK (1 << 0) diff --git a/code/__DEFINES/megafauna.dm b/code/__DEFINES/megafauna.dm new file mode 100644 index 000000000000..981b8d49f520 --- /dev/null +++ b/code/__DEFINES/megafauna.dm @@ -0,0 +1,4 @@ +/// Temperature of drake fire hotspots +#define DRAKE_FIRE_TEMP 500 +/// Volume of drake fire hotspots +#define DRAKE_FIRE_EXPOSURE 50 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index dbf3a02c5286..f4dc7d7b6106 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -128,8 +128,9 @@ #define SPECIES_ZOMBIE_KROKODIL "krokodil_zombie" #define SPECIES_OOZELING "oozeling" #define SPECIES_IPC "ipc" -#define SPECIES_SIMIAN "simian" -#define SPECIES_GOBLIN "goblin"//monkestation addition +#define SPECIES_SIMIAN "simian" //Monkestation Addition +#define SPECIES_GOBLIN "goblin" //Monkestation Addition +#define SPECIES_FLORAN "floran" //Monkestation Addition // Like species IDs, but not specifically attached a species. #define BODYPART_ID_ALIEN "alien" #define BODYPART_ID_ROBOTIC "robotic" diff --git a/code/__DEFINES/mood.dm b/code/__DEFINES/mood.dm new file mode 100644 index 000000000000..161f253b04c7 --- /dev/null +++ b/code/__DEFINES/mood.dm @@ -0,0 +1 @@ +#define MOOD_CATEGORY_LEGION_CORE "regenerative core" diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 51bb3d2e9afa..36ad2ddd1e30 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -42,6 +42,8 @@ #define ITEM_HAS_CONTEXTUAL_SCREENTIPS (1 << 19) /// No blood overlay is allowed to appear on this item, and it cannot gain blood DNA forensics #define NO_BLOOD_ON_ITEM (1 << 20) +/// Whether this item should skip the /datum/component/fantasy applied on spawn on the RPG event. Used on things like stacks +#define SKIP_FANTASY_ON_SPAWN (1<<21) // Flags for the clothing_flags var on /obj/item/clothing diff --git a/code/__DEFINES/pai.dm b/code/__DEFINES/pai.dm index f47524d32e26..4015ee3bc504 100644 --- a/code/__DEFINES/pai.dm +++ b/code/__DEFINES/pai.dm @@ -11,6 +11,13 @@ /// The amount of time between spamming for pAI candidates #define PAI_SPAM_TIME (40 SECONDS) +/// Maximum distance you can set the holoform leash +#define HOLOFORM_MAX_RANGE 9 +/// Minimum distance you can set the holoform leash +#define HOLOFORM_MIN_RANGE 3 +/// Default holoform leash distance +#define HOLOFORM_DEFAULT_RANGE HOLOFORM_MAX_RANGE + /// UI action to toggle huds #define PAI_TOGGLE_MEDICAL_HUD 0 #define PAI_TOGGLE_SECURITY_HUD 1 diff --git a/code/__DEFINES/path.dm b/code/__DEFINES/path.dm index 95713c5d36fa..6a930699041c 100644 --- a/code/__DEFINES/path.dm +++ b/code/__DEFINES/path.dm @@ -3,3 +3,23 @@ #define CANASTARPASS_DENSITY 0 /// If this is set, we bypass density checks and always call the proc #define CANASTARPASS_ALWAYS_PROC 1 + +/** + * A helper macro to see if it's possible to step from the first turf into the second one, minding things like door access and directional windows. + * If you really want to optimize things, optimize this, cuz this gets called a lot. + * We do early next.density check despite it being already checked in LinkBlockedWithAccess for short-circuit performance + */ +#define CAN_STEP(cur_turf, next, simulated_only, pass_info, avoid) (next && !next.density && !(simulated_only && SSpathfinder.space_type_cache[next.type]) && !cur_turf.LinkBlockedWithAccess(next, pass_info) && (next != avoid)) + +#define DIAGONAL_DO_NOTHING NONE +#define DIAGONAL_REMOVE_ALL 1 +#define DIAGONAL_REMOVE_CLUNKY 2 + +// Set of delays for path_map reuse +// The longer you go, the higher the risk of invalid paths +#define MAP_REUSE_INSTANT (0) +#define MAP_REUSE_SNAPPY (0.5 SECONDS) +#define MAP_REUSE_FAST (2 SECONDS) +#define MAP_REUSE_SLOW (20 SECONDS) +// Longest delay, so any maps older then this will be discarded from the subsystem cache +#define MAP_REUSE_SLOWEST (60 SECONDS) diff --git a/code/__DEFINES/patreon.dm b/code/__DEFINES/patreon.dm index b28d8546687b..45e6401c5a34 100644 --- a/code/__DEFINES/patreon.dm +++ b/code/__DEFINES/patreon.dm @@ -1,4 +1,5 @@ #define NO_RANK "None" +#define UNSUBBED "UNSUBBED" #define THANKS_RANK "9641441" #define ASSISTANT_RANK "9641458" #define COMMAND_RANK "9641523" diff --git a/code/__DEFINES/projectiles.dm b/code/__DEFINES/projectiles.dm index 8283e3840598..712b1503aa17 100644 --- a/code/__DEFINES/projectiles.dm +++ b/code/__DEFINES/projectiles.dm @@ -56,6 +56,7 @@ #define CALIBER_HOOK "hook" /// The caliber used by the changeling tentacle mutation. #define CALIBER_TENTACLE "tentacle" +#define CALIBER_A223 "a223" /// For gunpoints, how many tiles around the target the shooter can roam without losing their shot #define GUNPOINT_SHOOTER_STRAY_RANGE 2 diff --git a/code/__DEFINES/quirks.dm b/code/__DEFINES/quirks.dm index 290fed93c957..2e48daa4a51a 100644 --- a/code/__DEFINES/quirks.dm +++ b/code/__DEFINES/quirks.dm @@ -12,3 +12,5 @@ #define QUIRK_CHANGES_APPEARANCE (1<<2) /// The only thing this quirk effects is mood so it should be disabled if mood is #define QUIRK_MOODLET_BASED (1<<3) +/// This quirk shouldn't be shown by health analyzers and hud, perhaps as considering it medical condition is a far stretch. +#define QUIRK_HIDE_FROM_SCAN (1<<4) diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index be6d6015267c..af75661790d2 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -67,6 +67,7 @@ #define ROLE_LAVALAND "Lavaland" #define ROLE_LAZARUS_BAD "Slaved Revived Mob" #define ROLE_LAZARUS_GOOD "Friendly Revived Mob" +#define ROLE_SLASHER "Slasher" #define ROLE_CLOWN_OPERATIVE "Clown Operative" #define ROLE_FREE_GOLEM "Free Golem" @@ -108,7 +109,6 @@ #define ROLE_VENUSHUMANTRAP "Venus Human Trap" - /// This defines the antagonists you can operate with in the settings. /// Keys are the antagonist, values are the number of days since the player's /// first connection in order to play. diff --git a/code/__DEFINES/song.dm b/code/__DEFINES/song.dm index 7af269fbe219..782a7923ea14 100644 --- a/code/__DEFINES/song.dm +++ b/code/__DEFINES/song.dm @@ -13,3 +13,5 @@ ///it's what monkeys play! #define MONKEY_SONG "BPM: 200\nC4/0,14,C,A4-F2,F3,A3,F-F2,A-F,F4,G4,F,D4-Bb2-G2\nD3,G3,D-G2,G3-G2,D,D4-G3,D,B4-B2,G,B3,G-B2,B3-B2\nG4,A4,G,E4-C3,E3,G3,E-C,G-C,E,E4-G,E,C5-E-A3,C4\nA-E3,C,E4-C3,A4-C4,B4-A3-A2,C5-C4,D5-F-B3,D4,B-F3\nD,F4-D3,D4,F-B-B2,G4-D,A4-C-F3,F,C/2,B3/2,A3-C3/2\nB/2,C4,E-C3,F4,G-C,F-F3,F-C,C4/2,B/2,A-A2/2,G3/2\nF/I" +///song played by the mook bard +#define MOOK_SONG "BPM: 240\nA5,B5,C#6,D6,E6/0.17,A/0.5,A/0.25,A3/0.25\nA4/0.25,C#5/0.25,E5/0.25,A/0.25,C#/0.25,E/0.12\nC#6/0.25,C#/0.25,E6/0.25,A3/0.25,A4/0.25\nC#5/0.25,E5/0.25,A/0.25,C#/0.25,E/0.25,D/0.25\nG6/0.25,D/0.17,F6/0.17,C#6/0.5,E6/0.5,D4/0.25\nA/0.25,D5/0.25,F5/0.25,A/0.25,D/0.25,F/0.25\nD6/0.08,F6/0.08,D4/0.25,A/0.25,D5/0.25,F5/0.25\nCn4/0.2,B/0.17,D6/0.17,G5/0.5,G/0.25,B3/0.25\nD4/0.25,G4/0.25,B4/0.25,D/0.25,G/0.25,B/0.12\nB5/0.25,B/0.25,D6/0.25,G3/0.25,G4/0.25,B4/0.25\nF/0.25,G/0.25,B/0.25,F/0.25,D/0.25,F6/0.25\nC6/0.17,E/0.17,B5/0.5,D#/0.5,C4/0.25,G/0.25\nC5/0.25,E5/0.25,G/0.25,C/0.25,E/0.25,C6/0.08\nE6/0.08,C4/0.25,Dn4/0.25,E4/0.25,A5/0.17,B/0.5\nC6/0.25,F5/0.08,F4/0.08,C5/0.08,E5/0.12,G5/0.12\nC6/0.25,E6/0.25,E4/0.08,C5/0.08,B/0.17,F6/0.17\nE6/0.5,B/0.25,E4/0.08,G#4/0.08,C6/0.17,D6/0.5\nE6/0.25,A3/0.25,E4/0.25,C5/0.25,Gn3/0.25\nF5/0.12,A5/0.12,A6/0.25,F3/0.25,F4/0.12,A4/0.12\nC/0.12,F6/0.17,A6/0.17,G#6/0.5,A/0.25,F3/0.25\nF4/0.12,A4/0.12,D#5/0.12,B/0.17,G#/0.17,B6/0.5\nB5/0.25,G#/0.25,E3/0.25,E4/0.12,G#4/0.12\nDn/0.12,E6/0.08,E3/0.25,F#3/0.25,G#3/0.25\nE5/0.17,A5/0.17,E/0.5,E/0.25,A3/0.25,C#4/0.25\nE4/0.25,C#/0.25,E/0.12,A5/0.5,B/0.5,C#6/0.5\nD6/0.5,A3/0.25,C#4/0.25,E/0.25,C#/0.25,E/0.25\nE6/0.08,Gn/0.25,E4/0.25,A4/0.25,C#5/0.25,E/0.25\nA/0.25,C#/0.25,E6/0.17,E/0.5,Fn6/0.5,G6/0.5\nG3/0.25,E4/0.25,A/0.25,C#/0.25,E/0.25,A/0.25\nC#/0.25,F/0.08,A6/0.08,F3/0.25,F4/0.25,A4/0.25\nCn/0.25,F/0.25,A/0.25,C/0.25,G6/0.12,A6/0.12\nG A G F6 G3/0.25 D4/0.25 G4/0.25 B4/0.25 D/0.25\nG/0.25 B/0.25 E6/0.12 G6/0.12 F/0.71 G/0.71 F/0.71\nE3/0.25 E4/0.25 G4/0.25 B/0.25 E/0.25 G/0.25 B/0.25\nA5/0.08 E6/0.08 A3/0.25 E4/0.25 A4/0.25 C#/0.25 E/0.25 A/0.25 C#/0.25 D6/0.17 E6/0.5 F/0.25 B3/0.25 D4/0.12 F4/0.12 B4/0.12 F6/0.25 E/0.25 D6/0.25 G#3/0.25 E4/0.12 G#4/0.12 B/0.12 Cn6/0.12 D/0.25 A3/0.25 A4/0.25 C5/0.25 E5/0.25 G#3/0.25 Gn/0.25 C4/0.25 E4/0.25 A/" diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index e74803cccda9..701ce925344c 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -17,6 +17,7 @@ #define CHANNEL_MOB_SOUNDS 1009 #define CHANNEL_Z 1008 #define CHANNEL_WALKMAN 1007 //monkestation edit +#define CHANNEL_MASTER_VOLUME 1006 ///Default range of a sound. #define SOUND_RANGE 17 diff --git a/code/__DEFINES/span.dm b/code/__DEFINES/span.dm index 69190c39b626..7e31cc4a48b6 100644 --- a/code/__DEFINES/span.dm +++ b/code/__DEFINES/span.dm @@ -17,11 +17,13 @@ #define span_bigicon(str) ("" + str + "") #define span_binarysay(str) ("" + str + "") #define span_blob(str) ("" + str + "") +#define span_blobannounce(str) ("" + str + "") #define span_blue(str) ("" + str + "") #define span_blueteamradio(str) ("" + str + "") #define span_bold(str) ("" + str + "") #define span_boldannounce(str) ("" + str + "") #define span_bolddanger(str) ("" + str + "") +#define span_bolditalic(str) ("" + str + "") #define span_boldnicegreen(str) ("" + str + "") #define span_boldnotice(str) ("" + str + "") #define span_boldwarning(str) ("" + str + "") diff --git a/code/__DEFINES/species_clothing_paths.dm b/code/__DEFINES/species_clothing_paths.dm index 51d94eb0463d..745d6e51a0ab 100644 --- a/code/__DEFINES/species_clothing_paths.dm +++ b/code/__DEFINES/species_clothing_paths.dm @@ -12,8 +12,13 @@ //DIGITIGRADE PATHS ///The dmi containing digitigrade uniforms -#define DIGITIGRADE_UNIFORM_FILE 'icons/mob/species/misc/digitigrade.dmi' +#define DIGITIGRADE_UNIFORM_FILE 'monkestation/icons/mob/species/misc/uniform_digi.dmi' ///The dmi containing digitigrade shoes -#define DIGITIGRADE_SHOES_FILE 'icons/mob/species/misc/digitigrade_shoes.dmi' +#define DIGITIGRADE_SHOES_FILE 'monkestation/icons/mob/species/misc/feet_digi.dmi' ///The dmi containing digitigrade oversuits -#define DIGITIGRADE_SUIT_FILE 'icons/mob/species/misc/digitigrade_suits.dmi' +#define DIGITIGRADE_SUIT_FILE 'monkestation/icons/mob/species/misc/suit_digi.dmi' + +///The dmi containing snouted variation masks +#define SNOUTED_MASK_FILE 'monkestation/icons/mob/species/misc/mask_muzzled.dmi' +///The dmi containing snouted variation helmets +#define SNOUTED_HEAD_FILE 'monkestation/icons/mob/species/misc/head_muzzled.dmi' diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 07230479d473..5e80dcd35ebd 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -30,6 +30,8 @@ #define IGNORE_STASIS (1<<1) /// If the incapacitated status effect will ignore a mob being agressively grabbed #define IGNORE_GRAB (1<<2) +/// If the incapacited status effect will ignore a mob in cirt +#define IGNORE_CRIT (1<<3) // Grouped effect sources, see also code/__DEFINES/traits.dm @@ -38,6 +40,8 @@ #define STASIS_CHEMICAL_EFFECT "stasis_chemical" #define STASIS_SHAPECHANGE_EFFECT "stasis_shapechange" +#define STASIS_ADMIN "stasis_admin" +#define STASIS_LEGION_EATEN "stasis_eaten" #define STASIS_NETPOD_EFFECT "stasis_netpod" diff --git a/code/__DEFINES/stickers.dm b/code/__DEFINES/stickers.dm new file mode 100644 index 000000000000..9a420160d401 --- /dev/null +++ b/code/__DEFINES/stickers.dm @@ -0,0 +1,8 @@ +//sticker contraband values for spawning in boxes + +/// dont spawn in sticker kits +#define STICKER_NOSPAWN 0 +/// spawn in cargo sticker kits +#define STICKER_NORMAL 1 +/// spawn in syndicate sticker kit,not actually checked but good for keeping track or something +#define STICKER_SYNDICATE 2 diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 2a7084841746..6c16bda522b7 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -262,6 +262,14 @@ /// Game has round finished #define GAME_STATE_FINISHED 4 +// Used for SSticker.force_ending +/// Default, round is not being forced to end. +#define END_ROUND_AS_NORMAL 0 +/// End the round now as normal +#define FORCE_END_ROUND 1 +/// For admin forcing roundend, can be used to distinguish the two +#define ADMIN_FORCE_END_ROUND 2 + /** Create a new timer and add it to the queue. * Arguments: @@ -317,6 +325,9 @@ #define SSMOBS_DT (SSmobs.wait/10) #define SSOBJ_DT (SSobj.wait/10) +// The change in the world's time from the subsystem's last fire in seconds. +#define DELTA_WORLD_TIME(ss) ((world.time - ss.last_fire) * 0.1) + /// The timer key used to know how long subsystem initialization takes #define SS_INIT_TIMER_KEY "ss_init" diff --git a/code/__DEFINES/surgery.dm b/code/__DEFINES/surgery.dm index 5f698598d73e..e5b528f96d30 100644 --- a/code/__DEFINES/surgery.dm +++ b/code/__DEFINES/surgery.dm @@ -42,3 +42,8 @@ #define SURGERY_REQUIRE_LIMB (1<<3) ///Will allow the surgery to work only if there's a real (eg. not pseudopart) limb. #define SURGERY_REQUIRES_REAL_LIMB (1<<4) +///Will grant a bonus during surgery steps to users with TRAIT_MORBID while they're using tools with CRUEL_IMPLEMENT +#define SURGERY_MORBID_CURIOSITY (1<<5) + +///Return true if target is not in a valid body position for the surgery +#define IS_IN_INVALID_SURGICAL_POSITION(target, surgery) ((surgery.surgery_flags & SURGERY_REQUIRE_RESTING) && (target.mobility_flags & MOBILITY_LIEDOWN && target.body_position != LYING_DOWN)) diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index b7a1acd2aecf..11e778f00f9b 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -4,6 +4,9 @@ ///displays the current time into the round, with a lot of extra code just there for ensuring it looks okay after an entire day passes #define ROUND_TIME(...) ( "[world.time - SSticker.round_start_time > MIDNIGHT_ROLLOVER ? "[round((world.time - SSticker.round_start_time)/MIDNIGHT_ROLLOVER)]:[worldtime2text()]" : worldtime2text()]" ) +///Returns the time that has passed since the game started +#define STATION_TIME_PASSED(...) (world.time - SSticker.round_start_time) + /// Define that just has the current in-universe year for use in whatever context you might want to display that in. (For example, 2022 -> 2562 given a 540 year offset) #define CURRENT_STATION_YEAR (GLOB.year_integer + STATION_YEAR_OFFSET) diff --git a/code/__DEFINES/trader.dm b/code/__DEFINES/trader.dm new file mode 100644 index 000000000000..aae6da264998 --- /dev/null +++ b/code/__DEFINES/trader.dm @@ -0,0 +1,16 @@ +#define ITEM_REJECTED_PHRASE "ITEM_REJECTED_PHRASE" +#define ITEM_SELLING_CANCELED_PHRASE "ITEM_SELLING_CANCELED_PHRASE" +#define ITEM_SELLING_ACCEPTED_PHRASE "ITEM_SELLING_ACCEPTED_PHRASE" +#define INTERESTED_PHRASE "INTERESTED_PHRASE" +#define BUY_PHRASE "BUY_PHRASE" +#define NO_CASH_PHRASE "NO_CASH_PHRASE" +#define NO_STOCK_PHRASE "NO_STOCK_PHRASE" +#define NOT_WILLING_TO_BUY_PHRASE "NOT_WILLING_TO_BUY_PHRASE" +#define ITEM_IS_WORTHLESS_PHRASE "ITEM_IS_WORTHLESS_PHRASE" +#define TRADER_HAS_ENOUGH_ITEM_PHRASE "TRADER_HAS_ENOUGH_ITEM_PHRASE" +#define TRADER_LORE_PHRASE "TRADER_LORE_PHRASE" +#define TRADER_BATTLE_START_PHRASE "TRADER_AGGRO_PHRASE" +#define TRADER_BATTLE_END_PHRASE "TRADER_DEAGGRO_PHRASE" +#define TRADER_NOT_BUYING_ANYTHING "TRADER_NOT_BUYING_ANYTHING" +#define TRADER_NOT_SELLING_ANYTHING "TRADER_NOT_SELLING_ANYTHING" +#define TRADER_SHOP_OPENING_PHRASE "TRADER_SHOP_OPENING_PHRASE" diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 582584a2ab5b..4afb33ef0bf5 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -144,6 +144,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_PULL_BLOCKED "pullblocked" /// Abstract condition that prevents movement if being pulled and might be resisted against. Handcuffs and straight jackets, basically. #define TRAIT_RESTRAINED "restrained" +/// Apply this to make a mob not dense, and remove it when you want it to no longer make them undense, other sorces of undesity will still apply. Always define a unique source when adding a new instance of this! +#define TRAIT_UNDENSE "undense" +/// Expands our FOV by 30 degrees if restricted +#define TRAIT_EXPANDED_FOV "expanded_fov" /// Doesn't miss attacks #define TRAIT_PERFECT_ATTACKER "perfect_attacker" #define TRAIT_INCAPACITATED "incapacitated" @@ -172,6 +176,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_DEFIB_BLACKLISTED "defib_blacklisted" #define TRAIT_BADDNA "baddna" #define TRAIT_CLUMSY "clumsy" +/// Trait that means you are capable of holding items in some form +#define TRAIT_CAN_HOLD_ITEMS "can_hold_items" +/// Trait which lets you clamber over a barrier +#define TRAIT_FENCE_CLIMBER "can_climb_fences" /// means that you can't use weapons with normal trigger guards. #define TRAIT_CHUNKYFINGERS "chunkyfingers" #define TRAIT_DUMB "dumb" @@ -189,8 +197,13 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Makes the owner appear as dead to most forms of medical examination #define TRAIT_FAKEDEATH "fakedeath" #define TRAIT_DISFIGURED "disfigured" +/// "Magic" trait that blocks the mob from moving or interacting with anything. Used for transient stuff like mob transformations or incorporality in special cases. +/// Will block movement, `Life()` (!!!), and other stuff based on the mob. +#define TRAIT_NO_TRANSFORM "block_transformations" /// Tracks whether we're gonna be a baby alien's mummy. #define TRAIT_XENO_HOST "xeno_host" +/// This parrot is currently perched +#define TRAIT_PARROT_PERCHED "parrot_perched" /// This mob is immune to stun causing status effects and stamcrit. /// Prefer to use [/mob/living/proc/check_stun_immunity] over checking for this trait exactly. #define TRAIT_STUNIMMUNE "stun_immunity" @@ -479,6 +492,19 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai // and emit less heat. Present on /mob or /datum/mind #define TRAIT_SUPERMATTER_SOOTHER "supermatter_soother" +/// Trait added when a revenant is visible. +#define TRAIT_REVENANT_REVEALED "revenant_revealed" +/// Trait added when a revenant has been inhibited (typically by the bane of a holy weapon) +#define TRAIT_REVENANT_INHIBITED "revenant_inhibited" + +/// Trait which prevents you from becoming overweight +#define TRAIT_NOFAT "cant_get_fat" + +/// Trait which allows you to eat rocks +#define TRAIT_ROCK_EATER "rock_eater" +/// Trait which allows you to gain bonuses from consuming rocks +#define TRAIT_ROCK_METAMORPHIC "rock_metamorphic" + /// `do_teleport` will not allow this atom to teleport #define TRAIT_NO_TELEPORT "no-teleport" /// This atom is a secluded location, which is counted as out of bounds. @@ -587,7 +613,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_TENTACLE_IMMUNE "tentacle_immune" /// Currently under the effect of overwatch #define TRAIT_OVERWATCHED "watcher_overwatched" -/// Cannot be targetted by watcher overwatch +/// Cannot be targeted by watcher overwatch #define TRAIT_OVERWATCH_IMMUNE "overwatch_immune" //non-mob traits @@ -716,6 +742,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_POSTERBOY "poster_boy" #define TRAIT_THROWINGARM "throwing_arm" +///if the atom has a sticker attached to it +#define TRAIT_STICKERED "stickered" + #define TRAIT_JAILBIRD "jailbird" #define TRAIT_STOWAWAY "stowaway" #define TRAIT_LOUD_ASS "loud_ass" @@ -733,6 +762,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///Trait for the gamer quirk. #define TRAIT_GAMER "gamer" +/// Trait for the Extra-Sensory Paranoia quirk +#define TRAIT_PARANOIA "paranoia" + ///Trait for dryable items #define TRAIT_DRYABLE "trait_dryable" ///Trait for dried items @@ -826,6 +858,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///Trait needed for the lubefish evolution #define TRAIT_FISH_FED_LUBE "fish_fed_lube" +/// Trait given to angelic constructs to let them purge cult runes +#define TRAIT_ANGELIC "angelic" + // common trait sources #define TRAIT_GENERIC "generic" #define UNCONSCIOUS_TRAIT "unconscious" @@ -896,6 +931,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define SUIT_TRAIT "suit" /// Trait associated to lying down (having a [lying_angle] of a different value than zero). #define LYING_DOWN_TRAIT "lying-down" +/// A trait gained by leaning against a wall +#define LEANING_TRAIT "leaning" /// Trait associated to lacking electrical power. #define POWER_LACK_TRAIT "power-lack" /// Trait associated to lacking motor movement @@ -965,7 +1002,15 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define SPECIES_FLIGHT_TRAIT "species-flight" #define FROSTMINER_ENRAGE_TRAIT "frostminer-enrage" #define NO_GRAVITY_TRAIT "no-gravity" +/// A trait gained from a mob's leap action, like the leaper #define LEAPING_TRAIT "leaping" +/// A trait gained from a mob's vanish action, like the herophant +#define VANISHING_TRAIT "vanishing" +/// A trait gained from a mob's swoop action, like the ash drake +#define SWOOPING_TRAIT "swooping" +/// A trait gained from a mob's mimic ability, like the mimic +#define MIMIC_TRAIT "mimic" +#define SHRUNKEN_TRAIT "shrunken" #define LEAPER_BUBBLE_TRAIT "leaper-bubble" #define DNA_VAULT_TRAIT "dna_vault" /// sticky nodrop sounds like a bad soundcloud rapper's name @@ -1034,7 +1079,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define AUTOPSY_TRAIT "autopsy_trait" /// Trait given by [/datum/status_effect/blessing_of_insanity] #define MAD_WIZARD_TRAIT "mad_wizard_trait" - +/// Isn't attacked harmfully by blob structures +#define TRAIT_BLOB_ALLY "blob_ally" /** * Trait granted by [/mob/living/carbon/Initialize] and @@ -1171,6 +1217,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define SPEAKING_FROM_TONGUE "tongue" ///trait source that sign language should use #define SPEAKING_FROM_HANDS "hands" +/// this object cannot have its export value be shown by export scanner (shows as unknown) +#define TRAIT_HIDDEN_EXPORT_VALUE "hiddenexportvalue" ///FOOD TRAITS ///Trait for Fire Burps @@ -1191,3 +1239,24 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Do IPC's dream of doomsday? The answer is yes #define TRAIT_ROBOT_CAN_BLEED "robots_can_bleed" //monkestation edit end +/// This atom can have spells cast from it if a mob is within it +/// This means the "caster" of the spell is changed to the mob's loc +/// Note this doesn't mean all spells are guaranteed to work or the mob is guaranteed to cast +#define TRAIT_CASTABLE_LOC "castable_loc" + +///Trait given by /datum/element/relay_attacker +#define TRAIT_RELAYING_ATTACKER "relaying_attacker" +// unique trait sources, still defines +#define EMP_TRAIT "emp_trait" + +/// Trait given while using /datum/action/cooldown/mob_cooldown/wing_buffet +#define TRAIT_WING_BUFFET "wing_buffet" +/// Trait given while tired after using /datum/action/cooldown/mob_cooldown/wing_buffet +#define TRAIT_WING_BUFFET_TIRED "wing_buffet_tired" +/// Trait given to a dragon who fails to defend their rifts +#define TRAIT_RIFT_FAILURE "fail_dragon_loser" + +///trait determines if this mob can breed given by /datum/component/breeding +#define TRAIT_MOB_BREEDER "mob_breeder" +/// Trait given to mobs that we do not want to mindswap +#define TRAIT_NO_MINDSWAP "no_mindswap" diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index c1b8eea39ae7..48844e079c16 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -5,6 +5,8 @@ #define CHANGETURF_INHERIT_AIR (1<<4) // Inherit air from previous turf. Implies CHANGETURF_IGNORE_AIR #define CHANGETURF_RECALC_ADJACENT (1<<5) //Immediately recalc adjacent atmos turfs instead of queuing. #define CHANGETURF_TRAPDOOR_INDUCED (1<<6) // Caused by a trapdoor, for trapdoor to know that this changeturf was caused by itself +/// Use the baseturfs of the provided type +#define CHANGETURF_DEFAULT_BASETURF (1<<7) #define IS_OPAQUE_TURF(turf) (turf.directional_opacity == ALL_CARDINALS) @@ -15,8 +17,8 @@ #define RECT_TURFS(H_RADIUS, V_RADIUS, CENTER) \ block( \ - locate(max(CENTER.x-(H_RADIUS),1), max(CENTER.y-(V_RADIUS),1), CENTER.z), \ - locate(min(CENTER.x+(H_RADIUS),world.maxx), min(CENTER.y+(V_RADIUS),world.maxy), CENTER.z) \ + locate(max((CENTER).x-(H_RADIUS),1), max((CENTER).y-(V_RADIUS),1), (CENTER).z), \ + locate(min((CENTER).x+(H_RADIUS),world.maxx), min((CENTER).y+(V_RADIUS),world.maxy), (CENTER).z) \ ) ///Returns all turfs in a zlevel diff --git a/code/__DEFINES/twitch.dm b/code/__DEFINES/twitch.dm index 5d408fede4e9..75521f11bba9 100644 --- a/code/__DEFINES/twitch.dm +++ b/code/__DEFINES/twitch.dm @@ -1,3 +1,15 @@ +//For the twitch extension #define TWITCH_AFFECTS_STREAMER (1 << 0) #define TWITCH_AFFECTS_ALL (1 << 1) #define TWITCH_AFFECTS_RANDOM (1 << 2) + + +//For linking twitch account to ss13 +#define NO_TWITCH_SUB "" //these are the possible values for the twitch subs +#define TWITCH_SUB_TIER_1 "1000" +#define TWITCH_SUB_TIER_2 "2000" +#define TWITCH_SUB_TIER_3 "3000" + +#define ACCESS_TWITCH_SUB_TIER_1 1 +#define ACCESS_TWITCH_SUB_TIER_2 2 +#define ACCESS_TWITCH_SUB_TIER_3 3 diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 32f5837c3d24..31e722178279 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -57,7 +57,7 @@ // VV HREF KEYS #define VV_HK_TARGET "target" -#define VV_HK_VARNAME "targetvar" //name or index of var for 1 variable targetting hrefs. +#define VV_HK_VARNAME "targetvar" //name or index of var for 1 variable targeting hrefs. // vv_do_list() keys #define VV_HK_LIST_ADD "listadd" diff --git a/code/__DEFINES/wounds.dm b/code/__DEFINES/wounds.dm index 0aadb71d58be..815e60d0738e 100644 --- a/code/__DEFINES/wounds.dm +++ b/code/__DEFINES/wounds.dm @@ -1,4 +1,3 @@ - // ~wound damage/rolling defines /// the cornerstone of the wound threshold system, your base wound roll for any attack is rand(1, damage^this), after armor reduces said damage. See [/obj/item/bodypart/proc/check_wounding] #define WOUND_DAMAGE_EXPONENT 1.4 @@ -13,6 +12,10 @@ /// set wound_bonus on an item or attack to this to disable checking wounding for the attack #define CANT_WOUND -100 +/// If there are multiple possible and valid wounds for the same type and severity, weight will be used to pick among them. See _wound_pregen_data.dm for more details +/// This is used in pick_weight, so use integers +#define WOUND_DEFAULT_WEIGHT 50 + // ~wound severities /// for jokey/meme wounds like stubbed toe, no standard messages/sounds or second winds #define WOUND_SEVERITY_TRIVIAL 0 @@ -22,16 +25,26 @@ /// outright dismemberment of limb #define WOUND_SEVERITY_LOSS 4 +/// A "chronological" list of wound severities, starting at the least severe. +GLOBAL_LIST_INIT(wound_severities_chronological, list( + "[WOUND_SEVERITY_TRIVIAL]", + "[WOUND_SEVERITY_MODERATE]", + "[WOUND_SEVERITY_SEVERE]", + "[WOUND_SEVERITY_CRITICAL]" +)) -// ~wound categories +// ~wound categories: wounding_types /// any brute weapon/attack that doesn't have sharpness. rolls for blunt bone wounds -#define WOUND_BLUNT 1 +#define WOUND_BLUNT "wound_blunt" /// any brute weapon/attack with sharpness = SHARP_EDGED. rolls for slash wounds -#define WOUND_SLASH 2 +#define WOUND_SLASH "wound_slash" /// any brute weapon/attack with sharpness = SHARP_POINTY. rolls for piercing wounds -#define WOUND_PIERCE 3 +#define WOUND_PIERCE "wound_pierce" /// any concentrated burn attack (lasers really). rolls for burning wounds -#define WOUND_BURN 4 +#define WOUND_BURN "wound_burn" + +/// Mainly a define used for wound_pregen_data, if a pregen data instance expects this, it will accept any and all wound types, even none at all +#define WOUND_ALL "wound_all" // ~determination second wind defines @@ -46,20 +59,226 @@ /// While someone has determination in their system, their bleed rate is slightly reduced #define WOUND_DETERMINATION_BLEED_MOD 0.85 -// ~wound global lists -// list in order of highest severity to lowest -GLOBAL_LIST_INIT(global_wound_types, list(WOUND_BLUNT = list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate), - WOUND_SLASH = list(/datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate), - WOUND_PIERCE = list(/datum/wound/pierce/critical, /datum/wound/pierce/severe, /datum/wound/pierce/moderate), - WOUND_BURN = list(/datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate) - )) +/// Wounds using this competition mode will remove any wounds of a greater severity than itself in a random wound roll. In most cases, you dont want to use this. +#define WOUND_COMPETITION_OVERPOWER_GREATERS "wound_submit" +/// Wounds using this competition mode will remove any wounds of a lower severity than itself in a random wound roll. Used for ensuring the worse case scenario of a given injury_roll. +#define WOUND_COMPETITION_OVERPOWER_LESSERS "wound_dominate" + +// ~biology defines +// What kind of biology a limb has, and what wounds it can suffer +/// Has absolutely fucking nothing, no wounds +#define BIO_INORGANIC NONE +/// Has bone - allows the victim to suffer T2-T3 bone blunt wounds +#define BIO_BONE (1<<0) +/// Has flesh - allows the victim to suffer fleshy slash pierce and burn wounds +#define BIO_FLESH (1<<1) +/// Has metal - allows the victim to suffer robotic blunt and burn wounds +#define BIO_METAL (1<<2) +/// Is wired internally - allows the victim to suffer electrical wounds (robotic T1-T3 slash/pierce) +#define BIO_WIRED (1<<3) +/// Has bloodflow - can suffer bleeding wounds and can bleed +#define BIO_BLOODED (1<<4) +/// Is connected by a joint - can suffer T1 bone blunt wounds (dislocation) +#define BIO_JOINTED (1<<5) +/// Robotic - can suffer all metal/wired wounds, such as: UNIMPLEMENTED PLEASE UPDATE ONCE SYNTH WOUNDS 9/5/2023 ~Niko +#define BIO_ROBOTIC (BIO_METAL|BIO_WIRED) +/// Has flesh and bone - See BIO_BONE and BIO_FLESH +#define BIO_FLESH_BONE (BIO_BONE|BIO_FLESH) +/// Standard humanoid - can bleed and suffer all flesh/bone wounds, such as: T1-3 slash/pierce/burn/blunt, except dislocations. Think human heads/chests +#define BIO_STANDARD_UNJOINTED (BIO_FLESH_BONE|BIO_BLOODED) +/// Standard humanoid limbs - can bleed and suffer all flesh/bone wounds, such as: T1-3 slash/pierce/burn/blunt. Can also bleed, and be dislocated. Think human arms and legs +#define BIO_STANDARD_JOINTED (BIO_STANDARD_UNJOINTED|BIO_JOINTED) + +// "Where" a specific biostate is within a given limb +// Interior is hard shit, the last line, shit like bones +// Exterior is soft shit, targeted by slashes and pierces (usually), protects exterior +// A limb needs both mangled interior and exterior to be dismembered, but slash/pierce must mangle exterior to attack the interior +// Not having exterior/interior counts as mangled exterior/interior for the purposes of dismemberment +/// The given biostate is on the "interior" of the limb - hard shit, protected by exterior +#define ANATOMY_INTERIOR (1<<0) +/// The given biostate is on the "exterior" of the limb - soft shit, protects interior +#define ANATOMY_EXTERIOR (1<<1) +#define ANATOMY_EXTERIOR_AND_INTERIOR (ANATOMY_EXTERIOR|ANATOMY_INTERIOR) + +/// A assoc list of BIO_ define to EXTERIOR/INTERIOR defines. +/// This is where the interior/exterior state of a given biostate is set. +/// Note that not all biostates are guaranteed to be one of these - and in fact, many are not +/// IMPORTANT NOTE: All keys are stored as text and must be converted via text2num +GLOBAL_LIST_INIT(bio_state_anatomy, list( + "[BIO_WIRED]" = ANATOMY_EXTERIOR, + "[BIO_METAL]" = ANATOMY_INTERIOR, + "[BIO_FLESH]" = ANATOMY_EXTERIOR, + "[BIO_BONE]" = ANATOMY_INTERIOR, +)) + +// Wound series +// A "wound series" is just a family of wounds that logically follow eachother +// Multiple wounds in a single series cannot be on a limb - the highest severity will always be prioritized, and lower ones will be skipped + +/// T1-T3 Bleeding slash wounds. Requires flesh. Can cause bleeding, but doesn't require it. From: slash.dm +#define WOUND_SERIES_FLESH_SLASH_BLEED "wound_series_flesh_slash_bled" +/// T1-T3 Basic blunt wounds. T1 requires jointed, but 2-3 require bone. From: bone.dm +#define WOUND_SERIES_BONE_BLUNT_BASIC "wound_series_bone_blunt_basic" +/// T1-T3 Basic burn wounds. Requires flesh. From: burns.dm +#define WOUND_SERIES_FLESH_BURN_BASIC "wound_series_flesh_burn_basic" +/// T1-T3 Bleeding puncture wounds. Requires flesh. Can cause bleeding, but doesn't require it. From: pierce.dm +#define WOUND_SERIES_FLESH_PUNCTURE_BLEED "wound_series_flesh_puncture_bleed" +/// Generic loss wounds. See loss.dm +#define WOUND_SERIES_LOSS_BASIC "wound_series_loss_basic" + +/// A assoc list of (wound typepath -> wound_pregen_data instance). Every wound should have a pregen data. +GLOBAL_LIST_INIT_TYPED(all_wound_pregen_data, /datum/wound_pregen_data, generate_wound_static_data()) + +/// Constructs [GLOB.all_wound_pregen_data] by iterating through a typecache of pregen data, ignoring abstract types, and instantiating the rest. +/proc/generate_wound_static_data() + RETURN_TYPE(/list/datum/wound_pregen_data) + + var/list/datum/wound_pregen_data/all_pregen_data = list() + + for (var/datum/wound_pregen_data/iterated_path as anything in typecacheof(path = /datum/wound_pregen_data, ignore_root_path = TRUE)) + if (initial(iterated_path.abstract)) + continue + + if (!isnull(all_pregen_data[initial(iterated_path.wound_path_to_generate)])) + stack_trace("pre-existing pregen data for [initial(iterated_path.wound_path_to_generate)] when [iterated_path] was being considered: [all_pregen_data[initial(iterated_path.wound_path_to_generate)]]. \ + this is definitely a bug, and is probably because one of the two pregen data have the wrong wound typepath defined. [iterated_path] will not be instantiated") + + continue + + var/datum/wound_pregen_data/pregen_data = new iterated_path + all_pregen_data[pregen_data.wound_path_to_generate] = pregen_data + + return all_pregen_data + +// A wound series "collection" is merely a way for us to track what is in what series, and what their types are. +// Without this, we have no centralized way to determine what type is in what series outside of iterating over every pregen data. + +/// A branching assoc list of (series -> list(severity -> list(typepath -> weight))). Allows you to say "I want a generic slash wound", +/// then "Of severity 2", and get a wound of that description - via get_corresponding_wound_type() +/// Series: A generic wound_series, such as WOUND_SERIES_BONE_BLUNT_BASIC +/// Severity: Any wounds held within this will be of this severity. +/// Typepath, Weight: Merely a pairing of a given typepath to its weight, held for convenience in pickweight. +GLOBAL_LIST_INIT(wound_series_collections, generate_wound_series_collection()) + +// Series -> severity -> type -> weight +/// Generates [wound_series_collections] by iterating through all pregen_data. Refer to the mentioned list for documentation +/proc/generate_wound_series_collection() + RETURN_TYPE(/list/datum/wound) + + var/list/datum/wound/wound_collection = list() -// every single type of wound that can be rolled naturally, in case you need to pull a random one -GLOBAL_LIST_INIT(global_all_wound_types, list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate, - /datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate, - /datum/wound/pierce/critical, /datum/wound/pierce/severe, /datum/wound/pierce/moderate, - /datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate)) + for (var/datum/wound/wound_typepath as anything in typecacheof(/datum/wound, FALSE, TRUE)) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[wound_typepath] + if (!pregen_data) + continue + if (pregen_data.abstract) + stack_trace("somehow, a abstract wound_pregen_data instance ([pregen_data.type]) was instantiated and made it to generate_wound_series_collection()! \ + i literally have no idea how! please fix this!") + continue + + var/series = pregen_data.wound_series + var/list/datum/wound/series_list = wound_collection[series] + if (isnull(series_list)) + wound_collection[series] = list() + series_list = wound_collection[series] + + var/severity = "[(initial(wound_typepath.severity))]" + var/list/datum/wound/severity_list = series_list[severity] + if (isnull(severity_list)) + series_list[severity] = list() + severity_list = series_list[severity] + + severity_list[wound_typepath] = pregen_data.weight + + return wound_collection + +/// A branching assoc list of (wounding_type -> list(wound_series)). +/// Allows for determining of which wound series are caused by what. +GLOBAL_LIST_INIT(wounding_types_to_series, list( + WOUND_BLUNT = list( + WOUND_SERIES_BONE_BLUNT_BASIC + ), + WOUND_SLASH = list( + WOUND_SERIES_FLESH_SLASH_BLEED, + ), + WOUND_BURN = list( + WOUND_SERIES_FLESH_BURN_BASIC, + ), + WOUND_PUNCTURE = list( + WOUND_SERIES_FLESH_PUNCTURE_BLEED + ), +)) + +/// Used in get_corresponding_wound_type(): Will pick the highest severity wound out of severity_min and severity_max +#define WOUND_PICK_HIGHEST_SEVERITY 1 +/// Used in get_corresponding_wound_type(): Will pick the lowest severity wound out of severity_min and severity_max +#define WOUND_PICK_LOWEST_SEVERITY 2 + +/** + * Searches through all wounds for any of proper type, series, and biostate, and then returns a single one via pickweight. + * Is able to discern between, say, a flesh slash wound, and a metallic slash wound, and will return the respective one for the provided limb. + * + * The severity_max and severity_pick_mode args mostly exist in case you want a wound in a series that may not have your ideal severity wound, as it lets you + * essentially set a "fallback", where if your ideal wound doesnt exist, it'll still return something, trying to get closest to your ideal severity. + * + * Generally speaking, if you want a critical/severe/moderate wound, you should set severity_min to WOUND_SEVERITY_MODERATE, severity_max to your ideal wound, + * and severity_pick_mode to WOUND_PICK_HIGHEST_SEVERITY - UNLESS you for some reason want the LOWEST severity, in which case you should set + * severity_max to the highest wound you're willing to tolerate, and severity_pick_mode to WOUND_PICK_LOWEST_SEVERITY. + * + * Args: + * * list/wounding_types: A list of wounding_types. Only wounds that accept these wound types will be considered. + * * obj/item/bodypart/part: The limb we are considering. Extremely important for biostates. + * * severity_min: The minimum wound severity we will search for. + * * severity_max = severity_min: The maximum wound severity we will search for. + * * severity_pick_mode = WOUND_PICK_HIGHEST_SEVERITY: The "pick mode" we will use when considering multiple wounds of acceptable severity. See the above defines. + * * random_roll = TRUE: If this is considered a "random" consideration. If true, only wounds that can be randomly generated will be considered. + * * duplicates_allowed = FALSE: If exact duplicates of a given wound on part are tolerated. Useful for simply getting a path and not instantiating. + * * care_about_existing_wounds = TRUE: If we iterate over wounds to see if any are above or at a given wounds severity, and disregard it if any are. Useful for simply getting a path and not instantiating. + * + * Returns: + * A randomly picked wound typepath meeting all the above criteria and being applicable to the part's biotype - or null if there were none. + */ +/proc/get_corresponding_wound_type(list/wounding_types, obj/item/bodypart/part, severity_min, severity_max = severity_min, severity_pick_mode = WOUND_PICK_HIGHEST_SEVERITY, random_roll = TRUE, duplicates_allowed = FALSE, care_about_existing_wounds = TRUE) + RETURN_TYPE(/datum/wound) // note that just because its set to return this doesnt mean its non-nullable + + var/list/wounding_type_list = list() + for (var/wounding_type as anything in wounding_types) + wounding_type_list += GLOB.wounding_types_to_series[wounding_type] + if (!length(wounding_type_list)) + return null + + var/list/datum/wound/paths_to_pick_from = list() + for (var/series as anything in shuffle(wounding_type_list)) + var/list/severity_list = GLOB.wound_series_collections[series] + if (!length(severity_list)) + continue + + var/picked_severity + for (var/severity_text as anything in shuffle(GLOB.wound_severities_chronological)) + var/severity = text2num(severity_text) + if (severity > severity_min || severity < severity_max) + continue + + if (isnull(picked_severity) || ((severity_pick_mode == WOUND_PICK_HIGHEST_SEVERITY && severity > picked_severity) || (severity_pick_mode == WOUND_PICK_LOWEST_SEVERITY && severity < picked_severity))) + picked_severity = severity + + var/list/wound_typepaths = severity_list["[picked_severity]"] + if (!length(wound_typepaths)) + continue + + for (var/datum/wound/iterated_path as anything in wound_typepaths) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[iterated_path] + if (pregen_data.can_be_applied_to(part, wounding_types, random_roll = random_roll, duplicates_allowed = duplicates_allowed, care_about_existing_wounds = care_about_existing_wounds)) + paths_to_pick_from[iterated_path] = wound_typepaths[iterated_path] + + return pick_weight(paths_to_pick_from) // we found our winners! + +/// Assoc list of biotype -> ideal scar file to be used and grab stuff from. +GLOBAL_LIST_INIT(biotypes_to_scar_file, list( + "[BIO_FLESH]" = FLESH_SCAR_FILE, + "[BIO_BONE]" = BONE_SCAR_FILE +)) // ~burn wound infection defines // Thresholds for infection for burn wounds, once infestation hits each threshold, things get steadily worse @@ -87,40 +306,25 @@ GLOBAL_LIST_INIT(global_all_wound_types, list(/datum/wound/blunt/critical, /datu // ~mangling defines -// With the wounds pt. 2 update, general dismemberment now requires 2 things for a limb to be dismemberable (bone only creatures just need the second): -// 1. Flesh is mangled: A critical slash or pierce wound on that limb -// 2. Bone is mangled: At least a severe bone wound on that limb -// see [/obj/item/bodypart/proc/get_mangled_state] for more information +// With the wounds pt. 2 update, general dismemberment now requires 2 things for a limb to be dismemberable (exterior/bone only creatures just need the second): +// 1. Exterior is mangled: A critical slash or pierce wound on that limb +// 2. Interior is mangled: At least a severe bone wound on that limb +// Lack of exterior or interior count as mangled exterior/interior respectively +// see [/obj/item/bodypart/proc/get_mangled_state] for more information, as well as GLOB.bio_state_anatomy #define BODYPART_MANGLED_NONE NONE -#define BODYPART_MANGLED_BONE (1<<0) -#define BODYPART_MANGLED_FLESH (1<<1) -#define BODYPART_MANGLED_BOTH (BODYPART_MANGLED_BONE | BODYPART_MANGLED_FLESH) - - -// ~biology defines -// What kind of biology a limb has, and what wounds it can suffer -/// golems and androids, cannot suffer any wounds -#define BIO_INORGANIC NONE -/// skeletons and plasmemes, can only suffer bone wounds, only needs mangled bone to be able to dismember -#define BIO_BONE (1<<0) -/// nothing right now, maybe slimepeople in the future, can only suffer slashing, piercing, and burn wounds -#define BIO_FLESH (1<<1) -/// standard humanoids, can suffer all wounds, needs mangled bone and flesh to dismember. conveniently, what you get when you combine BIO_BONE and BIO_FLESH -#define BIO_FLESH_BONE (BIO_BONE | BIO_FLESH) - +#define BODYPART_MANGLED_INTERIOR (1<<0) +#define BODYPART_MANGLED_EXTERIOR (1<<1) +#define BODYPART_MANGLED_BOTH (BODYPART_MANGLED_INTERIOR | BODYPART_MANGLED_EXTERIOR) // ~wound flag defines -/// If this wound requires having the BIO_FLESH biological_state on the limb -#define FLESH_WOUND (1<<0) -/// If this wound requires having the BIO_BONE biological_state on the limb -#define BONE_WOUND (1<<1) -/// If having this wound counts as mangled flesh for dismemberment -#define MANGLES_FLESH (1<<2) -/// If having this wound counts as mangled bone for dismemberment -#define MANGLES_BONE (1<<3) +/// If having this wound counts as mangled exterior for dismemberment +#define MANGLES_EXTERIOR (1<<0) +/// If having this wound counts as mangled interior for dismemberment +#define MANGLES_INTERIOR (1<<1) /// If this wound marks the limb as being allowed to have gauze applied -#define ACCEPTS_GAUZE (1<<4) - +#define ACCEPTS_GAUZE (1<<2) +/// If this wound allows the victim to grasp it +#define CAN_BE_GRASPED (1<<3) // ~scar persistence defines // The following are the order placements for persistent scar save formats @@ -138,11 +342,13 @@ GLOBAL_LIST_INIT(global_all_wound_types, list(/datum/wound/blunt/critical, /datu #define SCAR_SAVE_BIOLOGY 6 /// Which character slot this was saved to #define SCAR_SAVE_CHAR_SLOT 7 +/// if the scar will check for any or all biostates on the limb (defaults to FALSE, so all) +#define SCAR_SAVE_CHECK_ANY_BIO 8 ///how many fields we save for each scar (so the number of above fields) -#define SCAR_SAVE_LENGTH 7 +#define SCAR_SAVE_LENGTH 8 /// saved scars with a version lower than this will be discarded, increment when you update the persistent scarring format in a way that invalidates previous saved scars (new fields, reordering, etc) -#define SCAR_CURRENT_VERSION 3 +#define SCAR_CURRENT_VERSION 4 /// how many scar slots, per character slot, we have to cycle through for persistent scarring, if enabled in character prefs #define PERSISTENT_SCAR_SLOTS 3 diff --git a/code/__DEFINES/~monkestation/antagonists.dm b/code/__DEFINES/~monkestation/antagonists.dm index 546c343bfcf2..8ec0def3b22b 100644 --- a/code/__DEFINES/~monkestation/antagonists.dm +++ b/code/__DEFINES/~monkestation/antagonists.dm @@ -1,8 +1,19 @@ +/// List of areas blacklisted from area based traitor objectives +#define TRAITOR_OBJECTIVE_BLACKLISTED_AREAS list(/area/station/engineering/hallway, \ + /area/station/engineering/lobby, \ + /area/station/engineering/storage, \ + /area/station/science/lobby, \ + /area/station/science/ordnance/bomb, \ + /area/station/science/ordnance/freezerchamber, \ + /area/station/science/ordnance/burnchamber, \ + /area/station/security/prison, \ + ) + // Clock cultist #define IS_CLOCK(mob) ((FACTION_CLOCK in mob.faction) || mob?.mind?.has_antag_datum(/datum/antagonist/clock_cultist)) /// maximum amount of cogscarabs the clock cult can have #define MAXIMUM_COGSCARABS 9 /// is something a cogscarab -#define iscogscarab(checked) (istype(checked, /mob/living/simple_animal/drone/cogscarab)) +#define iscogscarab(checked) (istype(checked, /mob/living/basic/drone/cogscarab)) /// is something an eminence #define iseminence(checked) (istype(checked, /mob/living/eminence)) diff --git a/code/__DEFINES/~monkestation/artifact.dm b/code/__DEFINES/~monkestation/artifact.dm new file mode 100644 index 000000000000..4442f9afa861 --- /dev/null +++ b/code/__DEFINES/~monkestation/artifact.dm @@ -0,0 +1,49 @@ + +//size +#define ARTIFACT_SIZE_TINY 0 //items +#define ARTIFACT_SIZE_SMALL 1 //big items +#define ARTIFACT_SIZE_LARGE 2 //not items + +// origins +#define ORIGIN_NARSIE "narnar" +#define ORIGIN_SILICON "silicon" +#define ORIGIN_WIZARD "wiznerd" +#define ORIGIN_PRECURSOR "precursor" +#define ORIGIN_MARTIAN "martian" +// rarities +#define ARTIFACT_COMMON 500 +#define ARTIFACT_UNCOMMON 400 +#define ARTIFACT_VERYUNCOMMON 300 +#define ARTIFACT_RARE 250 +#define ARTIFACT_VERYRARE 140 + +//cuts down on boiler plate code +#define ARTIFACT_SETUP(X,subsystem) ##X/Initialize(mapload, var/forced_origin = null){\ + . = ..();\ + START_PROCESSING(subsystem, src);\ + if(assoc_comp) {\ + assoc_comp = AddComponent(assoc_comp, forced_origin);\ + RegisterSignal(src, COMSIG_PARENT_QDELETING, PROC_REF(on_delete));\ + }\ +} \ +##X/proc/on_delete(atom/source){\ + SIGNAL_HANDLER;\ + assoc_comp = null;\ +} \ +##X/process(){\ + assoc_comp?.stimulate_from_turf_heat(get_turf(src));\ + if(assoc_comp?.active) {\ + assoc_comp.effect_process();\ + }\ +} \ +##X/rad_act(intensity){\ + assoc_comp?.stimulate_from_rad_act(intensity)\ +} + +#define STIMULUS_CARBON_TOUCH (1<<0) +#define STIMULUS_SILICON_TOUCH (1<<1) +#define STIMULUS_FORCE (1<<2) +#define STIMULUS_HEAT (1<<3) +#define STIMULUS_SHOCK (1<<4) +#define STIMULUS_RADIATION (1<<5) +#define STIMULUS_DATA (1<<6) diff --git a/code/__DEFINES/~monkestation/asteroids.dm b/code/__DEFINES/~monkestation/asteroids.dm new file mode 100644 index 000000000000..1e8792bbd61f --- /dev/null +++ b/code/__DEFINES/~monkestation/asteroids.dm @@ -0,0 +1,16 @@ +/// Used in asteroid composition lists to indicate a skip +#define SKIP "skip" + +// Mining template rarities +#define MINING_NO_RANDOM_SPAWN -1 +#define MINING_COMMON 1 +#define MINING_UNCOMMON 2 +#define MINING_RARE 3 + +/// YOU MUST USE THIS OVER CHECK_TICK IN ASTEROID GENERATION +#define GENERATOR_CHECK_TICK \ + if(TICK_CHECK) { \ + SSatoms.map_loader_stop(REF(template)); \ + stoplag(); \ + SSatoms.map_loader_begin(REF(template)); \ + } diff --git a/code/__DEFINES/~monkestation/dcs/signals/signals_traitor.dm b/code/__DEFINES/~monkestation/dcs/signals/signals_traitor.dm new file mode 100644 index 000000000000..dc3ae8cda176 --- /dev/null +++ b/code/__DEFINES/~monkestation/dcs/signals/signals_traitor.dm @@ -0,0 +1,4 @@ +/// Sent when a bug activates +#define COMSIG_TRAITOR_BUG_ACTIVATED "traitor_bug_activated" +/// Sent when a T1de bug activates +#define COMSIG_GLOBAL_GREY_TIDE_TRAITOR "grey_tide_traitor" diff --git a/code/__DEFINES/~monkestation/storytellers.dm b/code/__DEFINES/~monkestation/storytellers.dm new file mode 100644 index 000000000000..ce06c4ed58db --- /dev/null +++ b/code/__DEFINES/~monkestation/storytellers.dm @@ -0,0 +1,97 @@ + +//Could be bitflags, but that would require a good amount of translations, which eh, either way works for me +/// When the event is combat oriented (spawning monsters, inherently hostile antags) +#define TAG_COMBAT "combat" +/// When the event is spooky (broken lights, some antags) +#define TAG_SPOOKY "spooky" +/// When the event is destructive in a decent capacity (meteors, blob) +#define TAG_DESTRUCTIVE "destructive" +/// When the event impacts most of the crewmembers in some capacity (comms blackout) +#define TAG_COMMUNAL "communal" +/// When the event targets a person for something (appendix, heart attack) +#define TAG_TARGETED "targeted" +/// When the event is positive and helps the crew, in some capacity (Shuttle Loan, Supply Pod) +#define TAG_POSITIVE "positive" +/// When one of the crewmembers becomes an antagonist +#define TAG_CREW_ANTAG "crew_antag" +/// When the antagonist event is focused around team cooperation. +#define TAG_TEAM_ANTAG "team_antag" +/// When one of the non-crewmember players becomes an antagonist +#define TAG_OUTSIDER_ANTAG "away_antag" +/// When the event impacts the overmap +#define TAG_OVERMAP "overmap" +/// When the event requires the station to be in space (meteors, carp) +#define TAG_SPACE "space" +/// When the event requires the station to be on planetary. +#define TAG_PLANETARY "planetary" +/// When the event is an external threat(meteors, nukies). +#define TAG_EXTERNAL "external" + +#define EVENT_TRACK_MUNDANE "Mundane" +#define EVENT_TRACK_MODERATE "Moderate" +#define EVENT_TRACK_MAJOR "Major" +#define EVENT_TRACK_ROLESET "Roleset" +#define EVENT_TRACK_OBJECTIVES "Objectives" + +#define ALL_EVENTS "All" +#define UNCATEGORIZED_EVENTS "Uncategorized" + +#define STORYTELLER_WAIT_TIME 5 SECONDS + +#define EVENT_POINT_GAINED_PER_SECOND 0.08 + +#define TRACK_FAIL_POINT_PENALTY_MULTIPLIER 0.75 + +#define GAMEMODE_PANEL_MAIN "Main" +#define GAMEMODE_PANEL_VARIABLES "Variables" + +#define MUNDANE_POINT_THRESHOLD 40 +#define MODERATE_POINT_THRESHOLD 70 +#define MAJOR_POINT_THRESHOLD 130 +#define ROLESET_POINT_THRESHOLD 150 +#define OBJECTIVES_POINT_THRESHOLD 170 + +#define MUNDANE_MIN_POP 4 +#define MODERATE_MIN_POP 6 +#define MAJOR_MIN_POP 20 +#define ROLESET_MIN_POP 25 +#define OBJECTIVES_MIN_POP 20 + +/// Defines for how much pop do we need to stop applying a pop scalling penalty to event frequency. +#define MUNDANE_POP_SCALE_THRESHOLD 25 +#define MODERATE_POP_SCALE_THRESHOLD 32 +#define MAJOR_POP_SCALE_THRESHOLD 45 +#define ROLESET_POP_SCALE_THRESHOLD 45 +#define OBJECTIVES_POP_SCALE_THRESHOLD 45 + +/// The maximum penalty coming from pop scalling, when we're at the most minimum point, easing into 0 as we reach the SCALE_THRESHOLD. This is treated as a percentage. +#define MUNDANE_POP_SCALE_PENALTY 35 +#define MODERATE_POP_SCALE_PENALTY 35 +#define MAJOR_POP_SCALE_PENALTY 35 +#define ROLESET_POP_SCALE_PENALTY 35 +#define OBJECTIVES_POP_SCALE_PENALTY 35 + +#define STORYTELLER_VOTE "storyteller" + +#define EVENT_TRACKS list(EVENT_TRACK_MUNDANE, EVENT_TRACK_MODERATE, EVENT_TRACK_MAJOR, EVENT_TRACK_ROLESET, EVENT_TRACK_OBJECTIVES) +#define EVENT_PANEL_TRACKS list(EVENT_TRACK_MUNDANE, EVENT_TRACK_MODERATE, EVENT_TRACK_MAJOR, EVENT_TRACK_ROLESET, EVENT_TRACK_OBJECTIVES, UNCATEGORIZED_EVENTS, ALL_EVENTS) + +/// Defines for the antag cap to prevent midround injections. +#define ANTAG_CAP_FLAT 2 +#define ANTAG_CAP_DENOMINATOR 9 + +///Below are defines for roundstart point pool. The GAIN ones are multiplied by ready population +#define ROUNDSTART_MUNDANE_BASE 20 +#define ROUNDSTART_MUNDANE_GAIN 0.5 + +#define ROUNDSTART_MODERATE_BASE 35 +#define ROUNDSTART_MODERATE_GAIN 1.2 + +#define ROUNDSTART_MAJOR_BASE 40 +#define ROUNDSTART_MAJOR_GAIN 2 + +#define ROUNDSTART_ROLESET_BASE 60 +#define ROUNDSTART_ROLESET_GAIN 4 + +#define ROUNDSTART_OBJECTIVES_BASE 40 +#define ROUNDSTART_OBJECTIVES_GAIN 2 diff --git a/code/__HELPERS/bodyparts.dm b/code/__HELPERS/bodyparts.dm index 39df8e37e5ff..6a76ef50870d 100644 --- a/code/__HELPERS/bodyparts.dm +++ b/code/__HELPERS/bodyparts.dm @@ -1 +1,3 @@ #define IS_ORGANIC_LIMB(limb) (limb.bodytype & BODYTYPE_ORGANIC) +/// Helper to figure out if a limb is robotic +#define IS_ROBOTIC_LIMB(limb) (limb.bodytype & BODYTYPE_ROBOTIC) diff --git a/code/__HELPERS/chat.dm b/code/__HELPERS/chat.dm index fdf997a0bc54..e4538c9731ec 100644 --- a/code/__HELPERS/chat.dm +++ b/code/__HELPERS/chat.dm @@ -76,3 +76,19 @@ In TGS3 it will always be sent to all connected designated game chats. /// Handles text formatting for item use hints in examine text #define EXAMINE_HINT(text) ("" + text + "") + +/// Sends a message to all dead and observing players, if a source is provided a follow link will be attached. +/proc/send_to_observers(message, source) + var/list/all_observers = GLOB.dead_player_list + GLOB.current_observers_list + for(var/mob/observer as anything in all_observers) + if (isnull(source)) + to_chat(observer, "[message]") + continue + var/link = FOLLOW_LINK(observer, source) + to_chat(observer, "[link] [message]") + +/// Sends a message to everyone within the list, as well as all observers. +/proc/relay_to_list_and_observers(message, list/mob_list, source) + for(var/mob/creature as anything in mob_list) + to_chat(creature, message) + send_to_observers(message, source) diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index e7af8e0dcd7c..0eb8457a46cd 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -170,3 +170,11 @@ /// Orders heretic knowledge by priority /proc/cmp_heretic_knowledge(datum/heretic_knowledge/knowledge_a, datum/heretic_knowledge/knowledge_b) return initial(knowledge_b.priority) - initial(knowledge_a.priority) + +/// Passed a list of assoc lists, sorts them by the list's "name" keys. +/proc/cmp_assoc_list_name(list/A, list/B) + return sorttext(B["name"], A["name"]) + +/// Orders mobs by health +/proc/cmp_mob_health(mob/living/mob_a, mob/living/mob_b) + return mob_b.health - mob_a.health diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 6eb8fe60fb93..b7d8de1bc404 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -44,6 +44,7 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_appendages, GLOB.arachnid_appendages_list) //Monkestation Addition init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_chelicerae, GLOB.arachnid_chelicerae_list) //Monkestation Addition init_sprite_accessory_subtypes(/datum/sprite_accessory/goblin_ears, GLOB.goblin_ears_list) //Monkestation Addition + init_sprite_accessory_subtypes(/datum/sprite_accessory/floran_leaves, GLOB.floran_leaves_list) //Monkestation Addition //Species for(var/spath in subtypesof(/datum/species)) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 3cebfa315c98..adabbeee3ce4 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1478,3 +1478,13 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects) if(scream) stack_trace("Icon Lookup for state: [state] in file [file] failed.") return FALSE + +/// Cache of the width and height of icon files, to avoid repeating the same expensive operation +GLOBAL_LIST_EMPTY(icon_dimensions) + +/// Returns a list containing the width and height of an icon file +/proc/get_icon_dimensions(icon_path) + if (isnull(GLOB.icon_dimensions[icon_path])) + var/icon/my_icon = icon(icon_path) + GLOB.icon_dimensions[icon_path] = list("width" = my_icon.Width(), "height" = my_icon.Height()) + return GLOB.icon_dimensions[icon_path] diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index fa28f3c40cfb..e8f8d96b9a41 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -110,6 +110,8 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_chelicerae, GLOB.arachnid_chelicerae_list) if(!GLOB.goblin_ears_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/goblin_ears, GLOB.goblin_ears_list) + if(!GLOB.floran_leaves_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/floran_leaves, GLOB.floran_leaves_list) //Monkestation Addition End //For now we will always return none for tail_human and ears. | "For now" he says. @@ -142,7 +144,8 @@ "arachnid_appendages" = pick(GLOB.arachnid_appendages_list), //Monkestation Addition "arachnid_chelicerae" = pick(GLOB.arachnid_chelicerae_list), //Monkestation Addition "animecolor" = "#[pick("7F","FF")][pick("7F","FF")][pick("7F","FF")]", //Monkestation Addition - "goblin_ears" = pick(GLOB.goblin_ears_list) //Monkestation Addition + "goblin_ears" = pick(GLOB.goblin_ears_list), //Monkestation Addition + "floran_leaves" = pick(GLOB.floran_leaves_list), //Monkestation Addition )) /proc/random_hairstyle(gender) diff --git a/code/__HELPERS/path.dm b/code/__HELPERS/path.dm deleted file mode 100644 index 09c1e882f4e6..000000000000 --- a/code/__HELPERS/path.dm +++ /dev/null @@ -1,458 +0,0 @@ -/** - * This file contains the stuff you need for using JPS (Jump Point Search) pathing, an alternative to A* that skips - * over large numbers of uninteresting tiles resulting in much quicker pathfinding solutions. Mind that diagonals - * cost the same as cardinal moves currently, so paths may look a bit strange, but should still be optimal. - */ - -/** - * This is the proc you use whenever you want to have pathfinding more complex than "try stepping towards the thing". - * If no path was found, returns an empty list, which is important for bots like medibots who expect an empty list rather than nothing. - * It will yield until a path is returned, using magic - * - * Arguments: - * * caller: The movable atom that's trying to find the path - * * end: What we're trying to path to. It doesn't matter if this is a turf or some other atom, we're gonna just path to the turf it's on anyway - * * max_distance: The maximum number of steps we can take in a given path to search (default: 30, 0 = infinite) - * * mintargetdistance: Minimum distance to the target before path returns, could be used to get near a target, but not right to it - for an AI mob with a gun, for example. - * * id: An ID card representing what access we have and what doors we can open. Its location relative to the pathing atom is irrelevant - * * simulated_only: Whether we consider turfs without atmos simulation (AKA do we want to ignore space) - * * exclude: If we want to avoid a specific turf, like if we're a mulebot who already got blocked by some turf - * * skip_first: Whether or not to delete the first item in the path. This would be done because the first item is the starting tile, which can break movement for some creatures. - * * diagonal_safety: ensures diagonal moves won't use invalid midstep turfs by splitting them into two orthogonal moves if necessary - */ -/proc/get_path_to(atom/movable/caller, atom/end, max_distance = 30, mintargetdist, id=null, simulated_only = TRUE, turf/exclude, skip_first=TRUE, diagonal_safety=TRUE) - var/list/path = list() - // We're guarenteed that list will be the first list in pathfinding_finished's argset because of how callback handles the arguments list - var/datum/callback/await = CALLBACK(GLOBAL_PROC, /proc/pathfinding_finished, path) - if(!SSpathfinder.pathfind(caller, end, max_distance, mintargetdist, id, simulated_only, exclude, skip_first, diagonal_safety, await)) - return list() - - UNTIL(length(path)) - if(length(path) == 1 && path[1] == null || (QDELETED(caller) || QDELETED(end))) // It's trash, just hand back null to make it easy - return list() - return path - -/// Uses funny pass by reference bullshit to take the path created by pathfinding, and insert it into a return list -/// We'll be able to use this return list to tell a sleeping proc to continue execution -/proc/pathfinding_finished(list/return_list, list/path) - // We use += here to ensure the list is still pointing at the same thing - return_list += path - -/** - * A helper macro to see if it's possible to step from the first turf into the second one, minding things like door access and directional windows. - * Note that this can only be used inside the [datum/pathfind][pathfind datum] since it uses variables from said datum. - * If you really want to optimize things, optimize this, cuz this gets called a lot. - * We do early next.density check despite it being already checked in LinkBlockedWithAccess for short-circuit performance - */ -#define CAN_STEP(cur_turf, next) (next && !next.density && !(simulated_only && SSpathfinder.space_type_cache[next.type]) && !cur_turf.LinkBlockedWithAccess(next,caller, id) && (next != avoid)) -/// Another helper macro for JPS, for telling when a node has forced neighbors that need expanding -#define STEP_NOT_HERE_BUT_THERE(cur_turf, dirA, dirB) ((!CAN_STEP(cur_turf, get_step(cur_turf, dirA)) && CAN_STEP(cur_turf, get_step(cur_turf, dirB)))) - -/// The JPS Node datum represents a turf that we find interesting enough to add to the open list and possibly search for new tiles from -/datum/jps_node - /// The turf associated with this node - var/turf/tile - /// The node we just came from - var/datum/jps_node/previous_node - /// The A* node weight (f_value = number_of_tiles + heuristic) - var/f_value - /// The A* node heuristic (a rough estimate of how far we are from the goal) - var/heuristic - /// How many steps it's taken to get here from the start (currently pulling double duty as steps taken & cost to get here, since all moves incl diagonals cost 1 rn) - var/number_tiles - /// How many steps it took to get here from the last node - var/jumps - /// Nodes store the endgoal so they can process their heuristic without a reference to the pathfind datum - var/turf/node_goal - -/datum/jps_node/New(turf/our_tile, datum/jps_node/incoming_previous_node, jumps_taken, turf/incoming_goal) - tile = our_tile - jumps = jumps_taken - if(incoming_goal) // if we have the goal argument, this must be the first/starting node - node_goal = incoming_goal - else if(incoming_previous_node) // if we have the parent, this is from a direct lateral/diagonal scan, we can fill it all out now - previous_node = incoming_previous_node - number_tiles = previous_node.number_tiles + jumps - node_goal = previous_node.node_goal - heuristic = get_dist(tile, node_goal) - f_value = number_tiles + heuristic - // otherwise, no parent node means this is from a subscan lateral scan, so we just need the tile for now until we call [datum/jps/proc/update_parent] on it - -/datum/jps_node/Destroy(force, ...) - previous_node = null - return ..() - -/datum/jps_node/proc/update_parent(datum/jps_node/new_parent) - previous_node = new_parent - node_goal = previous_node.node_goal - jumps = get_dist(tile, previous_node.tile) - number_tiles = previous_node.number_tiles + jumps - heuristic = get_dist(tile, node_goal) - f_value = number_tiles + heuristic - -/// TODO: Macro this to reduce proc overhead -/proc/HeapPathWeightCompare(datum/jps_node/a, datum/jps_node/b) - return b.f_value - a.f_value - -/// The datum used to handle the JPS pathfinding, completely self-contained -/datum/pathfind - /// The thing that we're actually trying to path for - var/atom/movable/caller - /// The turf where we started at - var/turf/start - /// The turf we're trying to path to (note that this won't track a moving target) - var/turf/end - /// The open list/stack we pop nodes out from (TODO: make this a normal list and macro-ize the heap operations to reduce proc overhead) - var/datum/heap/open - ///An assoc list that serves as the closed list & tracks what turfs came from where. Key is the turf, and the value is what turf it came from - var/list/sources - /// The list we compile at the end if successful to pass back - var/list/path - - // general pathfinding vars/args - /// An ID card representing what access we have and what doors we can open. Its location relative to the pathing atom is irrelevant - var/obj/item/card/id/id - /// How far away we have to get to the end target before we can call it quits - var/mintargetdist = 0 - /// I don't know what this does vs , but they limit how far we can search before giving up on a path - var/max_distance = 30 - /// Space is big and empty, if this is TRUE then we ignore pathing through unsimulated tiles - var/simulated_only - /// A specific turf we're avoiding, like if a mulebot is being blocked by someone t-posing in a doorway we're trying to get through - var/turf/avoid - /// If we should delete the first step in the path or not. Used often because it is just the starting tile - var/skip_first = FALSE - /// Ensures diagonal moves won't use invalid midstep turfs by splitting them into two orthogonal moves if necessary - var/diagonal_safety = TRUE - /// The callback to invoke when we're done working, passing in the completed var/list/path - var/datum/callback/on_finish - -/datum/pathfind/New(atom/movable/caller, atom/goal, id, max_distance, mintargetdist, simulated_only, avoid, skip_first, diagonal_safety, datum/callback/on_finish) - src.caller = caller - end = get_turf(goal) - open = new /datum/heap(/proc/HeapPathWeightCompare) - sources = new() - src.id = id - src.max_distance = max_distance - src.mintargetdist = mintargetdist - src.simulated_only = simulated_only - src.avoid = avoid - src.skip_first = skip_first - src.diagonal_safety = diagonal_safety - src.on_finish = on_finish - -/datum/pathfind/Destroy(force, ...) - . = ..() - SSpathfinder.active_pathing -= src - SSpathfinder.currentrun -= src - if(on_finish) - on_finish.Invoke(null) - -/** - * "starts" off the pathfinding, by storing the values this datum will need to work later on - * returns FALSE if it fails to setup properly, TRUE otherwise - */ -/datum/pathfind/proc/start() - start = get_turf(caller) - if(!start || !get_turf(end)) - stack_trace("Invalid A* start or destination") - return FALSE - if(start.z != end.z || start == end ) //no pathfinding between z levels - return FALSE - if(max_distance && (max_distance < get_dist(start, end))) //if start turf is farther than max_distance from end turf, no need to do anything - return FALSE - - var/datum/jps_node/current_processed_node = new (start, -1, 0, end) - open.insert(current_processed_node) - sources[start] = start // i'm sure this is fine - return TRUE - -/** - * search_step() is the workhorse of pathfinding. It'll do the searching logic, and will slowly build up a path - * returns TRUE if everything is stable, FALSE if the pathfinding logic has failed, and we need to abort - */ -/datum/pathfind/proc/search_step() - if(QDELETED(caller)) - return FALSE - - while(!open.is_empty() && !path) - var/datum/jps_node/current_processed_node = open.pop() //get the lower f_value turf in the open list - if(max_distance && (current_processed_node.number_tiles > max_distance))//if too many steps, don't process that path - continue - - var/turf/current_turf = current_processed_node.tile - for(var/scan_direction in list(EAST, WEST, NORTH, SOUTH)) - lateral_scan_spec(current_turf, scan_direction, current_processed_node) - - for(var/scan_direction in list(NORTHEAST, SOUTHEAST, NORTHWEST, SOUTHWEST)) - diag_scan_spec(current_turf, scan_direction, current_processed_node) - - // Stable, we'll just be back later - if(TICK_CHECK) - return TRUE - return TRUE - -/** - * early_exit() is called when something goes wrong in processing, and we need to halt the pathfinding NOW - */ -/datum/pathfind/proc/early_exit() - on_finish.Invoke(null) - on_finish = null - qdel(src) - -/** - * Cleanup pass for the pathfinder. This tidies up the path, and fufills the pathfind's obligations - */ -/datum/pathfind/proc/finished() - //we're done! reverse the path to get it from start to finish - if(path) - for(var/i = 1 to round(0.5 * length(path))) - path.Swap(i, length(path) - i + 1) - sources = null - QDEL_NULL(open) - - if(diagonal_safety) - path = diagonal_movement_safety() - if(length(path) > 0 && skip_first) - path.Cut(1,2) - on_finish.Invoke(path) - on_finish = null - qdel(src) - -/// Called when we've hit the goal with the node that represents the last tile, then sets the path var to that path so it can be returned by [datum/pathfind/proc/search] -/datum/pathfind/proc/unwind_path(datum/jps_node/unwind_node) - path = new() - var/turf/iter_turf = unwind_node.tile - path.Add(iter_turf) - - while(unwind_node.previous_node) - var/dir_goal = get_dir(iter_turf, unwind_node.previous_node.tile) - for(var/i = 1 to unwind_node.jumps) - iter_turf = get_step(iter_turf,dir_goal) - path.Add(iter_turf) - unwind_node = unwind_node.previous_node - -/datum/pathfind/proc/diagonal_movement_safety() - if(length(path) < 2) - return - var/list/modified_path = list() - - for(var/i in 1 to length(path) - 1) - var/turf/current_turf = path[i] - var/turf/next_turf = path[i+1] - var/movement_dir = get_dir(current_turf, next_turf) - if(!(movement_dir & (movement_dir - 1))) //cardinal movement, no need to verify - modified_path += current_turf - continue - //If default diagonal movement step is invalid, replace with alternative two steps - if(movement_dir & NORTH) - if(!CAN_STEP(current_turf,get_step(current_turf,NORTH))) - modified_path += current_turf - modified_path += get_step(current_turf, movement_dir & ~NORTH) - else - modified_path += current_turf - else - if(!CAN_STEP(current_turf,get_step(current_turf,SOUTH))) - modified_path += current_turf - modified_path += get_step(current_turf, movement_dir & ~SOUTH) - else - modified_path += current_turf - modified_path += path[length(path)] - - return modified_path - -/** - * For performing lateral scans from a given starting turf. - * - * These scans are called from both the main search loop, as well as subscans for diagonal scans, and they treat finding interesting turfs slightly differently. - * If we're doing a normal lateral scan, we already have a parent node supplied, so we just create the new node and immediately insert it into the heap, ezpz. - * If we're part of a subscan, we still need for the diagonal scan to generate a parent node, so we return a node datum with just the turf and let the diag scan - * proc handle transferring the values and inserting them into the heap. - * - * Arguments: - * * original_turf: What turf did we start this scan at? - * * heading: What direction are we going in? Obviously, should be cardinal - * * parent_node: Only given for normal lateral scans, if we don't have one, we're a diagonal subscan. -*/ -/datum/pathfind/proc/lateral_scan_spec(turf/original_turf, heading, datum/jps_node/parent_node) - var/steps_taken = 0 - - var/turf/current_turf = original_turf - var/turf/lag_turf = original_turf - - while(TRUE) - if(path) - return - lag_turf = current_turf - current_turf = get_step(current_turf, heading) - steps_taken++ - if(!CAN_STEP(lag_turf, current_turf)) - return - - if(current_turf == end || (mintargetdist && (get_dist(current_turf, end) <= mintargetdist))) - var/datum/jps_node/final_node = new(current_turf, parent_node, steps_taken) - sources[current_turf] = original_turf - if(parent_node) // if this is a direct lateral scan we can wrap up, if it's a subscan from a diag, we need to let the diag make their node first, then finish - unwind_path(final_node) - return final_node - else if(sources[current_turf]) // already visited, essentially in the closed list - return - else - sources[current_turf] = original_turf - - if(parent_node && parent_node.number_tiles + steps_taken > max_distance) - return - - var/interesting = FALSE // have we found a forced neighbor that would make us add this turf to the open list? - - switch(heading) - if(NORTH) - if(STEP_NOT_HERE_BUT_THERE(current_turf, WEST, NORTHWEST) || STEP_NOT_HERE_BUT_THERE(current_turf, EAST, NORTHEAST)) - interesting = TRUE - if(SOUTH) - if(STEP_NOT_HERE_BUT_THERE(current_turf, WEST, SOUTHWEST) || STEP_NOT_HERE_BUT_THERE(current_turf, EAST, SOUTHEAST)) - interesting = TRUE - if(EAST) - if(STEP_NOT_HERE_BUT_THERE(current_turf, NORTH, NORTHEAST) || STEP_NOT_HERE_BUT_THERE(current_turf, SOUTH, SOUTHEAST)) - interesting = TRUE - if(WEST) - if(STEP_NOT_HERE_BUT_THERE(current_turf, NORTH, NORTHWEST) || STEP_NOT_HERE_BUT_THERE(current_turf, SOUTH, SOUTHWEST)) - interesting = TRUE - - if(interesting) - var/datum/jps_node/newnode = new(current_turf, parent_node, steps_taken) - if(parent_node) // if we're a diagonal subscan, we'll handle adding ourselves to the heap in the diag - open.insert(newnode) - return newnode - -/** - * For performing diagonal scans from a given starting turf. - * - * Unlike lateral scans, these only are called from the main search loop, so we don't need to worry about returning anything, - * though we do need to handle the return values of our lateral subscans of course. - * - * Arguments: - * * original_turf: What turf did we start this scan at? - * * heading: What direction are we going in? Obviously, should be diagonal - * * parent_node: We should always have a parent node for diagonals -*/ -/datum/pathfind/proc/diag_scan_spec(turf/original_turf, heading, datum/jps_node/parent_node) - var/steps_taken = 0 - var/turf/current_turf = original_turf - var/turf/lag_turf = original_turf - - while(TRUE) - if(path) - return - lag_turf = current_turf - current_turf = get_step(current_turf, heading) - steps_taken++ - if(!CAN_STEP(lag_turf, current_turf)) - return - - if(current_turf == end || (mintargetdist && (get_dist(current_turf, end) <= mintargetdist))) - var/datum/jps_node/final_node = new(current_turf, parent_node, steps_taken) - sources[current_turf] = original_turf - unwind_path(final_node) - return - else if(sources[current_turf]) // already visited, essentially in the closed list - return - else - sources[current_turf] = original_turf - - if(parent_node.number_tiles + steps_taken > max_distance) - return - - var/interesting = FALSE // have we found a forced neighbor that would make us add this turf to the open list? - var/datum/jps_node/possible_child_node // otherwise, did one of our lateral subscans turn up something? - - switch(heading) - if(NORTHWEST) - if(STEP_NOT_HERE_BUT_THERE(current_turf, EAST, NORTHEAST) || STEP_NOT_HERE_BUT_THERE(current_turf, SOUTH, SOUTHWEST)) - interesting = TRUE - else - possible_child_node = (lateral_scan_spec(current_turf, WEST) || lateral_scan_spec(current_turf, NORTH)) - if(NORTHEAST) - if(STEP_NOT_HERE_BUT_THERE(current_turf, WEST, NORTHWEST) || STEP_NOT_HERE_BUT_THERE(current_turf, SOUTH, SOUTHEAST)) - interesting = TRUE - else - possible_child_node = (lateral_scan_spec(current_turf, EAST) || lateral_scan_spec(current_turf, NORTH)) - if(SOUTHWEST) - if(STEP_NOT_HERE_BUT_THERE(current_turf, EAST, SOUTHEAST) || STEP_NOT_HERE_BUT_THERE(current_turf, NORTH, NORTHWEST)) - interesting = TRUE - else - possible_child_node = (lateral_scan_spec(current_turf, SOUTH) || lateral_scan_spec(current_turf, WEST)) - if(SOUTHEAST) - if(STEP_NOT_HERE_BUT_THERE(current_turf, WEST, SOUTHWEST) || STEP_NOT_HERE_BUT_THERE(current_turf, NORTH, NORTHEAST)) - interesting = TRUE - else - possible_child_node = (lateral_scan_spec(current_turf, SOUTH) || lateral_scan_spec(current_turf, EAST)) - - if(interesting || possible_child_node) - var/datum/jps_node/newnode = new(current_turf, parent_node, steps_taken) - open.insert(newnode) - if(possible_child_node) - possible_child_node.update_parent(newnode) - open.insert(possible_child_node) - if(possible_child_node.tile == end || (mintargetdist && (get_dist(possible_child_node.tile, end) <= mintargetdist))) - unwind_path(possible_child_node) - return - -/** - * For seeing if we can actually move between 2 given turfs while accounting for our access and the caller's pass_flags - * - * Assumes destinantion turf is non-dense - check and shortcircuit in code invoking this proc to avoid overhead. - * Makes some other assumptions, such as assuming that unless declared, non dense objects will not block movement. - * It's fragile, but this is VERY much the most expensive part of JPS, so it'd better be fast - * - * Arguments: - * * caller: The movable, if one exists, being used for mobility checks to see what tiles it can reach - * * ID: An ID card that decides if we can gain access to doors that would otherwise block a turf - * * simulated_only: Do we only worry about turfs with simulated atmos, most notably things that aren't space? - * * no_id: When true, doors with public access will count as impassible -*/ -/turf/proc/LinkBlockedWithAccess(turf/destination_turf, atom/movable/caller, ID, no_id = FALSE) - if(destination_turf.x != x && destination_turf.y != y) //diagonal - var/in_dir = get_dir(destination_turf,src) // eg. northwest (1+8) = 9 (00001001) - var/first_step_direction_a = in_dir & 3 // eg. north (1+8)&3 (0000 0011) = 1 (0000 0001) - var/first_step_direction_b = in_dir & 12 // eg. west (1+8)&12 (0000 1100) = 8 (0000 1000) - - for(var/first_step_direction in list(first_step_direction_a,first_step_direction_b)) - var/turf/midstep_turf = get_step(destination_turf,first_step_direction) - var/way_blocked = midstep_turf.density || LinkBlockedWithAccess(midstep_turf, caller, ID, no_id) || midstep_turf.LinkBlockedWithAccess(destination_turf, caller, ID, no_id) - if(!way_blocked) - return FALSE - return TRUE - var/actual_dir = get_dir(src, destination_turf) - - /// These are generally cheaper than looping contents so they go first - switch(destination_turf.pathing_pass_method) - // This is already assumed to be true - //if(TURF_PATHING_PASS_DENSITY) - // if(destination_turf.density) - // return TRUE - if(TURF_PATHING_PASS_PROC) - if(!destination_turf.CanAStarPass(ID, actual_dir, caller, no_id)) - return TRUE - if(TURF_PATHING_PASS_NO) - return TRUE - - var/static/list/directional_blocker_cache = typecacheof(list(/obj/structure/window, /obj/machinery/door/window, /obj/structure/railing, /obj/machinery/door/firedoor/border_only)) - // Source border object checks - for(var/obj/border in src) - if(!directional_blocker_cache[border.type]) - continue - if(!border.density && border.can_astar_pass == CANASTARPASS_DENSITY) - continue - if(!border.CanAStarPass(ID, actual_dir, no_id = no_id)) - return TRUE - - // Destination blockers check - var/reverse_dir = get_dir(destination_turf, src) - for(var/obj/iter_object in destination_turf) - // This is an optimization because of the massive call count of this code - if(!iter_object.density && iter_object.can_astar_pass == CANASTARPASS_DENSITY) - continue - if(!iter_object.CanAStarPass(ID, reverse_dir, caller, no_id)) - return TRUE - return FALSE diff --git a/code/__HELPERS/paths/jps.dm b/code/__HELPERS/paths/jps.dm new file mode 100644 index 000000000000..6ef883c7d2b4 --- /dev/null +++ b/code/__HELPERS/paths/jps.dm @@ -0,0 +1,306 @@ +/** + * This file contains the stuff you need for using JPS (Jump Point Search) pathing, an alternative to A* that skips + * over large numbers of uninteresting tiles resulting in much quicker pathfinding solutions. Mind that diagonals + * cost the same as cardinal moves currently, so paths may look a bit strange, but should still be optimal. + */ + +/// A helper macro for JPS, for telling when a node has forced neighbors that need expanding +/// Only usable in the context of the jps datum because of the datum vars it relies on +#define STEP_NOT_HERE_BUT_THERE(cur_turf, dirA, dirB) ((!CAN_STEP(cur_turf, get_step(cur_turf, dirA), simulated_only, pass_info, avoid) && CAN_STEP(cur_turf, get_step(cur_turf, dirB), simulated_only, pass_info, avoid))) + +/// The JPS Node datum represents a turf that we find interesting enough to add to the open list and possibly search for new tiles from +/datum/jps_node + /// The turf associated with this node + var/turf/tile + /// The node we just came from + var/datum/jps_node/previous_node + /// The A* node weight (f_value = number_of_tiles + heuristic) + var/f_value + /// The A* node heuristic (a rough estimate of how far we are from the goal) + var/heuristic + /// How many steps it's taken to get here from the start (currently pulling double duty as steps taken & cost to get here, since all moves incl diagonals cost 1 rn) + var/number_tiles + /// How many steps it took to get here from the last node + var/jumps + /// Nodes store the endgoal so they can process their heuristic without a reference to the pathfind datum + var/turf/node_goal + +/datum/jps_node/New(turf/our_tile, datum/jps_node/incoming_previous_node, jumps_taken, turf/incoming_goal) + tile = our_tile + jumps = jumps_taken + if(incoming_goal) // if we have the goal argument, this must be the first/starting node + node_goal = incoming_goal + else if(incoming_previous_node) // if we have the parent, this is from a direct lateral/diagonal scan, we can fill it all out now + previous_node = incoming_previous_node + number_tiles = previous_node.number_tiles + jumps + node_goal = previous_node.node_goal + heuristic = get_dist(tile, node_goal) + f_value = number_tiles + heuristic + // otherwise, no parent node means this is from a subscan lateral scan, so we just need the tile for now until we call [datum/jps/proc/update_parent] on it + +/datum/jps_node/Destroy(force, ...) + previous_node = null + return ..() + +/datum/jps_node/proc/update_parent(datum/jps_node/new_parent) + previous_node = new_parent + node_goal = previous_node.node_goal + jumps = get_dist(tile, previous_node.tile) + number_tiles = previous_node.number_tiles + jumps + heuristic = get_dist(tile, node_goal) + f_value = number_tiles + heuristic + +/// TODO: Macro this to reduce proc overhead +/proc/HeapPathWeightCompare(datum/jps_node/a, datum/jps_node/b) + return b.f_value - a.f_value + +/datum/pathfind/jps + /// The movable we are pathing + var/atom/movable/caller + /// The turf we're trying to path to (note that this won't track a moving target) + var/turf/end + /// The open list/stack we pop nodes out from (TODO: make this a normal list and macro-ize the heap operations to reduce proc overhead) + var/datum/heap/open + /// The list we compile at the end if successful to pass back + var/list/path + ///An assoc list that serves as the closed list. Key is the turf, points to true if we've seen it before + var/list/found_turfs + + /// How far away we have to get to the end target before we can call it quits + var/mintargetdist = 0 + /// If we should delete the first step in the path or not. Used often because it is just the starting tile + var/skip_first = FALSE + ///Defines how we handle diagonal moves. See __DEFINES/path.dm + var/diagonal_handling = DIAGONAL_REMOVE_CLUNKY + +/datum/pathfind/jps/proc/setup(atom/movable/caller, list/access, max_distance, simulated_only, avoid, list/datum/callback/on_finish, atom/goal, mintargetdist, skip_first, diagonal_handling) + src.caller = caller + src.pass_info = new(caller, access) + src.max_distance = max_distance + src.simulated_only = simulated_only + src.avoid = avoid + src.on_finish = on_finish + src.mintargetdist = mintargetdist + src.skip_first = skip_first + src.diagonal_handling = diagonal_handling + end = get_turf(goal) + open = new /datum/heap(/proc/HeapPathWeightCompare) + found_turfs = list() + +/datum/pathfind/jps/Destroy(force) + . = ..() + caller = null + end = null + open = null + +/datum/pathfind/jps/start() + start = start || get_turf(caller) + . = ..() + if(!.) + return . + + if(!get_turf(end)) + stack_trace("Invalid JPS destination") + return FALSE + if(start.z != end.z || start == end ) //no pathfinding between z levels + return FALSE + if(max_distance && (max_distance < get_dist(start, end))) //if start turf is farther than max_distance from end turf, no need to do anything + return FALSE + + var/datum/jps_node/current_processed_node = new (start, -1, 0, end) + open.insert(current_processed_node) + found_turfs[start] = TRUE // i'm sure this is fine + return TRUE + +/datum/pathfind/jps/search_step() + . = ..() + if(!.) + return . + if(QDELETED(caller)) + return FALSE + + while(!open.is_empty() && !path) + var/datum/jps_node/current_processed_node = open.pop() //get the lower f_value turf in the open list + if(max_distance && (current_processed_node.number_tiles > max_distance))//if too many steps, don't process that path + continue + + var/turf/current_turf = current_processed_node.tile + for(var/scan_direction in list(EAST, WEST, NORTH, SOUTH)) + lateral_scan_spec(current_turf, scan_direction, current_processed_node) + + for(var/scan_direction in list(NORTHEAST, SOUTHEAST, NORTHWEST, SOUTHWEST)) + diag_scan_spec(current_turf, scan_direction, current_processed_node) + + // Stable, we'll just be back later + if(TICK_CHECK) + return TRUE + return TRUE + +/datum/pathfind/jps/finished() + //we're done! turn our reversed path (end to start) into a path (start to end) + found_turfs = null + QDEL_NULL(open) + + var/list/path = src.path || list() + path = reverseList(path) + switch(diagonal_handling) + if(DIAGONAL_REMOVE_CLUNKY) + path = remove_clunky_diagonals(path, pass_info, simulated_only, avoid) + if(DIAGONAL_REMOVE_ALL) + path = remove_diagonals(path, pass_info, simulated_only, avoid) + if(skip_first && length(path) > 0) + path.Cut(1,2) + hand_back(path) + return ..() + +/// Called when we've hit the goal with the node that represents the last tile, then sets the path var to that path so it can be returned by [datum/pathfind/proc/search] +/datum/pathfind/jps/proc/unwind_path(datum/jps_node/unwind_node) + path = new() + var/turf/iter_turf = unwind_node.tile + path.Add(iter_turf) + + while(unwind_node.previous_node) + var/dir_goal = get_dir(iter_turf, unwind_node.previous_node.tile) + for(var/i in 1 to unwind_node.jumps) + iter_turf = get_step(iter_turf,dir_goal) + path.Add(iter_turf) + unwind_node = unwind_node.previous_node + +/** + * For performing lateral scans from a given starting turf. + * + * These scans are called from both the main search loop, as well as subscans for diagonal scans, and they treat finding interesting turfs slightly differently. + * If we're doing a normal lateral scan, we already have a parent node supplied, so we just create the new node and immediately insert it into the heap, ezpz. + * If we're part of a subscan, we still need for the diagonal scan to generate a parent node, so we return a node datum with just the turf and let the diag scan + * proc handle transferring the values and inserting them into the heap. + * + * Arguments: + * * original_turf: What turf did we start this scan at? + * * heading: What direction are we going in? Obviously, should be cardinal + * * parent_node: Only given for normal lateral scans, if we don't have one, we're a diagonal subscan. +*/ +/datum/pathfind/jps/proc/lateral_scan_spec(turf/original_turf, heading, datum/jps_node/parent_node) + var/steps_taken = 0 + + var/turf/current_turf = original_turf + var/turf/lag_turf = original_turf + var/datum/can_pass_info/pass_info = src.pass_info + + while(TRUE) + if(path) + return + lag_turf = current_turf + current_turf = get_step(current_turf, heading) + steps_taken++ + if(!CAN_STEP(lag_turf, current_turf, simulated_only, pass_info, avoid)) + return + + if(current_turf == end || (mintargetdist && (get_dist(current_turf, end) <= mintargetdist))) + var/datum/jps_node/final_node = new(current_turf, parent_node, steps_taken) + found_turfs[current_turf] = TRUE + if(parent_node) // if this is a direct lateral scan we can wrap up, if it's a subscan from a diag, we need to let the diag make their node first, then finish + unwind_path(final_node) + return final_node + else if(found_turfs[current_turf]) // already visited, essentially in the closed list + return + else + found_turfs[current_turf] = TRUE + + if(parent_node && parent_node.number_tiles + steps_taken > max_distance) + return + + var/interesting = FALSE // have we found a forced neighbor that would make us add this turf to the open list? + + switch(heading) + if(NORTH) + if(STEP_NOT_HERE_BUT_THERE(current_turf, WEST, NORTHWEST) || STEP_NOT_HERE_BUT_THERE(current_turf, EAST, NORTHEAST)) + interesting = TRUE + if(SOUTH) + if(STEP_NOT_HERE_BUT_THERE(current_turf, WEST, SOUTHWEST) || STEP_NOT_HERE_BUT_THERE(current_turf, EAST, SOUTHEAST)) + interesting = TRUE + if(EAST) + if(STEP_NOT_HERE_BUT_THERE(current_turf, NORTH, NORTHEAST) || STEP_NOT_HERE_BUT_THERE(current_turf, SOUTH, SOUTHEAST)) + interesting = TRUE + if(WEST) + if(STEP_NOT_HERE_BUT_THERE(current_turf, NORTH, NORTHWEST) || STEP_NOT_HERE_BUT_THERE(current_turf, SOUTH, SOUTHWEST)) + interesting = TRUE + + if(interesting) + var/datum/jps_node/newnode = new(current_turf, parent_node, steps_taken) + if(parent_node) // if we're a diagonal subscan, we'll handle adding ourselves to the heap in the diag + open.insert(newnode) + return newnode + +/** + * For performing diagonal scans from a given starting turf. + * + * Unlike lateral scans, these only are called from the main search loop, so we don't need to worry about returning anything, + * though we do need to handle the return values of our lateral subscans of course. + * + * Arguments: + * * original_turf: What turf did we start this scan at? + * * heading: What direction are we going in? Obviously, should be diagonal + * * parent_node: We should always have a parent node for diagonals +*/ +/datum/pathfind/jps/proc/diag_scan_spec(turf/original_turf, heading, datum/jps_node/parent_node) + var/steps_taken = 0 + var/turf/current_turf = original_turf + var/turf/lag_turf = original_turf + var/datum/can_pass_info/pass_info = src.pass_info + + while(TRUE) + if(path) + return + lag_turf = current_turf + current_turf = get_step(current_turf, heading) + steps_taken++ + if(!CAN_STEP(lag_turf, current_turf, simulated_only, pass_info, avoid)) + return + + if(current_turf == end || (mintargetdist && (get_dist(current_turf, end) <= mintargetdist))) + var/datum/jps_node/final_node = new(current_turf, parent_node, steps_taken) + found_turfs[current_turf] = TRUE + unwind_path(final_node) + return + else if(found_turfs[current_turf]) // already visited, essentially in the closed list + return + else + found_turfs[current_turf] = TRUE + + if(parent_node.number_tiles + steps_taken > max_distance) + return + + var/interesting = FALSE // have we found a forced neighbor that would make us add this turf to the open list? + var/datum/jps_node/possible_child_node // otherwise, did one of our lateral subscans turn up something? + + switch(heading) + if(NORTHWEST) + if(STEP_NOT_HERE_BUT_THERE(current_turf, EAST, NORTHEAST) || STEP_NOT_HERE_BUT_THERE(current_turf, SOUTH, SOUTHWEST)) + interesting = TRUE + else + possible_child_node = (lateral_scan_spec(current_turf, WEST) || lateral_scan_spec(current_turf, NORTH)) + if(NORTHEAST) + if(STEP_NOT_HERE_BUT_THERE(current_turf, WEST, NORTHWEST) || STEP_NOT_HERE_BUT_THERE(current_turf, SOUTH, SOUTHEAST)) + interesting = TRUE + else + possible_child_node = (lateral_scan_spec(current_turf, EAST) || lateral_scan_spec(current_turf, NORTH)) + if(SOUTHWEST) + if(STEP_NOT_HERE_BUT_THERE(current_turf, EAST, SOUTHEAST) || STEP_NOT_HERE_BUT_THERE(current_turf, NORTH, NORTHWEST)) + interesting = TRUE + else + possible_child_node = (lateral_scan_spec(current_turf, SOUTH) || lateral_scan_spec(current_turf, WEST)) + if(SOUTHEAST) + if(STEP_NOT_HERE_BUT_THERE(current_turf, WEST, SOUTHWEST) || STEP_NOT_HERE_BUT_THERE(current_turf, NORTH, NORTHEAST)) + interesting = TRUE + else + possible_child_node = (lateral_scan_spec(current_turf, SOUTH) || lateral_scan_spec(current_turf, EAST)) + + if(interesting || possible_child_node) + var/datum/jps_node/newnode = new(current_turf, parent_node, steps_taken) + open.insert(newnode) + if(possible_child_node) + possible_child_node.update_parent(newnode) + open.insert(possible_child_node) + if(possible_child_node.tile == end || (mintargetdist && (get_dist(possible_child_node.tile, end) <= mintargetdist))) + unwind_path(possible_child_node) + return diff --git a/code/__HELPERS/paths/path.dm b/code/__HELPERS/paths/path.dm new file mode 100644 index 000000000000..14241ef8e706 --- /dev/null +++ b/code/__HELPERS/paths/path.dm @@ -0,0 +1,379 @@ +/** + * This is the proc you use whenever you want to have pathfinding more complex than "try stepping towards the thing". + * If no path was found, returns an empty list, which is important for bots like medibots who expect an empty list rather than nothing. + * It will yield until a path is returned, using magic + * + * Arguments: + * * caller: The movable atom that's trying to find the path + * * end: What we're trying to path to. It doesn't matter if this is a turf or some other atom, we're gonna just path to the turf it's on anyway + * * max_distance: The maximum number of steps we can take in a given path to search (default: 30, 0 = infinite) + * * mintargetdistance: Minimum distance to the target before path returns, could be used to get near a target, but not right to it - for an AI mob with a gun, for example. + * * access: A list representing what access we have and what doors we can open. + * * simulated_only: Whether we consider tur fs without atmos simulation (AKA do we want to ignore space) + * * exclude: If we want to avoid a specific turf, like if we're a mulebot who already got blocked by some turf + * * skip_first: Whether or not to delete the first item in the path. This would be done because the first item is the starting tile, which can break movement for some creatures. + * * diagonal_handling: defines how we handle diagonal moves. see __DEFINES/path.dm + */ +/proc/get_path_to(atom/movable/caller, atom/end, max_distance = 30, mintargetdist, access=list(), simulated_only = TRUE, turf/exclude, skip_first=TRUE, diagonal_handling=DIAGONAL_REMOVE_CLUNKY) + var/list/hand_around = list() + // We're guarenteed that list will be the first list in pathfinding_finished's argset because of how callback handles the arguments list + var/datum/callback/await = list(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(pathfinding_finished), hand_around)) + if(!SSpathfinder.pathfind(caller, end, max_distance, mintargetdist, access, simulated_only, exclude, skip_first, diagonal_handling, await)) + return list() + + UNTIL(length(hand_around)) + var/list/return_val = hand_around[1] + if(!islist(return_val) || (QDELETED(caller) || QDELETED(end))) // It's trash, just hand back empty to make it easy + return list() + return return_val + +/** + * POTENTIALLY cheaper version of get_path_to + * This proc generates a path map for the end atom's turf, which allows us to cheaply do pathing operations "at" it + * Generation is significantly SLOWER then get_path_to, but if many things are/might be pathing at something then it is much faster + * Runs the risk of returning an suboptimal or INVALID PATH if the delay between map creation and use is too long + * + * If no path was found, returns an empty list, which is important for bots like medibots who expect an empty list rather than nothing. + * It will yield until a path is returned, using magic + * + * Arguments: + * * caller: The movable atom that's trying to find the path + * * end: What we're trying to path to. It doesn't matter if this is a turf or some other atom, we're gonna just path to the turf it's on anyway + * * max_distance: The maximum number of steps we can take in a given path to search (default: 30, 0 = infinite) + * * mintargetdistance: Minimum distance to the target before path returns, could be used to get near a target, but not right to it - for an AI mob with a gun, for example. + * * age: How old a path map can be before we'll avoid reusing it. Use the defines found in [code/__DEFINES/path.dm], values larger then MAP_REUSE_SLOWEST will be discarded + * * access: A list representing what access we have and what doors we can open. + * * simulated_only: Whether we consider tur fs without atmos simulation (AKA do we want to ignore space) + * * exclude: If we want to avoid a specific turf, like if we're a mulebot who already got blocked by some turf + * * skip_first: Whether or not to delete the first item in the path. This would be done because the first item is the starting tile, which can break movement for some creatures. + */ +/proc/get_swarm_path_to(atom/movable/caller, atom/end, max_distance = 30, mintargetdist, age = MAP_REUSE_INSTANT, access = list(), simulated_only = TRUE, turf/exclude, skip_first=TRUE) + var/list/hand_around = list() + // We're guarenteed that list will be the first list in pathfinding_finished's argset because of how callback handles the arguments list + var/datum/callback/await = list(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(pathfinding_finished), hand_around)) + if(!SSpathfinder.swarmed_pathfind(caller, end, max_distance, mintargetdist, age, access, simulated_only, exclude, skip_first, await)) + return list() + + UNTIL(length(hand_around)) + var/list/return_val = hand_around[1] + if(!islist(return_val) || (QDELETED(caller) || QDELETED(end))) // It's trash, just hand back empty to make it easy + return list() + return return_val + +/proc/get_sssp(atom/movable/caller, max_distance = 30, access = list(), simulated_only = TRUE, turf/exclude) + var/list/hand_around = list() + // We're guarenteed that list will be the first list in pathfinding_finished's argset because of how callback handles the arguments list + var/datum/callback/await = list(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(pathfinding_finished), hand_around)) + if(!SSpathfinder.build_map(caller, get_turf(caller), max_distance, access, simulated_only, exclude, await)) + return null + + UNTIL(length(hand_around)) + var/datum/path_map/return_val = hand_around[1] + if(!istype(return_val, /datum/path_map) || (QDELETED(caller))) // It's trash, just hand back null to make it easy + return null + return return_val + +/// Uses funny pass by reference bullshit to take the output created by pathfinding, and insert it into a return list +/// We'll be able to use this return list to tell a sleeping proc to continue execution +/proc/pathfinding_finished(list/return_list, hand_back) + // We use += here to behave nicely with lists + return_list += LIST_VALUE_WRAP_LISTS(hand_back) + +/// The datum used to handle the JPS pathfinding, completely self-contained +/datum/pathfind + /// The turf we started at + var/turf/start + + // general pathfinding vars/args + /// Limits how far we can search before giving up on a path + var/max_distance = 30 + /// Space is big and empty, if this is TRUE then we ignore pathing through unsimulated tiles + var/simulated_only + /// A specific turf we're avoiding, like if a mulebot is being blocked by someone t-posing in a doorway we're trying to get through + var/turf/avoid + /// The callbacks to invoke when we're done working, passing in the completed product + /// Invoked in order + var/list/datum/callback/on_finish + /// Datum that holds the canpass info of this pathing attempt. This is what CanAstarPass sees + var/datum/can_pass_info/pass_info + +/datum/pathfind/Destroy(force, ...) + . = ..() + SSpathfinder.active_pathing -= src + SSpathfinder.currentrun -= src + hand_back(null) + avoid = null + +/** + * "starts" off the pathfinding, by storing the values this datum will need to work later on + * returns FALSE if it fails to setup properly, TRUE otherwise + */ +/datum/pathfind/proc/start() + if(!start) + stack_trace("Invalid pathfinding start") + return FALSE + return TRUE + +/** + * search_step() is the workhorse of pathfinding. It'll do the searching logic, and will slowly build up a path + * returns TRUE if everything is stable, FALSE if the pathfinding logic has failed, and we need to abort + */ +/datum/pathfind/proc/search_step() + return TRUE + +/** + * early_exit() is called when something goes wrong in processing, and we need to halt the pathfinding NOW + */ +/datum/pathfind/proc/early_exit() + hand_back(null) + qdel(src) + +/** + * Cleanup pass for the pathfinder. This tidies up the path, and fufills the pathfind's obligations + */ +/datum/pathfind/proc/finished() + qdel(src) + +/** + * Call to return a value to whoever spawned this pathfinding work + * Will fail if it's already been called + */ +/datum/pathfind/proc/hand_back(value) + for(var/datum/callback/finished as anything in on_finish) + finished.Invoke(value) + on_finish = null + +/** + * Processes a path (list of turfs), removes any diagonal moves that would lead to a weird bump + * + * path - The path to process down + * pass_info - Holds all the info about what this path attempt can go through + * simulated_only - If we are not allowed to pass space turfs + * avoid - A turf to be avoided + */ +/proc/remove_clunky_diagonals(list/path, datum/can_pass_info/pass_info, simulated_only, turf/avoid) + if(length(path) < 2) + return path + var/list/modified_path = list() + + for(var/i in 1 to length(path) - 1) + var/turf/current_turf = path[i] + modified_path += current_turf + var/turf/next_turf = path[i+1] + var/movement_dir = get_dir(current_turf, next_turf) + if(!(movement_dir & (movement_dir - 1))) //cardinal movement, no need to verify + continue + //If the first diagonal movement step is invalid (north/south), replace with a sidestep first, with an implied vertical step in next_turf + var/vertical_only = movement_dir & (NORTH|SOUTH) + if(!CAN_STEP(current_turf,get_step(current_turf, vertical_only), simulated_only, pass_info, avoid)) + modified_path += get_step(current_turf, movement_dir & ~vertical_only) + modified_path += path[length(path)] + + return modified_path + +/** + * Processes a path (list of turfs), removes any diagonal moves + * + * path - The path to process down + * pass_info - Holds all the info about what this path attempt can go through + * simulated_only - If we are not allowed to pass space turfs + * avoid - A turf to be avoided + */ +/proc/remove_diagonals(list/path, datum/can_pass_info/pass_info, simulated_only, turf/avoid) + if(length(path) < 2) + return path + var/list/modified_path = list() + + for(var/i in 1 to length(path) - 1) + var/turf/current_turf = path[i] + modified_path += current_turf + var/turf/next_turf = path[i+1] + var/movement_dir = get_dir(current_turf, next_turf) + if(!(movement_dir & (movement_dir - 1))) //cardinal movement, no need to verify + continue + var/vertical_only = movement_dir & (NORTH|SOUTH) + // If we can't go directly north/south, we will first go to the side, + if(!CAN_STEP(current_turf,get_step(current_turf, vertical_only), simulated_only, pass_info, avoid)) + modified_path += get_step(current_turf, movement_dir & ~vertical_only) + else // Otherwise, we'll first go north/south, then to the side + modified_path += get_step(current_turf, vertical_only) + modified_path += path[length(path)] + + return modified_path + +/** + * For seeing if we can actually move between 2 given turfs while accounting for our access and the caller's pass_flags + * + * Assumes destinantion turf is non-dense - check and shortcircuit in code invoking this proc to avoid overhead. + * Makes some other assumptions, such as assuming that unless declared, non dense objects will not block movement. + * It's fragile, but this is VERY much the most expensive part of pathing, so it'd better be fast + * + * Arguments: + * * destination_turf - Where are we going from where we are? + * * pass_info - Holds all the info about what this path attempt can go through +*/ +/turf/proc/LinkBlockedWithAccess(turf/destination_turf, datum/can_pass_info/pass_info) + if(destination_turf.x != x && destination_turf.y != y) //diagonal + var/in_dir = get_dir(destination_turf,src) // eg. northwest (1+8) = 9 (00001001) + var/first_step_direction_a = in_dir & 3 // eg. north (1+8)&3 (0000 0011) = 1 (0000 0001) + var/first_step_direction_b = in_dir & 12 // eg. west (1+8)&12 (0000 1100) = 8 (0000 1000) + + for(var/first_step_direction in list(first_step_direction_a,first_step_direction_b)) + var/turf/midstep_turf = get_step(destination_turf,first_step_direction) + var/way_blocked = midstep_turf.density || LinkBlockedWithAccess(midstep_turf, pass_info) || midstep_turf.LinkBlockedWithAccess(destination_turf, pass_info) + if(!way_blocked) + return FALSE + return TRUE + var/actual_dir = get_dir(src, destination_turf) + + /// These are generally cheaper than looping contents so they go first + switch(destination_turf.pathing_pass_method) + // This is already assumed to be true + //if(TURF_PATHING_PASS_DENSITY) + // if(destination_turf.density) + // return TRUE + if(TURF_PATHING_PASS_PROC) + if(!destination_turf.CanAStarPass(actual_dir, pass_info)) + return TRUE + if(TURF_PATHING_PASS_NO) + return TRUE + + var/static/list/directional_blocker_cache = typecacheof(list(/obj/structure/window, /obj/machinery/door/window, /obj/structure/railing, /obj/machinery/door/firedoor/border_only)) + // Source border object checks + for(var/obj/border in src) + if(!directional_blocker_cache[border.type]) + continue + if(!border.density && border.can_astar_pass == CANASTARPASS_DENSITY) + continue + if(!border.CanAStarPass(actual_dir, pass_info)) + return TRUE + + // Destination blockers check + var/reverse_dir = get_dir(destination_turf, src) + for(var/obj/iter_object in destination_turf) + // This is an optimization because of the massive call count of this code + if(!iter_object.density && iter_object.can_astar_pass == CANASTARPASS_DENSITY) + continue + if(!iter_object.CanAStarPass(reverse_dir, pass_info)) + return TRUE + return FALSE + +// Could easily be a struct if/when we get that +/** + * Holds all information about what an atom can move through + * Passed into CanAStarPass to provide context for a pathing attempt + * + * Also used to check if using a cached path_map is safe + * There are some vars here that are unused. They exist to cover cases where caller_ref is used + * They're the properties of caller_ref used in those cases. + * It's kinda annoying, but there's some proc chains we can't convert to this datum + */ +/datum/can_pass_info + /// If we have no id, public airlocks are walls + var/no_id = FALSE + + /// What we can pass through. Mirrors /atom/movable/pass_flags + var/pass_flags = NONE + /// What access we have, airlocks, windoors, etc + var/list/access = null + /// What sort of movement do we have. Mirrors /atom/movable/movement_type + var/movement_type = NONE + /// Are we being thrown? + var/thrown = FALSE + /// Are we anchored + var/anchored = FLASH_LIGHT_POWER + + /// Are we a ghost? (they have effectively unique pathfinding) + var/is_observer = FALSE + /// Are we a living mob? + var/is_living = FALSE + /// Are we a bot? + var/is_bot = FALSE + /// Can we ventcrawl? + var/can_ventcrawl = FALSE + /// What is the size of our mob + var/mob_size = null + /// Is our mob incapacitated + var/incapacitated = FALSE + /// Is our mob incorporeal + var/incorporeal_move = FALSE + /// If our mob has a rider, what does it look like + var/datum/can_pass_info/rider_info = null + /// If our mob is buckled to something, what's it like + var/datum/can_pass_info/buckled_info = null + + /// Do we have gravity + var/has_gravity = TRUE + /// Pass information for the object we are pulling, if any + var/datum/can_pass_info/pulling_info = null + + /// Cameras have a lot of BS can_z_move overrides + /// Let's avoid this + var/camera_type + + /// Weakref to the caller used to generate this info + /// Should not use this almost ever, it's for context and to allow for proc chains that + /// Require a movable + var/datum/weakref/caller_ref = null + +/datum/can_pass_info/New(atom/movable/construct_from, list/access, no_id = FALSE, call_depth = 0) + // No infiniloops + if(call_depth > 10) + return + if(access) + src.access = access.Copy() + src.no_id = no_id + + if(isnull(construct_from)) + return + + src.caller_ref = WEAKREF(construct_from) + src.pass_flags = construct_from.pass_flags + src.movement_type = construct_from.movement_type + src.thrown = !!construct_from.throwing + src.anchored = construct_from.anchored + src.has_gravity = construct_from.has_gravity() + if(ismob(construct_from)) + var/mob/living/mob_construct = construct_from + src.incapacitated = mob_construct.incapacitated() + if(mob_construct.buckled) + src.buckled_info = new(mob_construct.buckled, access, no_id, call_depth + 1) + if(isobserver(construct_from)) + src.is_observer = TRUE + if(isliving(construct_from)) + var/mob/living/living_construct = construct_from + src.is_living = TRUE + src.can_ventcrawl = HAS_TRAIT(living_construct, TRAIT_VENTCRAWLER_ALWAYS) || HAS_TRAIT(living_construct, TRAIT_VENTCRAWLER_NUDE) + src.mob_size = living_construct.mob_size + src.incorporeal_move = living_construct.incorporeal_move + if(iscameramob(construct_from)) + src.camera_type = construct_from.type + src.is_bot = isbot(construct_from) + + if(construct_from.pulling) + src.pulling_info = new(construct_from.pulling, access, no_id, call_depth + 1) + +/// List of vars on /datum/can_pass_info to use when checking two instances for equality +GLOBAL_LIST_INIT(can_pass_info_vars, GLOBAL_PROC_REF(can_pass_check_vars)) + +/proc/can_pass_check_vars() + var/datum/can_pass_info/lamb = new() + var/datum/isaac = new() + var/list/altar = assoc_to_keys(lamb.vars - isaac.vars) + // Don't compare against calling atom, it's not relevant here + altar -= "caller_ref" + ASSERT("caller_ref" in lamb.vars, "caller_ref var was not found in /datum/can_pass_info, why are we filtering for it?") + // We will bespoke handle pulling_info + altar -= "pulling_info" + ASSERT("pulling_info" in lamb.vars, "pulling_info var was not found in /datum/can_pass_info, why are we filtering for it?") + return altar + +/datum/can_pass_info/proc/compare_against(datum/can_pass_info/check_against) + for(var/comparable_var in GLOB.can_pass_info_vars) + if(!(vars[comparable_var] ~= check_against[comparable_var])) + return FALSE + if(!pulling_info != !check_against.pulling_info) + return FALSE + if(pulling_info && !pulling_info.compare_against(check_against.pulling_info)) + return FALSE + return TRUE diff --git a/code/__HELPERS/paths/sssp.dm b/code/__HELPERS/paths/sssp.dm new file mode 100644 index 000000000000..f735c6646948 --- /dev/null +++ b/code/__HELPERS/paths/sssp.dm @@ -0,0 +1,300 @@ +#define FLOW_PATH_END 1 +/// Datum that describes the shortest path between a source turf and any turfs within a distance +/datum/path_map + /// Assoc list of turf -> the turf one step closer on the path + /// Arranged in discovery order, so the last turf here will be the furthest from the start + var/list/next_closest = list() + /// List of distances from the starting turf, each index lines up with the next_closest list + var/list/distances = list() + /// Our starting turf, the location this map feeds into + var/turf/start + /// The tick we were completed on, in case you want to hold onto this for a bit + var/creation_time + /// The pass info datum used to create us + var/datum/can_pass_info/pass_info + /// Were we allowed to path over space? + var/pass_space = TRUE + /// Were we avoiding a turf? If so, which one? + var/turf/avoid + /// Are we currently being expanded? + var/expanding = FALSE + /// Are we currently being built + var/building = FALSE + +/// Gets a list of turfs reachable by this path_map from the distance first to the distance second, both inclusive +/// first > second or first < second are both respected, and the return order will reflect the arg order +/// We return a list of turf -> distance, or null if we error +/datum/path_map/proc/turfs_in_range(first, second) + var/list/hand_back = list() + var/list/distances = src.distances + var/smaller = min(first, second) + var/larger = max(first, second) + var/largest_dist = distances[length(distances)] + if(smaller < 0 || larger < 0 || largest_dist < larger || largest_dist < smaller) + return null + if(first == smaller) + for(var/i in 1 to length(distances)) + if(i > larger) + break + if(i >= smaller) + hand_back[next_closest[i]] = distances[i] + else + for(var/i in length(distances) to 1 step -1) + if(i < smaller) + break + if(i <= larger) + hand_back[next_closest[i]] = distances[i] + + return hand_back + +/** + * Takes a turf to path to, returns the shortest path to it at the time of this datum's creation + * + * skip_first - If we should drop the first step in the path. Used to avoid stepping where we already are + * min_target_dist - How many, if any, turfs off the end of the path should we drop? + */ +/datum/path_map/proc/get_path_to(turf/path_to, skip_first = FALSE, min_target_dist = 0) + return generate_path(path_to, skip_first, min_target_dist) + +/** + * Takes a turf to start from, returns a path to the source turf of this datum + * + * skip_first - If we should drop the first step in the path. Used to avoid stepping where we already are + * min_target_dist - How many, if any, turfs off the end of the path should we drop? + */ +/datum/path_map/proc/get_path_from(turf/path_from, skip_first = FALSE, min_target_dist = 0) + return generate_path(path_from, skip_first, min_target_dist, reverse = TRUE) + +/** + * Takes a turf to use as the other end, returns the path between the source node and it + * + * skip_first - If we should drop the first step in the path. Used to avoid stepping where we already are + * min_target_dist - How many, if any, turfs off the end of the path should we drop? + * reverse - If true, "reverses" the path generated. You'd want to use this for generating a path to the source node itself + */ +/datum/path_map/proc/generate_path(turf/other_end, skip_first = FALSE, min_target_dist = 0, reverse = FALSE) + var/list/path = list() + var/turf/next_turf = other_end + // Cache for sonic speed + var/next_closest = src.next_closest + while(next_turf != FLOW_PATH_END || next_turf == null) + path += next_turf + next_turf = next_closest[next_turf] // We take the first entry cause that's the turf + + // This makes sense from a consumer level, I hate double negatives too I promise + if(!reverse) + path = reverseList(path) + if(skip_first && length(path) > 0) + path.Cut(1,2) + if(min_target_dist) + path.Cut(length(path) + 1 - min_target_dist, length(path) + 1) + return path + +/datum/path_map/proc/display(delay = 10 SECONDS) + for(var/index in 1 to length(distances)) + var/turf/next_turf = next_closest[index] + next_turf.maptext = "[distances[index]]" + next_turf.color = COLOR_NAVY + animate(next_turf, color = null, delay) + animate(maptext = "", world.tick_lag) + +/// Copies the passed in path_map into this datum +/// Saves some headache with updating refs if we want to modify a path_map +/datum/path_map/proc/copy_from(datum/path_map/read_from) + // Copy all the relevant vars over. NOT any of the timer stuff, we want them to still count + src.next_closest = read_from.next_closest + src.distances = read_from.distances + src.start = read_from.start + src.pass_info = read_from.pass_info + src.pass_space = read_from.pass_space + src.avoid = read_from.avoid + +/// Returns true if the passed in pass_map's pass logic matches ours +/// False otherwise +/datum/path_map/proc/compare_against(datum/path_map/map) + return compare_against_args(map.pass_info, map.start, map.pass_space, map.avoid) + +/// Returns true if the passed in pass_info and start/pass_space/avoid match ours +/// False otherwise +/datum/path_map/proc/compare_against_args(datum/can_pass_info/pass_info, turf/start, pass_space, turf/avoid) + if(src.start != start) + return FALSE + if(src.pass_space != pass_space) + return FALSE + if(src.avoid != avoid) + return FALSE + + return pass_info.compare_against(pass_info) + + +/// Returns a new /datum/pathfind/sssp based off our settings +/// Will have an invalid source mob, no max distance, and no ending callback +/datum/path_map/proc/settings_to_path() + // Default creation to not set any vars incidentially + var/static/mob/jeremy = new() + var/datum/pathfind/sssp/based_on_what = new() + based_on_what.setup(pass_info, null, INFINITY, pass_space, avoid) + return based_on_what + +/// Expands this pathmap to cover a new range, assuming the arg is greater then the current range +/// Returns true if this succeeded or was not required, false otherwise +/datum/path_map/proc/expand(new_range) + var/list/working_distances = distances + var/working_index = working_distances.len + var/max_dist = working_distances[working_distances.len] + if(new_range <= max_dist) + return TRUE + + UNTIL(expanding == FALSE) + // In case max_dist has changed ya feel + if(new_range <= max_dist) + return TRUE + + // Walk the start point backwards until we're at the first turf at the max distance + while(working_distances[working_index] == max_dist) + working_index -= 1 + + var/list/hand_around = list() + // We're guarenteed that hand_around will be the first list in pathfinding_finished's argset because of how callback handles the arguments list + var/datum/callback/await = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(pathfinding_finished), hand_around) + + // We're gonna build a pathfind datum from our settings and set it running + var/datum/pathfind/sssp/based_off_us = new() + + based_off_us.setup_from_canpass(pass_info, start, new_range, pass_space, avoid, list(await)) + based_off_us.working_queue = next_closest.Copy() + based_off_us.working_distances = working_distances.Copy() + based_off_us.working_index = working_index + if(!SSpathfinder.run_pathfind(based_off_us)) + return FALSE + + expanding = TRUE + UNTIL(length(hand_around)) + var/datum/path_map/return_val = hand_around[1] + if(!istype(return_val, /datum/path_map)) // It's trash, we've failed and need to clear away + return FALSE + copy_from(return_val) + expanding = FALSE + return TRUE + +/datum/path_map/proc/sanity_check() + for(var/index in 1 to length(distances)) + var/turf/next_turf = next_closest[index] + var/list/path = get_path_from(next_turf) + if(length(path) != distances[index] + 1) + stack_trace("[next_turf] had a distance of [length(path)] instead of the expected [distances[index]]") + if(path.Find(next_turf) != 1) + stack_trace("Starting turf [next_turf] was not the first entry in its list (instead it's at [path.Find(next_turf)])") + path = get_path_to(next_turf) + if(length(path) != distances[index] + 1) + stack_trace("[next_turf] had a distance of [length(path)] instead of the expected [distances[index]]") + if(path.Find(next_turf) != length(path)) + stack_trace("Starting turf [next_turf] was not the last entry in its list (instead it's at [path.Find(next_turf)])") + +/// Single source shortest path +/// Generates a flow map of a reachable turf -> the turf next closest to the map's center +/datum/pathfind/sssp + /// Ever expanding list of turfs to visit/visited, associated with the turf that's next closest to them + var/list/working_queue + /// List of distances, each entry mirrors an entry in the working_queue + var/list/working_distances + /// Our current position in the working queue + var/working_index + +/datum/pathfind/sssp/proc/setup(atom/movable/caller, list/access, turf/center, max_distance, simulated_only, turf/avoid, list/datum/callback/on_finish) + src.pass_info = new(caller, access) + src.start = center + src.max_distance = max_distance + src.simulated_only = simulated_only + src.avoid = avoid + src.on_finish = on_finish + +/datum/pathfind/sssp/proc/setup_from_canpass(datum/can_pass_info/info, turf/center, max_distance, simulated_only, turf/avoid, list/datum/callback/on_finish) + src.pass_info = info + src.start = center + src.max_distance = max_distance + src.simulated_only = simulated_only + src.avoid = avoid + src.on_finish = on_finish + +/datum/pathfind/sssp/start() + . = ..() + if(!.) + return . + working_queue = list() + working_distances = list() + working_queue[start] = FLOW_PATH_END + working_distances += 0 + working_index = 0 + return TRUE + +/datum/pathfind/sssp/search_step() + . = ..() + if(!.) + return . + + var/datum/can_pass_info/pass_info = src.pass_info + while(working_index < length(working_queue)) + working_index += 1 + + var/turf/next_turf = working_queue[working_index] + var/distance = working_distances[working_index] + 1 + if(distance > max_distance) + if(TICK_CHECK) + return TRUE + continue + for(var/turf/adjacent in TURF_NEIGHBORS(next_turf)) + // Already have a path? then we're gooood baby + if(working_queue[adjacent]) + continue + + // If it's blocked, go home + if(!CAN_STEP(next_turf, adjacent, simulated_only, pass_info, avoid)) + continue + // I want to prevent diagonal moves around corners + // We do this first because blocked diagonals are more common then non blocked ones. + if(next_turf.x != adjacent.x && next_turf.y != adjacent.y) + var/movement_dir = get_dir(next_turf, adjacent) + // If either of the move components would bump into something, replace it with an explicit move around + var/turf/vertical_move = get_step(next_turf, movement_dir & (NORTH|SOUTH)) + var/turf/horizontal_move = get_step(next_turf, movement_dir & (EAST|WEST)) + if(!working_queue[vertical_move]) + if(CAN_STEP(next_turf, vertical_move, simulated_only, pass_info, avoid)) + working_queue[vertical_move] = next_turf + working_distances += distance + else + // Can't do a vertical move? let's do a horizontal move first + if(!working_queue[horizontal_move]) + working_queue[horizontal_move] = next_turf + working_distances += distance + continue + if(!working_queue[horizontal_move]) + if(CAN_STEP(next_turf, horizontal_move, simulated_only, pass_info, avoid)) + working_queue[horizontal_move] = next_turf + working_distances += distance + else + if(!working_queue[vertical_move]) + working_queue[vertical_move] = next_turf + working_distances += distance + continue + + // Otherwise, this new turf's next closest turf is our source, so we'll mark as such and continue + // This is a breadth first search, we're essentially moving out in layers from the start position + working_queue[adjacent] = next_turf + working_distances += distance + + if(TICK_CHECK) + return TRUE + return TRUE + +/datum/pathfind/sssp/finished() + var/datum/path_map/flow_map = new() + flow_map.start = start + flow_map.pass_info = pass_info + flow_map.pass_space = simulated_only + flow_map.avoid = avoid + flow_map.next_closest = working_queue + flow_map.distances = working_distances + flow_map.creation_time = world.time + hand_back(flow_map) + return ..() diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm index 6328591471a5..1265a8aed204 100644 --- a/code/__HELPERS/pronouns.dm +++ b/code/__HELPERS/pronouns.dm @@ -15,6 +15,9 @@ if(capitalized) . = capitalize(.) +/datum/proc/p_Their(temp_gender) + return capitalize(p_their(temp_gender)) + /datum/proc/p_them(capitalized, temp_gender) . = "it" if(capitalized) @@ -38,6 +41,9 @@ /datum/proc/p_theyre(capitalized, temp_gender) . = p_they(capitalized, temp_gender) + "'" + copytext_char(p_are(temp_gender), 2) +/datum/proc/p_Theyre(temp_gender) + return p_They(temp_gender) + "'" + copytext_char(p_are(temp_gender), 2) + /datum/proc/p_s(temp_gender) //is this a descriptive proc name, or what? . = "s" diff --git a/code/__HELPERS/radiation.dm b/code/__HELPERS/radiation.dm index 6aba8388e0cb..65d32e786029 100644 --- a/code/__HELPERS/radiation.dm +++ b/code/__HELPERS/radiation.dm @@ -42,7 +42,7 @@ if(should_rad_act) for(var/obj/collector in range(5, source)) - if(!istype(collector, /obj/machinery/power/rad_collector)) + if(!istype(collector, /obj/machinery/power/rad_collector) && !isartifact(collector)) continue collector.rad_act(intensity) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index eed6ad7d1d12..64bfe5106794 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -4,7 +4,9 @@ #define PERSONAL_LAST_ROUND "personal last round" #define SERVER_LAST_ROUND "server last round" -GLOBAL_LIST_INIT(round_end_images, world.file2list("data/image_urls.txt")) +GLOBAL_LIST_INIT(achievements_unlocked, list()) + +GLOBAL_LIST_INIT(round_end_images, world.file2list("data/image_urls.txt")) // MONKEYSTATION EDIT ADDITION PR #11 - update roundend.dm /datum/controller/subsystem/ticker/proc/gather_roundend_feedback() gather_antag_data() @@ -203,22 +205,20 @@ GLOBAL_LIST_INIT(round_end_images, world.file2list("data/image_urls.txt")) player_client.give_award(/datum/award/score/hardcore_random, human_mob, round(human_mob.hardcore_survival_score)) -/datum/controller/subsystem/ticker/proc/declare_completion() +/datum/controller/subsystem/ticker/proc/declare_completion(was_forced = END_ROUND_AS_NORMAL) set waitfor = FALSE for(var/datum/callback/roundend_callbacks as anything in round_end_events) roundend_callbacks.InvokeAsync() LAZYCLEARLIST(round_end_events) - var/speed_round = FALSE - if(world.time - SSticker.round_start_time <= 300 SECONDS) - speed_round = TRUE + var/speed_round = (STATION_TIME_PASSED() <= 10 MINUTES) for(var/client/C in GLOB.clients) if(!C?.credits) C?.RollCredits() C?.playtitlemusic(40) - if(speed_round) + if(speed_round && was_forced != ADMIN_FORCE_END_ROUND) C?.give_award(/datum/award/achievement/misc/speed_round, C?.mob) HandleRandomHardcoreScore(C) @@ -236,6 +236,8 @@ GLOBAL_LIST_INIT(round_end_images, world.file2list("data/image_urls.txt")) //Set news report and mode result mode.set_round_result() + SSgamemode.round_end_report() + SSgamemode.store_roundend_data() // store data on roundend for next round to_chat(world, span_infoplain(span_big(span_bold("


The round has ended.")))) log_game("The round has ended.") @@ -382,6 +384,8 @@ GLOBAL_LIST_INIT(round_end_images, world.file2list("data/image_urls.txt")) parts += goal_report() //Economy & Money parts += market_report() + //Player Achievements + parts += cheevo_report() list_clear_nulls(parts) @@ -860,3 +864,25 @@ GLOBAL_LIST_INIT(round_end_images, world.file2list("data/image_urls.txt")) return qdel(query_update_everything_ranks) qdel(query_check_everything_ranks) + +/datum/controller/subsystem/ticker/proc/cheevo_report() + var/list/parts = list() + if(length(GLOB.achievements_unlocked)) + parts += "Achievement Get!
" + parts += "Total Achievements Earned: [length(GLOB.achievements_unlocked)]!
" + parts += "" + return "
" + +///A datum containing the info necessary for an achievement readout, reported and added to the global list in /datum/award/achievement/on_unlock(mob/user) +/datum/achievement_report + ///The winner of this achievement. + var/winner + ///The achievement that was won. + var/cheevo + ///The ckey of our winner + var/winner_key + ///The name of the area we earned this cheevo in + var/award_location diff --git a/code/__HELPERS/~monkestation-helpers/icon_smoothing.dm b/code/__HELPERS/~monkestation-helpers/icon_smoothing.dm index 27cfac8570a1..3e2668c6d177 100644 --- a/code/__HELPERS/~monkestation-helpers/icon_smoothing.dm +++ b/code/__HELPERS/~monkestation-helpers/icon_smoothing.dm @@ -50,3 +50,26 @@ if(length(overlays_adapters)) add_overlay(overlays_adapters) + +GLOBAL_LIST_EMPTY(string_numbers_lists) + +/** + * Caches lists of numeric values. + */ +/datum/proc/string_numbers_list(list/values) + //Just to to be extra-safe. If you try to shove in text or paths, you deserve the runtime errors. + var/list/sum = 0 + for(var/number in values) + sum += number + + var/string_id = values.Join("-") + + . = GLOB.string_numbers_lists[string_id] + + if(.) + return . + + return GLOB.string_numbers_lists[string_id] = values + +/datum/proc/p_They(temp_gender) + return capitalize(p_they(temp_gender)) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 48dc1a8ddbff..60d5d655b7d0 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -69,6 +69,7 @@ DEFINE_BITFIELD(area_flags, list( "PASSIVE_AREA" = PASSIVE_AREA, "GHOST_AREA" = GHOST_AREA, "NO_EXPLOSIONS_DURING" = NO_EXPLOSIONS_DURING, + "NO_GHOSTS_DURING_ROUND" = NO_GHOSTS_DURING_ROUND, )) DEFINE_BITFIELD(turf_flags, list( @@ -385,6 +386,7 @@ DEFINE_BITFIELD(bodytype, list( "BODYTYPE_ROBOTIC" = BODYTYPE_ROBOTIC, "BODYTYPE_SNOUTED" = BODYTYPE_SNOUTED, "BODYTYPE_CUSTOM" = BODYTYPE_CUSTOM, + "BODYTYPE_SNOUTED" = BODYTYPE_SNOUTED, )) DEFINE_BITFIELD(bodypart_flags, list( diff --git a/code/_globalvars/lists/achievements.dm b/code/_globalvars/lists/achievements.dm index 91521694ef75..283931f99847 100755 --- a/code/_globalvars/lists/achievements.dm +++ b/code/_globalvars/lists/achievements.dm @@ -1 +1,9 @@ GLOBAL_LIST_EMPTY(commendations) +///A list of the current achievement categories supported by the UI and checked by the achievement unit test +GLOBAL_LIST_INIT(achievement_categories, list("Bosses", "Jobs", "Skills", "Misc", "Mafia", "Scores")) +///A list of sounds that can be played when unlocking an achievement, set in the preferences. +GLOBAL_LIST_INIT(achievement_sounds, list( + CHEEVO_SOUND_PING = sound('sound/effects/glockenspiel_ping.ogg', volume = 70), + CHEEVO_SOUND_JINGLE = sound('sound/effects/beeps_jingle.ogg', volume = 70), + CHEEVO_SOUND_TADA = sound('sound/effects/tada_fanfare.ogg', volume = 30), +)) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 15e107a01d2f..7d0fc92b4446 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -50,6 +50,7 @@ GLOBAL_LIST_EMPTY(anime_bottom_list) //Monkestation Addition GLOBAL_LIST_EMPTY(arachnid_appendages_list) //Monkestation Addition GLOBAL_LIST_EMPTY(arachnid_chelicerae_list) //Monkestation Addition GLOBAL_LIST_EMPTY(goblin_ears_list) //Monkestation Addition +GLOBAL_LIST_EMPTY(floran_leaves_list) //Monkestation Addition GLOBAL_LIST_INIT(color_list_ethereal, list( "Blue" = "#3399ff", @@ -58,6 +59,7 @@ GLOBAL_LIST_INIT(color_list_ethereal, list( "Cyan Blue" = "#00ffff", "Dark Blue" = "#6666ff", "Dark Fuschia" = "#cc0066", + "Dark Green" = "#37835b", "Dark Red" = "#9c3030", "Dull Yellow" = "#fbdf56", @@ -239,6 +241,8 @@ GLOBAL_LIST_INIT(backpacklist, list( //Female Uniforms GLOBAL_LIST_EMPTY(female_clothing_icons) + //Auto-generated 'fallback' clothing icons +GLOBAL_LIST_EMPTY(fallback_clothing_icons) GLOBAL_LIST_INIT(scarySounds, list( 'sound/effects/footstep/clownstep1.ogg', diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index c95758d3f150..b6fdf4b87b32 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -197,8 +197,8 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items /obj/item/pen/screwdriver = 1, ) = 8, - list(//strange objects - /obj/item/relic = 5, + list(//artifacts + /obj/effect/artifact_spawner = 4, ) = 8, list(//construction and crafting diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 6e5ac2fef5b5..26755614e46f 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -12,6 +12,36 @@ GLOBAL_LIST_INIT(dangerous_turfs, typecacheof(list( /turf/open/space, /turf/open/openspace))) +/// List of types of abstract mob which shouldn't usually exist in the world on its own if we're spawning random mobs +GLOBAL_LIST_INIT(abstract_mob_types, list( + /mob/living/basic/blob_minion, + /mob/living/basic/construct, + /mob/living/basic/guardian, + /mob/living/basic/heretic_summon, + /mob/living/basic/mining, + /mob/living/basic/pet, + /mob/living/basic, + /mob/living/basic/spider, + /mob/living/carbon/alien/adult, + /mob/living/carbon/alien, + /mob/living/carbon/human/consistent, + /mob/living/carbon/human/dummy/consistent, + /mob/living/carbon/human/dummy, + /mob/living/carbon/human/species, + /mob/living/carbon, + /mob/living/silicon, + /mob/living/simple_animal/bot, + /mob/living/simple_animal/hostile/asteroid/elite, + /mob/living/simple_animal/hostile/asteroid, + /mob/living/simple_animal/hostile/megafauna, + /mob/living/simple_animal/hostile/mimic, // Cannot exist if spawned without being passed an item reference + /mob/living/simple_animal/hostile/retaliate, + /mob/living/simple_animal/hostile, + /mob/living/simple_animal/pet, + /mob/living/simple_animal/soulscythe, // As mimic, can't exist if spawned outside an item + /mob/living/simple_animal, +)) + //Since it didn't really belong in any other category, I'm putting this here //This is for procs to replace all the goddamn 'in world's that are chilling around the code @@ -53,6 +83,12 @@ GLOBAL_LIST_EMPTY(current_living_antags) /// All observers with clients that joined as observers. GLOBAL_LIST_EMPTY(current_observers_list) +/// All living mobs which can hear blob telepathy +GLOBAL_LIST_EMPTY(blob_telepathy_mobs) + +/// All "living" (because revenants are in between mortal planes or whatever) mobs that can hear revenants +GLOBAL_LIST_EMPTY(revenant_relay_mobs) + ///underages who have been reported to security for trying to buy things they shouldn't, so they can't spam GLOBAL_LIST_EMPTY(narcd_underages) diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm index ded99d194f3a..d0091684e2d4 100644 --- a/code/_globalvars/lists/names.dm +++ b/code/_globalvars/lists/names.dm @@ -29,6 +29,10 @@ GLOBAL_LIST_INIT(simian_last_names, world.file2list("monkestation/strings/names/ GLOBAL_LIST_INIT(simian_names_female, world.file2list("monkestation/strings/names/simian_female_first.txt")) GLOBAL_LIST_INIT(simian_names_male, world.file2list("monkestation/strings/names/simian_male_first.txt")) GLOBAL_LIST_INIT(cyberauth_names, world.file2list("strings/names/cyberauth.txt")) +GLOBAL_LIST_INIT(syndicate_monkey_names, world.file2list("strings/names/syndicate_monkey.txt")) +GLOBAL_LIST_INIT(guardian_first_names, world.file2list("strings/names/guardian_descriptions.txt")) +GLOBAL_LIST_INIT(guardian_tech_surnames, world.file2list("strings/names/guardian_gamepieces.txt")) +GLOBAL_LIST_INIT(guardian_fantasy_surnames, world.file2list("strings/names/guardian_tarot.txt")) GLOBAL_LIST_INIT(verbs, world.file2list("strings/names/verbs.txt")) GLOBAL_LIST_INIT(ing_verbs, world.file2list("strings/names/ing_verbs.txt")) diff --git a/code/_globalvars/lists/poll_ignore.dm b/code/_globalvars/lists/poll_ignore.dm index 6044f54587f0..c3fbb720650f 100644 --- a/code/_globalvars/lists/poll_ignore.dm +++ b/code/_globalvars/lists/poll_ignore.dm @@ -1,36 +1,69 @@ //Each lists stores ckeys for "Never for this round" option category -#define POLL_IGNORE_SENTIENCE_POTION "sentience_potion" -#define POLL_IGNORE_POSSESSED_BLADE "possessed_blade" +#define POLL_IGNORE_ACADEMY_WIZARD "academy_wizard" #define POLL_IGNORE_ALIEN_LARVA "alien_larva" -#define POLL_IGNORE_SYNDICATE "syndicate" -#define POLL_IGNORE_HOLOPARASITE "holoparasite" -#define POLL_IGNORE_POSIBRAIN "posibrain" -#define POLL_IGNORE_SPECTRAL_BLADE "spectral_blade" -#define POLL_IGNORE_CONSTRUCT "construct" -#define POLL_IGNORE_SPIDER "spider" +#define POLL_IGNORE_ASH_SPIRIT "ash_spirit" #define POLL_IGNORE_ASHWALKER "ashwalker" -#define POLL_IGNORE_GOLEM "golem" +#define POLL_IGNORE_BLOB "blob" +#define POLL_IGNORE_BOTS "bots" +#define POLL_IGNORE_CARGORILLA "cargorilla" +#define POLL_IGNORE_CONTRACTOR_SUPPORT "contractor_support" +#define POLL_IGNORE_CONSTRUCT "construct" #define POLL_IGNORE_DRONE "drone" +#define POLL_IGNORE_FIRE_SHARK "fire_shark" #define POLL_IGNORE_FUGITIVE "fugitive" -#define POLL_IGNORE_DEFECTIVECLONE "defective_clone" -#define POLL_IGNORE_PYROSLIME "slime" -#define POLL_IGNORE_SHADE "shade" +#define POLL_IGNORE_GOLEM "golem" +#define POLL_IGNORE_HERETIC_MONSTER "heretic_monster" +#define POLL_IGNORE_HOLOPARASITE "holoparasite" #define POLL_IGNORE_IMAGINARYFRIEND "imaginary_friend" -#define POLL_IGNORE_SPLITPERSONALITY "split_personality" -#define POLL_IGNORE_CONTRACTOR_SUPPORT "contractor_support" -#define POLL_IGNORE_ACADEMY_WIZARD "academy_wizard" +#define POLL_IGNORE_LAVALAND_ELITE "lavaland_elite" +#define POLL_IGNORE_MAID_IN_MIRROR "maid_in_mirror" +#define POLL_IGNORE_MONKEY_HELMET "mind_magnified_monkey" #define POLL_IGNORE_PAI "pai" -#define POLL_IGNORE_VENUSHUMANTRAP "venus_human_trap" +#define POLL_IGNORE_POSIBRAIN "posibrain" +#define POLL_IGNORE_POSSESSED_BLADE "possessed_blade" +#define POLL_IGNORE_PYROSLIME "slime" +#define POLL_IGNORE_RAW_PROPHET "raw_prophet" #define POLL_IGNORE_REGAL_RAT "regal_rat" -#define POLL_IGNORE_CARGORILLA "cargorilla" -#define POLL_IGNORE_MONKEY_HELMET "mind_magnified_monkey" -#define POLL_IGNORE_LAVALAND_ELITE "lavaland_elite" -#define POLL_IGNORE_SHUTTLE_DENIZENS "shuttle_denizens" -#define POLL_IGNORE_BOTS "bots" +#define POLL_IGNORE_RUST_SPIRIT "rust_spirit" +#define POLL_IGNORE_SENTIENCE_POTION "sentience_potion" +#define POLL_IGNORE_SPIDER "spider" +#define POLL_IGNORE_SHADE "shade" +#define POLL_IGNORE_SYNDICATE "syndicate" +#define POLL_IGNORE_SPLITPERSONALITY "splitpersonality" +#define POLL_IGNORE_VENUSHUMANTRAP "venus" +#define POLL_IGNORE_SPECTRAL_BLADE "spectralblade" +#define POLL_IGNORE_SHUTTLE_DENIZENS "shuttledenizen" +#define POLL_IGNORE_DEFECTIVECLONE "defectiveclone" GLOBAL_LIST_INIT(poll_ignore_desc, list( + POLL_IGNORE_ACADEMY_WIZARD = "Academy Wizard Defender", + POLL_IGNORE_ALIEN_LARVA = "Xenomorph larva", + POLL_IGNORE_ASH_SPIRIT = "Ash Spirit", + POLL_IGNORE_ASHWALKER = "Ashwalker eggs", + POLL_IGNORE_BLOB = "Blob spores", + POLL_IGNORE_BOTS = "Bots", + POLL_IGNORE_CARGORILLA = "Cargorilla", + POLL_IGNORE_CONTRACTOR_SUPPORT = "Contractor Support Unit", + POLL_IGNORE_CONSTRUCT = "Construct", + POLL_IGNORE_DRONE = "Drone shells", + POLL_IGNORE_FIRE_SHARK = "Fire Shark", + POLL_IGNORE_FUGITIVE = "Fugitive Hunter", + POLL_IGNORE_GOLEM = "Golems", + POLL_IGNORE_HERETIC_MONSTER = "Heretic Monster", + POLL_IGNORE_HOLOPARASITE = "Holoparasite", + POLL_IGNORE_IMAGINARYFRIEND = "Imaginary Friend", + POLL_IGNORE_LAVALAND_ELITE = "Lavaland elite", + POLL_IGNORE_MAID_IN_MIRROR = "Maid in the Mirror", + POLL_IGNORE_MONKEY_HELMET = "Mind magnified monkey", + POLL_IGNORE_PAI = JOB_PERSONAL_AI, + POLL_IGNORE_POSIBRAIN = "Positronic brain", + POLL_IGNORE_POSSESSED_BLADE = "Possessed blade", + POLL_IGNORE_PYROSLIME = "Slime", + POLL_IGNORE_RAW_PROPHET = "Raw Prophet", + POLL_IGNORE_RUST_SPIRIT = "Rust Spirit", + POLL_IGNORE_REGAL_RAT = "Regal rat", POLL_IGNORE_SENTIENCE_POTION = "Sentience potion", POLL_IGNORE_POSSESSED_BLADE = "Possessed blade", POLL_IGNORE_ALIEN_LARVA = "Xenomorph larva", @@ -44,7 +77,7 @@ GLOBAL_LIST_INIT(poll_ignore_desc, list( POLL_IGNORE_GOLEM = "Golems", POLL_IGNORE_DRONE = "Drone shells", POLL_IGNORE_FUGITIVE = "Fugitive Hunter", - POLL_IGNORE_DEFECTIVECLONE = "Defective clone", + POLL_IGNORE_DEFECTIVECLONE = "Defective clone", POLL_IGNORE_PYROSLIME = "Slime", POLL_IGNORE_SHADE = "Shade", POLL_IGNORE_IMAGINARYFRIEND = "Imaginary Friend", diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index 9671ecaa57e9..9819b3499a42 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -51,33 +51,57 @@ GLOBAL_LIST_INIT(phobia_regexes, list( )) GLOBAL_LIST_INIT(phobia_mobs, list( - "spiders" = typecacheof(list(/mob/living/basic/spider/giant)), - "security" = typecacheof(list(/mob/living/simple_animal/bot/secbot)), + "aliens" = typecacheof(list( + /mob/living/carbon/alien, + /mob/living/simple_animal/slime, + )), + "anime" = typecacheof(list(/mob/living/basic/guardian)), + "birds" = typecacheof(list( + /mob/living/basic/chick, + /mob/living/basic/chicken, + /mob/living/basic/parrot, + /mob/living/basic/pet/penguin, + )), + "conspiracies" = typecacheof(list( + /mob/living/basic/drone, + /mob/living/basic/pet/penguin, + /mob/living/simple_animal/bot/secbot, + )), + "doctors" = typecacheof(list(/mob/living/simple_animal/bot/medbot)), + "heresy" = typecacheof(list( + /mob/living/basic/heretic_summon, + )), + "insects" = typecacheof(list( + /mob/living/basic/cockroach, + /mob/living/basic/bee, + )), "lizards" = typecacheof(list(/mob/living/basic/lizard)), - "skeletons" = typecacheof(list(/mob/living/simple_animal/hostile/skeleton)), - "snakes" = typecacheof(list(/mob/living/simple_animal/hostile/retaliate/snake)), + "skeletons" = typecacheof(list(/mob/living/basic/skeleton)), "robots" = typecacheof(list( + /mob/living/basic/drone, /mob/living/silicon/ai, /mob/living/silicon/robot, /mob/living/simple_animal/bot, - /mob/living/simple_animal/drone, )), - "doctors" = typecacheof(list(/mob/living/simple_animal/bot/medbot)), + "security" = typecacheof(list(/mob/living/simple_animal/bot/secbot)), + "spiders" = typecacheof(list(/mob/living/basic/spider/giant)), + "skeletons" = typecacheof(list(/mob/living/basic/skeleton)), + "snakes" = typecacheof(list(/mob/living/basic/snake)), "the supernatural" = typecacheof(list( /mob/dead/observer, /mob/living/basic/bat, + /mob/living/basic/construct, /mob/living/basic/demon, /mob/living/basic/faithless, /mob/living/basic/ghost, + /mob/living/basic/heretic_summon, + /mob/living/basic/revenant, + /mob/living/basic/shade, + /mob/living/basic/skeleton, + /mob/living/basic/wizard, /mob/living/simple_animal/bot/mulebot/paranormal, - /mob/living/simple_animal/hostile/construct, /mob/living/simple_animal/hostile/dark_wizard, - /mob/living/simple_animal/hostile/heretic_summon, - /mob/living/simple_animal/hostile/skeleton, - /mob/living/simple_animal/hostile/wizard, /mob/living/simple_animal/hostile/zombie, - /mob/living/simple_animal/revenant, - /mob/living/simple_animal/shade, )), "aliens" = typecacheof(list( /mob/living/carbon/alien, @@ -85,16 +109,16 @@ GLOBAL_LIST_INIT(phobia_mobs, list( )), "conspiracies" = typecacheof(list( /mob/living/simple_animal/bot/secbot, - /mob/living/simple_animal/drone, + /mob/living/basic/drone, /mob/living/basic/pet/penguin, )), "birds" = typecacheof(list( /mob/living/basic/chick, /mob/living/basic/chicken, - /mob/living/simple_animal/parrot, + /mob/living/basic/parrot, /mob/living/basic/pet/penguin, )), - "anime" = typecacheof(list(/mob/living/simple_animal/hostile/guardian)), + "anime" = typecacheof(list(/mob/living/basic/guardian)), "insects" = typecacheof(list( /mob/living/basic/cockroach, /mob/living/basic/bee, diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 55326d5633ef..063d7f7cbf2a 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -80,6 +80,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BLOOD_DEFICIENCY" = TRAIT_BLOOD_DEFICIENCY, "TRAIT_JOLLY" = TRAIT_JOLLY, "TRAIT_NO_GLIDE" = TRAIT_NO_GLIDE, + "TRAIT_NO_FLOATING_ANIM" = TRAIT_NO_FLOATING_ANIM, "TRAIT_NOCRITDAMAGE" = TRAIT_NOCRITDAMAGE, "TRAIT_NO_SLIP_WATER" = TRAIT_NO_SLIP_WATER, "TRAIT_NO_SLIP_ICE" = TRAIT_NO_SLIP_ICE, @@ -96,6 +97,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_PARALYSIS_R_ARM" = TRAIT_PARALYSIS_R_ARM, "TRAIT_PARALYSIS_L_LEG" = TRAIT_PARALYSIS_L_LEG, "TRAIT_PARALYSIS_R_LEG" = TRAIT_PARALYSIS_R_LEG, + "TRAIT_PARROT_PERCHED" = TRAIT_PARROT_PERCHED, "TRAIT_CANNOT_OPEN_PRESENTS" = TRAIT_CANNOT_OPEN_PRESENTS, "TRAIT_PRESENT_VISION" = TRAIT_PRESENT_VISION, "TRAIT_DISK_VERIFIER" = TRAIT_DISK_VERIFIER, @@ -194,6 +196,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_UNOBSERVANT" = TRAIT_UNOBSERVANT, "TRAIT_TENTACLE_IMMUNE" = TRAIT_TENTACLE_IMMUNE, "TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE, + "TRAIT_UNDENSE" = TRAIT_UNDENSE, + "TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV, ), /obj/item/bodypart = list( "TRAIT_PARALYSIS" = TRAIT_PARALYSIS, diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 31168fb1657e..95597d9b1ac0 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -18,15 +18,32 @@ // DOES NOT EFFECT THE BASE 1 DECISECOND DELAY OF NEXT_CLICK /mob/proc/changeNext_move(num) - next_move = world.time + ((num+next_move_adjust)*next_move_modifier) + var/stat_multi = 1 + switch(stat) + if(SOFT_CRIT) + stat_multi = 8 + if(HARD_CRIT) + stat_multi = 16 + else + stat_multi = 1 + next_move = world.time + ((num+next_move_adjust) * next_move_modifier * stat_multi) /mob/living/changeNext_move(num) var/mod = next_move_modifier var/adj = next_move_adjust + var/stat_multi = 1 + switch(stat) + if(SOFT_CRIT) + stat_multi = 4 + if(HARD_CRIT) + stat_multi = 8 + else + stat_multi = 1 + for(var/datum/status_effect/effect as anything in status_effects) mod *= effect.nextmove_modifier() adj += effect.nextmove_adjust() - next_move = world.time + ((num + adj)*mod) + next_move = world.time + ((num + adj)*mod * stat_multi) /** * Before anything else, defer these calls to a per-mobtype handler. This allows us to @@ -69,7 +86,7 @@ return next_click = world.time + 1 - if(check_click_intercept(params,A) || notransform) + if(check_click_intercept(params,A) || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return var/list/modifiers = params2list(params) @@ -106,7 +123,7 @@ CtrlClickOn(A) return - if(incapacitated(IGNORE_RESTRAINTS|IGNORE_STASIS)) + if(incapacitated(IGNORE_RESTRAINTS|IGNORE_STASIS|IGNORE_CRIT)) return face_atom(A) @@ -117,7 +134,7 @@ if(!LAZYACCESS(modifiers, "catcher") && A.IsObscured()) return - if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED) && !((stat >= SOFT_CRIT && (stat != DEAD && stat != UNCONSCIOUS)))) changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow UnarmedAttack(A, FALSE) return diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 2537133a5d86..a05d11c73d69 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -510,7 +510,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." alerttooltipstyle = "cult" var/static/image/narnar var/angle = 0 - var/mob/living/simple_animal/hostile/construct/Cviewer = null + var/mob/living/basic/construct/Cviewer /atom/movable/screen/alert/bloodsense/Initialize(mapload) . = ..() @@ -615,19 +615,13 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." //GUARDIANS -/atom/movable/screen/alert/cancharge - name = "Charge Ready" - desc = "You are ready to charge at a location!" - icon_state = "guardian_charge" - alerttooltipstyle = "parasite" - /atom/movable/screen/alert/canstealth name = "Stealth Ready" desc = "You are ready to enter stealth!" icon_state = "guardian_canstealth" alerttooltipstyle = "parasite" -/atom/movable/screen/alert/instealth +/atom/movable/screen/alert/status_effect/instealth name = "In Stealth" desc = "You are in stealth and your next attack will do bonus damage!" icon_state = "guardian_instealth" diff --git a/code/_onclick/hud/drones.dm b/code/_onclick/hud/drones.dm index 61c006ac6fe5..4ae7b3070d97 100644 --- a/code/_onclick/hud/drones.dm +++ b/code/_onclick/hud/drones.dm @@ -32,19 +32,17 @@ /datum/hud/dextrous/drone/persistent_inventory_update() if(!mymob) return - var/mob/living/simple_animal/drone/D = mymob + var/mob/living/basic/drone/drone = mymob if(hud_shown) - if(D.internal_storage) - D.internal_storage.screen_loc = ui_drone_storage - D.client.screen += D.internal_storage - if(D.head) - D.head.screen_loc = ui_drone_head - D.client.screen += D.head + if(!isnull(drone.internal_storage)) + drone.internal_storage.screen_loc = ui_drone_storage + drone.client.screen += drone.internal_storage + if(!isnull(drone.head)) + drone.head.screen_loc = ui_drone_head + drone.client.screen += drone.head else - if(D.internal_storage) - D.internal_storage.screen_loc = null - if(D.head) - D.head.screen_loc = null + drone.internal_storage?.screen_loc = null + drone.head?.screen_loc = null ..() diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm index 9cdaea2356aa..7bb20ba10b79 100644 --- a/code/_onclick/hud/generic_dextrous.dm +++ b/code/_onclick/hud/generic_dextrous.dm @@ -46,7 +46,7 @@ using.hud = src static_inventory += using - mymob.client.clear_screen() + mymob.canon_client?.clear_screen() for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) @@ -66,10 +66,3 @@ for(var/obj/item/I in D.held_items) I.screen_loc = null D.client.screen -= I - - -//Dextrous simple mobs can use hands! -/mob/living/simple_animal/create_mob_hud() - if(dextrous) - hud_type = dextrous_hud_type - return ..() diff --git a/code/_onclick/hud/guardian.dm b/code/_onclick/hud/guardian.dm index 91da0f9fdb85..cbf274cbeb05 100644 --- a/code/_onclick/hud/guardian.dm +++ b/code/_onclick/hud/guardian.dm @@ -1,7 +1,7 @@ /datum/hud/guardian ui_style = 'icons/hud/guardian.dmi' -/datum/hud/guardian/New(mob/living/simple_animal/hostile/guardian/owner) +/datum/hud/guardian/New(mob/living/basic/guardian/owner) ..() var/atom/movable/screen/using @@ -41,10 +41,10 @@ using.hud = src static_inventory += using -/datum/hud/dextrous/guardian/New(mob/living/simple_animal/hostile/guardian/owner) //for a dextrous guardian +/datum/hud/dextrous/guardian/New(mob/living/basic/guardian/owner) //for a dextrous guardian ..() var/atom/movable/screen/using - if(istype(owner, /mob/living/simple_animal/hostile/guardian/dextrous)) + if(istype(owner, /mob/living/basic/guardian/dextrous)) var/atom/movable/screen/inventory/inv_box inv_box = new /atom/movable/screen/inventory() @@ -102,8 +102,8 @@ /datum/hud/dextrous/guardian/persistent_inventory_update() if(!mymob) return - if(istype(mymob, /mob/living/simple_animal/hostile/guardian/dextrous)) - var/mob/living/simple_animal/hostile/guardian/dextrous/dex_guardian = mymob + if(istype(mymob, /mob/living/basic/guardian/dextrous)) + var/mob/living/basic/guardian/dextrous/dex_guardian = mymob if(hud_shown) if(dex_guardian.internal_storage) @@ -125,7 +125,7 @@ /atom/movable/screen/guardian/manifest/Click() if(isguardian(usr)) - var/mob/living/simple_animal/hostile/guardian/user = usr + var/mob/living/basic/guardian/user = usr user.manifest() @@ -136,7 +136,7 @@ /atom/movable/screen/guardian/recall/Click() if(isguardian(usr)) - var/mob/living/simple_animal/hostile/guardian/user = usr + var/mob/living/basic/guardian/user = usr user.recall() /atom/movable/screen/guardian/toggle_mode @@ -146,7 +146,7 @@ /atom/movable/screen/guardian/toggle_mode/Click() if(isguardian(usr)) - var/mob/living/simple_animal/hostile/guardian/user = usr + var/mob/living/basic/guardian/user = usr user.toggle_modes() /atom/movable/screen/guardian/toggle_mode/inactive @@ -169,7 +169,7 @@ /atom/movable/screen/guardian/communicate/Click() if(isguardian(usr)) - var/mob/living/simple_animal/hostile/guardian/user = usr + var/mob/living/basic/guardian/user = usr user.communicate() @@ -180,5 +180,5 @@ /atom/movable/screen/guardian/toggle_light/Click() if(isguardian(usr)) - var/mob/living/simple_animal/hostile/guardian/user = usr + var/mob/living/basic/guardian/user = usr user.toggle_light() diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 45719f3af7f0..17391aec7423 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -97,6 +97,8 @@ GLOBAL_LIST_INIT(available_ui_styles, list( // subtypes can override this to force a specific UI style var/ui_style + var/list/team_finder_arrows = list() + /datum/hud/New(mob/owner) mymob = owner @@ -209,6 +211,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( QDEL_NULL(module_store_icon) QDEL_LIST(static_inventory) + QDEL_LIST(team_finder_arrows) inv_slots.Cut() action_intent = null @@ -317,6 +320,8 @@ GLOBAL_LIST_INIT(available_ui_styles, list( screenmob.client.screen += hotkeybuttons if(infodisplay.len) screenmob.client.screen += infodisplay + if(team_finder_arrows.len) + screenmob.client.screen += team_finder_arrows if(always_visible_inventory.len) screenmob.client.screen += always_visible_inventory @@ -329,12 +334,16 @@ GLOBAL_LIST_INIT(available_ui_styles, list( hud_shown = FALSE //Governs behavior of other procs if(static_inventory.len) screenmob.client.screen -= static_inventory + if(team_finder_arrows.len) + screenmob.client.screen += team_finder_arrows if(toggleable_inventory.len) screenmob.client.screen -= toggleable_inventory if(hotkeybuttons.len) screenmob.client.screen -= hotkeybuttons if(infodisplay.len) screenmob.client.screen += infodisplay + if(team_finder_arrows.len) + screenmob.client.screen -= team_finder_arrows if(always_visible_inventory.len) screenmob.client.screen += always_visible_inventory diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm index 587088e19029..44a20e485c3e 100644 --- a/code/_onclick/hud/new_player.dm +++ b/code/_onclick/hud/new_player.dm @@ -299,17 +299,19 @@ return hud.mymob.client << link("https://discord.gg/monkestation") -/atom/movable/screen/lobby/button/monke +/atom/movable/screen/lobby/button/twitch icon = 'icons/hud/lobby/bottom_buttons.dmi' icon_state = "info" base_icon_state = "info" screen_loc = "TOP:-126,CENTER:14" -/atom/movable/screen/lobby/button/monke/Click(location, control, params) +/atom/movable/screen/lobby/button/twitch/Click(location, control, params) . = ..() if(!.) return - hud.mymob.client << link("https://www.twitch.tv/thedukeofook") + if(!CONFIG_GET(string/twitch_link_website)) + return + hud.mymob.client << link("[CONFIG_GET(string/twitch_link_website)]?ckey=[hud.mymob.client.ckey]") /atom/movable/screen/lobby/button/settings icon = 'icons/hud/lobby/bottom_buttons.dmi' diff --git a/code/_onclick/hud/ooze.dm b/code/_onclick/hud/ooze.dm index d3ebe3e72885..c13123bb43bb 100644 --- a/code/_onclick/hud/ooze.dm +++ b/code/_onclick/hud/ooze.dm @@ -1,4 +1,4 @@ -///Hud type with targetting dol and a nutrition bar +///Hud type with targeting dol and a nutrition bar /datum/hud/ooze/New(mob/living/owner) . = ..() diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 75e83a00b593..44bd2873ccdb 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -345,9 +345,13 @@ GLOBAL_LIST_EMPTY(radial_menus) Choices should be a list where list keys are movables or text used for element names and return value and list values are movables/icons/images used for element icons */ -/proc/show_radial_menu(mob/user, atom/anchor, list/choices, uniqueid, radius, datum/callback/custom_check, require_near = FALSE, tooltips = FALSE, no_repeat_close = FALSE, radial_slice_icon = "radial_slice") +/proc/show_radial_menu(mob/user, atom/anchor, list/choices, uniqueid, radius, datum/callback/custom_check, require_near = FALSE, tooltips = FALSE, no_repeat_close = FALSE, radial_slice_icon = "radial_slice", autopick_single_option = TRUE) if(!user || !anchor || !length(choices)) return + + if(length(choices)==1 && autopick_single_option) + return choices[1] + if(!uniqueid) uniqueid = "defmenu_[REF(user)]_[REF(anchor)]" diff --git a/code/_onclick/hud/screentip.dm b/code/_onclick/hud/screentip.dm index 8f3b9d63014d..50162e6e3a8e 100644 --- a/code/_onclick/hud/screentip.dm +++ b/code/_onclick/hud/screentip.dm @@ -15,7 +15,7 @@ /atom/movable/screen/screentip/proc/update_view(datum/source) SIGNAL_HANDLER - if(!hud || !hud.mymob.client.view_size) //Might not have been initialized by now + if(!hud || !hud.mymob.canon_client?.view_size) //Might not have been initialized by now return maptext_width = view_to_pixels(hud.mymob.client.view_size.getView())[1] diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 8c12b83daac1..62fa07070976 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -156,6 +156,17 @@ return ..() || ((obj_flags & CAN_BE_HIT) && attacking_item.attack_atom(src, user, params)) /mob/living/attackby(obj/item/attacking_item, mob/living/user, params) + for(var/datum/surgery/operations as anything in surgeries) + if(user.istate & ISTATE_HARM) + break + if(IS_IN_INVALID_SURGICAL_POSITION(src, operations)) + continue + if(!(operations.surgery_flags & SURGERY_SELF_OPERABLE) && (user == src)) + continue + var/list/modifiers = params2list(params) + if(operations.next_step(user, modifiers)) + return TRUE + if(..()) return TRUE user.changeNext_move(attacking_item.attack_speed) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index aa08d7889fa8..f3a4adab662f 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -16,7 +16,7 @@ Otherwise pretty standard. */ /mob/living/carbon/human/UnarmedAttack(atom/A, proximity_flag) - if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED) && stat < SOFT_CRIT) if(src == A) check_self_for_injuries() return @@ -245,14 +245,14 @@ Drones */ -/mob/living/simple_animal/drone/resolve_unarmed_attack(atom/attack_target, proximity_flag, list/modifiers) +/mob/living/basic/drone/resolve_unarmed_attack(atom/attack_target, proximity_flag, list/modifiers) attack_target.attack_drone(src, modifiers) -/mob/living/simple_animal/drone/resolve_right_click_attack(atom/target, list/modifiers) +/mob/living/basic/drone/resolve_right_click_attack(atom/target, list/modifiers) return target.attack_drone_secondary(src, modifiers) /// Defaults to attack_hand. Override it when you don't want drones to do same stuff as humans. -/atom/proc/attack_drone(mob/living/simple_animal/drone/user, list/modifiers) +/atom/proc/attack_drone(mob/living/basic/drone/user, list/modifiers) attack_hand(user, modifiers) /** @@ -260,7 +260,7 @@ * Defaults to attack_hand_secondary. * When overriding it, remember that it ought to return a SECONDARY_ATTACK_* value. */ -/atom/proc/attack_drone_secondary(mob/living/simple_animal/drone/user, list/modifiers) +/atom/proc/attack_drone_secondary(mob/living/basic/drone/user, list/modifiers) return attack_hand_secondary(user, modifiers) /* @@ -296,14 +296,14 @@ */ /mob/living/simple_animal/resolve_unarmed_attack(atom/attack_target, list/modifiers) - if(dextrous && (isitem(attack_target) || !(istate & ISTATE_HARM))) + if((isitem(attack_target) || !(istate & ISTATE_HARM))) attack_target.attack_hand(src, modifiers) update_held_items() else return ..() /mob/living/simple_animal/resolve_right_click_attack(atom/target, list/modifiers) - if(dextrous && (isitem(target) || !(istate & ISTATE_HARM))) + if((isitem(target) || !(istate & ISTATE_HARM))) . = target.attack_hand_secondary(src, modifiers) update_held_items() else @@ -315,10 +315,7 @@ /mob/living/simple_animal/hostile/resolve_unarmed_attack(atom/attack_target, list/modifiers) GiveTarget(attack_target) - if(dextrous && (isitem(attack_target) || !(istate & ISTATE_HARM))) - return ..() - else - AttackingTarget(attack_target) + INVOKE_ASYNC(src, PROC_REF(AttackingTarget), attack_target) #undef LIVING_UNARMED_ATTACK_BLOCKED diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 465918bc4245..1686c6a2ca05 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -327,6 +327,8 @@ /datum/config_entry/string/overflow_job default = JOB_ASSISTANT +/datum/config_entry/flag/spooktober_enabled + /datum/config_entry/flag/grey_assistants /datum/config_entry/number/lavaland_budget diff --git a/code/controllers/configuration/entries/monkestation.dm b/code/controllers/configuration/entries/monkestation.dm index 3f21af608714..9df2b8d34dca 100644 --- a/code/controllers/configuration/entries/monkestation.dm +++ b/code/controllers/configuration/entries/monkestation.dm @@ -9,6 +9,7 @@ /datum/config_entry/string/patreon_link_website +/datum/config_entry/string/twitch_link_website /datum/config_entry/string/regular_roundend_webhook_url diff --git a/code/controllers/master.dm b/code/controllers/master.dm index a7013f058ed6..f44a5f5161e9 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -282,6 +282,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new if(sleep_offline_after_initializations && CONFIG_GET(flag/resume_after_initializations)) world.sleep_offline = FALSE initializations_finished_with_no_players_logged_in = initialized_tod < REALTIMEOFDAY - 10 + /// run votes + SSvote.initiate_vote(/datum/vote/storyteller, "pick round storyteller", forced = TRUE) // idk where else to run this lol /** * Initialize a given subsystem and handle the results. diff --git a/code/controllers/subsystem/achievements.dm b/code/controllers/subsystem/achievements.dm index 58fcb3efb733..e477848d7397 100644 --- a/code/controllers/subsystem/achievements.dm +++ b/code/controllers/subsystem/achievements.dm @@ -6,6 +6,8 @@ SUBSYSTEM_DEF(achievements) ///List of achievements var/list/datum/award/achievement/achievements = list() + ///The achievement with the highest amount of players that have unlocked it. + var/datum/award/achievement/most_unlocked_achievement ///List of scores var/list/datum/award/score/scores = list() ///List of all awards @@ -16,18 +18,47 @@ SUBSYSTEM_DEF(achievements) return SS_INIT_NO_NEED achievements_enabled = TRUE - for(var/T in subtypesof(/datum/award/achievement)) - var/instance = new T - achievements[T] = instance - awards[T] = instance + var/list/achievements_by_db_id = list() + for(var/datum/award/achievement/achievement as anything in subtypesof(/datum/award/achievement)) + if(!initial(achievement.database_id)) // abstract type + continue + var/datum/award/achievement/instance = new achievement + achievements[achievement] = instance + awards[achievement] = instance + achievements_by_db_id[instance.database_id] = instance - for(var/T in subtypesof(/datum/award/score)) - var/instance = new T - scores[T] = instance - awards[T] = instance + for(var/datum/award/score/score as anything in subtypesof(/datum/award/score)) + if(!initial(score.database_id)) // abstract type + continue + var/instance = new score + scores[score] = instance + awards[score] = instance update_metadata() + /** + * Count how many (unlocked) achievements are in the achievements database + * then store that amount in the times_achieved variable for each achievement. + * + * Thanks to Jordie for the query. + */ + var/datum/db_query/query = SSdbcore.NewQuery( + "SELECT a.achievement_key, COUNT(a.achievement_key) AS count FROM achievements a \ + JOIN achievement_metadata m ON a.achievement_key = m.achievement_key AND m.achievement_type = 'achievement' \ + GROUP BY a.achievement_key ORDER BY count DESC" + ) + if(query.Execute(async = TRUE)) + while(query.NextRow()) + var/id = query.item[1] + var/datum/award/achievement/instance = id ? achievements_by_db_id[id] : null + if(isnull(instance)) // removed achievement + continue + instance.times_achieved = query.item[2] + // the results are ordered in descending orders, so the first in the list should be the most unlocked one. + if(!most_unlocked_achievement) + most_unlocked_achievement = instance + qdel(query) + for(var/i in GLOB.clients) var/client/C = i if(!C.player_details.achievements.initialized) @@ -65,8 +96,6 @@ SUBSYSTEM_DEF(achievements) var/list/to_update = list() for(var/T in awards) var/datum/award/A = awards[T] - if(!A.database_id) - continue if(!current_metadata[A.database_id] || current_metadata[A.database_id] < A.achievement_version) to_update += list(A.get_metadata_row()) diff --git a/code/controllers/subsystem/ambience.dm b/code/controllers/subsystem/ambience.dm index e138c2d6048c..75d68b1651d5 100644 --- a/code/controllers/subsystem/ambience.dm +++ b/code/controllers/subsystem/ambience.dm @@ -51,6 +51,10 @@ SUBSYSTEM_DEF(ambience) ///Attempts to play an ambient sound to a mob, returning the cooldown in deciseconds /area/proc/play_ambience(mob/M, sound/override_sound, volume = 27) var/sound/new_sound = override_sound || pick(ambientsounds) + if(M.client?.prefs.channel_volume) + volume *= M.client.prefs.channel_volume["[CHANNEL_MASTER_VOLUME]"] * 0.01 + volume *= M.client.prefs.channel_volume["[CHANNEL_AMBIENCE]"] * 0.01 + new_sound = sound(new_sound, repeat = 0, wait = 0, volume = volume, channel = CHANNEL_AMBIENCE) SEND_SOUND(M, new_sound) diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 0b5d39b77380..96efadf80811 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -156,7 +156,8 @@ SUBSYSTEM_DEF(atoms) BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT else SEND_SIGNAL(A, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) - var/atom/movable/location = A.loc + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_ATOM_AFTER_POST_INIT, A) + var/atom/location = A.loc if(location) /// Sends a signal that the new atom `src`, has been created at `loc` SEND_SIGNAL(location, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZED_ON, A, arguments[1]) diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index 921cedc912fe..fc40b44676c8 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -66,6 +66,8 @@ SUBSYSTEM_DEF(economy) /// Tracks a temporary sum of all money in the system /// We need this on the subsystem because of yielding and such var/temporary_total = 0 + ///the mail crate we last generated + var/obj/structure/closet/crate/mail/economy/mail_crate /datum/controller/subsystem/economy/Initialize() //removes cargo from the split diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index e139ea091196..93aeb1504c03 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -134,6 +134,8 @@ SUBSYSTEM_DEF(job) if(!job.map_check()) //Even though we initialize before mapping, this is fine because the config is loaded at new log_job_debug("Removed [job.title] due to map config") continue + if(!CONFIG_GET(flag/spooktober_enabled) && job.job_flags & JOB_SPOOKTOBER) //if spooktober's not enabled, don't load spooktober jobs + continue new_all_occupations += job name_occupations[job.title] = job type_occupations[job_type] = job diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm index 515fdd465a39..51d595c98674 100644 --- a/code/controllers/subsystem/materials.dm +++ b/code/controllers/subsystem/materials.dm @@ -33,6 +33,8 @@ SUBSYSTEM_DEF(materials) var/list/rigid_stack_recipes = list( new /datum/stack_recipe("Carving block", /obj/structure/carving_block, 5, time = 3 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, applies_mats = TRUE, category = CAT_STRUCTURE), ) + ///Blank versions of all of the mining templates, indexed by rarity. + var/list/template_paths_by_rarity = list() ///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropiate vars (See these variables for more info) /datum/controller/subsystem/materials/proc/InitializeMaterials() @@ -165,3 +167,7 @@ SUBSYSTEM_DEF(materials) combo[GET_MATERIAL_REF(mat)] = materials_declaration[mat] * multiplier material_combos[combo_index] = combo return combo + +/datum/controller/subsystem/materials/proc/InitializeTemplates() + for(var/datum/mining_template/template as anything in typesof(/datum/mining_template)) + LAZYADD(template_paths_by_rarity["[initial(template.rarity)]"], template) diff --git a/code/controllers/subsystem/movement/movement_types.dm b/code/controllers/subsystem/movement/movement_types.dm index 28abee4807ce..3e20d526f5cd 100644 --- a/code/controllers/subsystem/movement/movement_types.dm +++ b/code/controllers/subsystem/movement/movement_types.dm @@ -326,7 +326,7 @@ * repath_delay - How often we're allowed to recalculate our path * max_path_length - The maximum number of steps we can take in a given path to search (default: 30, 0 = infinite) * miminum_distance - Minimum distance to the target before path returns, could be used to get near a target, but not right to it - for an AI mob with a gun, for example - * id - An ID card representing what access we have and what doors we can open + * access - A list representing what access we have and what doors we can open * simulated_only - Whether we consider turfs without atmos simulation (AKA do we want to ignore space) * avoid - If we want to avoid a specific turf, like if we're a mulebot who already got blocked by some turf * skip_first - Whether or not to delete the first item in the path. This would be done because the first item is the starting tile, which can break things @@ -343,7 +343,7 @@ repath_delay, max_path_length, minimum_distance, - obj/item/card/id/id, + list/access, simulated_only, turf/avoid, skip_first, @@ -364,7 +364,7 @@ repath_delay, max_path_length, minimum_distance, - id, + access, simulated_only, avoid, skip_first, @@ -377,8 +377,8 @@ var/max_path_length ///Minimum distance to the target before path returns var/minimum_distance - ///An ID card representing what access we have and what doors we can open. Kill me - var/obj/item/card/id/id + ///A list representing what access we have and what doors we can open. + var/list/access ///Whether we consider turfs without atmos simulation (AKA do we want to ignore space) var/simulated_only ///A perticular turf to avoid @@ -391,30 +391,28 @@ COOLDOWN_DECLARE(repath_cooldown) ///Bool used to determine if we're already making a path in JPS. this prevents us from re-pathing while we're already busy. var/is_pathing = FALSE - ///Callback to invoke once we make a path - var/datum/callback/on_finish_callback + ///Callbacks to invoke once we make a path + var/list/datum/callback/on_finish_callbacks = list() /datum/move_loop/has_target/jps/New(datum/movement_packet/owner, datum/controller/subsystem/movement/controller, atom/moving, priority, flags, datum/extra_info) . = ..() - on_finish_callback = CALLBACK(src, PROC_REF(on_finish_pathing)) + on_finish_callbacks += CALLBACK(src, PROC_REF(on_finish_pathing)) -/datum/move_loop/has_target/jps/setup(delay, timeout, atom/chasing, repath_delay, max_path_length, minimum_distance, obj/item/card/id/id, simulated_only, turf/avoid, skip_first, list/initial_path) +/datum/move_loop/has_target/jps/setup(delay, timeout, atom/chasing, repath_delay, max_path_length, minimum_distance, list/access, simulated_only, turf/avoid, skip_first, list/initial_path) . = ..() if(!.) return src.repath_delay = repath_delay src.max_path_length = max_path_length src.minimum_distance = minimum_distance - src.id = id + src.access = access src.simulated_only = simulated_only src.avoid = avoid src.skip_first = skip_first movement_path = initial_path?.Copy() - if(isidcard(id)) - RegisterSignal(id, COMSIG_PARENT_QDELETING, PROC_REF(handle_no_id)) //I prefer erroring to harddels. If this breaks anything consider making id info into a datum or something - -/datum/move_loop/has_target/jps/compare_loops(datum/move_loop/loop_type, priority, flags, extra_info, delay, timeout, atom/chasing, repath_delay, max_path_length, minimum_distance, obj/item/card/id/id, simulated_only, turf/avoid, skip_first, initial_path) - if(..() && repath_delay == src.repath_delay && max_path_length == src.max_path_length && minimum_distance == src.minimum_distance && id == src.id && simulated_only == src.simulated_only && avoid == src.avoid) + +/datum/move_loop/has_target/jps/compare_loops(datum/move_loop/loop_type, priority, flags, extra_info, delay, timeout, atom/chasing, repath_delay, max_path_length, minimum_distance, list/access, simulated_only, turf/avoid, skip_first, initial_path) + if(..() && repath_delay == src.repath_delay && max_path_length == src.max_path_length && minimum_distance == src.minimum_distance && access ~= src.access && simulated_only == src.simulated_only && avoid == src.avoid) return TRUE return FALSE @@ -428,20 +426,16 @@ movement_path = null /datum/move_loop/has_target/jps/Destroy() - id = null //Kill me avoid = null + on_finish_callbacks = null return ..() -/datum/move_loop/has_target/jps/proc/handle_no_id() - SIGNAL_HANDLER - id = null - ///Tries to calculate a new path for this moveloop. /datum/move_loop/has_target/jps/proc/recalculate_path() if(!COOLDOWN_FINISHED(src, repath_cooldown)) return COOLDOWN_START(src, repath_cooldown, repath_delay) - if(SSpathfinder.pathfind(moving, target, max_path_length, minimum_distance, id, simulated_only, avoid, skip_first, on_finish = on_finish_callback)) + if(SSpathfinder.pathfind(moving, target, max_path_length, minimum_distance, access, simulated_only, avoid, skip_first, on_finish = on_finish_callbacks)) is_pathing = TRUE SEND_SIGNAL(src, COMSIG_MOVELOOP_JPS_REPATH) diff --git a/code/controllers/subsystem/npcpool.dm b/code/controllers/subsystem/npcpool.dm index 34cad5d7f861..6fbfdadf6828 100644 --- a/code/controllers/subsystem/npcpool.dm +++ b/code/controllers/subsystem/npcpool.dm @@ -29,7 +29,7 @@ SUBSYSTEM_DEF(npcpool) stack_trace("Found a null in simple_animals active list [SA.type]!") continue - if(!SA.ckey && !SA.notransform) + if(!SA.ckey && !HAS_TRAIT(SA, TRAIT_NO_TRANSFORM)) if(SA.stat != DEAD) SA.handle_automated_movement() if(SA.stat != DEAD) diff --git a/code/controllers/subsystem/pathfinder.dm b/code/controllers/subsystem/pathfinder.dm index c503826b9bd8..fa1a7af5c859 100644 --- a/code/controllers/subsystem/pathfinder.dm +++ b/code/controllers/subsystem/pathfinder.dm @@ -8,6 +8,10 @@ SUBSYSTEM_DEF(pathfinder) var/list/datum/pathfind/active_pathing = list() /// List of pathfind datums being ACTIVELY processed. exists to make subsystem stats readable var/list/datum/pathfind/currentrun = list() + /// List of uncheccked source_to_map entries + var/list/currentmaps = list() + /// Assoc list of target turf -> list(/datum/path_map) centered on the turf + var/list/source_to_maps = list() var/static/space_type_cache /datum/controller/subsystem/pathfinder/Initialize() @@ -23,6 +27,7 @@ SUBSYSTEM_DEF(pathfinder) /datum/controller/subsystem/pathfinder/fire(resumed) if(!resumed) src.currentrun = active_pathing.Copy() + src.currentmaps = deep_copy_list(source_to_maps) // Dies of sonic speed from caching datum var reads var/list/currentrun = src.currentrun @@ -38,10 +43,165 @@ SUBSYSTEM_DEF(pathfinder) // Next please currentrun.len-- + // Go over our existing pathmaps, clear out the ones we aren't using + var/list/currentmaps = src.currentmaps + var/oldest_time = world.time - MAP_REUSE_SLOWEST + while(length(currentmaps)) + var/turf/source = currentmaps[length(currentmaps)] + var/list/datum/path_map/owned_maps = currentmaps[source] + for(var/datum/path_map/map as anything in owned_maps) + if(map.creation_time < oldest_time && !map.building) + source_to_maps[source] -= map + owned_maps.len-- + if(MC_TICK_CHECK) + return + if(!length(source_to_maps[source])) + source_to_maps -= source + + currentmaps.len-- + /// Initiates a pathfind. Returns true if we're good, FALSE if something's failed -/datum/controller/subsystem/pathfinder/proc/pathfind(atom/movable/caller, atom/end, max_distance = 30, mintargetdist, id=null, simulated_only = TRUE, turf/exclude, skip_first=TRUE, diagonal_safety=TRUE, datum/callback/on_finish) - var/datum/pathfind/path = new(caller, end, id, max_distance, mintargetdist, simulated_only, exclude, skip_first, diagonal_safety, on_finish) +/datum/controller/subsystem/pathfinder/proc/pathfind(atom/movable/caller, atom/end, max_distance = 30, mintargetdist, access = list(), simulated_only = TRUE, turf/exclude, skip_first = TRUE, diagonal_handling = DIAGONAL_REMOVE_CLUNKY, list/datum/callback/on_finish) + var/datum/pathfind/jps/path = new() + path.setup(caller, access, max_distance, simulated_only, exclude, on_finish, end, mintargetdist, skip_first, diagonal_handling) + if(path.start()) + active_pathing += path + return TRUE + return FALSE + +/// Initiates a swarmed pathfind. Returns TRUE if we're good, FALSE if something's failed +/// If a valid pathmap exists for the TARGET turf we'll use that, otherwise we have to build a new one +/datum/controller/subsystem/pathfinder/proc/swarmed_pathfind(atom/movable/caller, atom/end, max_distance = 30, mintargetdist = 0, age = MAP_REUSE_INSTANT, access = list(), simulated_only = TRUE, turf/exclude, skip_first = TRUE, list/datum/callback/on_finish) + var/turf/target = get_turf(end) + var/datum/can_pass_info/pass_info = new(caller, access) + // If there's a map we can use already, use it + var/datum/path_map/valid_map = get_valid_map(pass_info, target, simulated_only, exclude, age, include_building = TRUE) + if(valid_map && valid_map.expand(max_distance)) + path_map_passalong(on_finish, get_turf(caller), mintargetdist, skip_first, valid_map) + return TRUE + + // Otherwise we're gonna make a new one, and turn it into a path for the callbacks passed into us + var/list/datum/callback/pass_in = list() + pass_in += CALLBACK(GLOBAL_PROC, /proc/path_map_passalong, on_finish, get_turf(caller), mintargetdist, skip_first) + // And to allow subsequent calls to reuse the same map, we'll put a placeholder in the cache, and fill it up when the pathing finishes + var/datum/path_map/empty = new() + empty.pass_info = new(caller, access) + empty.start = target + empty.pass_space = simulated_only + empty.avoid = exclude + empty.building = TRUE + path_map_cache(target, empty) + pass_in += CALLBACK(src, PROC_REF(path_map_fill), target, empty) + if(!SSpathfinder.can_pass_build_map(pass_info, target, max_distance, simulated_only, exclude, pass_in)) + return FALSE + return TRUE + +/// We generate a path for the passed in callbacks, and then pipe it over +/proc/path_map_passalong(list/datum/callback/return_callbacks, turf/target, mintargetdist = 0, skip_first = TRUE, datum/path_map/hand_back) + var/list/requested_path + if(istype(hand_back, /datum/path_map)) + requested_path = hand_back.get_path_from(target, skip_first, mintargetdist) + for(var/datum/callback/return_callback as anything in return_callbacks) + return_callback.Invoke(requested_path) + +/// Caches the passed in path_map, allowing for reuse in future +/datum/controller/subsystem/pathfinder/proc/path_map_cache(turf/target, datum/path_map/hand_back) + // Cache our path_map + if(!target || !hand_back) + return + source_to_maps[target] += list(hand_back) + +/datum/controller/subsystem/pathfinder/proc/path_map_fill(turf/target, datum/path_map/fill_into, datum/path_map/hand_back) + fill_into.building = FALSE + if(!fill_into.compare_against(hand_back)) + source_to_maps[target] -= fill_into + return + fill_into.copy_from(hand_back) + fill_into.creation_time = hand_back.creation_time + // If we aren't in the source list anymore don't go trying to clear it out yeah? + if(!source_to_maps[target] || !(fill_into in source_to_maps[target])) + return + // Let's remove anything we're better than + for(var/datum/path_map/same_target as anything in source_to_maps[target]) + if(fill_into == same_target || !same_target.compare_against(hand_back)) + continue + // If it's still being made it'll be fresher then us + if(same_target.building) + continue + // We assume that we are fresher, and that's all we care about + // If it's being expanded it'll get updated when that finishes, then clear when all the refs drop + source_to_maps[target] -= same_target + +/// Initiates a SSSP run. Returns true if we're good, FALSE if something's failed +/datum/controller/subsystem/pathfinder/proc/build_map(atom/movable/caller, turf/source, max_distance = 30, access = list(), simulated_only = TRUE, turf/exclude, list/datum/callback/on_finish) + var/datum/pathfind/sssp/path = new() + path.setup(caller, access, source, max_distance, simulated_only, exclude, on_finish) + if(path.start()) + active_pathing += path + return TRUE + return FALSE + +/// Initiates a SSSP run from a pass_info datum. Returns true if we're good, FALSE if something's failed +/datum/controller/subsystem/pathfinder/proc/can_pass_build_map(datum/can_pass_info/pass_info, turf/source, max_distance = 30, simulated_only = TRUE, turf/exclude, list/datum/callback/on_finish) + var/datum/pathfind/sssp/path = new() + path.setup_from_canpass(pass_info, source, max_distance, simulated_only, exclude, on_finish) if(path.start()) active_pathing += path return TRUE return FALSE + +/// Begins to handle a pathfinding run based off the input /datum/pathfind datum +/// You should not use this, it exists to allow for shenanigans. You do not know how to do shenanigans +/datum/controller/subsystem/pathfinder/proc/run_pathfind(datum/pathfind/run) + active_pathing += run + return TRUE + +/// Takes a set of pathfind info, returns the first valid pathmap that would work if one exists +/// Optionally takes a max age to accept (defaults to 0 seconds) and a minimum acceptable range +/// If include_building is true and we can only find a building path, ew'll use that instead. tho we will wait for it to finish first +/datum/controller/subsystem/pathfinder/proc/get_valid_map(datum/can_pass_info/pass_info, turf/target, simulated_only = TRUE, turf/exclude, age = MAP_REUSE_INSTANT, min_range = -INFINITY, include_building = FALSE) + // Walk all the maps that match our caller's turf OR our target's + // Then hold onto em. If their cache time is short we can reuse/expand them, if not we'll have to make a new one + var/oldest_time = world.time - age + /// Backup return value used if no finished pathmaps are found + var/datum/path_map/constructing + for(var/datum/path_map/shared_source as anything in source_to_maps[target]) + if(!shared_source.compare_against_args(pass_info, target, simulated_only, exclude)) + continue + var/max_dist = 0 + if(shared_source.distances.len) + max_dist = shared_source.distances[shared_source.distances.len] + if(max_dist < min_range) + continue + if(oldest_time > shared_source.creation_time && !shared_source.building) + continue + if(shared_source.building) + if(include_building) + constructing = constructing || shared_source + continue + + return shared_source + if(constructing) + UNTIL(constructing.building == FALSE) + return constructing + return null + +/// Takes a set of pathfind info, returns all valid pathmaps that would work +/// Takes an optional minimum range arg +/datum/controller/subsystem/pathfinder/proc/get_valid_maps(datum/can_pass_info/pass_info, turf/target, simulated_only = TRUE, turf/exclude, age = MAP_REUSE_INSTANT, min_range = -INFINITY, include_building = FALSE) + // Walk all the maps that match our caller's turf OR our target's + // Then hold onto em. If their cache time is short we can reuse/expand them, if not we'll have to make a new one + var/list/valid_maps = list() + var/oldest_time = world.time - age + for(var/datum/path_map/shared_source as anything in source_to_maps[target]) + if(shared_source.compare_against_args(pass_info, target, simulated_only, exclude)) + continue + var/max_dist = shared_source.distances[shared_source.distances.len] + if(max_dist < min_range) + continue + if(oldest_time > shared_source.creation_time) + continue + if(!include_building && shared_source.building) + continue + valid_maps += shared_source + return valid_maps diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm deleted file mode 100644 index cf4908c92f7d..000000000000 --- a/code/controllers/subsystem/persistence.dm +++ /dev/null @@ -1,559 +0,0 @@ -#define FILE_RECENT_MAPS "data/RecentMaps.json" - -#define KEEP_ROUNDS_MAP 3 - -SUBSYSTEM_DEF(persistence) - name = "Persistence" - init_order = INIT_ORDER_PERSISTENCE - flags = SS_NO_FIRE - - ///instantiated wall engraving components - var/list/wall_engravings = list() - ///tattoo stories that we're saving. - var/list/prison_tattoos_to_save = list() - ///tattoo stories that have been selected for this round. - var/list/prison_tattoos_to_use = list() - var/list/saved_messages = list() - var/list/saved_modes = list(1,2,3) - var/list/saved_maps = list() - var/list/blocked_maps = list() - var/list/saved_trophies = list() - var/list/picture_logging_information = list() - var/list/obj/structure/sign/picture_frame/photo_frames - var/list/obj/item/storage/photo_album/photo_albums - var/rounds_since_engine_exploded = 0 - -/datum/controller/subsystem/persistence/Initialize() - load_poly() - load_wall_engravings() - load_prisoner_tattoos() - load_trophies() - load_recent_maps() - load_photo_persistence() - load_randomized_recipes() - load_custom_outfits() - load_delamination_counter() - - load_adventures() - return SS_INIT_SUCCESS - -///Collects all data to persist. -/datum/controller/subsystem/persistence/proc/collect_data() - save_wall_engravings() - save_prisoner_tattoos() - collect_trophies() - collect_maps() - save_photo_persistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION. - save_randomized_recipes() - save_scars() - save_custom_outfits() - save_delamination_counter() - if(GLOB.interviews) - save_keys(GLOB.interviews.approved_ckeys) - -///Loads up Poly's speech buffer. -/datum/controller/subsystem/persistence/proc/load_poly() - for(var/mob/living/simple_animal/parrot/poly/P in GLOB.alive_mob_list) - twitterize(P.speech_buffer, "polytalk") - break //Who's been duping the bird?! - -///Loads all engravings, and places a select amount in maintenance and the prison. -/datum/controller/subsystem/persistence/proc/load_wall_engravings() - var/json_file = file(ENGRAVING_SAVE_FILE) - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - if(!json) - return - - if(json["version"] < ENGRAVING_PERSISTENCE_VERSION) - update_wall_engravings(json) - - var/successfully_loaded_engravings = 0 - - var/list/viable_turfs = get_area_turfs(/area/station/maintenance, subtypes = TRUE) + get_area_turfs(/area/station/security/prison, subtypes = TRUE) - var/list/turfs_to_pick_from = list() - - for(var/turf/T as anything in viable_turfs) - if(!isclosedturf(T)) - continue - turfs_to_pick_from += T - - var/list/engraving_entries = json["entries"] - - if(engraving_entries.len) - for(var/iteration in 1 to rand(MIN_PERSISTENT_ENGRAVINGS, MAX_PERSISTENT_ENGRAVINGS)) - var/engraving = engraving_entries[rand(1, engraving_entries.len)] //This means repeats will happen for now, but its something I can live with. Just make more engravings! - if(!islist(engraving)) - stack_trace("something's wrong with the engraving data! one of the saved engravings wasn't a list!") - continue - - var/turf/closed/engraved_wall = pick(turfs_to_pick_from) - - if(HAS_TRAIT(engraved_wall, TRAIT_NOT_ENGRAVABLE)) - continue - - engraved_wall.AddComponent(/datum/component/engraved, engraving["story"], FALSE, engraving["story_value"]) - successfully_loaded_engravings++ - turfs_to_pick_from -= engraved_wall - - log_world("Loaded [successfully_loaded_engravings] engraved messages on map [SSmapping.config.map_name]") - -///Saves all new engravings in the world. -/datum/controller/subsystem/persistence/proc/save_wall_engravings() - var/list/saved_data = list() - - saved_data["version"] = ENGRAVING_PERSISTENCE_VERSION - saved_data["entries"] = list() - - - var/json_file = file(ENGRAVING_SAVE_FILE) - if(fexists(json_file)) - var/list/old_json = json_decode(file2text(json_file)) - if(old_json) - saved_data["entries"] = old_json["entries"] - - for(var/datum/component/engraved/engraving in wall_engravings) - if(!engraving.persistent_save) - continue - var/area/engraved_area = get_area(engraving.parent) - if(!(engraved_area.area_flags & PERSISTENT_ENGRAVINGS)) - continue - saved_data["entries"] += engraving.save_persistent() - - fdel(json_file) - - WRITE_FILE(json_file, json_encode(saved_data)) - -///This proc can update entries if the format has changed at some point. -/datum/controller/subsystem/persistence/proc/update_wall_engravings(json) - - - for(var/engraving_entry in json["entries"]) - continue //no versioning yet - - //Save it to the file - var/json_file = file(ENGRAVING_SAVE_FILE) - fdel(json_file) - WRITE_FILE(json_file, json_encode(json)) - - return json - -///Loads all tattoos, and select a few based on the amount of prisoner spawn positions. -/datum/controller/subsystem/persistence/proc/load_prisoner_tattoos() - var/json_file = file(PRISONER_TATTOO_SAVE_FILE) - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - if(!json) - return - - if(json["version"] < TATTOO_PERSISTENCE_VERSION) - update_prisoner_tattoos(json) - - var/datum/job/prisoner_datum = SSjob.name_occupations[JOB_PRISONER] - if(!prisoner_datum) - return - var/iterations_allowed = prisoner_datum.spawn_positions - - var/list/entries = json["entries"] - if(entries.len) - for(var/index in 1 to iterations_allowed) - prison_tattoos_to_use += list(entries[rand(1, entries.len)]) - - log_world("Loaded [prison_tattoos_to_use.len] prison tattoos") - -///Saves all tattoos, so they can appear on prisoners in future rounds -/datum/controller/subsystem/persistence/proc/save_prisoner_tattoos() - var/json_file = file(PRISONER_TATTOO_SAVE_FILE) - var/list/saved_data = list() - var/list/entries = list() - - if(fexists(json_file)) - var/list/old_json = json_decode(file2text(json_file)) - if(old_json) - entries += old_json["entries"] //Save the old if its there - - entries += prison_tattoos_to_save - - saved_data["version"] = ENGRAVING_PERSISTENCE_VERSION - saved_data["entries"] = entries - - fdel(json_file) - WRITE_FILE(json_file, json_encode(saved_data)) - -///This proc can update entries if the format has changed at some point. -/datum/controller/subsystem/persistence/proc/update_prisoner_tattoos(json) - - for(var/tattoo_entry in json["entries"]) - continue //no versioning yet - - //Save it to the file - var/json_file = file(PRISONER_TATTOO_SAVE_FILE) - fdel(json_file) - WRITE_FILE(json_file, json_encode(json)) - - return json - -/// Loads the trophies from the source file, and places a few in trophy display cases. -/datum/controller/subsystem/persistence/proc/load_trophies() - var/list/raw_saved_trophies = list() - if(fexists("data/npc_saves/TrophyItems.json")) - var/json_file = file("data/npc_saves/TrophyItems.json") - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - if(!json) - return - raw_saved_trophies = json["data"] - fdel("data/npc_saves/TrophyItems.json") - else - var/json_file = file("data/trophy_items.json") - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - if(!json) - return - raw_saved_trophies = json["data"] - - for(var/raw_json in raw_saved_trophies) - var/datum/trophy_data/parsed_trophy_data = new - parsed_trophy_data.load_from_json(raw_json) - saved_trophies += parsed_trophy_data - - set_up_trophies() - -/datum/controller/subsystem/persistence/proc/save_keys(list/approved_ckeys) - var/json_file = file("data/approved_keys.json") - var/list/keys = list() - if(fexists(json_file)) - fdel(json_file) - keys = json_encode(approved_ckeys) - WRITE_FILE(json_file, keys) - -///trophy data datum, for admin manipulation -/datum/trophy_data - ///path of the item the trophy will try to mimic, null if path_string is invalid - var/path - ///the message that appears under the item - var/message - ///the key of the one who placed the item in the trophy case - var/placer_key - -/datum/trophy_data/proc/load_from_json(list/json_data) - path = json_data["path"] - message = json_data["message"] - placer_key = json_data["placer_key"] - -/datum/trophy_data/proc/to_json() - var/list/new_data = list() - new_data["path"] = path - new_data["message"] = message - new_data["placer_key"] = placer_key - new_data["is_valid"] = text2path(path) ? TRUE : FALSE - return new_data - -/// Returns a list for the admin trophy panel. -/datum/controller/subsystem/persistence/proc/trophy_ui_data() - var/list/ui_data = list() - for(var/datum/trophy_data/data in saved_trophies) - var/list/pdata = data.to_json() - pdata["ref"] = REF(data) - ui_data += list(pdata) - - return ui_data - -/// Loads up the amount of times maps appeared to alter their appearance in voting and rotation. -/datum/controller/subsystem/persistence/proc/load_recent_maps() - var/map_sav = FILE_RECENT_MAPS - if(!fexists(FILE_RECENT_MAPS)) - return - var/list/json = json_decode(file2text(map_sav)) - if(!json) - return - saved_maps = json["data"] - - //Convert the mapping data to a shared blocking list, saves us doing this in several places later. - for(var/map in config.maplist) - var/datum/map_config/VM = config.maplist[map] - var/run = 0 - if(VM.map_name == SSmapping.config.map_name) - run++ - for(var/name in SSpersistence.saved_maps) - if(VM.map_name == name) - run++ - if(run >= 2) //If run twice in the last KEEP_ROUNDS_MAP + 1 (including current) rounds, disable map for voting and rotation. - blocked_maps += VM.map_name - -/// Puts trophies into trophy cases. -/datum/controller/subsystem/persistence/proc/set_up_trophies() - - var/list/valid_trophies = list() - - for(var/datum/trophy_data/data in saved_trophies) - - if(!data) //sanity for incorrect deserialization - continue - - var/path = text2path(data.path) - if(!path) //If the item no longer exist, ignore it - continue - - valid_trophies += data - - for(var/obj/structure/displaycase/trophy/trophy_case in GLOB.trophy_cases) - if(!valid_trophies.len) - break - - if(trophy_case.showpiece) - continue - - trophy_case.set_up_trophy(pick_n_take(valid_trophies)) - -///Loads up the photo album source file. -/datum/controller/subsystem/persistence/proc/get_photo_albums() - var/album_path = file("data/photo_albums.json") - if(fexists(album_path)) - return json_decode(file2text(album_path)) - -///Loads up the photo frames source file. -/datum/controller/subsystem/persistence/proc/get_photo_frames() - var/frame_path = file("data/photo_frames.json") - if(fexists(frame_path)) - return json_decode(file2text(frame_path)) - -/// Removes the identifier of a persistent photo frame from the json. -/datum/controller/subsystem/persistence/proc/remove_photo_frames(identifier) - var/frame_path = file("data/photo_frames.json") - if(!fexists(frame_path)) - return - - var/frame_json = json_decode(file2text(frame_path)) - frame_json -= identifier - - frame_json = json_encode(frame_json) - fdel(frame_path) - WRITE_FILE(frame_path, frame_json) - -///Loads photo albums, and populates them; also loads and applies frames to picture frames. -/datum/controller/subsystem/persistence/proc/load_photo_persistence() - var/album_path = file("data/photo_albums.json") - var/frame_path = file("data/photo_frames.json") - if(fexists(album_path)) - var/list/json = json_decode(file2text(album_path)) - if(json.len) - for(var/i in photo_albums) - var/obj/item/storage/photo_album/A = i - if(!A.persistence_id) - continue - if(json[A.persistence_id]) - A.populate_from_id_list(json[A.persistence_id]) - - if(fexists(frame_path)) - var/list/json = json_decode(file2text(frame_path)) - if(json.len) - for(var/i in photo_frames) - var/obj/structure/sign/picture_frame/PF = i - if(!PF.persistence_id) - continue - if(json[PF.persistence_id]) - PF.load_from_id(json[PF.persistence_id]) - -///Saves the contents of photo albums and the picture frames. -/datum/controller/subsystem/persistence/proc/save_photo_persistence() - var/album_path = file("data/photo_albums.json") - var/frame_path = file("data/photo_frames.json") - - var/list/frame_json = list() - var/list/album_json = list() - - if(fexists(album_path)) - album_json = json_decode(file2text(album_path)) - fdel(album_path) - - for(var/i in photo_albums) - var/obj/item/storage/photo_album/A = i - if(!istype(A) || !A.persistence_id) - continue - var/list/L = A.get_picture_id_list() - album_json[A.persistence_id] = L - - album_json = json_encode(album_json) - - WRITE_FILE(album_path, album_json) - - if(fexists(frame_path)) - frame_json = json_decode(file2text(frame_path)) - fdel(frame_path) - - for(var/i in photo_frames) - var/obj/structure/sign/picture_frame/F = i - if(!istype(F) || !F.persistence_id) - continue - frame_json[F.persistence_id] = F.get_photo_id() - - frame_json = json_encode(frame_json) - - WRITE_FILE(frame_path, frame_json) - -///Collects trophies from all existing trophy cases. -/datum/controller/subsystem/persistence/proc/collect_trophies() - for(var/trophy_case in GLOB.trophy_cases) - save_trophy(trophy_case) - - var/json_file = file("data/trophy_items.json") - var/list/file_data = list() - var/list/converted_data = list() - - for(var/datum/trophy_data/data in saved_trophies) - converted_data += list(data.to_json()) - - converted_data = remove_duplicate_trophies(converted_data) - - file_data["data"] = converted_data - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - -///gets the list of json trophies, and deletes the ones with an identical path and message -/datum/controller/subsystem/persistence/proc/remove_duplicate_trophies(list/trophies) - var/list/ukeys = list() - . = list() - for(var/trophy in trophies) - var/tkey = "[trophy["path"]]-[trophy["message"]]" - if(ukeys[tkey]) - continue - else - . += list(trophy) - ukeys[tkey] = TRUE - -///If there is a trophy in the trophy case, saved it, if the trophy was not a holo trophy and has a message attached. -/datum/controller/subsystem/persistence/proc/save_trophy(obj/structure/displaycase/trophy/trophy_case) - if(!trophy_case.holographic_showpiece && trophy_case.showpiece && trophy_case.trophy_message) - var/datum/trophy_data/data = new - data.path = trophy_case.showpiece.type - data.message = trophy_case.trophy_message - data.placer_key = trophy_case.placer_key - saved_trophies += data - -///Updates the list of the most recent maps. -/datum/controller/subsystem/persistence/proc/collect_maps() - if(length(saved_maps) > KEEP_ROUNDS_MAP) //Get rid of extras from old configs. - saved_maps.Cut(KEEP_ROUNDS_MAP+1) - var/mapstosave = min(length(saved_maps)+1, KEEP_ROUNDS_MAP) - if(length(saved_maps) < mapstosave) //Add extras if too short, one per round. - saved_maps += mapstosave - for(var/i = mapstosave; i > 1; i--) - saved_maps[i] = saved_maps[i-1] - saved_maps[1] = SSmapping.config.map_name - var/json_file = file(FILE_RECENT_MAPS) - var/list/file_data = list() - file_data["data"] = saved_maps - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - -///Loads all randomized recipes. -/datum/controller/subsystem/persistence/proc/load_randomized_recipes() - var/json_file = file("data/RandomizedChemRecipes.json") - var/json - if(fexists(json_file)) - json = json_decode(file2text(json_file)) - - for(var/randomized_type in subtypesof(/datum/chemical_reaction/randomized)) - var/datum/chemical_reaction/randomized/R = new randomized_type - var/loaded = FALSE - if(R.persistent && json) - var/list/recipe_data = json["[R.type]"] - if(recipe_data) - if(R.LoadOldRecipe(recipe_data) && (daysSince(R.created) <= R.persistence_period)) - loaded = TRUE - if(!loaded) //We do not have information for whatever reason, just generate new one - if(R.persistent) - log_game("Resetting persistent [randomized_type] random recipe.") - R.GenerateRecipe() - - if(!R.HasConflicts()) //Might want to try again if conflicts happened in the future. - add_chemical_reaction(R) - else - log_game("Randomized recipe [randomized_type] resulted in conflicting recipes.") - -///Saves all randomized recipes. -/datum/controller/subsystem/persistence/proc/save_randomized_recipes() - var/json_file = file("data/RandomizedChemRecipes.json") - var/list/file_data = list() - - //asert globchems done - for(var/randomized_type in subtypesof(/datum/chemical_reaction/randomized)) - var/datum/chemical_reaction/randomized/R = get_chemical_reaction(randomized_type) //ew, would be nice to add some simple tracking - if(R?.persistent) - var/list/recipe_data = R.SaveOldRecipe() - file_data["[R.type]"] = recipe_data - - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - -///Saves all scars for everyone's original characters -/datum/controller/subsystem/persistence/proc/save_scars() - for(var/i in GLOB.joined_player_list) - var/mob/living/carbon/human/ending_human = get_mob_by_ckey(i) - if(!istype(ending_human) || !ending_human.mind?.original_character_slot_index || !ending_human.client?.prefs.read_preference(/datum/preference/toggle/persistent_scars)) - continue - - var/mob/living/carbon/human/original_human = ending_human.mind.original_character.resolve() - - if(!original_human) - continue - - if(original_human.stat == DEAD || !original_human.all_scars || original_human != ending_human) - original_human.save_persistent_scars(TRUE) - else - original_human.save_persistent_scars() - -///Loads the custom outfits of every admin. -/datum/controller/subsystem/persistence/proc/load_custom_outfits() - var/file = file("data/custom_outfits.json") - if(!fexists(file)) - return - var/outfits_json = file2text(file) - var/list/outfits = json_decode(outfits_json) - if(!islist(outfits)) - return - - for(var/outfit_data in outfits) - if(!islist(outfit_data)) - continue - - var/outfittype = text2path(outfit_data["outfit_type"]) - if(!ispath(outfittype, /datum/outfit)) - continue - var/datum/outfit/outfit = new outfittype - if(!outfit.load_from(outfit_data)) - continue - GLOB.custom_outfits += outfit - -///Saves each admin's custom outfit list -/datum/controller/subsystem/persistence/proc/save_custom_outfits() - var/file = file("data/custom_outfits.json") - fdel(file) - - var/list/data = list() - for(var/datum/outfit/outfit in GLOB.custom_outfits) - data += list(outfit.get_json_data()) - - WRITE_FILE(file, json_encode(data)) - -/// Location where we save the information about how many rounds it has been since the engine blew up -#define DELAMINATION_COUNT_FILEPATH "data/rounds_since_delamination.txt" - -/datum/controller/subsystem/persistence/proc/load_delamination_counter() - if (!fexists(DELAMINATION_COUNT_FILEPATH)) - return - rounds_since_engine_exploded = text2num(file2text(DELAMINATION_COUNT_FILEPATH)) - for (var/obj/structure/sign/delamination_counter/sign as anything in GLOB.map_delamination_counters) - sign.update_count(rounds_since_engine_exploded) - -/datum/controller/subsystem/persistence/proc/save_delamination_counter() - rustg_file_write("[rounds_since_engine_exploded + 1]", DELAMINATION_COUNT_FILEPATH) - -#undef DELAMINATION_COUNT_FILEPATH -#undef FILE_RECENT_MAPS -#undef KEEP_ROUNDS_MAP diff --git a/code/controllers/subsystem/persistence/_persistence.dm b/code/controllers/subsystem/persistence/_persistence.dm new file mode 100644 index 000000000000..3153c72eb2c7 --- /dev/null +++ b/code/controllers/subsystem/persistence/_persistence.dm @@ -0,0 +1,111 @@ +#define FILE_RECENT_MAPS "data/RecentMaps.json" +#define KEEP_ROUNDS_MAP 3 + +SUBSYSTEM_DEF(persistence) + name = "Persistence" + init_order = INIT_ORDER_PERSISTENCE + flags = SS_NO_FIRE + + ///instantiated wall engraving components + var/list/wall_engravings = list() + ///all saved persistent engravings loaded from JSON + var/list/saved_engravings = list() + ///tattoo stories that we're saving. + var/list/prison_tattoos_to_save = list() + ///tattoo stories that have been selected for this round. + var/list/prison_tattoos_to_use = list() + var/list/saved_messages = list() + var/list/saved_modes = list(1,2,3) + var/list/saved_maps = list() + var/list/blocked_maps = list() + var/list/saved_trophies = list() + var/list/picture_logging_information = list() + var/list/obj/structure/sign/picture_frame/photo_frames + var/list/obj/item/storage/photo_album/photo_albums + var/rounds_since_engine_exploded = 0 + var/delam_highscore = 0 + var/tram_hits_this_round = 0 + var/tram_hits_last_round = 0 + +/datum/controller/subsystem/persistence/Initialize() + load_poly() + load_wall_engravings() + load_prisoner_tattoos() + load_trophies() + load_recent_maps() + load_photo_persistence() + load_randomized_recipes() + load_custom_outfits() + load_delamination_counter() + load_adventures() + return SS_INIT_SUCCESS + +///Collects all data to persist. +/datum/controller/subsystem/persistence/proc/collect_data() + save_wall_engravings() + save_prisoner_tattoos() + collect_trophies() + collect_maps() + save_photo_persistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION. + save_randomized_recipes() + save_scars() + save_custom_outfits() + save_delamination_counter() + if(GLOB.interviews) + save_keys(GLOB.interviews.approved_ckeys) + +///Loads up Poly's speech buffer. +/datum/controller/subsystem/persistence/proc/load_poly() + for(var/mob/living/basic/parrot/poly/bird in GLOB.alive_mob_list) + var/list/list_to_read = bird.get_static_list_of_phrases() + twitterize(list_to_read, "polytalk") + break //Who's been duping the bird?! + +/// Loads up the amount of times maps appeared to alter their appearance in voting and rotation. +/datum/controller/subsystem/persistence/proc/load_recent_maps() + var/map_sav = FILE_RECENT_MAPS + if(!fexists(FILE_RECENT_MAPS)) + return + var/list/json = json_decode(file2text(map_sav)) + if(!json) + return + saved_maps = json["data"] + + //Convert the mapping data to a shared blocking list, saves us doing this in several places later. + for(var/map in config.maplist) + var/datum/map_config/VM = config.maplist[map] + var/run = 0 + if(VM.map_name == SSmapping.config.map_name) + run++ + for(var/name in SSpersistence.saved_maps) + if(VM.map_name == name) + run++ + if(run >= 2) //If run twice in the last KEEP_ROUNDS_MAP + 1 (including current) rounds, disable map for voting and rotation. + blocked_maps += VM.map_name + +///Updates the list of the most recent maps. +/datum/controller/subsystem/persistence/proc/collect_maps() + if(length(saved_maps) > KEEP_ROUNDS_MAP) //Get rid of extras from old configs. + saved_maps.Cut(KEEP_ROUNDS_MAP+1) + var/mapstosave = min(length(saved_maps)+1, KEEP_ROUNDS_MAP) + if(length(saved_maps) < mapstosave) //Add extras if too short, one per round. + saved_maps += mapstosave + for(var/i = mapstosave; i > 1; i--) + saved_maps[i] = saved_maps[i-1] + saved_maps[1] = SSmapping.config.map_name + var/json_file = file(FILE_RECENT_MAPS) + var/list/file_data = list() + file_data["data"] = saved_maps + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) + +/datum/controller/subsystem/persistence/proc/save_keys(list/approved_ckeys) + var/json_file = file("data/approved_keys.json") + var/list/keys = list() + if(fexists(json_file)) + fdel(json_file) + keys = json_encode(approved_ckeys) + WRITE_FILE(json_file, keys) + +#undef FILE_RECENT_MAPS +#undef KEEP_ROUNDS_MAP diff --git a/code/controllers/subsystem/persistence/counter_delamination.dm b/code/controllers/subsystem/persistence/counter_delamination.dm new file mode 100644 index 000000000000..57ea7bde9f35 --- /dev/null +++ b/code/controllers/subsystem/persistence/counter_delamination.dm @@ -0,0 +1,19 @@ +/// Location where we save the information about how many rounds it has been since the engine blew up +#define DELAMINATION_COUNT_FILEPATH "data/rounds_since_delamination.txt" +#define DELAMINATION_HIGHSCORE_FILEPATH "data/delamination_highscore.txt" + +/datum/controller/subsystem/persistence/proc/load_delamination_counter() + if (!fexists(DELAMINATION_COUNT_FILEPATH)) + return + rounds_since_engine_exploded = text2num(file2text(DELAMINATION_COUNT_FILEPATH)) + for (var/obj/structure/sign/delamination_counter/sign as anything in GLOB.map_delamination_counters) + sign.update_count(rounds_since_engine_exploded) + + +/datum/controller/subsystem/persistence/proc/save_delamination_counter() + rustg_file_write("[rounds_since_engine_exploded + 1]", DELAMINATION_COUNT_FILEPATH) + if((rounds_since_engine_exploded + 1) > delam_highscore) + rustg_file_write("[rounds_since_engine_exploded + 1]", DELAMINATION_HIGHSCORE_FILEPATH) + +#undef DELAMINATION_COUNT_FILEPATH +#undef DELAMINATION_HIGHSCORE_FILEPATH diff --git a/code/controllers/subsystem/persistence/custom_outfits.dm b/code/controllers/subsystem/persistence/custom_outfits.dm new file mode 100644 index 000000000000..942f874fde5e --- /dev/null +++ b/code/controllers/subsystem/persistence/custom_outfits.dm @@ -0,0 +1,32 @@ +///Loads the custom outfits of every admin. +/datum/controller/subsystem/persistence/proc/load_custom_outfits() + var/file = file("data/custom_outfits.json") + if(!fexists(file)) + return + var/outfits_json = file2text(file) + var/list/outfits = json_decode(outfits_json) + if(!islist(outfits)) + return + + for(var/outfit_data in outfits) + if(!islist(outfit_data)) + continue + + var/outfittype = text2path(outfit_data["outfit_type"]) + if(!ispath(outfittype, /datum/outfit)) + continue + var/datum/outfit/outfit = new outfittype + if(!outfit.load_from(outfit_data)) + continue + GLOB.custom_outfits += outfit + +///Saves each admin's custom outfit list +/datum/controller/subsystem/persistence/proc/save_custom_outfits() + var/file = file("data/custom_outfits.json") + fdel(file) + + var/list/data = list() + for(var/datum/outfit/outfit in GLOB.custom_outfits) + data += list(outfit.get_json_data()) + + WRITE_FILE(file, json_encode(data)) diff --git a/code/controllers/subsystem/persistence/engravings.dm b/code/controllers/subsystem/persistence/engravings.dm new file mode 100644 index 000000000000..f47fc7fbba12 --- /dev/null +++ b/code/controllers/subsystem/persistence/engravings.dm @@ -0,0 +1,84 @@ +///Loads all engravings, and places a select amount in maintenance and the prison. +/datum/controller/subsystem/persistence/proc/load_wall_engravings() + var/json_file = file(ENGRAVING_SAVE_FILE) + if(!fexists(json_file)) + return + + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + + if(json["version"] < ENGRAVING_PERSISTENCE_VERSION) + update_wall_engravings(json) + + saved_engravings = json["entries"] + + if(!saved_engravings.len) + log_world("Failed to load engraved messages on map [SSmapping.config.map_name]") + return + + var/list/viable_turfs = get_area_turfs(/area/station/maintenance, subtypes = TRUE) + get_area_turfs(/area/station/security/prison, subtypes = TRUE) + var/list/turfs_to_pick_from = list() + + for(var/turf/T as anything in viable_turfs) + if(!isclosedturf(T)) + continue + turfs_to_pick_from += T + + var/successfully_loaded_engravings = 0 + + for(var/iteration in 1 to rand(MIN_PERSISTENT_ENGRAVINGS, MAX_PERSISTENT_ENGRAVINGS)) + var/engraving = pick_n_take(saved_engravings) + if(!islist(engraving)) + stack_trace("something's wrong with the engraving data! one of the saved engravings wasn't a list!") + continue + + var/turf/closed/engraved_wall = pick(turfs_to_pick_from) + + if(HAS_TRAIT(engraved_wall, TRAIT_NOT_ENGRAVABLE)) + continue + + engraved_wall.AddComponent(/datum/component/engraved, engraving["story"], FALSE, engraving["story_value"]) + successfully_loaded_engravings++ + turfs_to_pick_from -= engraved_wall + + log_world("Loaded [successfully_loaded_engravings] engraved messages on map [SSmapping.config.map_name]") + +///Saves all new engravings in the world. +/datum/controller/subsystem/persistence/proc/save_wall_engravings() + var/list/saved_data = list() + + saved_data["version"] = ENGRAVING_PERSISTENCE_VERSION + saved_data["entries"] = list() + + + var/json_file = file(ENGRAVING_SAVE_FILE) + if(fexists(json_file)) + var/list/old_json = json_decode(file2text(json_file)) + if(old_json) + saved_data["entries"] = old_json["entries"] + + for(var/datum/component/engraved/engraving in wall_engravings) + if(!engraving.persistent_save) + continue + var/area/engraved_area = get_area(engraving.parent) + if(!(engraved_area.area_flags & PERSISTENT_ENGRAVINGS)) + continue + saved_data["entries"] += engraving.save_persistent() + + fdel(json_file) + + WRITE_FILE(json_file, json_encode(saved_data)) + +///This proc can update entries if the format has changed at some point. +/datum/controller/subsystem/persistence/proc/update_wall_engravings(json) + for(var/engraving_entry in json["entries"]) + continue //no versioning yet + + //Save it to the file + var/json_file = file(ENGRAVING_SAVE_FILE) + fdel(json_file) + WRITE_FILE(json_file, json_encode(json)) + + return json + diff --git a/code/controllers/subsystem/persistence/photo_albums.dm b/code/controllers/subsystem/persistence/photo_albums.dm new file mode 100644 index 000000000000..3aee856b2c21 --- /dev/null +++ b/code/controllers/subsystem/persistence/photo_albums.dm @@ -0,0 +1,86 @@ +///Loads up the photo album source file. +/datum/controller/subsystem/persistence/proc/get_photo_albums() + var/album_path = file("data/photo_albums.json") + if(fexists(album_path)) + return json_decode(file2text(album_path)) + +///Loads up the photo frames source file. +/datum/controller/subsystem/persistence/proc/get_photo_frames() + var/frame_path = file("data/photo_frames.json") + if(fexists(frame_path)) + return json_decode(file2text(frame_path)) + +/// Removes the identifier of a persistent photo frame from the json. +/datum/controller/subsystem/persistence/proc/remove_photo_frames(identifier) + var/frame_path = file("data/photo_frames.json") + if(!fexists(frame_path)) + return + + var/frame_json = json_decode(file2text(frame_path)) + frame_json -= identifier + + frame_json = json_encode(frame_json) + fdel(frame_path) + WRITE_FILE(frame_path, frame_json) + +///Loads photo albums, and populates them; also loads and applies frames to picture frames. +/datum/controller/subsystem/persistence/proc/load_photo_persistence() + var/album_path = file("data/photo_albums.json") + var/frame_path = file("data/photo_frames.json") + if(fexists(album_path)) + var/list/json = json_decode(file2text(album_path)) + if(json.len) + for(var/i in photo_albums) + var/obj/item/storage/photo_album/A = i + if(!A.persistence_id) + continue + if(json[A.persistence_id]) + A.populate_from_id_list(json[A.persistence_id]) + + if(fexists(frame_path)) + var/list/json = json_decode(file2text(frame_path)) + if(json.len) + for(var/i in photo_frames) + var/obj/structure/sign/picture_frame/PF = i + if(!PF.persistence_id) + continue + if(json[PF.persistence_id]) + PF.load_from_id(json[PF.persistence_id]) + +///Saves the contents of photo albums and the picture frames. +/datum/controller/subsystem/persistence/proc/save_photo_persistence() + var/album_path = file("data/photo_albums.json") + var/frame_path = file("data/photo_frames.json") + + var/list/frame_json = list() + var/list/album_json = list() + + if(fexists(album_path)) + album_json = json_decode(file2text(album_path)) + fdel(album_path) + + for(var/i in photo_albums) + var/obj/item/storage/photo_album/A = i + if(!istype(A) || !A.persistence_id) + continue + var/list/L = A.get_picture_id_list() + album_json[A.persistence_id] = L + + album_json = json_encode(album_json) + + WRITE_FILE(album_path, album_json) + + if(fexists(frame_path)) + frame_json = json_decode(file2text(frame_path)) + fdel(frame_path) + + for(var/i in photo_frames) + var/obj/structure/sign/picture_frame/F = i + if(!istype(F) || !F.persistence_id) + continue + frame_json[F.persistence_id] = F.get_photo_id() + + frame_json = json_encode(frame_json) + + WRITE_FILE(frame_path, frame_json) + diff --git a/code/controllers/subsystem/persistence/recipes.dm b/code/controllers/subsystem/persistence/recipes.dm new file mode 100644 index 000000000000..84145b26aabc --- /dev/null +++ b/code/controllers/subsystem/persistence/recipes.dm @@ -0,0 +1,39 @@ +///Loads all randomized recipes. +/datum/controller/subsystem/persistence/proc/load_randomized_recipes() + var/json_file = file("data/RandomizedChemRecipes.json") + var/json + if(fexists(json_file)) + json = json_decode(file2text(json_file)) + + for(var/randomized_type in subtypesof(/datum/chemical_reaction/randomized)) + var/datum/chemical_reaction/randomized/R = new randomized_type + var/loaded = FALSE + if(R.persistent && json) + var/list/recipe_data = json["[R.type]"] + if(recipe_data) + if(R.LoadOldRecipe(recipe_data) && (daysSince(R.created) <= R.persistence_period)) + loaded = TRUE + if(!loaded) //We do not have information for whatever reason, just generate new one + if(R.persistent) + log_game("Resetting persistent [randomized_type] random recipe.") + R.GenerateRecipe() + + if(!R.HasConflicts()) //Might want to try again if conflicts happened in the future. + add_chemical_reaction(R) + else + log_game("Randomized recipe [randomized_type] resulted in conflicting recipes.") + +///Saves all randomized recipes. +/datum/controller/subsystem/persistence/proc/save_randomized_recipes() + var/json_file = file("data/RandomizedChemRecipes.json") + var/list/file_data = list() + + //asert globchems done + for(var/randomized_type in subtypesof(/datum/chemical_reaction/randomized)) + var/datum/chemical_reaction/randomized/R = get_chemical_reaction(randomized_type) //ew, would be nice to add some simple tracking + if(R?.persistent) + var/list/recipe_data = R.SaveOldRecipe() + file_data["[R.type]"] = recipe_data + + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) diff --git a/code/controllers/subsystem/persistence/scars.dm b/code/controllers/subsystem/persistence/scars.dm new file mode 100644 index 000000000000..fa378f24dd43 --- /dev/null +++ b/code/controllers/subsystem/persistence/scars.dm @@ -0,0 +1,17 @@ +///Saves all scars for everyone's original characters +/datum/controller/subsystem/persistence/proc/save_scars() + for(var/i in GLOB.joined_player_list) + var/mob/living/carbon/human/ending_human = get_mob_by_ckey(i) + if(!istype(ending_human) || !ending_human.mind?.original_character_slot_index || !ending_human.client?.prefs.read_preference(/datum/preference/toggle/persistent_scars)) + continue + + var/mob/living/carbon/human/original_human = ending_human.mind.original_character.resolve() + + if(!original_human) + continue + + if(original_human.stat == DEAD || !original_human.all_scars || original_human != ending_human) + original_human.save_persistent_scars(TRUE) + else + original_human.save_persistent_scars() + diff --git a/code/controllers/subsystem/persistence/tattoos.dm b/code/controllers/subsystem/persistence/tattoos.dm new file mode 100644 index 000000000000..45dd31c7f5c9 --- /dev/null +++ b/code/controllers/subsystem/persistence/tattoos.dm @@ -0,0 +1,55 @@ +///Loads all tattoos, and select a few based on the amount of prisoner spawn positions. +/datum/controller/subsystem/persistence/proc/load_prisoner_tattoos() + var/json_file = file(PRISONER_TATTOO_SAVE_FILE) + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + + if(json["version"] < TATTOO_PERSISTENCE_VERSION) + update_prisoner_tattoos(json) + + var/datum/job/prisoner_datum = SSjob.name_occupations[JOB_PRISONER] + if(!prisoner_datum) + return + var/iterations_allowed = prisoner_datum.spawn_positions + + var/list/entries = json["entries"] + if(entries.len) + for(var/index in 1 to iterations_allowed) + prison_tattoos_to_use += list(entries[rand(1, entries.len)]) + + log_world("Loaded [prison_tattoos_to_use.len] prison tattoos") + +///Saves all tattoos, so they can appear on prisoners in future rounds +/datum/controller/subsystem/persistence/proc/save_prisoner_tattoos() + var/json_file = file(PRISONER_TATTOO_SAVE_FILE) + var/list/saved_data = list() + var/list/entries = list() + + if(fexists(json_file)) + var/list/old_json = json_decode(file2text(json_file)) + if(old_json) + entries += old_json["entries"] //Save the old if its there + + entries += prison_tattoos_to_save + + saved_data["version"] = ENGRAVING_PERSISTENCE_VERSION + saved_data["entries"] = entries + + fdel(json_file) + WRITE_FILE(json_file, json_encode(saved_data)) + +///This proc can update entries if the format has changed at some point. +/datum/controller/subsystem/persistence/proc/update_prisoner_tattoos(json) + for(var/tattoo_entry in json["entries"]) + continue //no versioning yet + + //Save it to the file + var/json_file = file(PRISONER_TATTOO_SAVE_FILE) + fdel(json_file) + WRITE_FILE(json_file, json_encode(json)) + + return json + diff --git a/code/controllers/subsystem/persistence/trophies.dm b/code/controllers/subsystem/persistence/trophies.dm new file mode 100644 index 000000000000..515ed3860850 --- /dev/null +++ b/code/controllers/subsystem/persistence/trophies.dm @@ -0,0 +1,125 @@ +///trophy data datum, for admin manipulation +/datum/trophy_data + ///path of the item the trophy will try to mimic, null if path_string is invalid + var/path + ///the message that appears under the item + var/message + ///the key of the one who placed the item in the trophy case + var/placer_key + +/// Loads the trophies from the source file, and places a few in trophy display cases. +/datum/controller/subsystem/persistence/proc/load_trophies() + var/list/raw_saved_trophies = list() + if(fexists("data/npc_saves/TrophyItems.json")) + var/json_file = file("data/npc_saves/TrophyItems.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + raw_saved_trophies = json["data"] + fdel("data/npc_saves/TrophyItems.json") + else + var/json_file = file("data/trophy_items.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + raw_saved_trophies = json["data"] + + for(var/raw_json in raw_saved_trophies) + var/datum/trophy_data/parsed_trophy_data = new + parsed_trophy_data.load_from_json(raw_json) + saved_trophies += parsed_trophy_data + + set_up_trophies() + +/datum/trophy_data/proc/load_from_json(list/json_data) + path = json_data["path"] + message = json_data["message"] + placer_key = json_data["placer_key"] + +/datum/trophy_data/proc/to_json() + var/list/new_data = list() + new_data["path"] = path + new_data["message"] = message + new_data["placer_key"] = placer_key + new_data["is_valid"] = text2path(path) ? TRUE : FALSE + return new_data + +/// Returns a list for the admin trophy panel. +/datum/controller/subsystem/persistence/proc/trophy_ui_data() + var/list/ui_data = list() + for(var/datum/trophy_data/data in saved_trophies) + var/list/pdata = data.to_json() + pdata["ref"] = REF(data) + ui_data += list(pdata) + + return ui_data + + +/// Puts trophies into trophy cases. +/datum/controller/subsystem/persistence/proc/set_up_trophies() + + var/list/valid_trophies = list() + + for(var/datum/trophy_data/data in saved_trophies) + + if(!data) //sanity for incorrect deserialization + continue + + var/path = text2path(data.path) + if(!path) //If the item no longer exist, ignore it + continue + + valid_trophies += data + + for(var/obj/structure/displaycase/trophy/trophy_case in GLOB.trophy_cases) + if(!valid_trophies.len) + break + + if(trophy_case.showpiece) + continue + + trophy_case.set_up_trophy(pick_n_take(valid_trophies)) + +///Collects trophies from all existing trophy cases. +/datum/controller/subsystem/persistence/proc/collect_trophies() + for(var/trophy_case in GLOB.trophy_cases) + save_trophy(trophy_case) + + var/json_file = file("data/trophy_items.json") + var/list/file_data = list() + var/list/converted_data = list() + + for(var/datum/trophy_data/data in saved_trophies) + converted_data += list(data.to_json()) + + converted_data = remove_duplicate_trophies(converted_data) + + file_data["data"] = converted_data + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) + +///gets the list of json trophies, and deletes the ones with an identical path and message +/datum/controller/subsystem/persistence/proc/remove_duplicate_trophies(list/trophies) + var/list/ukeys = list() + . = list() + for(var/trophy in trophies) + var/tkey = "[trophy["path"]]-[trophy["message"]]" + if(ukeys[tkey]) + continue + else + . += list(trophy) + ukeys[tkey] = TRUE + +///If there is a trophy in the trophy case, saved it, if the trophy was not a holo trophy and has a message attached. +/datum/controller/subsystem/persistence/proc/save_trophy(obj/structure/displaycase/trophy/trophy_case) + if(!trophy_case.holographic_showpiece && trophy_case.showpiece && trophy_case.trophy_message) + var/datum/trophy_data/data = new + data.path = trophy_case.showpiece.type + data.message = trophy_case.trophy_message + data.placer_key = trophy_case.placer_key + saved_trophies += data + diff --git a/code/controllers/subsystem/processing/ai_behaviors.dm b/code/controllers/subsystem/processing/ai_behaviors.dm index 4ec698db32bb..e92da2474bb7 100644 --- a/code/controllers/subsystem/processing/ai_behaviors.dm +++ b/code/controllers/subsystem/processing/ai_behaviors.dm @@ -8,9 +8,12 @@ PROCESSING_SUBSYSTEM_DEF(ai_behaviors) wait = 1 ///List of all ai_behavior singletons, key is the typepath while assigned value is a newly created instance of the typepath. See SetupAIBehaviors() var/list/ai_behaviors + ///List of all targeting_strategy singletons, key is the typepath while assigned value is a newly created instance of the typepath. See SetupAIBehaviors() + var/list/targeting_strategies /datum/controller/subsystem/processing/ai_behaviors/Initialize() SetupAIBehaviors() + SetupTargetingStrats() return SS_INIT_SUCCESS /datum/controller/subsystem/processing/ai_behaviors/proc/SetupAIBehaviors() @@ -18,3 +21,9 @@ PROCESSING_SUBSYSTEM_DEF(ai_behaviors) for(var/behavior_type in subtypesof(/datum/ai_behavior)) var/datum/ai_behavior/ai_behavior = new behavior_type ai_behaviors[behavior_type] = ai_behavior + +/datum/controller/subsystem/processing/ai_behaviors/proc/SetupTargetingStrats() + targeting_strategies = list() + for(var/target_type in subtypesof(/datum/targeting_strategy)) + var/datum/targeting_strategy/target_start = new target_type + targeting_strategies[target_type] = target_start diff --git a/code/controllers/subsystem/processing/fastprocess.dm b/code/controllers/subsystem/processing/fastprocess.dm index 1b30ca44c240..ce1617253ed9 100644 --- a/code/controllers/subsystem/processing/fastprocess.dm +++ b/code/controllers/subsystem/processing/fastprocess.dm @@ -2,3 +2,9 @@ PROCESSING_SUBSYSTEM_DEF(fastprocess) name = "Fast Processing" wait = 0.2 SECONDS stat_tag = "FP" + +PROCESSING_SUBSYSTEM_DEF(actualfastprocess) + name = "Actual Fast Processing" + wait = 0.1 SECONDS + priority = FIRE_PRIORITY_TICKER + stat_tag = "AFP" diff --git a/code/controllers/subsystem/processing/station.dm b/code/controllers/subsystem/processing/station.dm index 21cd66c11a72..0b5626d68977 100644 --- a/code/controllers/subsystem/processing/station.dm +++ b/code/controllers/subsystem/processing/station.dm @@ -76,6 +76,9 @@ PROCESSING_SUBSYSTEM_DEF(station) for(var/iterator in 1 to amount) var/datum/station_trait/trait_type = pick_weight(selectable_traits_by_types[trait_sign]) //Rolls from the table for the specific trait type selectable_traits_by_types[trait_sign] -= trait_type + if(istype(trait_type, /datum/station_trait/late_arrivals) && SSmapping.config.map_name == "Oshan Station") + amount++ + continue setup_trait(trait_type) ///Creates a given trait of a specific type, while also removing any blacklisted ones from the future pool. diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 13df2be77ba9..517c26798a60 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -26,6 +26,7 @@ SUBSYSTEM_DEF(statpanels) global_data = list( "Map: [SSmapping.config?.map_name || "Loading..."]", cached ? "Next Map: [cached.map_name]" : null, + "Storyteller: [SSgamemode.storyteller ? SSgamemode.storyteller.name : "N/A"]", //monkestation addition "Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]", "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]", "Round Time: [ROUND_TIME()]", diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index d99019e61a57..83cc88c4063c 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -219,7 +219,7 @@ SUBSYSTEM_DEF(throwing) if (callback) callback.Invoke() - if(!thrownthing.currently_z_moving) // I don't think you can zfall while thrown but hey, just in case. + if(!thrownthing?.currently_z_moving) // I don't think you can zfall while thrown but hey, just in case. var/turf/T = get_turf(thrownthing) T?.zFall(thrownthing) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index aed9754a2a46..56c5179b34b0 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -1,4 +1,5 @@ #define ROUND_START_MUSIC_LIST "strings/round_start_sounds.txt" +#define SS_TICKER_TRAIT "SS_Ticker" SUBSYSTEM_DEF(ticker) name = "Ticker" @@ -10,8 +11,10 @@ SUBSYSTEM_DEF(ticker) /// state of current round (used by process()) Use the defines GAME_STATE_* ! var/current_state = GAME_STATE_STARTUP - /// Boolean to track if round was ended by admin intervention or a "round-ending" event, like summoning Nar'Sie, a blob victory, the nuke going off, etc. - var/force_ending = FALSE + /// Boolean to track if round should be forcibly ended next ticker tick. + /// Set by admin intervention ([ADMIN_FORCE_END_ROUND]) + /// or a "round-ending" event, like summoning Nar'Sie, a blob victory, the nuke going off, etc. ([FORCE_END_ROUND]) + var/force_ending = END_ROUND_AS_NORMAL /// If TRUE, there is no lobby phase, the game starts immediately. var/start_immediately = FALSE /// Boolean to track and check if our subsystem setup is done. @@ -211,7 +214,7 @@ SUBSYSTEM_DEF(ticker) mode.process(wait * 0.1) check_queue() - if(!roundend_check_paused && mode.check_finished(force_ending) || force_ending) + if(!roundend_check_paused && (mode.check_finished() || force_ending)) current_state = GAME_STATE_FINISHED toggle_ooc(TRUE) // Turn it on toggle_dooc(TRUE) @@ -225,10 +228,14 @@ SUBSYSTEM_DEF(ticker) var/init_start = world.timeofday mode = new /datum/game_mode/dynamic - + SSgamemode.init_storyteller() //monkestation addition CHECK_TICK //Configure mode and assign player to special mode stuff var/can_continue = 0 + //monkestation addition start + can_continue = SSgamemode.pre_setup() + CHECK_TICK + //monkestation addition end can_continue = src.mode.pre_setup() //Choose antagonists CHECK_TICK can_continue = can_continue && SSjob.DivideOccupations() //Distribute jobs @@ -278,7 +285,12 @@ SUBSYSTEM_DEF(ticker) INVOKE_ASYNC(SSdbcore, TYPE_PROC_REF(/datum/controller/subsystem/dbcore,SetRoundStart)) to_chat(world, span_notice("Welcome to [station_name()], enjoy your stay!")) - SEND_SOUND(world, sound(SSstation.announcer.get_rand_welcome_sound())) + + for(var/mob/M as anything in GLOB.player_list) + if(!M.client) + SEND_SOUND(M, sound(SSstation.announcer.get_rand_welcome_sound(), volume = 100)) + else if("[CHANNEL_VOX]" in M.client.prefs.channel_volume) + SEND_SOUND(M, sound(SSstation.announcer.get_rand_welcome_sound(), volume = M.client.prefs.channel_volume["[CHANNEL_VOX]"] * (M.client.prefs.channel_volume["[CHANNEL_MASTER_VOLUME]"] * 0.01))) current_state = GAME_STATE_PLAYING Master.SetRunLevel(RUNLEVEL_GAME) @@ -295,6 +307,8 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/proc/PostSetup() set waitfor = FALSE + SSgamemode.storyteller.process(STORYTELLER_WAIT_TIME * 0.1) // we want this asap + SSgamemode.storyteller.round_started = TRUE mode.post_setup() GLOB.start_state = new /datum/station_state() GLOB.start_state.count() @@ -476,7 +490,7 @@ SUBSYSTEM_DEF(ticker) var/mob/living = player.transfer_character() if(living) qdel(player) - living.notransform = TRUE + ADD_TRAIT(living, TRAIT_NO_TRANSFORM, SS_TICKER_TRAIT) if(living.client) var/atom/movable/screen/splash/S = new(null, living.client, TRUE) S.Fade(TRUE) @@ -491,12 +505,11 @@ SUBSYSTEM_DEF(ticker) if(living.job == processing_reward_jobs) living.client.reward_this_person += 150 if(livings.len) - addtimer(CALLBACK(src, PROC_REF(release_characters), livings), 30, TIMER_CLIENT_TIME) + addtimer(CALLBACK(src, PROC_REF(release_characters), livings), 3 SECONDS, TIMER_CLIENT_TIME) /datum/controller/subsystem/ticker/proc/release_characters(list/livings) - for(var/I in livings) - var/mob/living/L = I - L.notransform = FALSE + for(var/mob/living/living_mob as anything in livings) + REMOVE_TRAIT(living_mob, TRAIT_NO_TRANSFORM, SS_TICKER_TRAIT) /datum/controller/subsystem/ticker/proc/check_queue() if(!queued_players.len) @@ -760,3 +773,4 @@ SUBSYSTEM_DEF(ticker) return "[global.config.directory]/reboot_themes/[pick(possible_themes)]" #undef ROUND_START_MUSIC_LIST +#undef SS_TICKER_TRAIT diff --git a/code/controllers/subsystem/traitor.dm b/code/controllers/subsystem/traitor.dm index bae2bebecd14..247105c1dc0a 100644 --- a/code/controllers/subsystem/traitor.dm +++ b/code/controllers/subsystem/traitor.dm @@ -19,7 +19,7 @@ SUBSYSTEM_DEF(traitor) var/configuration_data = list() /// The coefficient multiplied by the current_global_progression for new joining traitors to calculate their progression - var/newjoin_progression_coeff = 0.6 + var/newjoin_progression_coeff = 1 /// The current progression that all traitors should be at in the round var/current_global_progression = 0 /// The amount of deviance from the current global progression before you start getting 2x the current scaling or no scaling at all diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 0513c666b774..787748405aaa 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -285,12 +285,16 @@ SUBSYSTEM_DEF(vote) "message" = vote.message, ) + if(vote.has_desc) + vote_data += list("desc" = vote.return_desc(vote_name)) + if(vote == current_vote) var/list/choices = list() for(var/key in current_vote.choices) choices += list(list( "name" = key, "votes" = current_vote.choices[key], + "desc" = current_vote.return_desc(key) )) data["currentVote"] = list( diff --git a/code/datums/achievements/_achievement_data.dm b/code/datums/achievements/_achievement_data.dm index 12c8256c74ce..295770b89b5b 100644 --- a/code/datums/achievements/_achievement_data.dm +++ b/code/datums/achievements/_achievement_data.dm @@ -45,13 +45,11 @@ kv[key] = value qdel(Query) - for(var/T in subtypesof(/datum/award)) - var/datum/award/A = SSachievements.awards[T] - if(!A || !A.name) //Skip abstract achievements types + for(var/award_type in subtypesof(/datum/award)) + var/datum/award/award = SSachievements.awards[award_type] + if(!award || !award.name) //Skip abstract achievements types continue - if(!data[T]) - data[T] = A.parse_value(kv[A.database_id]) - original_cached_data[T] = data[T] + award.on_achievement_data_init(src, kv[award.database_id]) ///Updates local cache with db data for the given achievement type if it wasn't loaded yet. /datum/achievement_data/proc/get_data(achievement_type) @@ -77,22 +75,12 @@ A.on_unlock(user) //Only on default achievement, as scores keep going up. else if(istype(A, /datum/award/score)) data[achievement_type] += value + update_static_data(user) ///Getter for the status/score of an achievement /datum/achievement_data/proc/get_achievement_status(achievement_type) return data[achievement_type] -///Resets an achievement to default values. -/datum/achievement_data/proc/reset(achievement_type) - if(!SSachievements.achievements_enabled) - return - var/datum/award/A = SSachievements.awards[achievement_type] - get_data(achievement_type) - if(istype(A, /datum/award/achievement)) - data[achievement_type] = FALSE - else if(istype(A, /datum/award/score)) - data[achievement_type] = 0 - /datum/achievement_data/ui_assets(mob/user) return list( get_asset_datum(/datum/asset/spritesheet/simple/achievements), @@ -107,34 +95,30 @@ ui = new(user, src, "Achievements") ui.open() -/datum/achievement_data/ui_data(mob/user) - var/ret_data = list() // screw standards (qustinnus you must rename src.data ok) - ret_data["categories"] = list("Bosses", "Jobs", "Misc", "Mafia", "Scores") - ret_data["achievements"] = list() - ret_data["user_key"] = user.ckey +/datum/achievement_data/ui_static_data(mob/user) + . = ..() + .["categories"] = GLOB.achievement_categories + .["achievements"] = list() + .["highscore"] = list() + .["user_key"] = user.ckey var/datum/asset/spritesheet/simple/assets = get_asset_datum(/datum/asset/spritesheet/simple/achievements) - //This should be split into static data later for(var/achievement_type in SSachievements.awards) - if(!SSachievements.awards[achievement_type].name) //No name? we a subtype. + var/datum/award/award = SSachievements.awards[achievement_type] + if(!award.name) //No name? we a subtype. continue if(isnull(data[achievement_type])) //We're still loading continue - var/list/this = list( - "name" = SSachievements.awards[achievement_type].name, - "desc" = SSachievements.awards[achievement_type].desc, - "category" = SSachievements.awards[achievement_type].category, - "icon_class" = assets.icon_class_name(SSachievements.awards[achievement_type].icon), + var/list/award_data = list( + "name" = award.name, + "desc" = award.desc, + "category" = award.category, + "icon_class" = assets.icon_class_name(award.icon), "value" = data[achievement_type], - "score" = ispath(achievement_type,/datum/award/score) ) - ret_data["achievements"] += list(this) - - return ret_data + award_data += award.get_ui_data(user.ckey) + .["achievements"] += list(award_data) -/datum/achievement_data/ui_static_data(mob/user) - . = ..() - .["highscore"] = list() for(var/score in SSachievements.scores) var/datum/award/score/S = SSachievements.scores[score] if(!S.name || !S.track_high_scores || !S.high_scores.len) diff --git a/code/datums/achievements/_awards.dm b/code/datums/achievements/_awards.dm index f1f3dc7079d3..23ab5e81001c 100644 --- a/code/datums/achievements/_awards.dm +++ b/code/datums/achievements/_awards.dm @@ -24,6 +24,9 @@ var/raw_value = get_raw_value(key) return parse_value(raw_value) +/datum/award/proc/on_achievement_data_init(datum/achievement_data/holder, database_value) + holder.original_cached_data[type] = holder.data[type] = parse_value(database_value) + ///This saves the changed data to the hub. /datum/award/proc/get_changed_rows(key, value) if(!database_id || !key || !name) @@ -66,21 +69,63 @@ /datum/award/proc/on_unlock(mob/user) return +///returns additional ui data for the Check Achievements menu +/datum/award/proc/get_ui_data() + return list( + "score" = FALSE, + "achieve_info" = null, + "achieve_tooltip" = null, + ) + ///Achievements are one-off awards for usually doing cool things. /datum/award/achievement desc = "Achievement for epic people" icon = "" // This should warn contributors that do not declare an icon when contributing new achievements. + ///How many players have earned this achievement + var/times_achieved = 0 /datum/award/achievement/get_metadata_row() . = ..() .["achievement_type"] = "achievement" +/datum/award/achievement/get_ui_data() + . = ..() + .["achieve_info"] = "Unlocked by [times_achieved] players so far" + if(!SSachievements.most_unlocked_achievement) + .["achieve_tooltip"] = "No achievement has been unlocked yet. Be the first today!" + return + if(SSachievements.most_unlocked_achievement == src) + .["achieve_tooltip"] = "This is the most unlocked achievement" + return + var/percent = FLOOR(times_achieved / SSachievements.most_unlocked_achievement.times_achieved * 100, 0.01) + .["achieve_tooltip"] = "[(times_achieved && !percent) ? "Less than 0.01" : percent]% compared to the achievement unlocked by the most players: \"[SSachievements.most_unlocked_achievement.name])\"" + /datum/award/achievement/parse_value(raw_value) return raw_value > 0 /datum/award/achievement/on_unlock(mob/user) . = ..() to_chat(user, span_greenannounce("Achievement unlocked: [name]!")) + var/sound/sound_to_send = LAZYACCESS(GLOB.achievement_sounds, user.client.prefs.read_preference(/datum/preference/choiced/sound_achievement)) + if(sound_to_send) + SEND_SOUND(user, sound_to_send) + + times_achieved++ + if(SSachievements.most_unlocked_achievement?.times_achieved < times_achieved) + SSachievements.most_unlocked_achievement = src + + var/datum/achievement_report/new_report = new /datum/achievement_report() + + new_report.winner = "[(user.real_name == user.name) ? user.real_name : "[user.real_name], as [user.name]"]" + new_report.cheevo = name + if(user.ckey) + new_report.winner_key = user.ckey + else + stack_trace("[name] achievement earned by [user], who did not have a ckey.") + + new_report.award_location = "[get_area_name(user)]" + + GLOB.achievements_unlocked += new_report ///Scores are for leaderboarded things, such as killcount of a specific boss /datum/award/score @@ -100,6 +145,10 @@ . = ..() .["achievement_type"] = "score" +/datum/award/score/get_ui_data() + . = ..() + .["score"] = TRUE + /datum/award/score/proc/LoadHighScores() var/datum/db_query/Q = SSdbcore.NewQuery( "SELECT ckey,value FROM [format_table_name("achievements")] WHERE achievement_key = :achievement_key ORDER BY value DESC LIMIT 50", @@ -117,3 +166,52 @@ /datum/award/score/parse_value(raw_value) return isnum(raw_value) ? raw_value : 0 + +///Defining this here 'cause it's the first score a player should see in the Scores category. +/datum/award/score/achievements_score + name = "Achievements Unlocked" + desc = "Don't worry, metagaming is all that matters." + icon = "elephant" //Obey the reference + database_id = ACHIEVEMENTS_SCORE + +/datum/award/score/achievements_score/get_ui_data(key) + . = ..() + var/datum/db_query/get_unlocked_count = SSdbcore.NewQuery( + "SELECT COUNT(m.achievement_key) FROM [format_table_name("achievements")] AS a JOIN [format_table_name("achievement_metadata")] m ON a.achievement_key = m.achievement_key AND m.achievement_type = 'Achievement' WHERE a.ckey = :ckey", + list("ckey" = key) + ) + if(!get_unlocked_count.Execute(async = TRUE)) + qdel(get_unlocked_count) + .["value"] = default_value + return . + if(get_unlocked_count.NextRow()) + .["value"] = text2num(get_unlocked_count.item[1]) + qdel(get_unlocked_count) + return . + +/datum/award/score/achievements_score/LoadHighScores() + var/datum/db_query/get_unlocked_highscore = SSdbcore.NewQuery( + "SELECT ckey, COUNT(ckey) AS c FROM [format_table_name("achievements")] AS a JOIN [format_table_name("achievement_metadata")] m ON a.achievement_key = m.achievement_key AND m.achievement_type = 'Achievement' GROUP BY ckey ORDER BY c DESC LIMIT 50", + ) + if(!get_unlocked_highscore.Execute(async = TRUE)) + qdel(get_unlocked_highscore) + return + else + while(get_unlocked_highscore.NextRow()) + var/key = get_unlocked_highscore.item[1] + var/score = text2num(get_unlocked_highscore.item[2]) + high_scores[key] = score + qdel(get_unlocked_highscore) + +/datum/award/score/achievements_score/on_achievement_data_init(datum/achievement_data/holder, database_value) + var/datum/db_query/get_unlocked_load = SSdbcore.NewQuery( + "SELECT COUNT(m.achievement_key) FROM [format_table_name("achievements")] AS a JOIN [format_table_name("achievement_metadata")] m ON a.achievement_key = m.achievement_key AND m.achievement_type = 'Achievement' WHERE a.ckey = :ckey", + list("ckey" = holder.owner_ckey) + ) + if(!get_unlocked_load.Execute(async = TRUE)) + qdel(get_unlocked_load) + return + if(get_unlocked_load.NextRow()) + holder.data[type] = text2num(get_unlocked_load.item[1]) || 0 + holder.original_cached_data[type] = 0 + qdel(get_unlocked_load) diff --git a/code/datums/achievements/job_achievements.dm b/code/datums/achievements/job_achievements.dm index 2bcc1ff91ced..10835b895b88 100644 --- a/code/datums/achievements/job_achievements.dm +++ b/code/datums/achievements/job_achievements.dm @@ -2,7 +2,27 @@ /datum/award/achievement/jobs category = "Jobs" -//chemistry +//engineering + +/datum/award/achievement/jobs/theoretical_limits + name = "All Within Theoretical Limits" + desc = "I never thought I'd see a resonance cascade, let alone prevent one..." + database_id = MEDAL_THEORETICAL_LIMITS + icon = "theoreticallimits" + +//medical + +/datum/award/achievement/jobs/sandman + name = "Mister Sandman" + desc = "Mechanically speaking, there's no real benefit to being unconscious during surgery. Weird how insistent this doctor is about using the N2O anyway though, huh?" + database_id = MEDAL_SANDMAN + icon = "basemisc" + +/datum/award/achievement/jobs/helbitaljanken + name = "Helbitaljanken" + desc = "You janked hard" + database_id = MEDAL_HELBITALJANKEN + icon = "helbital" /datum/award/achievement/jobs/chemistry_tut name = "Perfect chemistry blossom" @@ -10,6 +30,28 @@ database_id = MEDAL_CHEM_TUT icon = "chem_tut" +//mining + +/datum/award/achievement/jobs/frenching + name = "Frenching" + desc = "Just a taste, for science!" + database_id = MEDAL_FRENCHING + icon = "frenchingthebubble" + +//science + +/datum/award/achievement/jobs/feat_of_strength + name = "Feat of Strength" + desc = "If the rod is immovable, is it passing you or are you passing it?" + database_id = MEDAL_RODSUPLEX + icon = "featofstrength" + +/datum/award/achievement/jobs/snail + name = "KKKiiilll mmmeee" + desc = "You were a little too ambitious, but hey, I guess you're still alive?" + database_id = MEDAL_SNAIL + icon = "snail" + //all of service! hip hip! /datum/award/achievement/jobs/service_bad diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm index 8d9e5e2db3d7..483bdf906288 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -20,12 +20,6 @@ database_id = MEDAL_TIMEWASTE icon = "timewaste" -/datum/award/achievement/misc/feat_of_strength - name = "Feat of Strength" - desc = "If the rod is immovable, is it passing you or are you passing it?" - database_id = MEDAL_RODSUPLEX - icon = "featofstrength" - /datum/award/achievement/misc/round_and_full name = "Round and Full" desc = "Well at least you aren't down the river, I hear they eat people there." @@ -38,12 +32,6 @@ database_id = MEDAL_THANKSALOT icon = "clownthanks" -/datum/award/achievement/misc/helbitaljanken - name = "Helbitaljanken" - desc = "You janked hard" - database_id = MEDAL_HELBITALJANKEN - icon = "helbital" - /datum/award/achievement/misc/getting_an_upgrade name = "Getting an upgrade" desc = "Make your first unique material item!" @@ -76,11 +64,6 @@ desc = "If you saw someone casually club themselves upside the head with a toolbox anywhere in the galaxy but here, you'd probably be pretty concerned for them." database_id = MEDAL_SELFOUCH -/datum/award/achievement/misc/sandman - name = "Mister Sandman" - desc = "Mechanically speaking, there's no real benefit to being unconscious during surgery. Weird how insistent this doctor is about using the N2O anyway though, huh?" - database_id = MEDAL_SANDMAN - /datum/award/achievement/misc/cleanboss name = "One Lean, Mean, Cleaning Machine" desc = "How does it feel to know that your workplace values a mop bucket on wheels more than you?" // i can do better than this give me time @@ -98,12 +81,6 @@ database_id = MEDAL_LONGSHIFT icon = "longshift" -/datum/award/achievement/misc/snail - name = "KKKiiilll mmmeee" - desc = "You were a little too ambitious, but hey, I guess you're still alive?" - database_id = MEDAL_SNAIL - icon = "snail" - /datum/award/achievement/misc/lookoutsir name = "Look Out, Sir!" desc = "Either awarded for making the ultimate sacrifice for your comrades, or a really dumb attempt at grenade jumping." @@ -122,12 +99,6 @@ database_id = MEDAL_ASCENSION icon = "ascension" -/datum/award/achievement/misc/frenching - name = "Frenching" - desc = "Just a taste, for science!" - database_id = MEDAL_FRENCHING - icon = "frenchingthebubble" - /datum/award/achievement/misc/ash_ascension name = "Nightwatcher's Eyes" desc = "You've risen above the flames, became one with the ashes. You've been reborn as one with the Nightwatcher." @@ -164,6 +135,12 @@ database_id = MEDAL_COSMOS_ASCENSION icon = "cosmicascend" +/datum/award/achievement/misc/grand_ritual_finale + name = "Archmage" + desc = "Made a big impression on the station with your phenomenal cosmic power." + database_id = MEDAL_ARCHMAGE + icon = "archmage" + /datum/award/achievement/misc/toolbox_soul name = "SOUL'd Out" desc = "My eternal soul was destroyed to make a toolbox look funny and all I got was this achievement..." @@ -217,3 +194,10 @@ desc = "Don't be such a baby, it's just a heart attack. You've bounced back from worse!" database_id = MEDAL_HEALTHY icon = "picofhealth" + +/datum/award/achievement/misc/debt_extinguished + name = "Outdebted" + desc = "I've paid my dues, shift after shift... I've done my sentence but commited no griff..." + database_id = MEDAL_DEBT_EXTINGUISHED + icon = "outdebted" + diff --git a/code/datums/actions/cooldown_action.dm b/code/datums/actions/cooldown_action.dm index 015df7d310b3..d4d02901dda2 100644 --- a/code/datums/actions/cooldown_action.dm +++ b/code/datums/actions/cooldown_action.dm @@ -177,6 +177,8 @@ /// Starts a cooldown time for other abilities that share a cooldown with this. Has some niche usage with more complicated attack ai! /// Will use default cooldown time if an override is not specified /datum/action/cooldown/proc/StartCooldownOthers(override_cooldown_time) + if(!length(owner.actions)) + return // Possible if they have an action they don't control for(var/datum/action/cooldown/shared_ability in owner.actions - src) if(!(shared_cooldown & shared_ability.shared_cooldown)) continue diff --git a/code/datums/actions/mobs/charge.dm b/code/datums/actions/mobs/charge.dm index 17f1dd2aeb16..4bb3c70e7444 100644 --- a/code/datums/actions/mobs/charge.dm +++ b/code/datums/actions/mobs/charge.dm @@ -152,17 +152,23 @@ SSexplosions.med_mov_atom += target INVOKE_ASYNC(src, PROC_REF(DestroySurroundings), source) - hit_target(source, target, charge_damage) - -/datum/action/cooldown/mob_cooldown/charge/proc/hit_target(atom/movable/source, atom/target, damage_dealt) - if(!isliving(target)) - return - var/mob/living/living_target = target - living_target.visible_message("[source] slams into [living_target]!", "[source] tramples you into the ground!") - source.forceMove(get_turf(living_target)) - living_target.apply_damage(damage_dealt, BRUTE, wound_bonus = CANT_WOUND) - playsound(get_turf(living_target), 'sound/effects/meteorimpact.ogg', 100, TRUE) - shake_camera(living_target, 4, 3) + try_hit_target(source, target) + +/// Attempt to hit someone with our charge +/datum/action/cooldown/mob_cooldown/charge/proc/try_hit_target(atom/movable/source, atom/target) + if (can_hit_target(source, target)) + hit_target(source, target, charge_damage) + +/// Returns true if we're allowed to charge into this target +/datum/action/cooldown/mob_cooldown/charge/proc/can_hit_target(atom/movable/source, atom/target) + return isliving(target) + +/// Actually hit someone +/datum/action/cooldown/mob_cooldown/charge/proc/hit_target(atom/movable/source, mob/living/target, damage_dealt) + target.visible_message(span_danger("[source] slams into [target]!"), span_userdanger("[source] tramples you into the ground!")) + target.apply_damage(damage_dealt, BRUTE, wound_bonus = CANT_WOUND) + playsound(get_turf(target), 'sound/effects/meteorimpact.ogg', 100, TRUE) + shake_camera(target, 4, 3) shake_camera(source, 2, 3) /datum/action/cooldown/mob_cooldown/charge/basic_charge @@ -183,18 +189,21 @@ /datum/action/cooldown/mob_cooldown/charge/basic_charge/do_charge_indicator(atom/charger, atom/charge_target) charger.Shake(shake_pixel_shift, shake_pixel_shift, shake_duration) +/datum/action/cooldown/mob_cooldown/charge/basic_charge/can_hit_target(atom/movable/source, atom/target) + if(!isliving(target)) + if(!target.density || target.CanPass(source, get_dir(target, source))) + return FALSE + return TRUE + return ..() + /datum/action/cooldown/mob_cooldown/charge/basic_charge/hit_target(atom/movable/source, atom/target, damage_dealt) var/mob/living/living_source if(isliving(source)) living_source = source if(!isliving(target)) - if(!target.density || target.CanPass(source, get_dir(target, source))) - return source.visible_message(span_danger("[source] smashes into [target]!")) - if(!living_source) - return - living_source.Stun(recoil_duration, ignore_canstun = TRUE) + living_source?.Stun(recoil_duration, ignore_canstun = TRUE) return var/mob/living/living_target = target @@ -204,10 +213,9 @@ living_source.Stun(recoil_duration, ignore_canstun = TRUE) return - living_target.visible_message(span_danger("[source] charges on [living_target]!"), span_userdanger("[source] charges into you!")) + living_target.visible_message(span_danger("[source] charges into [living_target]!"), span_userdanger("[source] charges into you!")) living_target.Knockdown(knockdown_duration) - /datum/status_effect/tired_post_charge id = "tired_post_charge" duration = 1 SECONDS diff --git a/code/datums/actions/mobs/fire_breath.dm b/code/datums/actions/mobs/fire_breath.dm index 57962035a24d..165b87b02860 100644 --- a/code/datums/actions/mobs/fire_breath.dm +++ b/code/datums/actions/mobs/fire_breath.dm @@ -2,62 +2,121 @@ name = "Fire Breath" button_icon = 'icons/obj/wizard.dmi' button_icon_state = "fireball" - desc = "Allows you to shoot fire towards a target." + desc = "Breathe a line of flames towards the target." cooldown_time = 3 SECONDS /// The range of the fire var/fire_range = 15 /// The sound played when you use this ability var/fire_sound = 'sound/magic/fireball.ogg' - /// If the fire should be icey fire - var/ice_breath = FALSE + /// Time to wait between spawning each fire turf + var/fire_delay = 1.5 DECISECONDS + /// How hot is our fire + var/fire_temperature = DRAKE_FIRE_TEMP + /// 'How much' fire do we expose the turf to? + var/fire_volume = DRAKE_FIRE_EXPOSURE + /// How much damage do you take when engulfed? + var/fire_damage = 20 + /// How much damage to mechs take when engulfed? + var/mech_damage = 45 /datum/action/cooldown/mob_cooldown/fire_breath/Activate(atom/target_atom) - StartCooldown(360 SECONDS, 360 SECONDS) attack_sequence(target_atom) StartCooldown() return TRUE +/// Apply our specific fire breathing shape, in proc form so we can override it in subtypes /datum/action/cooldown/mob_cooldown/fire_breath/proc/attack_sequence(atom/target) playsound(owner.loc, fire_sound, 200, TRUE) - fire_line(target, 0) + fire_line(target) +/// Breathe fire in a line towards the target, optionally rotated at an offset from the target /datum/action/cooldown/mob_cooldown/fire_breath/proc/fire_line(atom/target, offset) - SLEEP_CHECK_DEATH(0, owner) - var/list/turfs = line_target(offset, fire_range, target) - dragon_fire_line(owner, turfs, ice_breath) + if (isnull(target)) + return + var/turf/target_turf = get_ranged_target_turf_direct(owner, target, fire_range, offset) + var/list/turfs = get_line(owner, target_turf) - get_turf(owner) + INVOKE_ASYNC(src, PROC_REF(progressive_fire_line), turfs) -/datum/action/cooldown/mob_cooldown/fire_breath/proc/line_target(offset, range, atom/target) - if(!target) +/// Creates fire with a delay on the list of targeted turfs +/datum/action/cooldown/mob_cooldown/fire_breath/proc/progressive_fire_line(list/burn_turfs) + if (QDELETED(owner) || owner.stat == DEAD) return - var/turf/T = get_ranged_target_turf_direct(owner, target, range, offset) - return (get_line(owner, T) - get_turf(owner)) + // Guys we have already hit, no double dipping + var/list/hit_list = list(owner) // also don't burn ourselves + for(var/turf/target_turf in burn_turfs) + if (target_turf.is_blocked_turf(exclude_mobs = TRUE)) + return + burn_turf(target_turf, hit_list, owner) + sleep(fire_delay) + +/// Finally spawn the actual fire, spawns the fire hotspot in case you want to recolour it or something +/datum/action/cooldown/mob_cooldown/fire_breath/proc/burn_turf(turf/fire_turf, list/hit_list, mob/living/source) + var/obj/effect/hotspot/fire_hotspot = new /obj/effect/hotspot(fire_turf) + fire_turf.hotspot_expose(fire_temperature, fire_volume, TRUE) + + for(var/mob/living/barbecued in fire_turf.contents) + if(barbecued in hit_list) + continue + hit_list |= barbecued + on_burn_mob(barbecued, source) + + for(var/obj/vehicle/sealed/mecha/robotron in fire_turf.contents) + if(robotron in hit_list) + continue + hit_list |= robotron + robotron.take_damage(mech_damage, BURN, FIRE) + + return fire_hotspot +/// Do something unpleasant to someone we set on fire +/datum/action/cooldown/mob_cooldown/fire_breath/proc/on_burn_mob(mob/living/barbecued, mob/living/source) + to_chat(barbecued, span_userdanger("You are burned by [source]'s fire breath!")) + barbecued.adjustFireLoss(fire_damage) + +/// Shoot three lines of fire in a sort of fork pattern approximating a cone /datum/action/cooldown/mob_cooldown/fire_breath/cone name = "Fire Cone" - desc = "Allows you to shoot fire towards a target with surrounding lines of fire." + desc = "Breathe several lines of fire directed at a target." /// The angles relative to the target that shoot lines of fire var/list/angles = list(-40, 0, 40) /datum/action/cooldown/mob_cooldown/fire_breath/cone/attack_sequence(atom/target) playsound(owner.loc, fire_sound, 200, TRUE) for(var/offset in angles) - INVOKE_ASYNC(src, PROC_REF(fire_line), target, offset) + fire_line(target, offset) +/// Shoot fire in a whole bunch of directions /datum/action/cooldown/mob_cooldown/fire_breath/mass_fire name = "Mass Fire" button_icon = 'icons/effects/fire.dmi' button_icon_state = "1" - desc = "Allows you to shoot fire in all directions." + desc = "Breathe flames in all directions." cooldown_time = 3 SECONDS + click_to_activate = FALSE + /// How many fire lines do we produce to turn a full circle? + var/sectors = 12 + /// How long do we wait between each spin? + var/breath_delay = 2.5 SECONDS + /// How many full circles do we perform? + var/total_spins = 3 + +/datum/action/cooldown/mob_cooldown/fire_breath/mass_fire/Activate(atom/target_atom) + target_atom = get_step(owner, owner.dir) // Just shoot it forwards, we don't need to click on someone for this one + return ..() /datum/action/cooldown/mob_cooldown/fire_breath/mass_fire/attack_sequence(atom/target) - shoot_mass_fire(target, 12, 2.5 SECONDS, 3) - -/datum/action/cooldown/mob_cooldown/fire_breath/mass_fire/proc/shoot_mass_fire(atom/target, spiral_count, delay_time, times) - SLEEP_CHECK_DEATH(0, owner) - for(var/i = 1 to times) - playsound(owner.loc, fire_sound, 200, TRUE) - var/increment = 360 / spiral_count - for(var/j = 1 to spiral_count) - INVOKE_ASYNC(src, PROC_REF(fire_line), target, j * increment + i * increment / 2) - SLEEP_CHECK_DEATH(delay_time, owner) + var/queued_spins = 0 + for (var/i in 1 to total_spins) + var/delay = queued_spins * breath_delay + queued_spins++ + addtimer(CALLBACK(src, PROC_REF(fire_spin), target, queued_spins), delay) + +/// Breathe fire in a circle, with a slight angle offset based on which of our several circles it is +/datum/action/cooldown/mob_cooldown/fire_breath/mass_fire/proc/fire_spin(target, spin_count) + if (QDELETED(owner) || owner.stat == DEAD) + return // Too dead to spin + playsound(owner.loc, fire_sound, 200, TRUE) + var/angle_increment = 360 / sectors + var/additional_offset = spin_count * angle_increment / 2 + for (var/i in 1 to sectors) + fire_line(target, (angle_increment * i) + (additional_offset)) diff --git a/code/datums/actions/mobs/lava_swoop.dm b/code/datums/actions/mobs/lava_swoop.dm index d23252c73aac..d18ad2f3af3b 100644 --- a/code/datums/actions/mobs/lava_swoop.dm +++ b/code/datums/actions/mobs/lava_swoop.dm @@ -38,7 +38,7 @@ return // stop swooped target movement swooping = TRUE - owner.set_density(FALSE) + ADD_TRAIT(owner, TRAIT_UNDENSE, SWOOPING_TRAIT) owner.visible_message(span_boldwarning("[owner] swoops up high!")) var/negative @@ -115,7 +115,7 @@ for(var/mob/M in range(7, owner)) shake_camera(M, 15, 1) - owner.set_density(TRUE) + REMOVE_TRAIT(owner, TRAIT_UNDENSE, SWOOPING_TRAIT) SLEEP_CHECK_DEATH(1, owner) swooping = FALSE if(!lava_success) diff --git a/code/datums/actions/mobs/mobcooldown.dm b/code/datums/actions/mobs/mobcooldown.dm index 17561f2f45a5..a495859494ff 100644 --- a/code/datums/actions/mobs/mobcooldown.dm +++ b/code/datums/actions/mobs/mobcooldown.dm @@ -3,7 +3,7 @@ button_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "sniper_zoom" desc = "Click this ability to attack." - check_flags = AB_CHECK_CONSCIOUS + check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED cooldown_time = 5 SECONDS text_cooldown = TRUE click_to_activate = TRUE diff --git a/code/datums/actions/mobs/small_sprite.dm b/code/datums/actions/mobs/small_sprite.dm deleted file mode 100644 index 335d6c9aff39..000000000000 --- a/code/datums/actions/mobs/small_sprite.dm +++ /dev/null @@ -1,57 +0,0 @@ -//Small sprites -/datum/action/small_sprite - name = "Toggle Giant Sprite" - desc = "Others will always see you as giant." - button_icon = 'icons/mob/actions/actions_xeno.dmi' - button_icon_state = "smallqueen" - background_icon_state = "bg_alien" - overlay_icon_state = "bg_alien_border" - var/small = FALSE - var/small_icon - var/small_icon_state - -/datum/action/small_sprite/queen - small_icon = 'icons/mob/nonhuman-player/alien.dmi' - small_icon_state = "alienq" - -/datum/action/small_sprite/megafauna - button_icon = 'icons/mob/actions/actions_xeno.dmi' - small_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - -/datum/action/small_sprite/megafauna/drake - small_icon_state = "ash_whelp" - -/datum/action/small_sprite/megafauna/colossus - small_icon_state = "basilisk" - -/datum/action/small_sprite/megafauna/bubblegum - small_icon_state = "goliath2" - -/datum/action/small_sprite/megafauna/legion - small_icon_state = "mega_legion" - -/datum/action/small_sprite/mega_arachnid - small_icon = 'icons/mob/simple/jungle/arachnid.dmi' - small_icon_state = "arachnid_mini" - background_icon_state = "bg_demon" - overlay_icon_state = "bg_demon_border" - - -/datum/action/small_sprite/space_dragon - small_icon = 'icons/mob/simple/carp.dmi' - small_icon_state = "carp" - button_icon = 'icons/mob/simple/carp.dmi' - button_icon_state = "carp" - -/datum/action/small_sprite/Trigger(trigger_flags) - ..() - if(!small) - var/image/I = image(icon = small_icon, icon_state = small_icon_state, loc = owner) - I.override = TRUE - I.pixel_x -= owner.pixel_x - I.pixel_y -= owner.pixel_y - owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic, "smallsprite", I, AA_TARGET_SEE_APPEARANCE | AA_MATCH_TARGET_OVERLAYS) - small = TRUE - else - owner.remove_alt_appearance("smallsprite") - small = FALSE diff --git a/code/datums/actions/mobs/sneak.dm b/code/datums/actions/mobs/sneak.dm index 13ae5a784b8c..4e254daa8684 100644 --- a/code/datums/actions/mobs/sneak.dm +++ b/code/datums/actions/mobs/sneak.dm @@ -5,7 +5,9 @@ button_icon_state = "sniper_zoom" background_icon_state = "bg_alien" overlay_icon_state = "bg_alien_border" - check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED | AB_CHECK_INCAPACITATED + cooldown_time = 0.5 SECONDS + melee_cooldown_time = 0 SECONDS + click_to_activate = FALSE /// The alpha we go to when sneaking. var/sneak_alpha = 75 diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 1c7a778ae229..6cc1201d6d6d 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -331,7 +331,7 @@ multiple modular subtrees with behaviors set_ai_status(AI_STATUS_ON) //Can't do anything while player is connected RegisterSignal(pawn, COMSIG_MOB_LOGIN, PROC_REF(on_sentience_gained)) -/// Use this proc to define how your controller defines what access the pawn has for the sake of pathfinding, likely pointing to whatever ID slot is relevant +/// Use this proc to define how your controller defines what access the pawn has for the sake of pathfinding. Return the access list you want to use /datum/ai_controller/proc/get_access() return @@ -346,6 +346,15 @@ multiple modular subtrees with behaviors minimum_distance = iter_behavior.required_distance return minimum_distance +/// Returns true if we have a blackboard key with the provided key and it is not qdeleting +/datum/ai_controller/proc/blackboard_key_exists(key) + var/datum/key_value = blackboard[key] + if (isdatum(key_value)) + return !QDELETED(key_value) + if (islist(key_value)) + return length(key_value) > 0 + return !!key_value + /** * Used to manage references to datum by AI controllers * @@ -611,6 +620,7 @@ multiple modular subtrees with behaviors // We found the value that's been deleted, it was an assoc value. Clear it out entirely else if(associated_value == source) next_to_clear -= inner_value + SEND_SIGNAL(pawn, COMSIG_AI_BLACKBOARD_KEY_CLEARED(inner_value)) index += 1 diff --git a/code/datums/ai/babies/babies_behaviors.dm b/code/datums/ai/babies/babies_behaviors.dm index aeb295ff2204..daaa3b407b75 100644 --- a/code/datums/ai/babies/babies_behaviors.dm +++ b/code/datums/ai/babies/babies_behaviors.dm @@ -2,74 +2,77 @@ * Find a compatible, living partner, if we're also alone. */ /datum/ai_behavior/find_partner - action_cooldown = 40 SECONDS - /// Range to look. var/range = 7 - /// Maximum number of children var/max_children = 3 /datum/ai_behavior/find_partner/perform(seconds_per_tick, datum/ai_controller/controller, target_key, partner_types_key, child_types_key) . = ..() - + max_children = controller.blackboard[BB_MAX_CHILDREN] || max_children var/mob/pawn_mob = controller.pawn var/list/partner_types = controller.blackboard[partner_types_key] var/list/child_types = controller.blackboard[child_types_key] + var/mob/living/living_pawn = controller.pawn - var/mob/living/partner var/children = 0 - for(var/mob/other in oview(range, pawn_mob)) + for(var/mob/living/other in oview(range, pawn_mob)) + if(!pawn_mob.faction_check_atom(other)) + finish_action(controller, FALSE) + return + + if(children >= max_children) + finish_action(controller, FALSE) + return + if(other.stat != CONSCIOUS) //Check if it's conscious FIRST. continue - var/is_child = is_type_in_list(other, child_types) - if(is_child) //Check for children SECOND. + + if(is_type_in_list(other, child_types)) //Check for children SECOND. children++ - else if(is_type_in_list(other, partner_types)) - if(other.ckey) - continue - else if(!is_child && other.gender == MALE && !(other.flags_1 & HOLOGRAM_1)) //Better safe than sorry ;_; - partner = other + continue - //shyness check. we're not shy in front of things that share a faction with us. - else if(isliving(other) && !pawn_mob.faction_check_mob(other)) - finish_action(controller, FALSE) - return + if(!is_type_in_list(other, partner_types) || !HAS_TRAIT(other, TRAIT_MOB_BREEDER)) + continue + + if(other.ckey) + continue + + if(other.gender != living_pawn.gender && !(other.flags_1 & HOLOGRAM_1)) //Better safe than sorry ;_; + controller.set_blackboard_key(target_key, other) + finish_action(controller, TRUE) - if(partner && children < max_children) - controller.set_blackboard_key(target_key, partner) + finish_action(controller, FALSE) - finish_action(controller, TRUE) /** * Reproduce. */ /datum/ai_behavior/make_babies - action_cooldown = 40 SECONDS - behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH /datum/ai_behavior/make_babies/setup(datum/ai_controller/controller, target_key, child_types_key) + . = ..() var/atom/target = controller.blackboard[target_key] if(!target) return FALSE set_movement_target(controller, target) - return TRUE /datum/ai_behavior/make_babies/perform(seconds_per_tick, datum/ai_controller/controller, target_key, child_types_key) . = ..() var/mob/target = controller.blackboard[target_key] - if(!target || target.stat != CONSCIOUS) + if(QDELETED(target) || target.stat != CONSCIOUS) finish_action(controller, FALSE, target_key) return - - var/child_type = pick_weight(controller.blackboard[child_types_key]) - var/turf/turf_loc = get_turf(controller.pawn.loc) - if(turf_loc) - new child_type(turf_loc) - + var/mob/living/basic/living_pawn = controller.pawn + living_pawn.set_combat_mode(FALSE) + living_pawn.melee_attack(target) finish_action(controller, TRUE, target_key) /datum/ai_behavior/make_babies/finish_action(datum/ai_controller/controller, succeeded, target_key) . = ..() - controller.clear_blackboard_key(target_key) + if(!succeeded) + return + var/mob/living/living_pawn = controller.pawn + living_pawn.istate = initial(living_pawn.istate) diff --git a/code/datums/ai/babies/babies_subtrees.dm b/code/datums/ai/babies/babies_subtrees.dm index 0c71b6d757b0..8310cd955733 100644 --- a/code/datums/ai/babies/babies_subtrees.dm +++ b/code/datums/ai/babies/babies_subtrees.dm @@ -3,11 +3,19 @@ */ /datum/ai_planning_subtree/make_babies var/chance = 5 + operational_datums = list(/datum/component/breed) /datum/ai_planning_subtree/make_babies/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - if(controller.pawn.gender != FEMALE || !SPT_PROB(chance, seconds_per_tick)) + if(!SPT_PROB(chance, seconds_per_tick)) + return + + if(controller.blackboard_key_exists(BB_BABIES_TARGET)) + controller.queue_behavior(/datum/ai_behavior/make_babies, BB_BABIES_TARGET, BB_BABIES_CHILD_TYPES) + return SUBTREE_RETURN_FINISH_PLANNING + + if(controller.pawn.gender == FEMALE || !controller.blackboard[BB_BREED_READY]) return var/partner_types = controller.blackboard[BB_BABIES_PARTNER_TYPES] @@ -20,13 +28,5 @@ if(is_type_in_list(controller.pawn, baby_types)) return - var/atom/target = controller.blackboard[BB_BABIES_TARGET] - // Find target - if(QDELETED(target)) - controller.queue_behavior(/datum/ai_behavior/find_partner, BB_BABIES_TARGET, BB_BABIES_PARTNER_TYPES, BB_BABIES_CHILD_TYPES) - return - - // Do target - controller.queue_behavior(/datum/ai_behavior/make_babies, BB_BABIES_TARGET, BB_BABIES_CHILD_TYPES) - return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_partner, BB_BABIES_TARGET, BB_BABIES_PARTNER_TYPES, BB_BABIES_CHILD_TYPES) diff --git a/code/datums/ai/basic_mobs/base_basic_controller.dm b/code/datums/ai/basic_mobs/base_basic_controller.dm index b4f7c27c2f91..cd025b28bcb2 100644 --- a/code/datums/ai/basic_mobs/base_basic_controller.dm +++ b/code/datums/ai/basic_mobs/base_basic_controller.dm @@ -15,10 +15,16 @@ /datum/ai_controller/basic_controller/able_to_run() . = ..() - if(isliving(pawn)) - var/mob/living/living_pawn = pawn - if(IS_DEAD_OR_INCAP(living_pawn)) - return FALSE + if(!isliving(pawn)) + return + var/mob/living/living_pawn = pawn + var/incap_flags = NONE + if (ai_traits & CAN_ACT_IN_STASIS) + incap_flags |= IGNORE_STASIS + if(!(ai_traits & CAN_ACT_WHILE_DEAD) && (living_pawn.incapacitated(incap_flags) || living_pawn.stat)) + return FALSE + if(ai_traits & PAUSE_DURING_DO_AFTER && LAZYLEN(living_pawn.do_afters)) + return FALSE /datum/ai_controller/basic_controller/proc/update_speed(mob/living/basic/basic_mob) SIGNAL_HANDLER diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm index cfd53164bb21..15ddc7b264d7 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm @@ -1,11 +1,12 @@ /datum/ai_behavior/basic_melee_attack - action_cooldown = 2 SECONDS - behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + action_cooldown = 0.2 SECONDS // We gotta check unfortunately often because we're in a race condition with nextmove + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + ///do we finish this action after hitting once? + var/terminate_after_action = FALSE -/datum/ai_behavior/basic_melee_attack/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) +/datum/ai_behavior/basic_melee_attack/setup(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) . = ..() - var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] - if(isnull(targetting_datum)) + if(!controller.blackboard[targeting_strategy_key]) CRASH("No target datum was supplied in the blackboard for [controller.pawn]") //Hiding location is priority @@ -15,18 +16,23 @@ set_movement_target(controller, target) -/datum/ai_behavior/basic_melee_attack/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) +/datum/ai_behavior/basic_melee_attack/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) + if (isliving(controller.pawn)) + var/mob/living/pawn = controller.pawn + if (world.time < pawn.next_move) + return + . = ..() var/mob/living/basic/basic_mob = controller.pawn - //targetting datum will kill the action if not real anymore + //targeting strategy will kill the action if not real anymore var/atom/target = controller.blackboard[target_key] - var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] + var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key]) - if(!targetting_datum.can_attack(basic_mob, target)) + if(!targeting_strategy.can_attack(basic_mob, target)) finish_action(controller, FALSE, target_key) return - var/hiding_target = targetting_datum.find_hidden_mobs(basic_mob, target) //If this is valid, theyre hidden in something! + var/hiding_target = targeting_strategy.find_hidden_mobs(basic_mob, target) //If this is valid, theyre hidden in something! controller.set_blackboard_key(hiding_location_key, hiding_target) @@ -35,61 +41,111 @@ else basic_mob.melee_attack(target) + if(terminate_after_action) + finish_action(controller, TRUE, target_key) -/datum/ai_behavior/basic_melee_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targetting_datum_key, hiding_location_key) +/datum/ai_behavior/basic_melee_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key) . = ..() if(!succeeded) controller.clear_blackboard_key(target_key) -/datum/ai_behavior/basic_melee_attack/average_speed - action_cooldown = 1 SECONDS +/datum/ai_behavior/basic_melee_attack/interact_once + terminate_after_action = TRUE + +/datum/ai_behavior/basic_melee_attack/interact_once/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key) + . = ..() + controller.clear_blackboard_key(target_key) /datum/ai_behavior/basic_ranged_attack action_cooldown = 0.6 SECONDS behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM required_distance = 3 - /// How many shots to fire - var/shots = 1 - /// The interval between individual shots in a burst - var/burst_interval = 0.2 SECONDS + /// range we will try chasing the target before giving up + var/chase_range = 9 + ///do we care about avoiding friendly fire? + var/avoid_friendly_fire = FALSE -/datum/ai_behavior/basic_ranged_attack/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) +/datum/ai_behavior/basic_ranged_attack/setup(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) . = ..() var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key] if(QDELETED(target)) return FALSE set_movement_target(controller, target) -/datum/ai_behavior/basic_ranged_attack/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) - . = ..() +/datum/ai_behavior/basic_ranged_attack/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) var/mob/living/basic/basic_mob = controller.pawn - //targetting datum will kill the action if not real anymore + //targeting strategy will kill the action if not real anymore var/atom/target = controller.blackboard[target_key] - var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] + var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key]) - if(!targetting_datum.can_attack(basic_mob, target)) + if(!targeting_strategy.can_attack(basic_mob, target, chase_range)) finish_action(controller, FALSE, target_key) return - var/atom/hiding_target = targetting_datum.find_hidden_mobs(basic_mob, target) //If this is valid, theyre hidden in something! + var/atom/hiding_target = targeting_strategy.find_hidden_mobs(basic_mob, target) //If this is valid, theyre hidden in something! var/atom/final_target = hiding_target ? hiding_target : target if(!can_see(basic_mob, final_target, required_distance)) - finish_action(controller, FALSE, target_key) return - controller.set_blackboard_key(hiding_location_key, hiding_target) + if(avoid_friendly_fire && check_friendly_in_path(basic_mob, target, targeting_strategy)) + adjust_position(basic_mob, target) + return ..() - if(shots>1) - var/atom/burst_target = final_target - var/datum/callback/callback = CALLBACK(basic_mob, TYPE_PROC_REF(/mob/living/basic,RangedAttack), burst_target) - for(var/i in 2 to shots) - addtimer(callback, (i - 1) * burst_interval) - callback.Invoke() - else - basic_mob.RangedAttack(final_target) + controller.set_blackboard_key(hiding_location_key, hiding_target) + basic_mob.RangedAttack(final_target) + return ..() //only start the cooldown when the shot is shot -/datum/ai_behavior/basic_ranged_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targetting_datum_key, hiding_location_key) +/datum/ai_behavior/basic_ranged_attack/finish_action(datum/ai_controller/controller, succeeded, target_key, targeting_strategy_key, hiding_location_key) . = ..() if(!succeeded) controller.clear_blackboard_key(target_key) + +/datum/ai_behavior/basic_ranged_attack/proc/check_friendly_in_path(mob/living/source, atom/target, datum/targeting_strategy/targeting_strategy) + var/list/turfs_list = calculate_trajectory(source, target) + for(var/turf/possible_turf as anything in turfs_list) + + for(var/mob/living/potential_friend in possible_turf) + if(!targeting_strategy.can_attack(source, potential_friend)) + return TRUE + + return FALSE + +/datum/ai_behavior/basic_ranged_attack/proc/adjust_position(mob/living/living_pawn, atom/target) + var/turf/our_turf = get_turf(living_pawn) + var/list/possible_turfs = list() + + for(var/direction in GLOB.alldirs) + var/turf/target_turf = get_step(our_turf, direction) + if(isnull(target_turf)) + continue + if(target_turf.is_blocked_turf() || get_dist(target_turf, target) > get_dist(living_pawn, target)) + continue + possible_turfs += target_turf + + if(!length(possible_turfs)) + return + var/turf/picked_turf = get_closest_atom(/turf, possible_turfs, target) + step(living_pawn, get_dir(living_pawn, picked_turf)) + +/datum/ai_behavior/basic_ranged_attack/proc/calculate_trajectory(mob/living/source , atom/target) + var/list/turf_list = get_line(source, target) + var/list_length = length(turf_list) - 1 + for(var/i in 1 to list_length) + var/turf/current_turf = turf_list[i] + var/turf/next_turf = turf_list[i+1] + var/direction_to_turf = get_dir(current_turf, next_turf) + if(!ISDIAGONALDIR(direction_to_turf)) + continue + + for(var/cardinal_direction in GLOB.cardinals) + if(cardinal_direction & direction_to_turf) + turf_list += get_step(current_turf, cardinal_direction) + + turf_list -= get_turf(source) + turf_list -= get_turf(target) + + return turf_list + +/datum/ai_behavior/basic_ranged_attack/avoid_friendly_fire + avoid_friendly_fire = TRUE diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/nearest_targetting.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/nearest_targeting.dm similarity index 100% rename from code/datums/ai/basic_mobs/basic_ai_behaviors/nearest_targetting.dm rename to code/datums/ai/basic_mobs/basic_ai_behaviors/nearest_targeting.dm diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm index 7674c48e54ba..2e922d62f09a 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm @@ -4,7 +4,7 @@ action_cooldown = 0 behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION /// How far do we try to run? Further makes for smoother running, but potentially weirder pathfinding - var/run_distance = 9 + var/run_distance = DEFAULT_BASIC_FLEE_DISTANCE /// Clear target if we finish the action unsuccessfully var/clear_failed_targets = TRUE @@ -12,20 +12,22 @@ var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key] if(QDELETED(target)) return FALSE + run_distance = controller.blackboard[BB_BASIC_MOB_FLEE_DISTANCE] || initial(run_distance) if(!plot_path_away_from(controller, target)) return FALSE return ..() /datum/ai_behavior/run_away_from_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key) . = ..() + if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING]) + return var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key] - var/escaped = QDELETED(target) || !can_see(controller.pawn, target, run_distance) // If we can't see it we got away - if (escaped) + if (QDELETED(target) || !can_see(controller.pawn, target, run_distance)) finish_action(controller, succeeded = TRUE, target_key = target_key, hiding_location_key = hiding_location_key) return if (get_dist(controller.pawn, controller.current_movement_target) > required_distance) - return - if(plot_path_away_from(controller, target)) + return // Still heading over + if (plot_path_away_from(controller, target)) return finish_action(controller, succeeded = FALSE, target_key = target_key, hiding_location_key = hiding_location_key) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/set_travel_destination.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/set_travel_destination.dm new file mode 100644 index 000000000000..207df4424577 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/set_travel_destination.dm @@ -0,0 +1,13 @@ +/datum/ai_behavior/set_travel_destination + +/datum/ai_behavior/set_travel_destination/perform(seconds_per_tick, datum/ai_controller/controller, target_key, location_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + + controller.set_blackboard_key(location_key, target) + + finish_action(controller, TRUE, target_key) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeted_mob_ability.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeted_mob_ability.dm index ca1efe6f169f..a39200d0cc16 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/targeted_mob_ability.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeted_mob_ability.dm @@ -11,7 +11,8 @@ finish_action(controller, FALSE, ability_key, target_key) return var/mob/pawn = controller.pawn - var/result = ability.InterceptClickOn(pawn, null, target) + pawn.face_atom(target) + var/result = ability.Trigger(target = target) finish_action(controller, result, ability_key, target_key) /datum/ai_behavior/targeted_mob_ability/finish_action(datum/ai_controller/controller, succeeded, ability_key, target_key) @@ -19,12 +20,6 @@ var/atom/target = controller.blackboard[target_key] if (QDELETED(target)) controller.clear_blackboard_key(target_key) - return - if (!isliving(target)) - return - var/mob/living/living_target = target - if(living_target.stat >= UNCONSCIOUS) - controller.clear_blackboard_key(target_key) /** * # Try Mob Ability and plan execute diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/targetting.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm similarity index 65% rename from code/datums/ai/basic_mobs/basic_ai_behaviors/targetting.dm rename to code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm index 9d7587c712b3..28f89bcf2974 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/targetting.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/targeting.dm @@ -2,27 +2,31 @@ action_cooldown = 2 SECONDS /// How far can we see stuff? var/vision_range = 9 + /// Blackboard key for aggro range, uses vision range if not specified + var/aggro_range_key = BB_AGGRO_RANGE /// Static typecache list of potentially dangerous objs var/static/list/hostile_machines = typecacheof(list(/obj/machinery/porta_turret, /obj/vehicle/sealed/mecha)) -/datum/ai_behavior/find_potential_targets/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) +/datum/ai_behavior/find_potential_targets/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) . = ..() var/mob/living/living_mob = controller.pawn - var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] + var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key]) - if(!targetting_datum) + if(!targeting_strategy) CRASH("No target datum was supplied in the blackboard for [controller.pawn]") var/atom/current_target = controller.blackboard[target_key] - if (targetting_datum.can_attack(living_mob, current_target, vision_range)) + if (targeting_strategy.can_attack(living_mob, current_target, vision_range)) finish_action(controller, succeeded = FALSE) return + var/aggro_range = controller.blackboard[aggro_range_key] || vision_range + controller.clear_blackboard_key(target_key) - var/list/potential_targets = hearers(vision_range, controller.pawn) - living_mob //Remove self, so we don't suicide + var/list/potential_targets = hearers(aggro_range, controller.pawn) - living_mob //Remove self, so we don't suicide - for(var/HM in typecache_filter_list(range(vision_range, living_mob), hostile_machines)) //Can we see any hostile machines? - if(can_see(living_mob, HM, vision_range)) + for(var/HM in typecache_filter_list(range(aggro_range, living_mob), hostile_machines)) //Can we see any hostile machines? + if(can_see(living_mob, HM, aggro_range)) potential_targets += HM if(!potential_targets.len) @@ -32,7 +36,7 @@ var/list/filtered_targets = list() for(var/atom/pot_target in potential_targets) - if(targetting_datum.can_attack(living_mob, pot_target))//Can we attack it? + if(targeting_strategy.can_attack(living_mob, pot_target))//Can we attack it? filtered_targets += pot_target continue @@ -43,7 +47,7 @@ var/atom/target = pick_final_target(controller, filtered_targets) controller.set_blackboard_key(target_key, target) - var/atom/potential_hiding_location = targetting_datum.find_hidden_mobs(living_mob, target) + var/atom/potential_hiding_location = targeting_strategy.find_hidden_mobs(living_mob, target) if(potential_hiding_location) //If they're hiding inside of something, we need to know so we can go for that instead initially. controller.set_blackboard_key(hiding_location_key, potential_hiding_location) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/travel_towards.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/travel_towards.dm index bbc1a43e3224..55f6ef4c4c00 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/travel_towards.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/travel_towards.dm @@ -6,6 +6,8 @@ /datum/ai_behavior/travel_towards required_distance = 0 behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + /// If true we will get rid of our target on completion + var/clear_target = FALSE /datum/ai_behavior/travel_towards/setup(datum/ai_controller/controller, target_key) . = ..() @@ -16,7 +18,15 @@ /datum/ai_behavior/travel_towards/perform(seconds_per_tick, datum/ai_controller/controller, target_key) . = ..() - finish_action(controller, TRUE) + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/travel_towards/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + if (clear_target) + controller.clear_blackboard_key(target_key) + +/datum/ai_behavior/travel_towards/stop_on_arrival + clear_target = TRUE /** * # Travel Towards Atom diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/unbuckle_mob.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/unbuckle_mob.dm new file mode 100644 index 000000000000..d0fb7e3e8c70 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/unbuckle_mob.dm @@ -0,0 +1,14 @@ +/datum/ai_behavior/unbuckle_mob + +/datum/ai_behavior/unbuckle_mob/perform(seconds_per_tick, datum/ai_controller/controller) + . = ..() + + var/mob/living/living_pawn = controller.pawn + var/atom/movable/buckled_too = living_pawn.buckled + + if(isnull(buckled_too)) + finish_action(controller, FALSE) + return + + buckled_too.unbuckle_mob(living_pawn) + finish_action(controller, TRUE) diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/ventcrawling.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/ventcrawling.dm index 5ec5f24066cd..e162cc612990 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/ventcrawling.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/ventcrawling.dm @@ -18,7 +18,7 @@ . = ..() var/obj/machinery/atmospherics/components/unary/vent_pump/entry_vent = controller.blackboard[target_key] || controller.blackboard[BB_ENTRY_VENT_TARGET] var/mob/living/cached_pawn = controller.pawn - if(HAS_TRAIT(cached_pawn, TRAIT_MOVE_VENTCRAWLING) || !controller.blackboard[BB_CURRENTLY_TARGETTING_VENT] || !is_vent_valid(entry_vent)) + if(HAS_TRAIT(cached_pawn, TRAIT_MOVE_VENTCRAWLING) || !controller.blackboard[BB_CURRENTLY_TARGETING_VENT] || !is_vent_valid(entry_vent)) return if(!cached_pawn.can_enter_vent(entry_vent, provide_feedback = FALSE)) // we're an AI we scoff at feedback @@ -30,7 +30,7 @@ finish_action(controller, FALSE, target_key) return - controller.set_blackboard_key(BB_CURRENTLY_TARGETTING_VENT, FALSE) // must be done here because we have a do_after sleep in handle_ventcrawl unfortunately and double dipping could lead to erroneous suicide pill calls. + controller.set_blackboard_key(BB_CURRENTLY_TARGETING_VENT, FALSE) // must be done here because we have a do_after sleep in handle_ventcrawl unfortunately and double dipping could lead to erroneous suicide pill calls. cached_pawn.handle_ventcrawl(entry_vent) if(!HAS_TRAIT(cached_pawn, TRAIT_MOVE_VENTCRAWLING)) //something failed and we ARE NOT IN THE VENT even though the earlier check said we were good to go! odd. finish_action(controller, FALSE, target_key) @@ -134,4 +134,5 @@ controller.clear_blackboard_key(target_key) controller.clear_blackboard_key(BB_ENTRY_VENT_TARGET) controller.clear_blackboard_key(BB_EXIT_VENT_TARGET) - controller.set_blackboard_key(BB_CURRENTLY_TARGETTING_VENT, FALSE) // just in case + controller.set_blackboard_key(BB_CURRENTLY_TARGETING_VENT, FALSE) // just in case + diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/wounded_targeting.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/wounded_targeting.dm new file mode 100644 index 000000000000..46037fdc076e --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/wounded_targeting.dm @@ -0,0 +1,11 @@ +/// Picks targets based on which one has the lowest health +/datum/ai_behavior/find_potential_targets/most_wounded + +/datum/ai_behavior/find_potential_targets/most_wounded/pick_final_target(datum/ai_controller/controller, list/filtered_targets) + var/list/living_targets = list() + for(var/mob/living/living_target in filtered_targets) + living_targets += filtered_targets + if(living_targets.len) + sortTim(living_targets, GLOBAL_PROC_REF(cmp_mob_health)) + return pop(living_targets) + return ..() diff --git a/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm new file mode 100644 index 000000000000..411690043546 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/attack_adjacent_target.dm @@ -0,0 +1,33 @@ +/// Attack something which is already adjacent to us, without ending planning +/datum/ai_planning_subtree/basic_melee_attack_subtree/opportunistic + melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/opportunistic + end_planning = FALSE + +/datum/ai_planning_subtree/basic_melee_attack_subtree/opportunistic/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if(QDELETED(target) || !controller.pawn.Adjacent(target)) + return + if (isliving(controller.pawn)) + var/mob/living/pawn = controller.pawn + if (LAZYLEN(pawn.do_afters)) + return + controller.queue_behavior(melee_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + +/// Attack something which is already adjacent to us without moving +/datum/ai_behavior/basic_melee_attack/opportunistic + action_cooldown = 0.2 SECONDS // We gotta check unfortunately often because we're in a race condition with nextmove + behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +/datum/ai_behavior/basic_melee_attack/opportunistic/setup(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) + if (!controller.blackboard_key_exists(targeting_strategy_key)) + CRASH("No target datum was supplied in the blackboard for [controller.pawn]") + return controller.blackboard_key_exists(target_key) + +/datum/ai_behavior/basic_melee_attack/opportunistic/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) + var/atom/movable/atom_pawn = controller.pawn + if(!atom_pawn.CanReach(controller.blackboard[target_key])) + finish_action(controller, TRUE, target_key) // Don't clear target + return FALSE + . = ..() + finish_action(controller, TRUE, target_key) // Try doing something else diff --git a/code/datums/ai/basic_mobs/basic_subtrees/attack_obstacle_in_path.dm b/code/datums/ai/basic_mobs/basic_subtrees/attack_obstacle_in_path.dm index 9f1053f29d3f..7059bec93fe2 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/attack_obstacle_in_path.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/attack_obstacle_in_path.dm @@ -74,7 +74,7 @@ return FALSE if (basic_mob.see_invisible < object.invisibility) return FALSE - var/list/whitelist = basic_mob.ai_controller.blackboard[BB_OBSTACLE_TARGETTING_WHITELIST] + var/list/whitelist = basic_mob.ai_controller.blackboard[BB_OBSTACLE_TARGETING_WHITELIST] if(whitelist && !is_type_in_typecache(object, whitelist)) return FALSE diff --git a/code/datums/ai/basic_mobs/basic_subtrees/call_reinforcements.dm b/code/datums/ai/basic_mobs/basic_subtrees/call_reinforcements.dm new file mode 100644 index 000000000000..59ff88b4879b --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/call_reinforcements.dm @@ -0,0 +1,50 @@ +#define REINFORCEMENTS_COOLDOWN (30 SECONDS) + +/// Calls all nearby mobs that share a faction to give backup in combat +/datum/ai_planning_subtree/call_reinforcements + /// Blackboard key containing something to say when calling reinforcements (takes precedence over emotes) + var/say_key = BB_REINFORCEMENTS_SAY + /// Blackboard key containing an emote to perform when calling reinforcements + var/emote_key = BB_REINFORCEMENTS_EMOTE + /// Reinforcement-calling behavior to use + var/call_type = /datum/ai_behavior/call_reinforcements + +/datum/ai_planning_subtree/call_reinforcements/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + if (!decide_to_call(controller) || controller.blackboard[BB_BASIC_MOB_REINFORCEMENTS_COOLDOWN] > world.time) + return + + var/call_say = controller.blackboard[BB_REINFORCEMENTS_SAY] + var/call_emote = controller.blackboard[BB_REINFORCEMENTS_EMOTE] + + if(!isnull(call_say)) + controller.queue_behavior(/datum/ai_behavior/perform_speech, call_say) + else if(!isnull(call_emote)) + controller.queue_behavior(/datum/ai_behavior/perform_emote, call_emote) + else + controller.queue_behavior(/datum/ai_behavior/perform_emote, "cries for help!") + + controller.queue_behavior(call_type) + +/// Decides when to call reinforcements, can be overridden for alternate behavior +/datum/ai_planning_subtree/call_reinforcements/proc/decide_to_call(datum/ai_controller/controller) + return controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET) && istype(controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET], /mob) + +/// Call out to all mobs in the specified range for help +/datum/ai_behavior/call_reinforcements + /// Range to call reinforcements from + var/reinforcements_range = 15 + +/datum/ai_behavior/call_reinforcements/perform(seconds_per_tick, datum/ai_controller/controller) + . = ..() + + var/mob/pawn_mob = controller.pawn + for(var/mob/other_mob in oview(reinforcements_range, pawn_mob)) + if(pawn_mob.faction_check_atom(other_mob) && !isnull(other_mob.ai_controller)) + // Add our current target to their retaliate list so that they'll attack our aggressor + other_mob.ai_controller.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]) + other_mob.ai_controller.set_blackboard_key(BB_BASIC_MOB_REINFORCEMENT_TARGET, pawn_mob) + + controller.set_blackboard_key(BB_BASIC_MOB_REINFORCEMENTS_COOLDOWN, world.time + REINFORCEMENTS_COOLDOWN) + +#undef REINFORCEMENTS_COOLDOWN diff --git a/code/datums/ai/basic_mobs/basic_subtrees/capricious_retaliate.dm b/code/datums/ai/basic_mobs/basic_subtrees/capricious_retaliate.dm new file mode 100644 index 000000000000..4d5319bca86e --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/capricious_retaliate.dm @@ -0,0 +1,69 @@ +/// Add or remove people to our retaliation shitlist just on an arbitrary whim +/datum/ai_planning_subtree/capricious_retaliate + /// Blackboard key which tells us how to select valid targets + var/targeting_strategy_key = BB_TARGETING_STRATEGY + /// Whether we should skip checking faction for our decision + var/ignore_faction = TRUE + +/datum/ai_planning_subtree/capricious_retaliate/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + controller.queue_behavior(/datum/ai_behavior/capricious_retaliate, targeting_strategy_key, ignore_faction) + +/// Add or remove people to our retaliation shitlist just on an arbitrary whim +/datum/ai_behavior/capricious_retaliate + action_cooldown = 1 SECONDS + +/datum/ai_behavior/capricious_retaliate/perform(seconds_per_tick, datum/ai_controller/controller, targeting_strategy_key, ignore_faction) + . = ..() + var/atom/pawn = controller.pawn + if (controller.blackboard_key_exists(BB_BASIC_MOB_RETALIATE_LIST)) + var/deaggro_chance = controller.blackboard[BB_RANDOM_DEAGGRO_CHANCE] || 10 + if (!SPT_PROB(deaggro_chance, seconds_per_tick)) + finish_action(controller, TRUE, ignore_faction) // "true" here means "don't clear our ignoring factions status" + return + pawn.visible_message(span_notice("[pawn] calms down.")) // We can blackboard key this if anyone else actually wants to customise it + controller.clear_blackboard_key(BB_BASIC_MOB_RETALIATE_LIST) + finish_action(controller, FALSE, ignore_faction) + controller.CancelActions() // Otherwise they will try and get one last kick in + return + + var/aggro_chance = controller.blackboard[BB_RANDOM_AGGRO_CHANCE] || 0.5 + if (!SPT_PROB(aggro_chance, seconds_per_tick)) + finish_action(controller, FALSE, ignore_faction) + return + + var/aggro_range = controller.blackboard[BB_AGGRO_RANGE] || 9 + var/list/potential_targets = hearers(aggro_range, get_turf(pawn)) - pawn + if (!length(potential_targets)) + failed_targeting(controller, pawn, ignore_faction) + return + + var/datum/targeting_strategy/target_helper = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key]) + + var/mob/living/final_target = null + if (ignore_faction) + controller.set_blackboard_key(BB_TEMPORARILY_IGNORE_FACTION, TRUE) + while (isnull(final_target) && length(potential_targets)) + var/mob/living/test_target = pick_n_take(potential_targets) + if (target_helper.can_attack(pawn, test_target, vision_range = aggro_range)) + final_target = test_target + + if (isnull(final_target)) + failed_targeting(controller, pawn, ignore_faction) + return + + controller.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, final_target) + pawn.visible_message(span_warning("[pawn] glares grumpily at [final_target]!")) + finish_action(controller, TRUE, ignore_faction) + +/// Called if we try but fail to target something +/datum/ai_behavior/capricious_retaliate/proc/failed_targeting(datum/ai_controller/controller, atom/pawn, ignore_faction) + finish_action(controller, FALSE, ignore_faction) + pawn.visible_message(span_notice("[pawn] grumbles.")) // We're pissed off but with no outlet to vent our frustration upon + +/datum/ai_behavior/capricious_retaliate/finish_action(datum/ai_controller/controller, succeeded, ignore_faction) + . = ..() + if (succeeded || !ignore_faction) + return + var/usually_ignores_faction = controller.blackboard[BB_ALWAYS_IGNORE_FACTION] || FALSE + controller.set_blackboard_key(BB_TEMPORARILY_IGNORE_FACTION, usually_ignores_faction) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/climb_tree.dm b/code/datums/ai/basic_mobs/basic_subtrees/climb_tree.dm index 6827f3eee993..bad349030f1b 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/climb_tree.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/climb_tree.dm @@ -1,4 +1,5 @@ /datum/ai_planning_subtree/climb_trees + operational_datums = list(/datum/component/tree_climber) ///chance to climb a tree var/climb_chance = 35 @@ -7,11 +8,8 @@ if(!SPT_PROB(climb_chance, seconds_per_tick)) return - var/obj/structure/flora/tree/target = controller.blackboard[BB_CLIMBED_TREE] + if(controller.blackboard_key_exists(BB_CLIMBED_TREE)) + controller.queue_behavior(/datum/ai_behavior/climb_tree, BB_CLIMBED_TREE) + return SUBTREE_RETURN_FINISH_PLANNING - if(QDELETED(target)) - controller.queue_behavior(/datum/ai_behavior/find_and_set/valid_tree, BB_CLIMBED_TREE, /obj/structure/flora/tree) - return - - controller.queue_behavior(/datum/ai_behavior/climb_tree, BB_CLIMBED_TREE) - return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_and_set/valid_tree, BB_CLIMBED_TREE, /obj/structure/flora/tree) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm b/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm index 8d20df7b9c79..b02ec8eaa85a 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/find_food.dm @@ -3,8 +3,7 @@ /datum/ai_planning_subtree/find_food/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] - if(!QDELETED(target)) + if(controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) // Busy with something return diff --git a/code/datums/ai/basic_mobs/basic_subtrees/find_paper_and_write.dm b/code/datums/ai/basic_mobs/basic_subtrees/find_paper_and_write.dm index 900d13e0a046..0d2d0c3e3b44 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/find_paper_and_write.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/find_paper_and_write.dm @@ -1,10 +1,9 @@ /datum/ai_planning_subtree/find_paper_and_write /datum/ai_planning_subtree/find_paper_and_write/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - var/obj/item/inhand_paper = controller.blackboard[BB_SIMPLE_CARRY_ITEM] var/mob/living/basic/wizard = controller.pawn - if(!QDELETED(inhand_paper)) + if(controller.blackboard_key_exists(BB_SIMPLE_CARRY_ITEM)) controller.queue_behavior(/datum/ai_behavior/write_on_paper, BB_SIMPLE_CARRY_ITEM, BB_WRITING_LIST) return SUBTREE_RETURN_FINISH_PLANNING diff --git a/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm index 6ae7885618b9..4a2f5b476c75 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/flee_target.dm @@ -9,16 +9,18 @@ /datum/ai_planning_subtree/flee_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - if (!controller.blackboard[BB_BASIC_MOB_FLEEING]) + var/atom/flee_from = controller.blackboard[target_key] + if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING] || QDELETED(flee_from)) return - var/atom/target = controller.blackboard[target_key] - if(QDELETED(target)) + var/flee_distance = controller.blackboard[BB_BASIC_MOB_FLEE_DISTANCE] || DEFAULT_BASIC_FLEE_DISTANCE + if (get_dist(controller.pawn, flee_from) >= flee_distance) return + controller.queue_behavior(flee_behaviour, target_key, hiding_place_key) return SUBTREE_RETURN_FINISH_PLANNING //we gotta get out of here. /// Try to escape from your current target, without performing any other actions. -/// Reads from some fleeing-specific targetting keys rather than the current mob target. +/// Reads from some fleeing-specific targeting keys rather than the current mob target. /datum/ai_planning_subtree/flee_target/from_flee_key target_key = BB_BASIC_MOB_FLEE_TARGET hiding_place_key = BB_BASIC_MOB_FLEE_TARGET_HIDING_LOCATION diff --git a/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm b/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm index b80a28836a06..2a85e9e902b2 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm @@ -3,11 +3,13 @@ /// Blackboard key holding atom we want to stay away from var/target_key = BB_BASIC_MOB_CURRENT_TARGET /// How close will we allow our target to get? - var/minimum_distance = 3 + var/minimum_distance = 4 /// How far away will we allow our target to get? var/maximum_distance = 6 /// How far do we look for our target? var/view_distance = 10 + /// the run away behavior we will use + var/run_away_behavior = /datum/ai_behavior/step_away /datum/ai_planning_subtree/maintain_distance/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() @@ -16,12 +18,15 @@ return // Don't run away from cucumbers, they're not snakes var/range = get_dist(controller.pawn, target) if (range < minimum_distance) - controller.queue_behavior(/datum/ai_behavior/step_away, target_key) + controller.queue_behavior(run_away_behavior, target_key, minimum_distance) return if (range > maximum_distance) controller.queue_behavior(/datum/ai_behavior/pursue_to_range, target_key, maximum_distance) return +/datum/ai_planning_subtree/maintain_distance/cover_minimum_distance + run_away_behavior = /datum/ai_behavior/cover_minimum_distance + /// Take one step away /datum/ai_behavior/step_away behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION @@ -80,3 +85,32 @@ if (!QDELETED(current_target) && get_dist(controller.pawn, current_target) > range) return finish_action(controller, succeeded = TRUE) + +///instead of taking a single step, we cover the entire distance +/datum/ai_behavior/cover_minimum_distance + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + required_distance = 0 + action_cooldown = 0.2 SECONDS + +/datum/ai_behavior/cover_minimum_distance/setup(datum/ai_controller/controller, target_key, minimum_distance) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + var/required_distance = minimum_distance - get_dist(controller.pawn, target) //the distance we need to move + var/distance = 0 + var/turf/chosen_turf + for(var/turf/open/potential_turf in oview(required_distance, controller.pawn)) + var/new_distance_from_target = get_dist(potential_turf, target) + if(potential_turf.is_blocked_turf()) + continue + if(new_distance_from_target > distance) + chosen_turf = potential_turf + distance = new_distance_from_target + if(isnull(chosen_turf)) + return FALSE + set_movement_target(controller, target = chosen_turf) + +/datum/ai_behavior/cover_minimum_distance/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + finish_action(controller, succeeded = TRUE) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/mine_walls.dm b/code/datums/ai/basic_mobs/basic_subtrees/mine_walls.dm new file mode 100644 index 000000000000..3c03702b6994 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/mine_walls.dm @@ -0,0 +1,73 @@ +//behavior to find mineable mineral walls + +/datum/ai_planning_subtree/mine_walls + var/find_wall_behavior = /datum/ai_behavior/find_mineral_wall + +/datum/ai_planning_subtree/mine_walls/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(controller.blackboard_key_exists(BB_TARGET_MINERAL_WALL)) + controller.queue_behavior(/datum/ai_behavior/mine_wall, BB_TARGET_MINERAL_WALL) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(find_wall_behavior, BB_TARGET_MINERAL_WALL) + +/datum/ai_behavior/mine_wall + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + action_cooldown = 15 SECONDS + +/datum/ai_behavior/mine_wall/setup(datum/ai_controller/controller, target_key) + . = ..() + var/turf/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/mine_wall/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/mob/living/basic/living_pawn = controller.pawn + var/turf/closed/mineral/target = controller.blackboard[target_key] + var/is_gibtonite_turf = istype(target, /turf/closed/mineral/gibtonite) + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + living_pawn.melee_attack(target) + if(is_gibtonite_turf) + living_pawn.manual_emote("sighs...") //accept whats about to happen to us + + finish_action(controller, TRUE, target_key) + return + +/datum/ai_behavior/mine_wall/finish_action(datum/ai_controller/controller, success, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + +/datum/ai_behavior/find_mineral_wall + +/datum/ai_behavior/find_mineral_wall/perform(seconds_per_tick, datum/ai_controller/controller, found_wall_key) + . = ..() + var/mob/living_pawn = controller.pawn + + for(var/turf/closed/mineral/potential_wall in oview(9, living_pawn)) + if(!check_if_mineable(controller, potential_wall)) //check if its surrounded by walls + continue + controller.set_blackboard_key(found_wall_key, potential_wall) //closest wall first! + finish_action(controller, TRUE) + return + + finish_action(controller, FALSE) + +/datum/ai_behavior/find_mineral_wall/proc/check_if_mineable(datum/ai_controller/controller, turf/target_wall) + var/mob/living/source = controller.pawn + var/direction_to_turf = get_dir(target_wall, source) + if(!ISDIAGONALDIR(direction_to_turf)) + return TRUE + var/list/directions_to_check = list() + for(var/direction_check in GLOB.cardinals) + if(direction_check & direction_to_turf) + directions_to_check += direction_check + + for(var/direction in directions_to_check) + var/turf/test_turf = get_step(target_wall, direction) + if(isnull(test_turf)) + continue + if(!test_turf.is_blocked_turf(ignore_atoms = list(source))) + return TRUE + return FALSE diff --git a/code/datums/ai/basic_mobs/basic_subtrees/move_to_cardinal.dm b/code/datums/ai/basic_mobs/basic_subtrees/move_to_cardinal.dm new file mode 100644 index 000000000000..c98878e0fd71 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/move_to_cardinal.dm @@ -0,0 +1,71 @@ +/// Try to line up with a cardinal direction of your target +/datum/ai_planning_subtree/move_to_cardinal + /// Behaviour to execute to line ourselves up + var/move_behaviour = /datum/ai_behavior/move_to_cardinal + /// Blackboard key in which to store selected target + var/target_key = BB_BASIC_MOB_CURRENT_TARGET + +/datum/ai_planning_subtree/move_to_cardinal/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + if(!controller.blackboard_key_exists(target_key)) + return + controller.queue_behavior(move_behaviour, target_key) + +/// Try to line up with a cardinal direction of your target +/datum/ai_behavior/move_to_cardinal + required_distance = 0 + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + /// How close to our target is too close? + var/minimum_distance = 1 + /// How far away is too far? + var/maximum_distance = 9 + +/datum/ai_behavior/move_to_cardinal/setup(datum/ai_controller/controller, target_key) + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + target_nearest_cardinal(controller, target) + return TRUE + +/// Set our movement target to the closest cardinal space to our target +/datum/ai_behavior/move_to_cardinal/proc/target_nearest_cardinal(datum/ai_controller/controller, atom/target) + var/atom/move_target + var/closest = INFINITY + + for (var/dir in GLOB.cardinals) + var/turf/cardinal_turf = get_ranged_target_turf(target, dir, minimum_distance) + if (cardinal_turf.is_blocked_turf()) + continue + var/distance_to = get_dist(controller.pawn, cardinal_turf) + if (distance_to >= closest) + continue + closest = distance_to + move_target = cardinal_turf + + if (isnull(move_target)) + move_target = target + if (controller.current_movement_target == move_target) + return + set_movement_target(controller, move_target) + +/datum/ai_behavior/move_to_cardinal/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + var/atom/target = controller.blackboard[target_key] + if (QDELETED(target)) + finish_action(controller = controller, succeeded = FALSE, target_key = target_key) + return + if (!(get_dir(controller.pawn, target) in GLOB.cardinals)) + target_nearest_cardinal(controller, target) + return + var/distance_to_target = get_dist(controller.pawn, target) + if (distance_to_target < minimum_distance) + target_nearest_cardinal(controller, target) + return + if (distance_to_target > maximum_distance) + return + finish_action(controller = controller, succeeded = TRUE, target_key = target_key) + return + +/datum/ai_behavior/move_to_cardinal/finish_action(datum/ai_controller/controller, succeeded, target_key) + if (!succeeded) + controller.clear_blackboard_key(target_key) + return ..() diff --git a/code/datums/ai/basic_mobs/basic_subtrees/opportunistic_ventcrawler.dm b/code/datums/ai/basic_mobs/basic_subtrees/opportunistic_ventcrawler.dm index 63a745305b20..240272d1ef48 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/opportunistic_ventcrawler.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/opportunistic_ventcrawler.dm @@ -15,6 +15,6 @@ controller.queue_behavior(/datum/ai_behavior/travel_towards, BB_ENTRY_VENT_TARGET) return - controller.set_blackboard_key(BB_CURRENTLY_TARGETTING_VENT, TRUE) + controller.set_blackboard_key(BB_CURRENTLY_TARGETING_VENT, TRUE) controller.queue_behavior(/datum/ai_behavior/crawl_through_vents, BB_ENTRY_VENT_TARGET) return SUBTREE_RETURN_FINISH_PLANNING // we are going into this vent... no distractions diff --git a/code/datums/ai/basic_mobs/basic_subtrees/prepare_travel_to_destination.dm b/code/datums/ai/basic_mobs/basic_subtrees/prepare_travel_to_destination.dm new file mode 100644 index 000000000000..2718ca630ff7 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/prepare_travel_to_destination.dm @@ -0,0 +1,23 @@ + +///Subtree that checks if we are on the target atom's tile, and sets it as a travel target if not +///The target is taken from the blackboard. This one always requires a specific implementation. +/datum/ai_planning_subtree/prepare_travel_to_destination + var/target_key + var/travel_destination_key = BB_TRAVEL_DESTINATION + +/datum/ai_planning_subtree/prepare_travel_to_destination/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/atom/target = controller.blackboard[target_key] + + //Target is deleted, or we are already standing on it + if(QDELETED(target) || (isturf(target) && controller.pawn.loc == target) || (target.loc == controller.pawn.loc)) + return + + //Already set with this value, return + if(controller.blackboard[target_key] == controller.blackboard[travel_destination_key]) + return + + controller.queue_behavior(/datum/ai_behavior/set_travel_destination, target_key, travel_destination_key) + return //continue planning regardless of success + +/datum/ai_planning_subtree/prepare_travel_to_destination/trader + target_key = BB_SHOP_SPOT diff --git a/code/datums/ai/basic_mobs/basic_subtrees/ranged_skirmish.dm b/code/datums/ai/basic_mobs/basic_subtrees/ranged_skirmish.dm index 07fb6f8b0dcd..95a125eea5ce 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/ranged_skirmish.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/ranged_skirmish.dm @@ -4,41 +4,40 @@ /// Blackboard key holding target atom var/target_key = BB_BASIC_MOB_CURRENT_TARGET /// What AI behaviour do we actually run? - var/datum/ai_behavior/ranged_skirmish/attack_behavior = /datum/ai_behavior/ranged_skirmish + var/attack_behavior = /datum/ai_behavior/ranged_skirmish + /// If target is further away than this we don't fire + var/max_range = 9 + /// If target is closer than this we don't fire + var/min_range = 2 /datum/ai_planning_subtree/ranged_skirmish/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - var/atom/target = controller.blackboard[target_key] - if(QDELETED(target)) + if(!controller.blackboard_key_exists(target_key)) return - controller.queue_behavior(attack_behavior, target_key, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + controller.queue_behavior(attack_behavior, target_key, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION, max_range, min_range) /// How often will we try to perform our ranged attack? /datum/ai_behavior/ranged_skirmish action_cooldown = 1 SECONDS - /// If target is further away than this we don't fire - var/max_range = 9 - /// If target is closer than this we don't fire - var/min_range = 2 -/datum/ai_behavior/ranged_skirmish/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) +/datum/ai_behavior/ranged_skirmish/setup(datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key, max_range, min_range) . = ..() var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key] return !QDELETED(target) -/datum/ai_behavior/ranged_skirmish/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) +/datum/ai_behavior/ranged_skirmish/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key, max_range, min_range) . = ..() var/atom/target = controller.blackboard[target_key] if (QDELETED(target)) finish_action(controller, succeeded = FALSE) return - var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] - if(!targetting_datum.can_attack(controller.pawn, target)) + var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key]) + if(!targeting_strategy.can_attack(controller.pawn, target)) finish_action(controller, succeeded = FALSE) return - var/hiding_target = targetting_datum.find_hidden_mobs(controller.pawn, target) + var/hiding_target = targeting_strategy.find_hidden_mobs(controller.pawn, target) controller.set_blackboard_key(hiding_location_key, hiding_target) target = hiding_target || target diff --git a/code/datums/ai/basic_mobs/basic_subtrees/run_emote.dm b/code/datums/ai/basic_mobs/basic_subtrees/run_emote.dm new file mode 100644 index 000000000000..6f2f5cdc2035 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/run_emote.dm @@ -0,0 +1,33 @@ +/// Intermittently run an emote +/datum/ai_planning_subtree/run_emote + var/emote_key = BB_EMOTE_KEY + var/emote_chance_key = BB_EMOTE_CHANCE + +/datum/ai_planning_subtree/run_emote/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/emote_chance = controller.blackboard[emote_chance_key] || 0 + if (!SPT_PROB(emote_chance, seconds_per_tick)) + return + controller.queue_behavior(/datum/ai_behavior/run_emote, emote_key) + +/// Emote from a blackboard key +/datum/ai_behavior/run_emote + +/datum/ai_behavior/run_emote/perform(seconds_per_tick, datum/ai_controller/controller, emote_key) + var/mob/living/living_pawn = controller.pawn + if (!isliving(living_pawn)) + finish_action(controller, FALSE) + return + + var/list/emote_list = controller.blackboard[emote_key] + var/emote + if (islist(emote_list)) + emote = length(emote_list) ? pick(emote_list) : null + else + emote = emote_list + + if(isnull(emote)) + finish_action(controller, FALSE) + return + + living_pawn.emote(emote) + finish_action(controller, TRUE) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/shapechange_ambush.dm b/code/datums/ai/basic_mobs/basic_subtrees/shapechange_ambush.dm new file mode 100644 index 000000000000..ff01eb804ff7 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/shapechange_ambush.dm @@ -0,0 +1,41 @@ +/// Shapeshift when we have no target, until someone has been nearby for long enough +/datum/ai_planning_subtree/shapechange_ambush + operational_datums = list(/datum/component/ai_target_timer) + /// Key where we keep our ability + var/ability_key = BB_SHAPESHIFT_ACTION + /// Key where we keep our target + var/target_key = BB_BASIC_MOB_CURRENT_TARGET + /// How long to lull our target into a false sense of security + var/minimum_target_time = 8 SECONDS + +/datum/ai_planning_subtree/shapechange_ambush/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + var/is_shifted = ismob(living_pawn.loc) + var/has_target = controller.blackboard_key_exists(target_key) + var/datum/action/cooldown/using_action = controller.blackboard[ability_key] + + if (!is_shifted) + if (has_target) + return // We're busy + + if (using_action?.IsAvailable()) + controller.queue_behavior(/datum/ai_behavior/use_mob_ability/shapeshift, BB_SHAPESHIFT_ACTION) // Shift + return SUBTREE_RETURN_FINISH_PLANNING + + if (!has_target || !using_action?.IsAvailable()) + return SUBTREE_RETURN_FINISH_PLANNING // Lie in wait + var/time_on_target = controller.blackboard[BB_BASIC_MOB_HAS_TARGET_TIME] || 0 + if (time_on_target < minimum_target_time) + return // Wait a bit longer + controller.queue_behavior(/datum/ai_behavior/use_mob_ability/shapeshift, BB_SHAPESHIFT_ACTION) // Surprise! + +/// Selects a random shapeshift ability before shifting +/datum/ai_behavior/use_mob_ability/shapeshift + +/datum/ai_behavior/use_mob_ability/shapeshift/setup(datum/ai_controller/controller, ability_key) + var/datum/action/cooldown/spell/shapeshift/using_action = controller.blackboard[ability_key] + if (!using_action?.IsAvailable()) + return FALSE + if (isnull(using_action.shapeshift_type)) // If we don't have a shape then pick one, AI can't use context wheels + using_action.shapeshift_type = pick(using_action.possible_shapes) + return ..() diff --git a/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm index 90379fcac0a7..5b1f5ffbff9e 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/simple_attack_target.dm @@ -1,16 +1,16 @@ /datum/ai_planning_subtree/basic_melee_attack_subtree + /// What do we do in order to attack someone? var/datum/ai_behavior/basic_melee_attack/melee_attack_behavior = /datum/ai_behavior/basic_melee_attack + /// Is this the last thing we do? (if we set a movement target, this will usually be yes) + var/end_planning = TRUE /datum/ai_planning_subtree/basic_melee_attack_subtree/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] - if(QDELETED(target)) + if(!controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) return - controller.queue_behavior(melee_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) - return SUBTREE_RETURN_FINISH_PLANNING //we are going into battle...no distractions. - -/datum/ai_planning_subtree/basic_melee_attack_subtree/average_speed - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/average_speed + controller.queue_behavior(melee_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + if (end_planning) + return SUBTREE_RETURN_FINISH_PLANNING //we are going into battle...no distractions. /datum/ai_planning_subtree/basic_ranged_attack_subtree operational_datums = list(/datum/component/ranged_attacks) @@ -18,8 +18,7 @@ /datum/ai_planning_subtree/basic_ranged_attack_subtree/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] - if(QDELETED(target)) + if(!controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) return - controller.queue_behavior(ranged_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + controller.queue_behavior(ranged_attack_behavior, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) return SUBTREE_RETURN_FINISH_PLANNING //we are going into battle...no distractions. diff --git a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_nearest_target_to_flee.dm b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_nearest_target_to_flee.dm index 42a361c25cd8..6630f7d193d9 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_nearest_target_to_flee.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_nearest_target_to_flee.dm @@ -3,19 +3,19 @@ /datum/ai_planning_subtree/simple_find_nearest_target_to_flee/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - if (!controller.blackboard[BB_BASIC_MOB_FLEEING]) + if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING]) return - controller.queue_behavior(/datum/ai_behavior/find_potential_targets/nearest, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + controller.queue_behavior(/datum/ai_behavior/find_potential_targets/nearest, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) /// Find the nearest thing on our list of 'things which have done damage to me' and set it as the flee target /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee - var/targeting_key = BB_TARGETTING_DATUM + var/targeting_key = BB_TARGETING_STRATEGY /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - if (!controller.blackboard[BB_BASIC_MOB_FLEEING]) + if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING]) return controller.queue_behavior(/datum/ai_behavior/target_from_retaliate_list/nearest, BB_BASIC_MOB_RETALIATE_LIST, BB_BASIC_MOB_CURRENT_TARGET, targeting_key, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) /datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee/from_flee_key - targeting_key = BB_FLEE_TARGETTING_DATUM + targeting_key = BB_FLEE_TARGETING_STRATEGY diff --git a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm index ec4ef1863adc..1c7d8de9120b 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_target.dm @@ -2,7 +2,7 @@ /datum/ai_planning_subtree/simple_find_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - controller.queue_behavior(/datum/ai_behavior/find_potential_targets, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + controller.queue_behavior(/datum/ai_behavior/find_potential_targets, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) // Prevents finding a target if a human is nearby /datum/ai_planning_subtree/simple_find_target/not_while_observed diff --git a/code/datums/ai/basic_mobs/basic_subtrees/simple_find_wounded_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_wounded_target.dm new file mode 100644 index 000000000000..7a230014d9ab --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/simple_find_wounded_target.dm @@ -0,0 +1,6 @@ +/// Selects the most wounded potential target that we can see +/datum/ai_planning_subtree/simple_find_wounded_target + +/datum/ai_planning_subtree/simple_find_wounded_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + controller.queue_behavior(/datum/ai_behavior/find_potential_targets/most_wounded, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/sleep_with_no_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/sleep_with_no_target.dm index ccd67d6d1e72..93499cf673c4 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/sleep_with_no_target.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/sleep_with_no_target.dm @@ -16,7 +16,7 @@ /datum/ai_behavior/sleep_after_targetless_time/perform(seconds_per_tick, datum/ai_controller/controller, target_key) var/atom/target = controller.blackboard[target_key] - finish_action(controller, succeeded = !target, seconds_per_tick = seconds_per_tick) + finish_action(controller, succeeded = QDELETED(target), seconds_per_tick = seconds_per_tick) /datum/ai_behavior/sleep_after_targetless_time/finish_action(datum/ai_controller/controller, succeeded, seconds_per_tick) . = ..() diff --git a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm index a201191d31c3..8cebe0e9f149 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/speech_subtree.dm @@ -7,32 +7,42 @@ var/list/emote_see = list() ///Possible lines of speech the AI can have var/list/speak = list() + ///The sound effects associated with this speech, if any + var/list/sound = list() /datum/ai_planning_subtree/random_speech/New() . = ..() if(speak) speak = string_list(speak) + if(sound) + sound = string_list(sound) if(emote_hear) emote_hear = string_list(emote_hear) if(emote_see) emote_see = string_list(emote_see) /datum/ai_planning_subtree/random_speech/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - if(SPT_PROB(speech_chance, seconds_per_tick)) - var/audible_emotes_length = emote_hear?.len - var/non_audible_emotes_length = emote_see?.len - var/speak_lines_length = speak?.len + if(!SPT_PROB(speech_chance, seconds_per_tick)) + return + speak(controller) + +/// Actually perform an action +/datum/ai_planning_subtree/random_speech/proc/speak(datum/ai_controller/controller) + var/audible_emotes_length = emote_hear?.len + var/non_audible_emotes_length = emote_see?.len + var/speak_lines_length = speak?.len - var/total_choices_length = audible_emotes_length + non_audible_emotes_length + speak_lines_length + var/total_choices_length = audible_emotes_length + non_audible_emotes_length + speak_lines_length - var/random_number_in_range = rand(1, total_choices_length) + var/random_number_in_range = rand(1, total_choices_length) + var/sound_to_play = length(sound) > 0 ? pick(sound) : null - if(random_number_in_range <= audible_emotes_length) - controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_hear)) - else if(random_number_in_range <= (audible_emotes_length + non_audible_emotes_length)) - controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_see)) - else - controller.queue_behavior(/datum/ai_behavior/perform_speech, pick(speak)) + if(random_number_in_range <= audible_emotes_length) + controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_hear), sound_to_play) + else if(random_number_in_range <= (audible_emotes_length + non_audible_emotes_length)) + controller.queue_behavior(/datum/ai_behavior/perform_emote, pick(emote_see)) + else + controller.queue_behavior(/datum/ai_behavior/perform_speech, pick(speak), sound_to_play) /datum/ai_planning_subtree/random_speech/insect speech_chance = 5 @@ -60,6 +70,7 @@ /datum/ai_planning_subtree/random_speech/sheep speech_chance = 5 speak = list("baaa","baaaAAAAAH!","baaah") + sound = list('sound/creatures/sheep1.ogg', 'sound/creatures/sheep2.ogg', 'sound/creatures/sheep3.ogg') emote_hear = list("bleats.") emote_see = list("shakes her head.", "stares into the distance.") @@ -94,6 +105,7 @@ /datum/ai_planning_subtree/random_speech/cow speech_chance = 1 speak = list("moo?","moo","MOOOOOO") + sound = list('sound/creatures/cow.ogg') emote_hear = list("brays.") emote_see = list("shakes her head.") @@ -104,6 +116,7 @@ /datum/ai_planning_subtree/random_speech/cow/wisdom/New() . = ..() speak = GLOB.wisdoms //Done here so it's setup properly + sound = list() /datum/ai_planning_subtree/random_speech/deer speech_chance = 1 @@ -143,6 +156,9 @@ speak = list("oink?","oink","snurf") emote_hear = list("snorts.") emote_see = list("sniffs around.") + sound = list('sound/creatures/pig1.ogg', 'sound/creatures/pig2.ogg') + emote_hear = list("snorts.") + emote_see = list("sniffs around.") /datum/ai_planning_subtree/random_speech/killer_tomato speech_chance = 3 @@ -176,3 +192,21 @@ speech_chance = 5 emote_hear = list("rawrs.","grumbles.","grawls.", "stomps!") emote_see = list("stares ferociously.") + +/datum/ai_planning_subtree/random_speech/blackboard //literal tower of babel, subtree form + speech_chance = 1 + +/datum/ai_planning_subtree/random_speech/blackboard/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/list/speech_lines = controller.blackboard[BB_BASIC_MOB_SPEAK_LINES] + if(isnull(speech_lines)) + return ..() + + // Note to future developers: this behaviour a singleton so this probably doesn't work as you would expect + // The whole speech tree really needs to be refactored because this isn't how we use AI data these days + speak = speech_lines[BB_EMOTE_SAY] || list() + emote_see = speech_lines[BB_EMOTE_SEE] || list() + emote_hear = speech_lines[BB_EMOTE_HEAR] || list() + sound = speech_lines[BB_EMOTE_SOUND] || list() + speech_chance = speech_lines[BB_SPEAK_CHANCE] ? speech_lines[BB_SPEAK_CHANCE] : initial(speech_chance) + + return ..() diff --git a/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm b/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm index 2d553fe4b2f7..55ec73876131 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/target_retaliate.dm @@ -2,21 +2,26 @@ /datum/ai_planning_subtree/target_retaliate operational_datums = list(/datum/element/ai_retaliate, /datum/component/ai_retaliate_advanced) /// Blackboard key which tells us how to select valid targets - var/targetting_datum_key = BB_TARGETTING_DATUM + var/targeting_strategy_key = BB_TARGETING_STRATEGY /// Blackboard key in which to store selected target var/target_key = BB_BASIC_MOB_CURRENT_TARGET /// Blackboard key in which to store selected target's hiding place var/hiding_place_key = BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION + /// do we check for faction? + var/check_faction = FALSE /datum/ai_planning_subtree/target_retaliate/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) . = ..() - controller.queue_behavior(/datum/ai_behavior/target_from_retaliate_list, BB_BASIC_MOB_RETALIATE_LIST, target_key, targetting_datum_key, hiding_place_key) + controller.queue_behavior(/datum/ai_behavior/target_from_retaliate_list, BB_BASIC_MOB_RETALIATE_LIST, target_key, targeting_strategy_key, hiding_place_key, check_faction) + +/datum/ai_planning_subtree/target_retaliate/check_faction + check_faction = TRUE /// Places a mob which you can see and who has recently attacked you into some 'run away from this' AI keys -/// Can use a different targetting datum than you use to select attack targets +/// Can use a different targeting strategy than you use to select attack targets /// Not required if fleeing is the only target behaviour or uses the same target datum /datum/ai_planning_subtree/target_retaliate/to_flee - targetting_datum_key = BB_FLEE_TARGETTING_DATUM + targeting_strategy_key = BB_FLEE_TARGETING_STRATEGY target_key = BB_BASIC_MOB_FLEE_TARGET hiding_place_key = BB_BASIC_MOB_FLEE_TARGET_HIDING_LOCATION @@ -29,42 +34,51 @@ /// How far can we see stuff? var/vision_range = 9 -/datum/ai_behavior/target_from_retaliate_list/perform(seconds_per_tick, datum/ai_controller/controller, shitlist_key, target_key, targetting_datum_key, hiding_location_key) +/datum/ai_behavior/target_from_retaliate_list/perform(seconds_per_tick, datum/ai_controller/controller, shitlist_key, target_key, targeting_strategy_key, hiding_location_key, check_faction) . = ..() var/mob/living/living_mob = controller.pawn - var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] - if(!targetting_datum) + var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key]) + if(!targeting_strategy) CRASH("No target datum was supplied in the blackboard for [controller.pawn]") - var/list/enemies_list = controller.blackboard[shitlist_key] - if (!length(enemies_list)) - finish_action(controller, succeeded = FALSE) + var/list/shitlist = controller.blackboard[shitlist_key] + var/atom/existing_target = controller.blackboard[target_key] + + if (!check_faction) + controller.set_blackboard_key(BB_TEMPORARILY_IGNORE_FACTION, TRUE) + + if (!QDELETED(existing_target) && (locate(existing_target) in shitlist) && targeting_strategy.can_attack(living_mob, existing_target, vision_range)) + finish_action(controller, succeeded = TRUE, check_faction = check_faction) return - if (controller.blackboard[target_key] in enemies_list) // Don't bother changing - finish_action(controller, succeeded = FALSE) + var/list/enemies_list = list() + for(var/mob/living/potential_target as anything in shitlist) + if(!targeting_strategy.can_attack(living_mob, potential_target, vision_range)) + continue + enemies_list += potential_target + + if(!length(enemies_list)) + controller.clear_blackboard_key(target_key) + finish_action(controller, succeeded = FALSE, check_faction = check_faction) return var/atom/new_target = pick_final_target(controller, enemies_list) controller.set_blackboard_key(target_key, new_target) - var/atom/potential_hiding_location = targetting_datum.find_hidden_mobs(living_mob, new_target) + var/atom/potential_hiding_location = targeting_strategy.find_hidden_mobs(living_mob, new_target) if(potential_hiding_location) //If they're hiding inside of something, we need to know so we can go for that instead initially. controller.set_blackboard_key(hiding_location_key, potential_hiding_location) - finish_action(controller, succeeded = TRUE) - -/// Returns true if this target is valid for attacking based on current conditions -/datum/ai_behavior/target_from_retaliate_list/proc/can_attack_target(mob/living/living_mob, atom/target, datum/targetting_datum/targetting_datum) - if (!target) - return FALSE - if (target == living_mob) - return FALSE - if (!can_see(living_mob, target, vision_range)) - return FALSE - return targetting_datum.can_attack(living_mob, target) + finish_action(controller, succeeded = TRUE, check_faction = check_faction) /// Returns the desired final target from the filtered list of enemies /datum/ai_behavior/target_from_retaliate_list/proc/pick_final_target(datum/ai_controller/controller, list/enemies_list) return pick(enemies_list) + +/datum/ai_behavior/target_from_retaliate_list/finish_action(datum/ai_controller/controller, succeeded, check_faction) + . = ..() + if (succeeded || check_faction) + return + var/usually_ignores_faction = controller.blackboard[BB_ALWAYS_IGNORE_FACTION] || FALSE + controller.set_blackboard_key(BB_TEMPORARILY_IGNORE_FACTION, usually_ignores_faction) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/targeted_mob_ability.dm b/code/datums/ai/basic_mobs/basic_subtrees/targeted_mob_ability.dm index b6b4d286df1a..cd809804ba36 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/targeted_mob_ability.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/targeted_mob_ability.dm @@ -1,7 +1,7 @@ /// Attempts to use a mob ability on a target /datum/ai_planning_subtree/targeted_mob_ability /// Blackboard key for the ability - var/ability_key = BB_TARGETTED_ACTION + var/ability_key = BB_TARGETED_ACTION /// Blackboard key for where the target ref is stored var/target_key = BB_BASIC_MOB_CURRENT_TARGET /// Behaviour to perform using ability @@ -13,11 +13,16 @@ if (!ability_key) CRASH("You forgot to tell this mob where to find its ability") - var/mob/living/target = controller.blackboard[target_key] + if (!controller.blackboard_key_exists(target_key)) + return + var/datum/action/cooldown/using_action = controller.blackboard[ability_key] - if (QDELETED(target) || QDELETED(using_action) || !using_action.IsAvailable()) + if (!using_action?.IsAvailable()) return controller.queue_behavior(use_ability_behaviour, ability_key, target_key) if (finish_planning) return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_planning_subtree/targeted_mob_ability/continue_planning + finish_planning = FALSE diff --git a/code/datums/ai/basic_mobs/basic_subtrees/teleport_away_from_target.dm b/code/datums/ai/basic_mobs/basic_subtrees/teleport_away_from_target.dm new file mode 100644 index 000000000000..dadba992e9f1 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/teleport_away_from_target.dm @@ -0,0 +1,56 @@ +///behavior to activate ability to escape from target +/datum/ai_planning_subtree/teleport_away_from_target + ///minimum distance away from the target before we execute behavior + var/minimum_distance = 2 + ///the ability we will execute + var/ability_key + +/datum/ai_planning_subtree/teleport_away_from_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) + return + var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + var/distance_from_target = get_dist(target, controller.pawn) + if(distance_from_target >= minimum_distance) + controller.clear_blackboard_key(BB_ESCAPE_DESTINATION) + return + var/datum/action/cooldown/ability = controller.blackboard[ability_key] + if(!ability?.IsAvailable()) + return + var/turf/location_turf = controller.blackboard[BB_ESCAPE_DESTINATION] + + if(isnull(location_turf)) + controller.queue_behavior(/datum/ai_behavior/find_furthest_turf_from_target, BB_BASIC_MOB_CURRENT_TARGET, BB_ESCAPE_DESTINATION, minimum_distance) + return SUBTREE_RETURN_FINISH_PLANNING + + if(get_dist(location_turf, target) < minimum_distance || !can_see(controller.pawn, location_turf)) //target moved close too close or we moved too far since finding the target turf + controller.clear_blackboard_key(BB_ESCAPE_DESTINATION) + return + + controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability/and_clear_target, ability_key, BB_ESCAPE_DESTINATION) + +///find furtherst turf target so we may teleport to it +/datum/ai_behavior/find_furthest_turf_from_target + +/datum/ai_behavior/find_furthest_turf_from_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key, set_key, range) + var/mob/living/living_target = controller.blackboard[target_key] + if(QDELETED(living_target)) + return + + var/distance = 0 + var/turf/chosen_turf + for(var/turf/open/potential_destination in oview(range, living_target)) + if(potential_destination.is_blocked_turf()) + continue + var/new_distance_to_target = get_dist(potential_destination, living_target) + if(new_distance_to_target > distance) + chosen_turf = potential_destination + distance = new_distance_to_target + if(distance == range) + break //we have already found the max distance + + if(isnull(chosen_turf)) + finish_action(controller, FALSE) + return + + controller.set_blackboard_key(set_key, chosen_turf) + finish_action(controller, TRUE) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/travel_to_point.dm b/code/datums/ai/basic_mobs/basic_subtrees/travel_to_point.dm new file mode 100644 index 000000000000..0b5e5d4776f9 --- /dev/null +++ b/code/datums/ai/basic_mobs/basic_subtrees/travel_to_point.dm @@ -0,0 +1,21 @@ +/// Simply walk to a location +/datum/ai_planning_subtree/travel_to_point + /// Blackboard key where we travel a place we walk to + var/location_key = BB_TRAVEL_DESTINATION + /// What do we do in order to travel + var/travel_behaviour = /datum/ai_behavior/travel_towards + +/datum/ai_planning_subtree/travel_to_point/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + . = ..() + var/atom/target = controller.blackboard[location_key] + if (QDELETED(target)) + return + controller.queue_behavior(travel_behaviour, location_key) + return SUBTREE_RETURN_FINISH_PLANNING + + +/datum/ai_planning_subtree/travel_to_point/and_clear_target + travel_behaviour = /datum/ai_behavior/travel_towards/stop_on_arrival + +/datum/ai_planning_subtree/travel_to_point/and_clear_target/reinforce + location_key = BB_BASIC_MOB_REINFORCEMENT_TARGET diff --git a/code/datums/ai/basic_mobs/basic_subtrees/use_mob_ability.dm b/code/datums/ai/basic_mobs/basic_subtrees/use_mob_ability.dm index 2c618e98e72b..5ceef67bedb2 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/use_mob_ability.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/use_mob_ability.dm @@ -1,10 +1,10 @@ /** * Simple behaviours which simply try to use an ability whenever it is available. - * For something which wants a target try `targetted_mob_ability`. + * For something which wants a target try `targeted_mob_ability`. */ /datum/ai_planning_subtree/use_mob_ability /// Blackboard key for the ability - var/ability_key + var/ability_key = BB_GENERIC_ACTION /// Behaviour to perform using ability var/use_ability_behaviour = /datum/ai_behavior/use_mob_ability /// If true we terminate planning after trying to use the ability. @@ -15,7 +15,7 @@ CRASH("You forgot to tell this mob where to find its ability") var/datum/action/cooldown/using_action = controller.blackboard[ability_key] - if (QDELETED(using_action) || !using_action.IsAvailable()) + if (!using_action?.IsAvailable()) return controller.queue_behavior(use_ability_behaviour, ability_key) diff --git a/code/datums/ai/basic_mobs/generic_controllers.dm b/code/datums/ai/basic_mobs/generic_controllers.dm new file mode 100644 index 000000000000..dae1b944dd32 --- /dev/null +++ b/code/datums/ai/basic_mobs/generic_controllers.dm @@ -0,0 +1,26 @@ +/// The most basic AI tree which just finds a guy and then runs at them to click them +/datum/ai_controller/basic_controller/simple_hostile + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/// Find a target, walk at target, attack intervening obstacles +/datum/ai_controller/basic_controller/simple_hostile_obstacles + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) diff --git a/code/datums/ai/basic_mobs/pet_commands/pet_use_targetted_ability.dm b/code/datums/ai/basic_mobs/pet_commands/pet_use_targeted_ability.dm similarity index 100% rename from code/datums/ai/basic_mobs/pet_commands/pet_use_targetted_ability.dm rename to code/datums/ai/basic_mobs/pet_commands/pet_use_targeted_ability.dm diff --git a/code/datums/ai/basic_mobs/targetting_datums/basic_targetting_datum.dm b/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm similarity index 51% rename from code/datums/ai/basic_mobs/targetting_datums/basic_targetting_datum.dm rename to code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm index 643089bb5eae..2505b87a717f 100644 --- a/code/datums/ai/basic_mobs/targetting_datums/basic_targetting_datum.dm +++ b/code/datums/ai/basic_mobs/targeting_strategies/basic_targeting_strategy.dm @@ -1,27 +1,35 @@ -///Datum for basic mobs to define what they can attack. -/datum/targetting_datum +///Datum for basic mobs to define what they can attack.GET_TARGETING_STRATEGY\((/[^,]*)\), +///Global, just like ai_behaviors +/datum/targeting_strategy ///Returns true or false depending on if the target can be attacked by the mob -/datum/targetting_datum/proc/can_attack(mob/living/living_mob, atom/target, vision_range) +/datum/targeting_strategy/proc/can_attack(mob/living/living_mob, atom/target, vision_range) return ///Returns something the target might be hiding inside of -/datum/targetting_datum/proc/find_hidden_mobs(mob/living/living_mob, atom/target) +/datum/targeting_strategy/proc/find_hidden_mobs(mob/living/living_mob, atom/target) var/atom/target_hiding_location if(istype(target.loc, /obj/structure/closet) || istype(target.loc, /obj/machinery/disposal) || istype(target.loc, /obj/machinery/sleeper)) target_hiding_location = target.loc return target_hiding_location -/datum/targetting_datum/basic +/datum/targeting_strategy/basic /// When we do our basic faction check, do we look for exact faction matches? var/check_factions_exactly = FALSE - /// Minimum status to attack living beings - var/stat_attack = CONSCIOUS - ///Whether we care for seeing the target or not + /// Whether we care for seeing the target or not var/ignore_sight = FALSE + /// Blackboard key containing the minimum stat of a living mob to target + var/minimum_stat_key = BB_TARGET_MINIMUM_STAT + /// If this blackboard key is TRUE, makes us only target wounded mobs + var/target_wounded_key -/datum/targetting_datum/basic/can_attack(mob/living/living_mob, atom/the_target, vision_range) - if(isturf(the_target) || !the_target) // bail out on invalids +/datum/targeting_strategy/basic/can_attack(mob/living/living_mob, atom/the_target, vision_range) + var/datum/ai_controller/basic_controller/our_controller = living_mob.ai_controller + + if(isnull(our_controller)) + return FALSE + + if(isturf(the_target) || isnull(the_target)) // bail out on invalids return FALSE if(isobj(the_target.loc)) @@ -30,6 +38,8 @@ return FALSE if(ismob(the_target)) //Target is in godmode, ignore it. + if(living_mob.loc == the_target) + return FALSE // We've either been eaten or are shapeshifted, let's assume the latter because we're still alive var/mob/M = the_target if(M.status_flags & GODMODE) return FALSE @@ -40,13 +50,18 @@ if(living_mob.see_invisible < the_target.invisibility) //Target's invisible to us, forget it return FALSE - if(isturf(the_target.loc) && living_mob.z != the_target.z) // z check will always fail if target is in a mech + if(isturf(living_mob.loc) && isturf(the_target.loc) && living_mob.z != the_target.z) // z check will always fail if target is in a mech or pawn is shapeshifted or jaunting return FALSE if(isliving(the_target)) //Targeting vs living mobs - var/mob/living/L = the_target - if(faction_check(living_mob, L) || (L.stat > stat_attack)) + var/mob/living/living_target = the_target + if(faction_check(our_controller, living_mob, living_target)) return FALSE + if(living_target.stat > our_controller.blackboard[minimum_stat_key]) + return FALSE + if(target_wounded_key && our_controller.blackboard[target_wounded_key] && living_target.health == living_target.maxHealth) + return FALSE + return TRUE if(ismecha(the_target)) //Targeting vs mechas @@ -68,34 +83,29 @@ return FALSE /// Returns true if the mob and target share factions -/datum/targetting_datum/basic/proc/faction_check(mob/living/living_mob, mob/living/the_target) - return living_mob.faction_check_mob(the_target, exact_match = check_factions_exactly) +/datum/targeting_strategy/basic/proc/faction_check(datum/ai_controller/controller, mob/living/living_mob, mob/living/the_target) + if (controller.blackboard[BB_ALWAYS_IGNORE_FACTION] || controller.blackboard[BB_TEMPORARILY_IGNORE_FACTION]) + return FALSE + return living_mob.faction_check_atom(the_target, exact_match = check_factions_exactly) /// Subtype more forgiving for items. /// Careful, this can go wrong and keep a mob hyper-focused on an item it can't lose aggro on -/datum/targetting_datum/basic/allow_items +/datum/targeting_strategy/basic/allow_items -/datum/targetting_datum/basic/allow_items/can_attack(mob/living/living_mob, atom/the_target) +/datum/targeting_strategy/basic/allow_items/can_attack(mob/living/living_mob, atom/the_target, vision_range) . = ..() if(isitem(the_target)) // trust fall exercise return TRUE -/// Subtype which doesn't care about faction -/// Mobs which retaliate but don't otherwise target seek should just attack anything which annoys them -/datum/targetting_datum/basic/ignore_faction - -/datum/targetting_datum/basic/ignore_faction/faction_check(mob/living/living_mob, mob/living/the_target) - return FALSE - /// Subtype which searches for mobs of a size relative to ours -/datum/targetting_datum/basic/of_size +/datum/targeting_strategy/basic/of_size /// If true, we will return mobs which are smaller than us. If false, larger. var/find_smaller = TRUE /// If true, we will return mobs which are the same size as us. var/inclusive = TRUE -/datum/targetting_datum/basic/of_size/can_attack(mob/living/owner, atom/target) +/datum/targeting_strategy/basic/of_size/can_attack(mob/living/owner, atom/target, vision_range) if(!isliving(target)) return FALSE . = ..() @@ -110,8 +120,14 @@ return !find_smaller // This is just using the default values but the subtype makes it clearer -/datum/targetting_datum/basic/of_size/ours_or_smaller +/datum/targeting_strategy/basic/of_size/ours_or_smaller -/datum/targetting_datum/basic/of_size/larger +/datum/targeting_strategy/basic/of_size/larger find_smaller = FALSE inclusive = FALSE + +/// Makes the mob only attack their own faction. Useful mostly if their attacks do something helpful (e.g. healing touch). +/datum/targeting_strategy/basic/same_faction + +/datum/targeting_strategy/basic/same_faction/faction_check(mob/living/living_mob, mob/living/the_target) + return !..() // inverts logic to ONLY target mobs that share a faction diff --git a/code/datums/ai/basic_mobs/targetting_datums/dont_target_friends.dm b/code/datums/ai/basic_mobs/targeting_strategies/dont_target_friends.dm similarity index 55% rename from code/datums/ai/basic_mobs/targetting_datums/dont_target_friends.dm rename to code/datums/ai/basic_mobs/targeting_strategies/dont_target_friends.dm index 8e6c79fda3fa..7231d88dde08 100644 --- a/code/datums/ai/basic_mobs/targetting_datums/dont_target_friends.dm +++ b/code/datums/ai/basic_mobs/targeting_strategies/dont_target_friends.dm @@ -1,20 +1,14 @@ /// Don't target an atom in our friends list (or turfs), anything else is fair game -/datum/targetting_datum/not_friends +/datum/targeting_strategy/basic/not_friends /// Stop regarding someone as a valid target once they pass this stat level, setting it to DEAD means you will happily attack corpses var/attack_until_past_stat = HARD_CRIT /// If we can try to closed turfs or not var/attack_closed_turf = FALSE ///Returns true or false depending on if the target can be attacked by the mob -/datum/targetting_datum/not_friends/can_attack(mob/living/living_mob, atom/target) - if (!target) - return FALSE - if (attack_closed_turf) - if (isopenturf(target)) - return FALSE - else - if (isturf(target)) - return FALSE +/datum/targeting_strategy/basic/not_friends/can_attack(mob/living/living_mob, atom/target, vision_range) + if(attack_closed_turf && isclosedturf(target)) + return TRUE if (ismob(target)) var/mob/mob_target = target @@ -35,7 +29,18 @@ // OR This is not our friend, fire at will return TRUE +///friends dont care about factions +/datum/targeting_strategy/basic/not_friends/faction_check(mob/living/living_mob, mob/living/the_target) return FALSE -/datum/targetting_datum/not_friends/attack_closed_turfs +/datum/targeting_strategy/basic/not_friends/attack_closed_turfs attack_closed_turf = TRUE + +/// Subtype that allows us to target items while deftly avoiding attacking our allies. Be careful when it comes to targeting items as an AI could get trapped targeting something it can't destroy. +/datum/targeting_strategy/basic/not_friends/allow_items + +/datum/targeting_strategy/basic/not_friends/allow_items/can_attack(mob/living/living_mob, atom/the_target, vision_range) + . = ..() + if(isitem(the_target)) + // trust fall exercise + return TRUE diff --git a/code/datums/ai/basic_mobs/targeting_strategies/with_object.dm b/code/datums/ai/basic_mobs/targeting_strategies/with_object.dm new file mode 100644 index 000000000000..7cc76d3010c9 --- /dev/null +++ b/code/datums/ai/basic_mobs/targeting_strategies/with_object.dm @@ -0,0 +1,29 @@ +/** + * Find mobs who are holding the bb configurable object type + * + * This is an extension of basic targeting behaviour, that allows you to + * only target the mob if they have a specific item in their hand. + * + */ +/datum/targeting_strategy/basic/holding_object + /// BB key that holds the target typepath to use + var/target_item_key = BB_TARGET_HELD_ITEM + +///Returns true or false depending on if the target can be attacked by the mob +/datum/targeting_strategy/basic/holding_object/can_attack(mob/living/living_mob, atom/target, vision_range) + var/datum/ai_controller/controller = living_mob.ai_controller + var/object_type_path = controller.blackboard[target_item_key] + + if (object_type_path == null) + return FALSE // no op + if(!ismob(target)) + return FALSE // no hands no problems + + // Look at me, type casting like a grown up + var/mob/targetmob = target + // Check if our parent behaviour agrees we can attack this target (we ignore faction by default) + var/can_attack = ..() + if(can_attack && targetmob.is_holding_item_of_type(object_type_path)) + return TRUE // they have the item + // No valid target + return FALSE diff --git a/code/datums/ai/dog/dog_behaviors.dm b/code/datums/ai/dog/dog_behaviors.dm index 2f6ae2d9720a..c6bdc46afe72 100644 --- a/code/datums/ai/dog/dog_behaviors.dm +++ b/code/datums/ai/dog/dog_behaviors.dm @@ -4,22 +4,21 @@ * Adds a floor to the melee damage of the dog, as most pet dogs don't actually have any melee strength */ /datum/ai_behavior/basic_melee_attack/dog - action_cooldown = 0.8 SECONDS behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM required_distance = 3 -/datum/ai_behavior/basic_melee_attack/dog/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) +/datum/ai_behavior/basic_melee_attack/dog/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) controller.behavior_cooldowns[src] = world.time + action_cooldown var/mob/living/living_pawn = controller.pawn if(!(isturf(living_pawn.loc) || HAS_TRAIT(living_pawn, TRAIT_AI_BAGATTACK))) // Void puppies can attack from inside bags - finish_action(controller, FALSE, target_key, targetting_datum_key, hiding_location_key) + finish_action(controller, FALSE, target_key, targeting_strategy_key, hiding_location_key) return // Unfortunately going to repeat this check in parent call but what can you do var/atom/target = controller.blackboard[target_key] - var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] - if (!targetting_datum.can_attack(living_pawn, target)) - finish_action(controller, FALSE, target_key, targetting_datum_key, hiding_location_key) + var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key]) + if (!targeting_strategy.can_attack(living_pawn, target)) + finish_action(controller, FALSE, target_key, targeting_strategy_key, hiding_location_key) return if (!in_range(living_pawn, target)) diff --git a/code/datums/ai/dog/dog_controller.dm b/code/datums/ai/dog/dog_controller.dm index 5a42cb43a1eb..a5794ff9b5f4 100644 --- a/code/datums/ai/dog/dog_controller.dm +++ b/code/datums/ai/dog/dog_controller.dm @@ -2,7 +2,7 @@ blackboard = list( BB_DOG_HARASS_HARM = TRUE, BB_VISION_RANGE = AI_DOG_VISION_RANGE, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, ) ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_dog @@ -19,7 +19,11 @@ blackboard = list( BB_DOG_HARASS_HARM = TRUE, BB_VISION_RANGE = AI_DOG_VISION_RANGE, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + // Find nearby mobs ... + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/holding_object, + // With tongs in hand! + BB_TARGET_HELD_ITEM = /obj/item/kitchen/tongs, BB_BABIES_PARTNER_TYPES = list(/mob/living/basic/pet/dog), BB_BABIES_CHILD_TYPES = list(/mob/living/basic/pet/dog/corgi/puppy = 95, /mob/living/basic/pet/dog/corgi/puppy/void = 5), ) @@ -29,6 +33,10 @@ /datum/ai_planning_subtree/make_babies, // Ian WILL prioritise sex over following your instructions /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/dog_harassment, + // Find targets to run away from (uses the targeting strategy from above) + /datum/ai_planning_subtree/simple_find_target, + // Flee from that target + /datum/ai_planning_subtree/flee_target, ) /datum/ai_controller/basic_controller/dog/corgi/get_access() @@ -36,4 +44,21 @@ if(!istype(corgi_pawn)) return - return corgi_pawn.access_card + return corgi_pawn.access_card.GetAccess() + +/datum/ai_controller/basic_controller/dog/puppy + blackboard = list( + BB_DOG_HARASS_HARM = TRUE, + BB_VISION_RANGE = AI_DOG_VISION_RANGE, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/holding_object, + // With tongs in hand! + BB_TARGET_HELD_ITEM = /obj/item/kitchen/tongs, + ) + planning_subtrees = list( + /datum/ai_planning_subtree/random_speech/dog, + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/dog_harassment, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/flee_target, + ) diff --git a/code/datums/ai/dog/dog_subtrees.dm b/code/datums/ai/dog/dog_subtrees.dm index 66198b61ac30..62f63da54bdd 100644 --- a/code/datums/ai/dog/dog_subtrees.dm +++ b/code/datums/ai/dog/dog_subtrees.dm @@ -4,27 +4,27 @@ /datum/ai_planning_subtree/dog_harassment/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) if(!SPT_PROB(10, seconds_per_tick)) return - controller.queue_behavior(/datum/ai_behavior/find_hated_dog_target, BB_DOG_HARASS_TARGET, BB_PET_TARGETTING_DATUM) + controller.queue_behavior(/datum/ai_behavior/find_hated_dog_target, BB_DOG_HARASS_TARGET, BB_PET_TARGETING_STRATEGY) var/atom/harass_target = controller.blackboard[BB_DOG_HARASS_TARGET] if (isnull(harass_target)) return - controller.queue_behavior(/datum/ai_behavior/basic_melee_attack/dog, BB_DOG_HARASS_TARGET, BB_PET_TARGETTING_DATUM) + controller.queue_behavior(/datum/ai_behavior/basic_melee_attack/dog, BB_DOG_HARASS_TARGET, BB_PET_TARGETING_STRATEGY) return SUBTREE_RETURN_FINISH_PLANNING /datum/ai_behavior/find_hated_dog_target -/datum/ai_behavior/find_hated_dog_target/setup(datum/ai_controller/controller, target_key, targetting_datum_key) +/datum/ai_behavior/find_hated_dog_target/setup(datum/ai_controller/controller, target_key, targeting_strategy_key) . = ..() var/mob/living/dog = controller.pawn - var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] + var/datum/targeting_strategy/targeting_strategy = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key]) for(var/mob/living/iter_living in oview(2, dog)) if(iter_living.stat != CONSCIOUS || !HAS_TRAIT(iter_living, TRAIT_HATED_BY_DOGS)) continue if(!isnull(dog.buckled)) dog.audible_message(span_notice("[dog] growls at [iter_living], yet [dog.p_they()] [dog.p_are()] much too comfy to move."), hearing_distance = COMBAT_MESSAGE_RANGE) continue - if(!targetting_datum.can_attack(dog, iter_living)) + if(!targeting_strategy.can_attack(dog, iter_living)) continue dog.audible_message(span_warning("[dog] growls at [iter_living], seemingly annoyed by [iter_living.p_their()] presence."), hearing_distance = COMBAT_MESSAGE_RANGE) diff --git a/code/datums/ai/generic/find_and_set.dm b/code/datums/ai/generic/find_and_set.dm index 443febae2a0e..b0d34f68c224 100644 --- a/code/datums/ai/generic/find_and_set.dm +++ b/code/datums/ai/generic/find_and_set.dm @@ -8,8 +8,8 @@ /datum/ai_behavior/find_and_set/perform(seconds_per_tick, datum/ai_controller/controller, set_key, locate_path, search_range) . = ..() - var/atom/current_target = controller.blackboard[set_key] - if (!QDELETED(current_target)) + if (controller.blackboard_key_exists(set_key)) + finish_action(controller, TRUE) return var/find_this_thing = search_tactic(controller, locate_path, search_range) if(find_this_thing) @@ -76,6 +76,16 @@ if(found.len) return pick(found) +/// Like find_and_set/in_list, but we return the turf location of the item instead of the item itself. +/datum/ai_behavior/find_and_set/in_list/turf_location + +/datum/ai_behavior/find_and_set/in_list/turf_location/search_tactic(datum/ai_controller/controller, locate_paths, search_range) + . = ..() + if(isnull(.)) + return null + + return get_turf(.) + /** * Variant of find and set which returns an object which can be animated with a staff of change */ @@ -129,9 +139,39 @@ continue if (living_pawn.see_invisible < dead_pal.invisibility) continue - if (!living_pawn.faction_check_mob(dead_pal)) + if (!living_pawn.faction_check_atom(dead_pal)) continue nearby_bodies += dead_pal if (nearby_bodies.len) return pick(nearby_bodies) + +/** + * A variant that looks for a human who is not dead or incapacitated, and has a mind + */ +/datum/ai_behavior/find_and_set/conscious_person + +/datum/ai_behavior/find_and_set/conscious_person/search_tactic(datum/ai_controller/controller, locate_path, search_range) + var/list/customers = list() + for(var/mob/living/carbon/human/target in oview(search_range, controller.pawn)) + if(IS_DEAD_OR_INCAP(target) || !target.mind) + continue + customers += target + + if(customers.len) + return pick(customers) + + return null + +/datum/ai_behavior/find_and_set/nearby_friends + action_cooldown = 2 SECONDS + +/datum/ai_behavior/find_and_set/nearby_friends/search_tactic(datum/ai_controller/controller, locate_path, search_range) + var/atom/friend = locate(/mob/living/carbon/human) in oview(search_range, controller.pawn) + + if(isnull(friend)) + return null + + var/mob/living/living_pawn = controller.pawn + var/potential_friend = living_pawn.faction.Find(REF(friend)) ? friend : null + return potential_friend diff --git a/code/datums/ai/generic/generic_behaviors.dm b/code/datums/ai/generic/generic_behaviors.dm index 0091bfbf1acc..7e383d304afd 100644 --- a/code/datums/ai/generic/generic_behaviors.dm +++ b/code/datums/ai/generic/generic_behaviors.dm @@ -300,11 +300,25 @@ /datum/ai_behavior/perform_speech -/datum/ai_behavior/perform_speech/perform(seconds_per_tick, datum/ai_controller/controller, speech) +/datum/ai_behavior/perform_speech/perform(seconds_per_tick, datum/ai_controller/controller, speech, speech_sound) + . = ..() + var/mob/living/living_pawn = controller.pawn if(!istype(living_pawn)) return living_pawn.say(speech, forced = "AI Controller") + if(speech_sound) + playsound(living_pawn, speech_sound, 80, vary = TRUE) + finish_action(controller, TRUE) + +/datum/ai_behavior/perform_speech_radio + +/datum/ai_behavior/perform_speech_radio/perform(seconds_per_tick, datum/ai_controller/controller, speech, obj/item/radio/speech_radio, list/try_channels = list(RADIO_CHANNEL_COMMON)) + var/mob/living/living_pawn = controller.pawn + if(!istype(living_pawn) || !istype(speech_radio) || QDELETED(speech_radio) || !length(try_channels)) + finish_action(controller, FALSE) + return + speech_radio.talk_into(living_pawn, speech, pick(try_channels)) finish_action(controller, TRUE) //song behaviors diff --git a/code/datums/ai/hunting_behavior/hunting_behaviors.dm b/code/datums/ai/hunting_behavior/hunting_behaviors.dm index a06f69965695..f5e5c209a181 100644 --- a/code/datums/ai/hunting_behavior/hunting_behaviors.dm +++ b/code/datums/ai/hunting_behavior/hunting_behaviors.dm @@ -16,6 +16,8 @@ var/hunt_range = 2 /// What are the chances we hunt something at any given moment var/hunt_chance = 100 + ///do we finish planning subtree + var/finish_planning = TRUE /datum/ai_planning_subtree/find_and_hunt_target/New() . = ..() @@ -35,13 +37,15 @@ // We're not hunting anything, look around for something if(isnull(hunted)) controller.queue_behavior(finding_behavior, target_key, hunt_targets, hunt_range) + return // We ARE hunting something, execute the hunt. // Note that if our AI controller has multiple hunting subtrees set, // we may accidentally be executing another tree's hunt - not ideal, // try to set a unique target key if you have multiple - else - controller.queue_behavior(hunting_behavior, target_key, BB_HUNTING_COOLDOWN) + + controller.queue_behavior(hunting_behavior, target_key, BB_HUNTING_COOLDOWN) + if(finish_planning) return SUBTREE_RETURN_FINISH_PLANNING //If we're hunting we're too busy for anything else /// Finds a specific atom type to hunt. @@ -77,6 +81,7 @@ /// Do we reset the target after attacking something, so we can check for status changes. var/always_reset_target = FALSE + /datum/ai_behavior/hunt_target/setup(datum/ai_controller/controller, hunting_target_key, hunting_cooldown_key) . = ..() var/atom/hunt_target = controller.blackboard[hunting_target_key] @@ -89,7 +94,7 @@ var/mob/living/hunter = controller.pawn var/atom/hunted = controller.blackboard[hunting_target_key] - if(isnull(hunted)) + if(QDELETED(hunted)) //Target is gone for some reason. forget about this task! controller[hunting_target_key] = null finish_action(controller, FALSE, hunting_target_key) @@ -121,6 +126,37 @@ controller.clear_blackboard_key(hunting_target_key) /datum/ai_behavior/hunt_target/unarmed_attack_target + ///do we toggle combat mode before interacting with the object? + var/switch_combat_mode = FALSE /datum/ai_behavior/hunt_target/unarmed_attack_target/target_caught(mob/living/hunter, obj/structure/cable/hunted) hunter.UnarmedAttack(hunted, TRUE) + +/datum/ai_behavior/hunt_target/unarmed_attack_target/finish_action(datum/ai_controller/controller, succeeded, hunting_target_key, hunting_cooldown_key) + . = ..() + if(!switch_combat_mode) + return + var/mob/living/living_pawn = controller.pawn + living_pawn.istate = initial(living_pawn.istate) + +/datum/ai_behavior/hunt_target/unarmed_attack_target/switch_combat_mode + switch_combat_mode = TRUE + +/datum/ai_behavior/hunt_target/unarmed_attack_target/reset_target + always_reset_target = TRUE + +/datum/ai_behavior/hunt_target/use_ability_on_target + always_reset_target = TRUE + ///the ability we will use + var/ability_key + +/datum/ai_behavior/hunt_target/use_ability_on_target/perform(seconds_per_tick, datum/ai_controller/controller, hunting_target_key, hunting_cooldown_key) + var/datum/action/cooldown/ability = controller.blackboard[ability_key] + if(!ability?.IsAvailable()) + finish_action(controller, FALSE, hunting_target_key) + return ..() + +/datum/ai_behavior/hunt_target/use_ability_on_target/target_caught(mob/living/hunter, atom/hunted) + var/datum/action/cooldown/ability = hunter.ai_controller.blackboard[ability_key] + ability.InterceptClickOn(hunter, null, hunted) + diff --git a/code/datums/ai/hunting_behavior/hunting_corpses.dm b/code/datums/ai/hunting_behavior/hunting_corpses.dm new file mode 100644 index 000000000000..e720e4da947a --- /dev/null +++ b/code/datums/ai/hunting_behavior/hunting_corpses.dm @@ -0,0 +1,17 @@ +/// Find and attack corpses +/datum/ai_planning_subtree/find_and_hunt_target/corpses + finding_behavior = /datum/ai_behavior/find_hunt_target/corpses + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target + hunt_targets = list(/mob/living) + +/// Find nearby dead mobs +/datum/ai_behavior/find_hunt_target/corpses + +/datum/ai_behavior/find_hunt_target/corpses/valid_dinner(mob/living/source, mob/living/dinner, radius) + if (!isliving(dinner) || dinner.stat != DEAD) + return FALSE + return can_see(source, dinner, radius) + +/// Find and attack specifically human corpses +/datum/ai_planning_subtree/find_and_hunt_target/corpses/human + hunt_targets = list(/mob/living/carbon/human) diff --git a/code/datums/ai/idle_behaviors/idle_random_walk.dm b/code/datums/ai/idle_behaviors/idle_random_walk.dm index b25f983f3139..f189e89b4230 100644 --- a/code/datums/ai/idle_behaviors/idle_random_walk.dm +++ b/code/datums/ai/idle_behaviors/idle_random_walk.dm @@ -14,3 +14,68 @@ /datum/idle_behavior/idle_random_walk/less_walking walk_chance = 10 + +/// Only walk if we don't have a target +/datum/idle_behavior/idle_random_walk/no_target + /// Where do we look for a target? + var/target_key = BB_BASIC_MOB_CURRENT_TARGET + +/datum/idle_behavior/idle_random_walk/no_target/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller) + if (!controller.blackboard_key_exists(target_key)) + return + return ..() + +/// Only walk if we are not on the target's location +/datum/idle_behavior/idle_random_walk/not_while_on_target + ///What is the spot we have to stand on? + var/target_key + +/datum/idle_behavior/idle_random_walk/not_while_on_target/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller) + var/atom/target = controller.blackboard[target_key] + + //Don't move, if we are are already standing on it + if(!QDELETED(target) && ((isturf(target) && controller.pawn.loc == target) || (target.loc == controller.pawn.loc))) + return + + return ..() + +/// walk randomly however stick near a target +/datum/idle_behavior/walk_near_target + /// chance to walk + var/walk_chance = 25 + /// distance we are to target + var/minimum_distance = 20 + /// key that holds target + var/target_key + +/datum/idle_behavior/walk_near_target/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller) + . = ..() + var/mob/living/living_pawn = controller.pawn + if(LAZYLEN(living_pawn.do_afters)) + return + + if(!SPT_PROB(walk_chance, seconds_per_tick) || !(living_pawn.mobility_flags & MOBILITY_MOVE) || !isturf(living_pawn.loc) || living_pawn.pulledby) + return + + var/atom/target = controller.blackboard[target_key] + var/distance = get_dist(target, living_pawn) + if(isnull(target) || distance > minimum_distance) //if we are too far away from target, just walk randomly + var/move_dir = pick(GLOB.alldirs) + living_pawn.Move(get_step(living_pawn, move_dir), move_dir) + return + + var/list/possible_turfs = list() + for(var/direction in GLOB.alldirs) + var/turf/possible_step = get_step(living_pawn, direction) + if(get_dist(possible_step, target) > minimum_distance) + continue + if(possible_step.is_blocked_turf()) + continue + possible_turfs += possible_step + + if(!length(possible_turfs)) + return + + var/turf/picked_turf = pick(possible_turfs) + + living_pawn.Move(picked_turf, get_dir(living_pawn, picked_turf)) diff --git a/code/datums/ai/learn_ai.md b/code/datums/ai/learn_ai.md index 9906806cfbd5..e8a151140f06 100644 --- a/code/datums/ai/learn_ai.md +++ b/code/datums/ai/learn_ai.md @@ -25,7 +25,7 @@ First, let's look at the blackboard. ```dm /datum/ai_controller/basic/cow blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items(), + BB_TARGETING_STRATEGY = GET_TARGETING_STRATEGY(/datum/targeting_strategy/basic/allow_items), BB_BASIC_MOB_TIP_REACTING = FALSE, BB_BASIC_MOB_TIPPER = null, ) @@ -81,7 +81,7 @@ Okay, so we have blackboard variables, which are considered by subtrees to plan //now we know we have a target but should let a hostile subtree plan attacking humans. let's check if it's actually food if(target in wanted) - controller.queue_behavior(/datum/ai_behavior/basic_melee_attack, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + controller.queue_behavior(/datum/ai_behavior/basic_melee_attack, BB_BASIC_MOB_CURRENT_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) return SUBTREE_RETURN_FINISH_PLANNING //this prevents further subtrees from planning since we want to focus on eating the food ``` @@ -113,7 +113,7 @@ And one of those behaviors, `basic_melee_attack`. As I have been doing so far, I //targetting datum will kill the action if not real anymore var/datum/weakref/weak_target = controller.blackboard[target_key] var/atom/target = weak_target?.resolve() - var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key] + var/datum/targeting_strategy/targetting_datum = controller.blackboard[targetting_datum_key] if(!targetting_datum.can_attack(basic_mob, target)) ///We have a target that is no longer valid to attack. Remember that returning doesn't end the behavior, JUST this single performance. So we call "finish_action" with whether it succeeded in doing what it wanted to do (it didn't, so FALSE) and the blackboard keys passed into this behavior. diff --git a/code/datums/ai/movement/ai_movement_jps.dm b/code/datums/ai/movement/ai_movement_jps.dm index 3523da7ecec2..150833991330 100644 --- a/code/datums/ai/movement/ai_movement_jps.dm +++ b/code/datums/ai/movement/ai_movement_jps.dm @@ -2,7 +2,7 @@ * This movement datum represents smart-pathing */ /datum/ai_movement/jps - max_pathing_attempts = 4 + max_pathing_attempts = 20 /datum/ai_movement/jps/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target, min_distance) . = ..() @@ -12,13 +12,13 @@ var/datum/move_loop/loop = SSmove_manager.jps_move(moving, current_movement_target, delay, - repath_delay = 2 SECONDS, + repath_delay = 0.5 SECONDS, max_path_length = AI_MAX_PATH_LENGTH, minimum_distance = controller.get_minimum_distance(), - id = controller.get_access(), + access = controller.get_access(), subsystem = SSai_movement, extra_info = controller, - initial_path = controller.blackboard[BB_PATH_TO_USE]) + ) RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move)) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move)) @@ -28,5 +28,5 @@ SIGNAL_HANDLER var/datum/ai_controller/controller = source.extra_info - source.id = controller.get_access() + source.access = controller.get_access() source.minimum_distance = controller.get_minimum_distance() diff --git a/code/datums/ai/objects/mod.dm b/code/datums/ai/objects/mod.dm index ff3a8c6d1697..2bb555d281bf 100644 --- a/code/datums/ai/objects/mod.dm +++ b/code/datums/ai/objects/mod.dm @@ -28,7 +28,7 @@ queue_behavior(/datum/ai_behavior/mod_attach) /datum/ai_controller/mod/get_access() - return id_card + return id_card.GetAccess() /datum/ai_behavior/mod_attach behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT|AI_BEHAVIOR_MOVE_AND_PERFORM diff --git a/code/datums/ai/objects/vending_machines/vending_machine_behaviors.dm b/code/datums/ai/objects/vending_machines/vending_machine_behaviors.dm index 5bad78a35154..b4e5609531c1 100644 --- a/code/datums/ai/objects/vending_machines/vending_machine_behaviors.dm +++ b/code/datums/ai/objects/vending_machines/vending_machine_behaviors.dm @@ -22,7 +22,7 @@ /datum/ai_behavior/vendor_crush/proc/tiltonmob(datum/ai_controller/controller, turf/target_turf) var/obj/machinery/vending/vendor_pawn = controller.pawn - if(vendor_pawn.tilt(target_turf)) //We hit something + if(vendor_pawn.tilt(target_turf, 0) & SUCCESSFULLY_CRUSHED_MOB) //We hit something vendor_pawn.say(pick("Supersize this!", "Eat my shiny metal ass!", "Want to consume some of my products?", "SMASH!", "Don't you love these smashing prices!")) controller.set_blackboard_key(BB_VENDING_LAST_HIT_SUCCESFUL, TRUE) else diff --git a/code/datums/ai/oldhostile/hostile_tameable.dm b/code/datums/ai/oldhostile/hostile_tameable.dm index bfa9f17dffa2..583177981aff 100644 --- a/code/datums/ai/oldhostile/hostile_tameable.dm +++ b/code/datums/ai/oldhostile/hostile_tameable.dm @@ -62,7 +62,7 @@ if(!istype(simple_pawn)) return - return simple_pawn.access_card + return simple_pawn.access_card.GetAccess() /datum/ai_controller/hostile_friend/proc/on_ridden_driver_move(atom/movable/movable_parent, mob/living/user, direction) SIGNAL_HANDLER diff --git a/code/datums/ai/robot_customer/robot_customer_behaviors.dm b/code/datums/ai/robot_customer/robot_customer_behaviors.dm index 431713b94cac..e370af6f5c1f 100644 --- a/code/datums/ai/robot_customer/robot_customer_behaviors.dm +++ b/code/datums/ai/robot_customer/robot_customer_behaviors.dm @@ -3,7 +3,7 @@ /datum/ai_behavior/find_seat/perform(seconds_per_tick, datum/ai_controller/controller) . = ..() - var/mob/living/simple_animal/robot_customer/customer_pawn = controller.pawn + var/mob/living/basic/robot_customer/customer_pawn = controller.pawn var/datum/customer_data/customer_data = controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] var/datum/venue/attending_venue = controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] @@ -44,7 +44,7 @@ /datum/ai_behavior/order_food/perform(seconds_per_tick, datum/ai_controller/controller) . = ..() - var/mob/living/simple_animal/robot_customer/customer_pawn = controller.pawn + var/mob/living/basic/robot_customer/customer_pawn = controller.pawn var/datum/customer_data/customer_data = controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] var/obj/structure/holosign/robot_seat/seat_marker = controller.blackboard[BB_CUSTOMER_MY_SEAT] if(get_turf(seat_marker) == get_turf(customer_pawn)) @@ -75,7 +75,7 @@ // SPT_PROB 1.5 is about a 40% chance that the tourist will have vocalised at least once every minute. if(SPT_PROB(0.85, seconds_per_tick)) - var/mob/living/simple_animal/robot_customer/customer_pawn = controller.pawn + var/mob/living/basic/robot_customer/customer_pawn = controller.pawn var/datum/customer_data/customer_data = controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] customer_pawn.say(pick(customer_data.wait_for_food_lines)) @@ -98,7 +98,7 @@ /datum/ai_behavior/wait_for_food/finish_action(datum/ai_controller/controller, succeeded) . = ..() - var/mob/living/simple_animal/robot_customer/customer_pawn = controller.pawn + var/mob/living/basic/robot_customer/customer_pawn = controller.pawn var/datum/customer_data/customer_data = controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] var/mob/living/greytider = controller.blackboard[BB_CUSTOMER_CURRENT_TARGET] //usually if we stop waiting, it's because we're done with the venue. but here we're either beating some dude up diff --git a/code/datums/ai/robot_customer/robot_customer_controller.dm b/code/datums/ai/robot_customer/robot_customer_controller.dm index dfcab76c8728..433eab6ae88c 100644 --- a/code/datums/ai/robot_customer/robot_customer_controller.dm +++ b/code/datums/ai/robot_customer/robot_customer_controller.dm @@ -1,14 +1,16 @@ /datum/ai_controller/robot_customer ai_movement = /datum/ai_movement/basic_avoidance movement_delay = 0.8 SECONDS - blackboard = list(BB_CUSTOMER_CURRENT_ORDER = null, - BB_CUSTOMER_MY_SEAT = null, - BB_CUSTOMER_PATIENCE = 999, - BB_CUSTOMER_CUSTOMERINFO = null, - BB_CUSTOMER_EATING = FALSE, - BB_CUSTOMER_LEAVING = FALSE, - BB_CUSTOMER_ATTENDING_VENUE = null, - BB_CUSTOMER_SAID_CANT_FIND_SEAT_LINE = FALSE) + blackboard = list( + BB_CUSTOMER_ATTENDING_VENUE = null, + BB_CUSTOMER_CURRENT_ORDER = null, + BB_CUSTOMER_CUSTOMERINFO = null, + BB_CUSTOMER_EATING = FALSE, + BB_CUSTOMER_LEAVING = FALSE, + BB_CUSTOMER_MY_SEAT = null, + BB_CUSTOMER_PATIENCE = 999 SECONDS, + BB_CUSTOMER_SAID_CANT_FIND_SEAT_LINE = FALSE, + ) planning_subtrees = list(/datum/ai_planning_subtree/robot_customer) /datum/ai_controller/robot_customer/Destroy() @@ -18,7 +20,7 @@ return ..() /datum/ai_controller/robot_customer/TryPossessPawn(atom/new_pawn) - if(!istype(new_pawn, /mob/living/simple_animal/robot_customer)) + if(!istype(new_pawn, /mob/living/basic/robot_customer)) return AI_CONTROLLER_INCOMPATIBLE new_pawn.AddElement(/datum/element/relay_attackers) RegisterSignal(new_pawn, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attackby)) @@ -28,6 +30,12 @@ return ..() //Run parent at end /datum/ai_controller/robot_customer/UnpossessPawn(destroy) + if(isnull(pawn)) +#ifndef UNIT_TESTS + stack_trace("Robot Customer AI Controller UnpossessPawn called with null pawn! This shouldn't happen in normal circumstances.") // and unit tests are abnormal circumstances +#endif + return + UnregisterSignal(pawn, list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_WAS_ATTACKED, COMSIG_LIVING_GET_PULLED, COMSIG_ATOM_ATTACK_HAND)) return ..() //Run parent at end @@ -67,7 +75,7 @@ INVOKE_ASYNC(src, PROC_REF(async_on_get_pulled), source, puller) /datum/ai_controller/robot_customer/proc/async_on_get_pulled(datum/source, mob/living/puller) - var/mob/living/simple_animal/robot_customer/customer = pawn + var/mob/living/basic/robot_customer/customer = pawn var/datum/customer_data/customer_data = blackboard[BB_CUSTOMER_CUSTOMERINFO] var/datum/venue/attending_venue = blackboard[BB_CUSTOMER_ATTENDING_VENUE] @@ -81,12 +89,12 @@ /datum/ai_controller/robot_customer/proc/dont_want_that(mob/living/chef, obj/item/thing) - var/mob/living/simple_animal/robot_customer/customer = pawn + var/mob/living/basic/robot_customer/customer = pawn var/datum/customer_data/customer_data = blackboard[BB_CUSTOMER_CUSTOMERINFO] customer.say(customer_data.wrong_item_line) /datum/ai_controller/robot_customer/proc/warn_greytider(mob/living/greytider) - var/mob/living/simple_animal/robot_customer/customer = pawn + var/mob/living/basic/robot_customer/customer = pawn var/datum/venue/attending_venue = blackboard[BB_CUSTOMER_ATTENDING_VENUE] var/datum/customer_data/customer_data = blackboard[BB_CUSTOMER_CUSTOMERINFO] //Living mobs are tagged, so these will always be valid diff --git a/code/datums/announcers/default_announcer.dm b/code/datums/announcers/default_announcer.dm index 9db822e02fef..830471615cbb 100644 --- a/code/datums/announcers/default_announcer.dm +++ b/code/datums/announcers/default_announcer.dm @@ -1,5 +1,7 @@ /datum/centcom_announcer/default - welcome_sounds = list('sound/ai/default/welcome.ogg') + welcome_sounds = list('monkestation/sound/ai/duke/welcome/bonus1.ogg', + 'monkestation/sound/ai/duke/welcome/welcome1.ogg', + 'monkestation/sound/ai/duke/welcome/welcome2.ogg') alert_sounds = list('sound/ai/default/attention.ogg') command_report_sounds = list('sound/ai/default/commandreport.ogg') event_sounds = list(ANNOUNCER_AIMALF = 'sound/ai/default/aimalf.ogg', diff --git a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm index 345356f85b36..16cc42756c1f 100644 --- a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm @@ -140,6 +140,11 @@ return var/mob/living/carbon/human/human_owner = ownerlimb.owner draw_color = human_owner.dna.features["animecolor"] + if(ORGAN_COLOR_MUTSECONDARY) + if(!ishuman(ownerlimb.owner)) + return + var/mob/living/carbon/human/human_owner = ownerlimb.owner + draw_color = human_owner.dna.features["mcolor_secondary"] return TRUE diff --git a/code/datums/browser.dm b/code/datums/browser.dm index 62cea4929e55..3cca23c56ad3 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -78,7 +78,7 @@
- [title ? "
[title]
" : ""] + [title ? "
[title]
" : ""]
"} //" This is here because else the rest of the file looks like a string in notepad++. diff --git a/code/datums/cinematics/_cinematic.dm b/code/datums/cinematics/_cinematic.dm index 6659fde0c516..cc4fe5a0fab8 100644 --- a/code/datums/cinematics/_cinematic.dm +++ b/code/datums/cinematics/_cinematic.dm @@ -1,3 +1,5 @@ +#define CINEMATIC_SOURCE "cinematic" + /** * Plays a cinematic, duh. Can be to a select few people, or everyone. * @@ -30,7 +32,7 @@ /datum/cinematic /// A list of all clients watching the cinematic var/list/client/watching = list() - /// A list of all mobs who have notransform set while watching the cinematic + /// A list of all mobs who have TRAIT_NO_TRANSFORM set while watching the cinematic var/list/datum/weakref/locked = list() /// Whether the cinematic is a global cinematic or not var/is_global = FALSE @@ -106,13 +108,8 @@ /datum/cinematic/proc/show_to(mob/watching_mob, client/watching_client) SIGNAL_HANDLER - // We could technically rip people out of notransform who shouldn't be, - // so we'll only lock down all viewing mobs who don't have it already set. - // This does potentially mean some mobs could lose their notrasnform and - // not be locked down by cinematics, but that should be very unlikely. - if(!watching_mob.notransform) - locked += WEAKREF(watching_mob) - watching_mob.notransform = TRUE + if(!HAS_TRAIT_FROM(watching_mob, TRAIT_NO_TRANSFORM, CINEMATIC_SOURCE)) + lock_mob(watching_mob) // Only show the actual cinematic to cliented mobs. if(!watching_client || (watching_client in watching)) @@ -146,14 +143,24 @@ remove_watcher(viewing_client) for(var/datum/weakref/locked_ref as anything in locked) - var/mob/locked_mob = locked_ref.resolve() - if(QDELETED(locked_mob)) - continue - locked_mob.notransform = FALSE - UnregisterSignal(locked_mob, COMSIG_MOB_CLIENT_LOGIN) + unlock_mob(locked_ref) qdel(src) + +/// Locks a mob, preventing them from moving, being hurt, or acting +/datum/cinematic/proc/lock_mob(mob/to_lock) + locked += WEAKREF(to_lock) + ADD_TRAIT(to_lock, TRAIT_NO_TRANSFORM, CINEMATIC_SOURCE) + +/// Unlocks a previously locked weakref +/datum/cinematic/proc/unlock_mob(datum/weakref/mob_ref) + var/mob/locked_mob = mob_ref.resolve() + if(isnull(locked_mob)) + return + REMOVE_TRAIT(locked_mob, TRAIT_NO_TRANSFORM, CINEMATIC_SOURCE) + UnregisterSignal(locked_mob, COMSIG_MOB_CLIENT_LOGIN) + /// Removes the passed client from our watching list. /datum/cinematic/proc/remove_watcher(client/no_longer_watching) SIGNAL_HANDLER @@ -163,8 +170,10 @@ UnregisterSignal(no_longer_watching, COMSIG_PARENT_QDELETING) // We'll clear the cinematic if they have a mob which has one, - // but we won't remove notransform. Wait for the cinematic end to do that. + // but we won't remove TRAIT_NO_TRANSFORM. Wait for the cinematic end to do that. no_longer_watching.mob?.clear_fullscreen("cinematic") no_longer_watching.screen -= screen watching -= no_longer_watching + +#undef CINEMATIC_SOURCE diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 253e3c3d2a8f..3b8d83349dcf 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -169,12 +169,13 @@ return /** - * Called when the component has a new source registered + * Called when the component has a new source registered. + * Return COMPONENT_INCOMPATIBLE to signal that the source is incompatible and should not be added */ -/datum/component/proc/on_source_add(source) +/datum/component/proc/on_source_add(source, ...) SHOULD_CALL_PARENT(TRUE) if(dupe_mode != COMPONENT_DUPE_SOURCES) - CRASH("Component '[type]' does not use sources but has been given a source") + return COMPONENT_INCOMPATIBLE LAZYOR(sources, source) /** @@ -461,7 +462,7 @@ component_type = new_component.type raw_args[1] = src - if(dupe_mode != COMPONENT_DUPE_ALLOWED && dupe_mode != COMPONENT_DUPE_SELECTIVE) + if(dupe_mode != COMPONENT_DUPE_ALLOWED && dupe_mode != COMPONENT_DUPE_SELECTIVE && dupe_mode != COMPONENT_DUPE_SOURCES) if(!dupe_type) old_component = GetExactComponent(component_type) else @@ -494,10 +495,14 @@ if(COMPONENT_DUPE_SOURCES) if(source in old_component.sources) return old_component // source already registered, no work to do - old_component.on_source_add(source) + + if(old_component.on_source_add(arglist(list(source) + raw_args.Copy(2))) == COMPONENT_INCOMPATIBLE) + stack_trace("incompatible source added to a [old_component.type]. Args: [json_encode(raw_args)]") + return null else if(!new_component) new_component = new component_type(raw_args) // There's a valid dupe mode but there's no old component, act like normal + else if(dupe_mode == COMPONENT_DUPE_SELECTIVE) var/list/arguments = raw_args.Copy() arguments[1] = new_component @@ -509,12 +514,17 @@ break if(!new_component && make_new_component) new_component = new component_type(raw_args) + + else if(dupe_mode == COMPONENT_DUPE_SOURCES) + new_component = new component_type(raw_args) + if(new_component.on_source_add(arglist(list(source) + raw_args.Copy(2))) == COMPONENT_INCOMPATIBLE) + stack_trace("incompatible source added to a [new_component.type]. Args: [json_encode(raw_args)]") + return null + else if(!new_component) new_component = new component_type(raw_args) // Dupes are allowed, act like normal if(!old_component && !QDELETED(new_component)) // Nothing related to duplicate components happened and the new component is healthy - if(uses_sources) // make sure they have the source added if they use sources - new_component.on_source_add(source) SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_component) return new_component diff --git a/code/datums/components/appearance_on_aggro.dm b/code/datums/components/appearance_on_aggro.dm index 85690a579ae8..8c0df88e6fdb 100644 --- a/code/datums/components/appearance_on_aggro.dm +++ b/code/datums/components/appearance_on_aggro.dm @@ -1,49 +1,80 @@ /** - * component gave to basic creatures to allow them to change appearance when find a target + * Changes visuals of the attached mob while it has a target */ /datum/component/appearance_on_aggro + /// Blackboardey to search for a target var/target_key = BB_BASIC_MOB_CURRENT_TARGET + /// Icon state to use when we have a target + var/aggro_state /// path of the overlay to apply - var/mutable_appearance/overlay_path + var/mutable_appearance/aggro_overlay /// visibility of our icon when aggroed var/alpha_on_aggro /// visibility of our icon when deaggroed var/alpha_on_deaggro + /// do we currently have a target + var/atom/current_target -/datum/component/appearance_on_aggro/Initialize(overlay_icon, overlay_state, alpha_on_aggro, alpha_on_deaggro) - if(!isliving(parent)) +/datum/component/appearance_on_aggro/Initialize(aggro_state, overlay_icon, overlay_state, alpha_on_aggro, alpha_on_deaggro) + if (!isliving(parent)) return COMPONENT_INCOMPATIBLE - if(overlay_icon && overlay_state) - src.overlay_path = mutable_appearance(overlay_icon, overlay_state) - if(!alpha_on_aggro || !alpha_on_deaggro) - return + src.aggro_state = aggro_state src.alpha_on_aggro = alpha_on_aggro src.alpha_on_deaggro = alpha_on_deaggro + if (!isnull(overlay_icon) && !isnull(overlay_state)) + aggro_overlay = mutable_appearance(overlay_icon, overlay_state) /datum/component/appearance_on_aggro/RegisterWithParent() - RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_SET(target_key), PROC_REF(change_appearance)) - RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), PROC_REF(revert_appearance)) + RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_SET(target_key), PROC_REF(on_set_target)) + RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), PROC_REF(on_clear_target)) + if (!isnull(aggro_state)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON_STATE, PROC_REF(on_icon_state_updated)) + if (!isnull(aggro_overlay)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_overlays_updated)) /datum/component/appearance_on_aggro/UnregisterFromParent() . = ..() UnregisterSignal(parent, list(COMSIG_AI_BLACKBOARD_KEY_SET(target_key), COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key))) -/datum/component/appearance_on_aggro/proc/change_appearance(mob/living/source) +/datum/component/appearance_on_aggro/proc/on_set_target(mob/living/source) SIGNAL_HANDLER var/atom/target = source.ai_controller.blackboard[target_key] - if(isnull(target)) + if (QDELETED(target)) return - if(overlay_path) - source.add_overlay(overlay_path) - if(alpha_on_aggro) + + current_target = target + if (!isnull(aggro_overlay) || !isnull(aggro_state)) + source.update_appearance(UPDATE_ICON) + if (!isnull(alpha_on_aggro)) animate(source, alpha = alpha_on_aggro, time = 2 SECONDS) -/datum/component/appearance_on_aggro/proc/revert_appearance(mob/living/source) +/datum/component/appearance_on_aggro/Destroy() + if (!isnull(current_target)) + revert_appearance(parent) + return ..() + +/datum/component/appearance_on_aggro/proc/on_clear_target(atom/source) SIGNAL_HANDLER + revert_appearance(parent) - if(overlay_path) - source.cut_overlay(overlay_path) - if(alpha_on_deaggro) +/datum/component/appearance_on_aggro/proc/revert_appearance(mob/living/source) + current_target = null + if (!isnull(aggro_overlay) || !isnull(aggro_state)) + source.update_appearance(UPDATE_ICON) + if (!isnull(alpha_on_deaggro)) animate(source, alpha = alpha_on_deaggro, time = 2 SECONDS) + +/datum/component/appearance_on_aggro/proc/on_icon_state_updated(mob/living/source) + SIGNAL_HANDLER + if (source.stat == DEAD) + return + source.icon_state = isnull(current_target) ? initial(source.icon_state) : aggro_state + +/datum/component/appearance_on_aggro/proc/on_overlays_updated(atom/source, list/overlays) + SIGNAL_HANDLER + + if (isnull(current_target)) + return + overlays += aggro_overlay diff --git a/code/datums/components/area_based_godmode.dm b/code/datums/components/area_based_godmode.dm new file mode 100644 index 000000000000..4f03ae57794c --- /dev/null +++ b/code/datums/components/area_based_godmode.dm @@ -0,0 +1,123 @@ +#define MAP_AREA_TYPE "area_type" +#define MAP_ALLOW_AREA_SUBTYPES "allow_area_subtypes" +#define DEFAULT_GAIN_MESSAGE span_big(span_green("You are now invulnerable.")) +#define DEFAULT_LOSE_MESSAGE span_big(span_red("You are no longer invulnerable.")) + +/** + * Area-based godmode. + * Gain and Lose message can only be set once, at initial component creation; adding a source will not update them. + */ +/datum/component/area_based_godmode + dupe_mode = COMPONENT_DUPE_SOURCES + + /// The type of area that will trigger godmode. + var/list/sources_to_area_type + + /// Whether or not to allow subtypes of the area type to trigger godmode. + var/allow_area_subtypes + + /// The message to send to the mob when they gain godmode. + var/gain_message + + /// The message to send to the mob when they lose godmode. + var/lose_message + + /// Cached state of check_area, prevents recalculating on source add + var/check_area_cached_state = FALSE + +/datum/component/area_based_godmode/Initialize( + area_type, + allow_area_subtypes, + gain_message = DEFAULT_GAIN_MESSAGE, + lose_message = DEFAULT_LOSE_MESSAGE, +) + var/mob/mob_target = parent + if(!istype(mob_target)) + return COMPONENT_INCOMPATIBLE + if(initial(mob_target.status_flags) & GODMODE) + return COMPONENT_INCOMPATIBLE + + sources_to_area_type = list() + src.gain_message = gain_message + src.lose_message = lose_message + RegisterSignal(mob_target, COMSIG_ENTER_AREA, PROC_REF(check_area)) + +/datum/component/area_based_godmode/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_ENTER_AREA) + +/datum/component/area_based_godmode/on_source_add( + source, + area_type, + allow_area_subtypes = FALSE, + gain_message = DEFAULT_GAIN_MESSAGE, + lose_message = DEFAULT_LOSE_MESSAGE, +) + . = ..() + if(. == COMPONENT_INCOMPATIBLE) + return + + var/list/information_map = list( + MAP_AREA_TYPE = area_type, + MAP_ALLOW_AREA_SUBTYPES = allow_area_subtypes, + ) + sources_to_area_type[source] = information_map + + var/mob/mob_target = parent // no need to istype here, done at creation + mob_target.become_area_sensitive("[REF(src)]:[source]") + if(!check_area_cached_state) + check_area(mob_target) + +/datum/component/area_based_godmode/on_source_remove(source) + sources_to_area_type -= source + var/mob/mob_target = parent + mob_target.lose_area_sensitivity("[REF(src)]:[source]") + if(check_area_cached_state) + check_area(mob_target) + return ..() + +/datum/component/area_based_godmode/proc/check_in_valid_area(mob/checking) + var/list/area/allowed_areas = list() + for(var/source in sources_to_area_type) + var/list/source_map = sources_to_area_type[source] + var/area/top_level = source_map[MAP_AREA_TYPE] + if(!allowed_areas[top_level]) + allowed_areas[top_level] = source_map[MAP_ALLOW_AREA_SUBTYPES] + + if(!length(allowed_areas)) + stack_trace("called check_in_valid_area with zero sources") + return FALSE + + var/area/area = get_area(checking) + if(area.type in allowed_areas) + return TRUE + + for(var/area/allowed_area as anything in allowed_areas) + if(!allowed_areas[allowed_area]) + continue + if(istype(area, allowed_area)) + return TRUE + + return FALSE + +/datum/component/area_based_godmode/proc/check_area(mob/source) + SIGNAL_HANDLER + + var/has_godmode = source.status_flags & GODMODE + if(!check_in_valid_area(source)) + if(has_godmode) + to_chat(source, lose_message) + source.status_flags ^= GODMODE + check_area_cached_state = FALSE + return + + check_area_cached_state = TRUE + if(has_godmode) + return + + to_chat(source, gain_message) + source.status_flags ^= GODMODE + +#undef MAP_AREA_TYPE +#undef MAP_ALLOW_AREA_SUBTYPES +#undef DEFAULT_GAIN_MESSAGE +#undef DEFAULT_LOSE_MESSAGE diff --git a/code/datums/components/attached_sticker.dm b/code/datums/components/attached_sticker.dm deleted file mode 100644 index cb37382da968..000000000000 --- a/code/datums/components/attached_sticker.dm +++ /dev/null @@ -1,84 +0,0 @@ -// The attached sticker - -/datum/component/attached_sticker - dupe_mode = COMPONENT_DUPE_ALLOWED - ///The overlay we apply to things we stick to - var/mutable_appearance/sticker_overlay - ///The turf our COMSIG_TURF_EXPOSE is registered to, so we can unregister it later. - var/turf/signal_turf - ///Our physical sticker to drop - var/obj/item/sticker - ///Can we be washed off? - var/washable = TRUE - -/datum/component/attached_sticker/Initialize(px, py, obj/stick, mob/living/user, cleanable=TRUE) - if(!isatom(parent)) - return COMPONENT_INCOMPATIBLE - washable = cleanable - var/atom/atom_parent = parent - sticker = stick - sticker_overlay = mutable_appearance(stick.icon, stick.icon_state , layer = atom_parent.layer + 1, appearance_flags = RESET_COLOR | PIXEL_SCALE) - sticker_overlay.pixel_x = px - sticker_overlay.pixel_y = py - atom_parent.add_overlay(sticker_overlay) - if(isliving(parent) && user) - var/mob/living/victim = parent - if(victim.client) - user.log_message("stuck [sticker] to [key_name(victim)]", LOG_ATTACK) - victim.log_message("had [sticker] stuck to them by [key_name(user)]", LOG_ATTACK) - else if(isturf(parent) && (sticker.resistance_flags & FLAMMABLE)) - //register signals on the users turf instead because we can assume they are on flooring sticking it to a wall so it should burn (otherwise it would fruitlessly check wall temperature) - signal_turf = (user && isclosedturf(parent)) ? get_turf(user) : parent - RegisterSignal(signal_turf, COMSIG_TURF_EXPOSE, PROC_REF(on_turf_expose)) - sticker.moveToNullspace() - -///Move sticker item from nullspace, delete this component, cut overlay -/datum/component/attached_sticker/proc/peel(atom/source) - SIGNAL_HANDLER - if(!parent) // just in case - return - var/atom/as_atom = parent - as_atom.cut_overlay(sticker_overlay) - sticker_overlay = null - if(sticker) - sticker.forceMove(isturf(parent) ? parent : as_atom.drop_location()) - sticker.pixel_y = rand(-4,1) - sticker.pixel_x = rand(-3,3) - sticker = null - qdel(src) - -/datum/component/attached_sticker/RegisterWithParent() - if(sticker.resistance_flags & FLAMMABLE) - RegisterSignal(parent, COMSIG_LIVING_IGNITED, PROC_REF(on_ignite)) - if(washable) - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(peel)) - RegisterSignal(parent, COMSIG_PARENT_QDELETING, PROC_REF(on_attached_qdel)) - -/datum/component/attached_sticker/UnregisterFromParent() - if(sticker.resistance_flags & FLAMMABLE) - UnregisterSignal(parent, list(COMSIG_LIVING_IGNITED, COMSIG_PARENT_QDELETING)) - if(signal_turf) - UnregisterSignal(signal_turf, COMSIG_TURF_EXPOSE) - signal_turf = null - if(washable) - UnregisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT) - -///Signal handler for COMSIG_TURF_EXPOSE, deletes this sticker if the temperature is above 100C and it is flammable -/datum/component/attached_sticker/proc/on_turf_expose(datum/source, datum/gas_mixture/air, exposed_temperature) - SIGNAL_HANDLER - if(exposed_temperature <= FIRE_MINIMUM_TEMPERATURE_TO_EXIST) - return - qdel(sticker) - peel() - -///Signal handler for COMSIG_LIVING_IGNITED, deletes this sticker -/datum/component/attached_sticker/proc/on_ignite(datum/source) - SIGNAL_HANDLER - qdel(sticker) - peel() - -/// Signal handler for COMSIG_PARENT_QDELETING, deletes this sticker if the attached object is deleted -/datum/component/attached_sticker/proc/on_attached_qdel(datum/source) - SIGNAL_HANDLER - qdel(sticker) - peel() diff --git a/code/datums/components/basic_inhands.dm b/code/datums/components/basic_inhands.dm new file mode 100644 index 000000000000..ac50f618861f --- /dev/null +++ b/code/datums/components/basic_inhands.dm @@ -0,0 +1,50 @@ +/** + * Basic handling for showing held items in a mob's hands + */ +/datum/component/basic_inhands + /// Layer index we show our inhands upon + var/display_layer + /// Y offset to apply to inhands + var/y_offset + /// X offset to apply to inhands, is inverted for the left hand + var/x_offset + /// What overlays are we currently showing? + var/list/cached_overlays + +/datum/component/basic_inhands/Initialize(display_layer = 1, y_offset = 0, x_offset = 0) + . = ..() + if (!isliving(parent)) + return COMPONENT_INCOMPATIBLE + src.display_layer = display_layer + src.y_offset = y_offset + src.x_offset = x_offset + cached_overlays = list() + +/datum/component/basic_inhands/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_updated_overlays)) + RegisterSignal(parent, COMSIG_MOB_UPDATE_HELD_ITEMS, PROC_REF(on_updated_held_items)) + +/datum/component/basic_inhands/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, list(COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_MOB_UPDATE_HELD_ITEMS)) + +/// When your overlays update, add your held overlays +/datum/component/basic_inhands/proc/on_updated_overlays(atom/parent_atom, list/overlays) + SIGNAL_HANDLER + overlays += cached_overlays + +/// When your number of held items changes, regenerate held icons +/datum/component/basic_inhands/proc/on_updated_held_items(mob/living/holding_mob) + SIGNAL_HANDLER + var/list/held_overlays = list() + for(var/obj/item/held in holding_mob.held_items) + var/is_right = holding_mob.get_held_index_of_item(held) % 2 == 0 + var/icon_file = is_right ? held.righthand_file : held.lefthand_file + var/mutable_appearance/held_overlay = held.build_worn_icon(default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) + held_overlay.pixel_y += y_offset + held_overlay.pixel_x += x_offset * (is_right ? 1 : -1) + held_overlays += held_overlay + + cached_overlays = held_overlays + holding_mob.update_appearance(UPDATE_OVERLAYS) diff --git a/code/datums/components/basic_mob_attack_telegraph.dm b/code/datums/components/basic_mob_attack_telegraph.dm index 9395937deb68..e693ff61d9ab 100644 --- a/code/datums/components/basic_mob_attack_telegraph.dm +++ b/code/datums/components/basic_mob_attack_telegraph.dm @@ -66,7 +66,7 @@ return ADD_TRAIT(source, TRAIT_BASIC_ATTACK_FORECAST, REF(src)) forget_target(target) - source.melee_attack(target) + source.melee_attack(target, ignore_cooldown = TRUE) // We already started the cooldown when we triggered the forecast /// The guy we're trying to attack moved, is he still in range? /datum/component/basic_mob_attack_telegraph/proc/target_moved(atom/target) diff --git a/code/datums/components/blob_minion.dm b/code/datums/components/blob_minion.dm new file mode 100644 index 000000000000..876ddc87cfeb --- /dev/null +++ b/code/datums/components/blob_minion.dm @@ -0,0 +1,154 @@ +/** + * Common behaviour shared by things which are minions to a blob + */ +/datum/component/blob_minion + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + /// Overmind who is our boss + var/mob/camera/blob/overmind + /// Callback to run if overmind strain changes + var/datum/callback/on_strain_changed + +/datum/component/blob_minion/Initialize(mob/camera/blob/overmind, datum/callback/on_strain_changed) + . = ..() + if (!isliving(parent)) + return COMPONENT_INCOMPATIBLE + src.on_strain_changed = on_strain_changed + register_overlord(overmind) + +/datum/component/blob_minion/InheritComponent(datum/component/new_comp, i_am_original, mob/camera/blob/overmind, datum/callback/on_strain_changed) + if (!isnull(on_strain_changed)) + src.on_strain_changed = on_strain_changed + register_overlord(overmind) + +/datum/component/blob_minion/proc/register_overlord(mob/camera/blob/overmind) + if (isnull(overmind)) + return + src.overmind = overmind + overmind.register_new_minion(parent) + RegisterSignal(overmind, COMSIG_PARENT_QDELETING, PROC_REF(overmind_deleted)) + RegisterSignal(overmind, COMSIG_BLOB_SELECTED_STRAIN, PROC_REF(overmind_properties_changed)) + overmind_properties_changed(overmind, overmind.blobstrain) + +/// Our overmind is gone, uh oh! +/datum/component/blob_minion/proc/overmind_deleted() + SIGNAL_HANDLER + overmind = null + overmind_properties_changed() + +/// Our overmind has changed colour and properties +/datum/component/blob_minion/proc/overmind_properties_changed(mob/camera/blob/overmind, datum/blobstrain/new_strain) + SIGNAL_HANDLER + var/mob/living/living_parent = parent + living_parent.update_appearance(UPDATE_ICON) + on_strain_changed?.Invoke(overmind, new_strain) + +/datum/component/blob_minion/RegisterWithParent() + var/mob/living/living_parent = parent + living_parent.pass_flags |= PASSBLOB + living_parent.faction |= ROLE_BLOB + ADD_TRAIT(parent, TRAIT_BLOB_ALLY, REF(src)) + remove_verb(parent, /mob/living/verb/pulled) // No dragging people into the blob + RegisterSignal(parent, COMSIG_MOB_MIND_INITIALIZED, PROC_REF(on_mind_init)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON, PROC_REF(on_update_appearance)) + RegisterSignal(parent, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(on_update_status_tab)) + RegisterSignal(parent, COMSIG_ATOM_BLOB_ACT, PROC_REF(on_blob_touched)) + RegisterSignal(parent, COMSIG_ATOM_FIRE_ACT, PROC_REF(on_burned)) + RegisterSignal(parent, COMSIG_ATOM_TRIED_PASS, PROC_REF(on_attempted_pass)) + RegisterSignal(parent, COMSIG_MOVABLE_SPACEMOVE, PROC_REF(on_space_move)) + RegisterSignal(parent, COMSIG_LIVING_TRY_SPEECH, PROC_REF(on_try_speech)) + RegisterSignal(parent, COMSIG_MOB_CHANGED_TYPE, PROC_REF(on_transformed)) + living_parent.update_appearance(UPDATE_ICON) + GLOB.blob_telepathy_mobs |= parent + +/datum/component/blob_minion/UnregisterFromParent() + if (!isnull(overmind)) + overmind.blob_mobs -= parent + var/mob/living/living_parent = parent + living_parent.pass_flags &= ~PASSBLOB + living_parent.faction -= ROLE_BLOB + REMOVE_TRAIT(parent, TRAIT_BLOB_ALLY, REF(src)) + add_verb(parent, /mob/living/verb/pulled) + UnregisterSignal(parent, list( + COMSIG_ATOM_BLOB_ACT, + COMSIG_ATOM_FIRE_ACT, + COMSIG_ATOM_TRIED_PASS, + COMSIG_ATOM_UPDATE_ICON, + COMSIG_LIVING_TRY_SPEECH, + COMSIG_MOB_CHANGED_TYPE, + COMSIG_MOB_GET_STATUS_TAB_ITEMS, + COMSIG_MOB_MIND_INITIALIZED, + COMSIG_MOVABLE_SPACEMOVE, + )) + GLOB.blob_telepathy_mobs -= parent + +/// Become blobpilled when we gain a mind +/datum/component/blob_minion/proc/on_mind_init(mob/living/minion, datum/mind/new_mind) + SIGNAL_HANDLER + if (isnull(overmind)) + return + var/datum/antagonist/blob_minion/minion_motive = new(overmind) + new_mind.add_antag_datum(minion_motive) + +/// When our icon is updated, update our colour too +/datum/component/blob_minion/proc/on_update_appearance(mob/living/minion) + SIGNAL_HANDLER + if(isnull(overmind)) + minion.remove_atom_colour(FIXED_COLOUR_PRIORITY) + return + minion.add_atom_colour(overmind.blobstrain.color, FIXED_COLOUR_PRIORITY) + +/// When our icon is updated, update our colour too +/datum/component/blob_minion/proc/on_update_status_tab(mob/living/minion, list/status_items) + SIGNAL_HANDLER + if (isnull(overmind)) + return + status_items += "Blobs to Win: [length(overmind.blobs_legit)]/[overmind.blobwincount]" + +/// If we feel the gentle caress of a blob, we feel better +/datum/component/blob_minion/proc/on_blob_touched(mob/living/minion) + SIGNAL_HANDLER + if(minion.stat == DEAD || minion.health >= minion.maxHealth) + return COMPONENT_CANCEL_BLOB_ACT // Don't hurt us in order to heal us + for(var/i in 1 to 2) + var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(parent)) // hello yes you are being healed + heal_effect.color = isnull(overmind) ? COLOR_BLACK : overmind.blobstrain.complementary_color + minion.heal_overall_damage(minion.maxHealth * BLOBMOB_HEALING_MULTIPLIER) + return COMPONENT_CANCEL_BLOB_ACT + +/// If we feel the fearsome bite of open flame, we feel worse +/datum/component/blob_minion/proc/on_burned(mob/living/minion, exposed_temperature, exposed_volume) + SIGNAL_HANDLER + if(isnull(exposed_temperature)) + minion.adjustFireLoss(5) + return + minion.adjustFireLoss(clamp(0.01 * exposed_temperature, 1, 5)) + +/// Someone is attempting to move through us, allow it if it is a blob tile +/datum/component/blob_minion/proc/on_attempted_pass(mob/living/minion, atom/movable/incoming) + SIGNAL_HANDLER + if(istype(incoming, /obj/structure/blob)) + return COMSIG_COMPONENT_PERMIT_PASSAGE + +/// If we're near a blob, stop drifting +/datum/component/blob_minion/proc/on_space_move(mob/living/minion) + SIGNAL_HANDLER + var/obj/structure/blob/blob_handhold = locate() in range(1, parent) + if (!isnull(blob_handhold)) + return COMSIG_MOVABLE_STOP_SPACEMOVE + +/// We only speak telepathically to blobs +/datum/component/blob_minion/proc/on_try_speech(mob/living/minion, message, ignore_spam, forced) + SIGNAL_HANDLER + var/spanned_message = minion.say_quote(message) + var/rendered = span_blob("\[Blob Telepathy\] [minion.real_name] [spanned_message]") + relay_to_list_and_observers(rendered, GLOB.blob_telepathy_mobs, minion) + return COMPONENT_CANNOT_SPEAK + +/// Called when a blob minion is transformed into something else, hopefully a spore into a zombie +/datum/component/blob_minion/proc/on_transformed(mob/living/minion, mob/living/replacement) + SIGNAL_HANDLER + overmind?.assume_direct_control(replacement) + +/datum/component/blob_minion/PostTransfer() + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE diff --git a/code/datums/components/breeding.dm b/code/datums/components/breeding.dm new file mode 100644 index 000000000000..9f5a9e278f1f --- /dev/null +++ b/code/datums/components/breeding.dm @@ -0,0 +1,76 @@ +/* + * A component to allow us to breed + */ +/datum/component/breed + /// additional mobs we can breed with + var/list/can_breed_with + ///path of the baby + var/baby_path + ///time to wait after breeding + var/breed_timer + ///AI key we set when we're ready to breed + var/breed_key = BB_BREED_READY + ///are we ready to breed? + var/ready_to_breed = TRUE + ///callback after we give birth to the child + var/datum/callback/post_birth + +/datum/component/breed/Initialize(list/can_breed_with = list(), breed_timer = 40 SECONDS, baby_path, post_birth) + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + + if(ishuman(parent)) //sin detected + return COMPONENT_INCOMPATIBLE + + if(!ispath(baby_path)) + stack_trace("attempted to add a breeding component with invalid baby path!") + return + + src.can_breed_with = can_breed_with + src.breed_timer = breed_timer + src.baby_path = baby_path + src.post_birth = post_birth + + ADD_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + +/datum/component/breed/RegisterWithParent() + RegisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(breed_with_partner)) + ADD_TRAIT(parent, TRAIT_MOB_BREEDER, REF(src)) + var/mob/living/parent_mob = parent + parent_mob.ai_controller?.set_blackboard_key(breed_key, TRUE) + +/datum/component/breed/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET) + REMOVE_TRAIT(parent, TRAIT_MOB_BREEDER, REF(src)) + post_birth = null + + +/datum/component/breed/proc/breed_with_partner(mob/living/source, mob/living/target) + SIGNAL_HANDLER + + if(source.istate & ISTATE_HARM) + return + + if(!is_type_in_typecache(target, can_breed_with)) + return + + if(!HAS_TRAIT(target, TRAIT_MOB_BREEDER) || target.gender == source.gender) + return + + if(!ready_to_breed) + source.balloon_alert(source, "not ready!") + return COMPONENT_HOSTILE_NO_ATTACK + + var/turf/delivery_destination = get_turf(source) + var/mob/living/baby = new baby_path(delivery_destination) + new /obj/effect/temp_visual/heart(delivery_destination) + toggle_status(source) + + addtimer(CALLBACK(src, PROC_REF(toggle_status), source), breed_timer) + post_birth?.Invoke(baby, target) + return COMPONENT_HOSTILE_NO_ATTACK + +/datum/component/breed/proc/toggle_status(mob/living/source) + ready_to_breed = !ready_to_breed + source.ai_controller?.set_blackboard_key(BB_BREED_READY, ready_to_breed) + diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm index 2f0175b1eee3..4ff742004592 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -87,10 +87,8 @@ log_combat(user, H, "wounded via throat slitting", source) H.apply_damage(source.force, BRUTE, BODY_ZONE_HEAD, wound_bonus=CANT_WOUND) // easy tiger, we'll get to that in a sec var/obj/item/bodypart/slit_throat = H.get_bodypart(BODY_ZONE_HEAD) - if(slit_throat) - var/datum/wound/slash/critical/screaming_through_a_slit_throat = new - screaming_through_a_slit_throat.apply_wound(slit_throat) - H.apply_status_effect(/datum/status_effect/neck_slice) + if (H.cause_wound_of_type_and_severity(WOUND_SLASH, slit_throat, WOUND_SEVERITY_CRITICAL)) + H.apply_status_effect(/datum/status_effect/neck_slice) /** * Handles a user butchering a target diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index dbcacdfeaaf4..afbe6de22228 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -137,7 +137,7 @@ dropped_thing.visible_message(span_boldwarning("[dropped_thing] falls into [parent]!"), span_userdanger("[oblivion_message]")) if (isliving(dropped_thing)) var/mob/living/falling_mob = dropped_thing - falling_mob.notransform = TRUE + ADD_TRAIT(falling_mob, TRAIT_NO_TRANSFORM, REF(src)) falling_mob.Paralyze(20 SECONDS) var/oldtransform = dropped_thing.transform @@ -174,7 +174,7 @@ else if(isliving(dropped_thing)) var/mob/living/fallen_mob = dropped_thing - fallen_mob.notransform = FALSE + REMOVE_TRAIT(fallen_mob, TRAIT_NO_TRANSFORM, REF(src)) if (fallen_mob.stat != DEAD) fallen_mob.investigate_log("has died from falling into a chasm.", INVESTIGATE_DEATHS) fallen_mob.death(TRUE) diff --git a/code/datums/components/crafting/melee_weapon.dm b/code/datums/components/crafting/melee_weapon.dm index 0d50bf077e68..af41a4900d3e 100644 --- a/code/datums/components/crafting/melee_weapon.dm +++ b/code/datums/components/crafting/melee_weapon.dm @@ -142,3 +142,12 @@ ) time = 10 SECONDS category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/sharpmop + name = "Sharpened Mop" + result = /obj/item/mop/sharp + time = 30 + reqs = list(/obj/item/mop = 1, + /obj/item/shard = 1) + category = CAT_WEAPON_MELEE + tool_behaviors = list(TOOL_WIRECUTTER) diff --git a/code/datums/components/cult_ritual_item.dm b/code/datums/components/cult_ritual_item.dm index b76c1fd7acb8..5922e05586fa 100644 --- a/code/datums/components/cult_ritual_item.dm +++ b/code/datums/components/cult_ritual_item.dm @@ -304,7 +304,7 @@ ) if(cultist.blood_volume) - cultist.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM), wound_bonus = CANT_WOUND) // *cuts arm* *bone explodes* ever have one of those days? + cultist.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick(GLOB.arm_zones), wound_bonus = CANT_WOUND) // *cuts arm* *bone explodes* ever have one of those days? var/scribe_mod = initial(rune_to_scribe.scribe_delay) if(!initial(rune_to_scribe.no_scribe_boost) && (our_turf.type in turfs_that_boost_us)) diff --git a/code/datums/components/curse_of_polymorph.dm b/code/datums/components/curse_of_polymorph.dm new file mode 100644 index 000000000000..bbfb6c842e30 --- /dev/null +++ b/code/datums/components/curse_of_polymorph.dm @@ -0,0 +1,36 @@ +/** + * curse of polymorph component; + * + * Used as a rpgloot suffix and wizard spell! + */ +/datum/component/curse_of_polymorph + var/polymorph_type + +/datum/component/curse_of_polymorph/Initialize(polymorph_type) + . = ..() + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + src.polymorph_type = polymorph_type + +/datum/component/curse_of_polymorph/RegisterWithParent() + . = ..() + var/obj/item/cursed_item = parent + RegisterSignal(cursed_item, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) + +/datum/component/curse_of_polymorph/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, list( + COMSIG_ITEM_EQUIPPED, + )) + +///signal called from equipping parent +/datum/component/curse_of_polymorph/proc/on_equip(datum/source, mob/living/equipper, slot) + SIGNAL_HANDLER + var/obj/item/polymorpher_item = parent + // Items with no slot flags curse on pickup (because hand slot) + if(polymorpher_item.slot_flags && !(polymorpher_item.slot_flags & slot)) + return + ASYNC + equipper.dropItemToGround(polymorpher_item, TRUE) + equipper.wabbajack(polymorph_type) + diff --git a/code/datums/components/damage_chain.dm b/code/datums/components/damage_chain.dm new file mode 100644 index 000000000000..e472083c4a11 --- /dev/null +++ b/code/datums/components/damage_chain.dm @@ -0,0 +1,112 @@ +/** + * Draws a line between you and another atom, hurt anyone stood in the line + */ +/datum/component/damage_chain + dupe_mode = COMPONENT_DUPE_ALLOWED + /// How often do we attempt to deal damage? + var/tick_interval + /// Tracks when we can next deal damage + COOLDOWN_DECLARE(tick_cooldown) + /// Damage inflicted per tick + var/damage_per_tick + /// Type of damage to inflict + var/damage_type + /// Optional callback which checks if we can damage the target + var/datum/callback/validate_target + /// Optional callback for additional visuals or text display when dealing damage + var/datum/callback/chain_damage_feedback + /// We will fire the damage feedback callback on every x successful attacks + var/feedback_interval + /// How many successful attacks have we made? + var/successful_attacks = 0 + /// Time between making any attacks at which we just reset the successful attack counter + var/reset_feedback_timer = 0 + /// Our chain + var/datum/beam/chain + +/datum/component/damage_chain/Initialize( + atom/linked_to, + max_distance = 7, + beam_icon = 'icons/effects/beam.dmi', + beam_state = "medbeam", + beam_type = /obj/effect/ebeam, + tick_interval = 0.3 SECONDS, + damage_per_tick = 1.2, + damage_type = BURN, + datum/callback/validate_target = null, + datum/callback/chain_damage_feedback = null, + feedback_interval = 5, +) + . = ..() + if (!isatom(parent)) + return COMPONENT_INCOMPATIBLE + if (!isatom(linked_to)) + CRASH("Attempted to create [type] linking [parent.type] with non-atom [linked_to]!") + + src.tick_interval = tick_interval + src.damage_per_tick = damage_per_tick + src.damage_type = damage_type + src.validate_target = validate_target + src.chain_damage_feedback = chain_damage_feedback + src.feedback_interval = feedback_interval + + var/atom/atom_parent = parent + chain = atom_parent.Beam(linked_to, icon = beam_icon, icon_state = beam_state, beam_type = beam_type, maxdistance = max_distance) + RegisterSignal(chain, COMSIG_PARENT_QDELETING, PROC_REF(end_beam)) + START_PROCESSING(SSfastprocess, src) + +/datum/component/damage_chain/RegisterWithParent() + RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(end_beam)) // We actually don't really use many signals it's all processing + +/datum/component/damage_chain/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_LIVING_DEATH) + +/datum/component/damage_chain/Destroy(force, silent) + if (!QDELETED(chain)) + UnregisterSignal(chain, COMSIG_PARENT_QDELETING) + QDEL_NULL(chain) + chain = null + STOP_PROCESSING(SSfastprocess, src) + return ..() + +/// Destroy ourself +/datum/component/damage_chain/proc/end_beam() + SIGNAL_HANDLER + qdel(src) + +/datum/component/damage_chain/process(seconds_per_tick) + var/successful_hit = FALSE + var/list/target_turfs = list() + for(var/obj/effect/ebeam/chainpart in chain.elements) + if (isnull(chainpart) || !chainpart.x || !chainpart.y || !chainpart.z) + continue + var/turf/overlaps = get_turf_pixel(chainpart) + target_turfs |= overlaps + if(overlaps == get_turf(chain.origin) || overlaps == get_turf(chain.target)) + continue + for(var/turf/nearby_turf in circle_range(overlaps, 1)) + target_turfs |= nearby_turf + + for(var/turf/hit_turf as anything in target_turfs) + for(var/mob/living/victim in hit_turf) + if (victim == parent || victim.stat == DEAD) + continue + if (!isnull(validate_target) && !validate_target.Invoke(victim)) + continue + if (successful_attacks == 0) + chain_damage_feedback?.Invoke(victim) + victim.apply_damage(damage_per_tick, damage_type, wound_bonus = CANT_WOUND) + successful_hit = TRUE + + if (isnull(chain_damage_feedback)) + return + if (successful_hit) + successful_attacks++ + reset_feedback_timer = addtimer(CALLBACK(src, PROC_REF(reset_feedback)), 10 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE|TIMER_DELETE_ME) + if (successful_attacks > feedback_interval) + reset_feedback() + +/// Make it so that the next time we hit something we'll invoke the feedback callback +/datum/component/damage_chain/proc/reset_feedback() + successful_attacks = 0 + deltimer(reset_feedback_timer) diff --git a/code/datums/components/direct_explosive_trap.dm b/code/datums/components/direct_explosive_trap.dm new file mode 100644 index 000000000000..136c29afc11d --- /dev/null +++ b/code/datums/components/direct_explosive_trap.dm @@ -0,0 +1,85 @@ +/** + * Responds to certain signals and 'explodes' on the person using the item. + * Differs from `interaction_booby_trap` in that this doesn't actually explode, it just directly calls ex_act on one person. + */ +/datum/component/direct_explosive_trap + /// An optional mob to inform about explosions + var/mob/living/saboteur + /// Amount of force to apply + var/explosive_force + /// Colour for examine notification + var/glow_colour + /// Optional additional target checks before we go off + var/datum/callback/explosive_checks + /// Signals which set off the bomb, must pass a mob as the first non-source argument + var/list/triggering_signals + +/datum/component/direct_explosive_trap/Initialize( + mob/living/saboteur, + explosive_force = EXPLODE_HEAVY, + expire_time = 1 MINUTES, + glow_colour = COLOR_RED, + datum/callback/explosive_checks, + list/triggering_signals = list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BUMPED) +) + . = ..() + if (!isatom(parent)) + return COMPONENT_INCOMPATIBLE + src.saboteur = saboteur + src.explosive_force = explosive_force + src.glow_colour = glow_colour + src.explosive_checks = explosive_checks + src.triggering_signals = triggering_signals + + if (expire_time > 0) + addtimer(CALLBACK(src, PROC_REF(bomb_expired)), expire_time, TIMER_DELETE_ME) + +/datum/component/direct_explosive_trap/RegisterWithParent() + if (!(COMSIG_PARENT_EXAMINE in triggering_signals)) // Maybe you're being extra mean with this one + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examined)) + RegisterSignals(parent, triggering_signals, PROC_REF(explode)) + if (!isnull(saboteur)) + RegisterSignal(saboteur, COMSIG_PARENT_QDELETING, PROC_REF(on_bomber_deleted)) + +/datum/component/direct_explosive_trap/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_PARENT_EXAMINE) + triggering_signals) + if (!isnull(saboteur)) + UnregisterSignal(saboteur, COMSIG_PARENT_QDELETING) + +/datum/component/direct_explosive_trap/Destroy(force, silent) + if (isnull(saboteur)) + return ..() + UnregisterSignal(saboteur, COMSIG_PARENT_QDELETING) + saboteur = null + return ..() + +/// Called if we sit too long without going off +/datum/component/direct_explosive_trap/proc/bomb_expired() + if (!isnull(saboteur)) + to_chat(saboteur, span_bolddanger("Failure! Your trap didn't catch anyone this time...")) + qdel(src) + +/// Let people know something is up +/datum/component/direct_explosive_trap/proc/on_examined(datum/source, mob/user, text) + SIGNAL_HANDLER + text += span_holoparasite("It glows with a strange light...") + +/// Blow up +/datum/component/direct_explosive_trap/proc/explode(atom/source, mob/living/victim) + SIGNAL_HANDLER + if (!isliving(victim)) + return + if (!isnull(explosive_checks) && !explosive_checks.Invoke(victim)) + return + to_chat(victim, span_bolddanger("[source] was boobytrapped!")) + if (!isnull(saboteur)) + to_chat(saboteur, span_bolddanger("Success! Your trap on [source] caught [victim.name]!")) + playsound(source, 'sound/effects/explosion2.ogg', 200, TRUE) + new /obj/effect/temp_visual/explosion(get_turf(source)) + EX_ACT(victim, explosive_force) + qdel(src) + +/// Don't hang a reference to the person who placed the bomb +/datum/component/direct_explosive_trap/proc/on_bomber_deleted() + SIGNAL_HANDLER + saboteur = null diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm index 8c69fd8100f5..f0c82e61ddf4 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -93,7 +93,8 @@ if(harmful) victim.throw_alert(ALERT_EMBEDDED_OBJECT, /atom/movable/screen/alert/embeddedobject) playsound(victim,'sound/weapons/bladeslice.ogg', 40) - weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody! + if (limb.can_bleed()) + weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody! damage += weapon.w_class * impact_pain_mult victim.add_mood_event("embedded", /datum/mood_event/embedded) @@ -303,7 +304,7 @@ return var/damage = weapon.w_class * remove_pain_mult limb.receive_damage(brute=(1-pain_stam_pct) * damage * 1.5, sharpness=SHARP_EDGED) // Performs exit wounds and flings the user to the caster if nearby - limb.force_wound_upwards(/datum/wound/pierce/moderate) + victim.cause_wound_of_type_and_severity(WOUND_PIERCE, limb, WOUND_SEVERITY_MODERATE) victim.stamina.adjust(-pain_stam_pct * damage) playsound(get_turf(victim), 'sound/effects/wounds/blood2.ogg', 50, TRUE) diff --git a/code/datums/components/explodable.dm b/code/datums/components/explodable.dm index bf59f7aa3bb5..0cb2a5458024 100644 --- a/code/datums/components/explodable.dm +++ b/code/datums/components/explodable.dm @@ -91,13 +91,16 @@ detonate() ///Called when you attack a specific body part of the thing this is equipped on. Useful for exploding pants. -/datum/component/explodable/proc/explodable_attack_zone(datum/source, damage, damagetype, def_zone) +/datum/component/explodable/proc/explodable_attack_zone(datum/source, damage, damagetype, def_zone, ...) SIGNAL_HANDLER if(!def_zone) return if(damagetype != BURN) //Don't bother if it's not fire. return + if(isbodypart(def_zone)) + var/obj/item/bodypart/hitting = def_zone + def_zone = hitting.body_zone if(!is_hitting_zone(def_zone)) //You didn't hit us! ha! return detonate() diff --git a/code/datums/components/fantasy/_fantasy.dm b/code/datums/components/fantasy/_fantasy.dm index 164d97aefd46..31f969e61932 100644 --- a/code/datums/components/fantasy/_fantasy.dm +++ b/code/datums/components/fantasy/_fantasy.dm @@ -17,16 +17,18 @@ if(!isitem(parent)) return COMPONENT_INCOMPATIBLE - src.quality = quality || randomQuality() + src.quality = quality + if(isnull(src.quality)) + src.quality = random_quality() src.canFail = canFail src.announce = announce src.affixes = affixes appliedComponents = list() if(affixes && affixes.len) - setAffixes() + set_affixes() else - randomAffixes() + random_affixes() /datum/component/fantasy/Destroy() unmodify() @@ -37,6 +39,11 @@ var/obj/item/master = parent originalName = master.name modify() + RegisterSignal(parent, COMSIG_STACK_CAN_MERGE, PROC_REF(try_merge_stack)) + +/datum/component/fantasy/proc/try_merge_stack(obj/item/stack/to_merge, in_hand) + SIGNAL_HANDLER + return CANCEL_STACK_MERGE /datum/component/fantasy/UnregisterFromParent() unmodify() @@ -53,14 +60,20 @@ src.announce = announce || src.announce modify() -/datum/component/fantasy/proc/randomQuality() +/datum/component/fantasy/proc/random_quality() var/quality = pick(1;15, 2;14, 2;13, 2;12, 3;11, 3;10, 3;9, 4;8, 4;7, 4;6, 5;5, 5;4, 5;3, 6;2, 6;1, 6;0) if(prob(50)) quality = -quality return quality ///proc on creation for random affixes -/datum/component/fantasy/proc/randomAffixes(force) +/datum/component/fantasy/proc/random_affixes(force) + var/alignment + if(quality >= 0) + alignment |= AFFIX_GOOD + if(quality <= 0) + alignment |= AFFIX_EVIL + if(!affixListing) affixListing = list() for(var/T in subtypesof(/datum/fantasy_affix)) @@ -72,12 +85,6 @@ return affixes = list() - var/alignment - if(quality >= 0) - alignment |= AFFIX_GOOD - if(quality <= 0) - alignment |= AFFIX_EVIL - var/usedSlots = NONE for(var/i in 1 to max(1, abs(quality))) // We want at least 1 affix applied var/datum/fantasy_affix/affix = pick_weight(affixListing) @@ -91,7 +98,7 @@ usedSlots |= affix.placement ///proc on creation for specific affixes given to the fantasy component -/datum/component/fantasy/proc/setAffixes(force) +/datum/component/fantasy/proc/set_affixes(force) var/usedSlots = NONE for(var/datum/fantasy_affix/affix in affixes) // We want at least 1 affix applied if((affix.placement & usedSlots) || (!affix.validate(parent))) @@ -101,12 +108,7 @@ /datum/component/fantasy/proc/modify() var/obj/item/master = parent - - master.force = max(0, master.force + quality) - master.throwforce = max(0, master.throwforce + quality) - master.set_armor(master.get_armor().generate_new_with_modifiers(list(ARMOR_ALL = quality))) - master.wound_bonus += quality - master.bare_wound_bonus += quality + master.apply_fantasy_bonuses(quality) var/newName = originalName for(var/i in affixes) @@ -121,10 +123,10 @@ place.visible_message(span_danger("[parent] [span_blue("violently glows blue")] for a while, then evaporates.")) master.burn() return - else if(announce) - announce() master.name = newName + if(announce) + announce() /datum/component/fantasy/proc/unmodify() var/obj/item/master = parent @@ -133,12 +135,7 @@ var/datum/fantasy_affix/affix = i affix.remove(src) QDEL_LIST(appliedComponents) - - master.force = max(0, master.force - quality) - master.throwforce = max(0, master.throwforce - quality) - master.set_armor(master.get_armor().generate_new_with_modifiers(list(ARMOR_ALL = -quality))) - master.wound_bonus -= quality - master.bare_wound_bonus -= quality + master.remove_fantasy_bonuses(quality) master.name = originalName @@ -153,4 +150,4 @@ span = "" effect_description = span_bold("mottled black glow") - location.visible_message("[span][originalName] is covered by a [effect_description] and then transforms into [parent]!") + location.visible_message("[span]The [originalName] is covered by a [effect_description] and then transforms into [parent]!") diff --git a/code/datums/components/fantasy/prefixes.dm b/code/datums/components/fantasy/prefixes.dm index 8ac9aa0cef80..cd80a1143130 100644 --- a/code/datums/components/fantasy/prefixes.dm +++ b/code/datums/components/fantasy/prefixes.dm @@ -145,7 +145,6 @@ var/obj/item/master = comp.parent master.RemoveElement(/datum/element/venomous) - /datum/fantasy_affix/soul_stealer name = "soul-stealing" placement = AFFIX_PREFIX diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm index 4e38d61b0d18..c8809efae491 100644 --- a/code/datums/components/fantasy/suffixes.dm +++ b/code/datums/components/fantasy/suffixes.dm @@ -42,9 +42,16 @@ /datum/fantasy_affix/cosmetic_suffixes/apply(datum/component/fantasy/comp, newName) if(comp.quality > 0 || (comp.quality == 0 && prob(50))) - return "[newName] of [pick(goodSuffixes)]" + . = "[newName] of [pick(goodSuffixes)]" + if(comp.quality >= 10) + START_PROCESSING(SSprocessing, src) + if(comp.quality >= 15) + comp.parent.AddComponent(/datum/component/unusual_effect, color = "#FFEA0030", include_particles = TRUE) + else + comp.parent.AddComponent(/datum/component/unusual_effect, color = "#FFBF0030") else - return "[newName] of [pick(badSuffixes)]" + . = "[newName] of [pick(badSuffixes)]" + return . //////////// Good suffixes /datum/fantasy_affix/bane @@ -189,11 +196,13 @@ name = "curse of hunger" placement = AFFIX_SUFFIX alignment = AFFIX_EVIL + weight = 5 /datum/fantasy_affix/curse_of_hunger/validate(obj/item/attached) - //curse of hunger that attaches onto food has the ability to eat itself. it's hilarious. - if(!IS_EDIBLE(attached)) - return TRUE + // Curse of hunger can be really unbearable to deal with, + // so it should not start on someone or in a bag. + if(!isturf(attached.loc)) + return FALSE return TRUE /datum/fantasy_affix/curse_of_hunger/apply(datum/component/fantasy/comp, newName) @@ -201,10 +210,64 @@ var/obj/item/master = comp.parent var/filter_color = "#8a0c0ca1" //clarified args var/new_name = pick(", eternally hungry", " of the glutton", " cursed with hunger", ", consumer of all", " of the feast") - master.AddElement(/datum/element/curse_announcement, "[master] is cursed with the curse of hunger!", filter_color, new_name, comp) + master.AddElement(/datum/element/curse_announcement, "[master] is cursed with the curse of hunger!", filter_color, "", comp) comp.appliedComponents += master.AddComponent(/datum/component/curse_of_hunger) - return newName //no spoilers! + return "[newName][new_name]" /datum/fantasy_affix/curse_of_hunger/remove(datum/component/fantasy/comp) var/obj/item/master = comp.parent master.RemoveElement(/datum/element/curse_announcement) //just in case + +/datum/fantasy_affix/curse_of_polymorph + name = "curse of polymorph" + placement = AFFIX_SUFFIX + alignment = AFFIX_EVIL + +/datum/fantasy_affix/curse_of_polymorph/validate(obj/item/attached) + // Don't start on someone so that it doesn't immediately polymorph them. + if(ismob(attached.loc)) + return FALSE + if(!isclothing(attached)) + return FALSE + return TRUE + +/datum/fantasy_affix/curse_of_polymorph/apply(datum/component/fantasy/comp, newName) + . = ..() + var/obj/item/master = comp.parent + var/filter_color = "#800080a1" //clarified args + var/new_name = pick(", transforming", " of the polymorph", " cursed with polymorphing", ", changer of all", " of changing") + var/static/list/possible_results = list( + WABBAJACK_MONKEY, + WABBAJACK_ROBOT, + WABBAJACK_SLIME, + WABBAJACK_XENO, + WABBAJACK_HUMAN, + WABBAJACK_ANIMAL, + ) + master.AddElement(/datum/element/curse_announcement, "[master] is cursed with the curse of polymorph!", filter_color, "", comp) + comp.appliedComponents += master.AddComponent(/datum/component/curse_of_polymorph, pick(possible_results)) + return "[newName][new_name]" + +/datum/fantasy_affix/curse_of_polymorph/remove(datum/component/fantasy/comp) + var/obj/item/master = comp.parent + master.RemoveElement(/datum/element/curse_announcement) //just in case + +/datum/fantasy_affix/speed + name = "of speed" + placement = AFFIX_SUFFIX + alignment = AFFIX_GOOD + +/datum/fantasy_affix/speed/validate(obj/item/attached) + if(!istype(attached, /obj/item/clothing/shoes)) + return FALSE + return TRUE + +/datum/fantasy_affix/speed/apply(datum/component/fantasy/comp, newName) + . = ..() + var/obj/item/master = comp.parent + master.slowdown = min(-comp.quality / 5, master.slowdown) + return "[newName] of speed" + +/datum/fantasy_affix/speed/remove(datum/component/fantasy/comp) + var/obj/item/master = comp.parent + master.slowdown = initial(master.slowdown) diff --git a/code/datums/components/focused_attacker.dm b/code/datums/components/focused_attacker.dm new file mode 100644 index 000000000000..2cc0890016ff --- /dev/null +++ b/code/datums/components/focused_attacker.dm @@ -0,0 +1,71 @@ +/** + * Increases our attack damage every time we attack the same target + * Not compatible with any other component or status effect which modifies attack damage + */ +/datum/component/focused_attacker + /// Amount of damage we gain per attack + var/gain_per_attack + /// Maximum amount by which we can increase our attack power + var/maximum_gain + /// The last thing we attacked + var/atom/last_target + +/datum/component/focused_attacker/Initialize(gain_per_attack = 5, maximum_gain = 25) + . = ..() + if (!isliving(parent) && !isitem(parent)) + return COMPONENT_INCOMPATIBLE + src.maximum_gain = maximum_gain + src.gain_per_attack = gain_per_attack + +/datum/component/focused_attacker/Destroy(force, silent) + if (!isnull(last_target)) + UnregisterSignal(last_target, COMSIG_PARENT_QDELETING) + return ..() + +/datum/component/focused_attacker/RegisterWithParent() + if (isliving(parent)) + RegisterSignals(parent, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK), PROC_REF(pre_mob_attack)) + else + RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, PROC_REF(pre_item_attack)) + +/datum/component/focused_attacker/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_ITEM_PRE_ATTACK)) + +/// Before a mob attacks, try increasing its attack power +/datum/component/focused_attacker/proc/pre_mob_attack(mob/living/attacker, atom/target) + SIGNAL_HANDLER + if (isnull(target) || isturf(target)) + return + if (target == last_target) + if (attacker.melee_damage_lower - initial(attacker.melee_damage_lower) >= maximum_gain) + return + attacker.melee_damage_lower += gain_per_attack + attacker.melee_damage_upper += gain_per_attack + return + + attacker.melee_damage_lower = initial(attacker.melee_damage_lower) + attacker.melee_damage_upper = initial(attacker.melee_damage_upper) + register_new_target(target) + +/// Before an item attacks, try increasing its attack power +/datum/component/focused_attacker/proc/pre_item_attack(obj/item/weapon, atom/target, mob/user, params) + SIGNAL_HANDLER + if (target == last_target) + if (weapon.force - initial(weapon.force) < maximum_gain) + weapon.force += gain_per_attack + return + + weapon.force = initial(weapon.force) + register_new_target(target) + +/// Register a new target +/datum/component/focused_attacker/proc/register_new_target(atom/target) + if (!isnull(last_target)) + UnregisterSignal(last_target, COMSIG_PARENT_QDELETING) + last_target = target + RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(on_target_deleted)) + +/// Drop our target ref on deletion +/datum/component/focused_attacker/proc/on_target_deleted(target) + SIGNAL_HANDLER + last_target = null diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index 221d4945c0e2..07d5763c6654 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -42,6 +42,9 @@ Behavior that's still missing from this component that original food items had t var/list/tastes ///The buffs these foods give when eaten var/food_buffs + ///how many bites we can get + var/total_bites = 0 + var/current_mask /datum/component/edible/Initialize( list/initial_reagents, @@ -74,6 +77,7 @@ Behavior that's still missing from this component that original food items had t src.tastes = string_assoc_list(tastes) src.check_liked = check_liked + setup_initial_reagents(initial_reagents) /datum/component/edible/RegisterWithParent() @@ -214,6 +218,8 @@ Behavior that's still missing from this component that original food items had t else owner.reagents.add_reagent(rid, amount) + total_bites = round(owner.reagents.total_volume / bite_consumption) + /datum/component/edible/proc/examine(datum/source, mob/user, list/examine_list) SIGNAL_HANDLER @@ -310,7 +316,12 @@ Behavior that's still missing from this component that original food items had t var/atom/owner = parent - if((feeder.istate & ISTATE_HARM)) + var/obj/item/food/foodstuff + + if(istype(owner, /obj/item/food)) + foodstuff = owner + + if((feeder.istate & ISTATE_HARM) && !(foodstuff?.force_feed_on_aggression)) //monkestation edit - add loafing return . = COMPONENT_CANCEL_ATTACK_CHAIN //Point of no return I suppose @@ -438,6 +449,14 @@ Behavior that's still missing from this component that original food items had t var/fraction = min(bite_consumption / owner.reagents.total_volume, 1) owner.reagents.trans_to(eater, bite_consumption, transfered_by = feeder, methods = INGEST) bitecount++ + var/desired_mask = (total_bites / bitecount) + desired_mask = round(desired_mask) + desired_mask = max(1,desired_mask) + desired_mask = min(desired_mask, 4) + + if(desired_mask != current_mask) + current_mask = desired_mask + parent.add_filter("bite", 0, alpha_mask_filter(icon=icon('goon/icons/obj/food.dmi', "eating[desired_mask]"))) checkLiked(fraction, eater) if(!owner.reagents.total_volume) On_Consume(eater, feeder) @@ -565,6 +584,15 @@ Behavior that's still missing from this component that original food items had t if(bitecount == 0 || prob(50)) L.manual_emote("nibbles away at \the [parent].") bitecount++ + var/desired_mask = (total_bites / bitecount) + desired_mask = round(desired_mask) + desired_mask = max(1,desired_mask) + desired_mask = min(desired_mask, 4) + + if(desired_mask != current_mask) + current_mask = desired_mask + src.add_filter("bite", 0, alpha_mask_filter(icon=icon('goon/icons/obj/food.dmi', "eating[desired_mask]"))) + . = COMPONENT_CANCEL_ATTACK_CHAIN L.taste(owner.reagents) // why should carbons get all the fun? if(bitecount >= 5) diff --git a/code/datums/components/food/ice_cream_holder.dm b/code/datums/components/food/ice_cream_holder.dm index 60da9b207d6e..af2143e2457f 100644 --- a/code/datums/components/food/ice_cream_holder.dm +++ b/code/datums/components/food/ice_cream_holder.dm @@ -33,14 +33,16 @@ var/datum/reagent/sweetener -/datum/component/ice_cream_holder/Initialize(max_scoops = DEFAULT_MAX_ICE_CREAM_SCOOPS, - change_name = TRUE, - filled_name, - change_desc = FALSE, - x_offset = 0, - y_offset = 0, - datum/reagent/sweetener = /datum/reagent/consumable/sugar, - list/prefill_flavours) +/datum/component/ice_cream_holder/Initialize( + max_scoops = DEFAULT_MAX_ICE_CREAM_SCOOPS, + change_name = TRUE, + filled_name, + change_desc = FALSE, + x_offset = 0, + y_offset = 0, + datum/reagent/sweetener = /datum/reagent/consumable/sugar, + list/prefill_flavours, +) if(!IS_EDIBLE(parent)) /// There is no easy way to add servings to those non-item edibles, but I won't stop you. return COMPONENT_INCOMPATIBLE @@ -169,7 +171,7 @@ if(compare_list(our_scoops, icecream_order.wanted_flavors)) return COMPONENT_CORRECT_ORDER -/datum/component/ice_cream_holder/proc/sell_ice_cream(obj/item/source, mob/living/simple_animal/robot_customer/sold_to) +/datum/component/ice_cream_holder/proc/sell_ice_cream(obj/item/source, mob/living/basic/robot_customer/sold_to) SIGNAL_HANDLER //the price of ice cream scales with the number of scoops. Yummy. diff --git a/code/datums/components/gunpoint.dm b/code/datums/components/gunpoint.dm index 969c3e3a233a..90ba318bb582 100644 --- a/code/datums/components/gunpoint.dm +++ b/code/datums/components/gunpoint.dm @@ -161,25 +161,27 @@ qdel(src) ///If the shooter is hit by an attack, they have a 50% chance to flinch and fire. If it hit the arm holding the trigger, it's an 80% chance to fire instead -/datum/component/gunpoint/proc/flinch(attacker, damage, damagetype, def_zone) +/datum/component/gunpoint/proc/flinch(mob/living/source, damage_amount, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) SIGNAL_HANDLER - var/mob/living/shooter = parent - if(attacker == shooter) - return // somehow this wasn't checked for months but no one tried punching themselves to initiate the shot, amazing + if(!attack_direction) // No fliching from yourself + return var/flinch_chance = 50 - var/gun_hand = LEFT_HANDS + var/gun_hand = (source.get_held_index_of_item(weapon) % 2) ? BODY_ZONE_L_ARM : BODY_ZONE_R_ARM - if(shooter.held_items[RIGHT_HANDS] == weapon) - gun_hand = RIGHT_HANDS + if(isbodypart(def_zone)) + var/obj/item/bodypart/hitting = def_zone + def_zone = hitting.body_zone - if((def_zone == BODY_ZONE_L_ARM && gun_hand == LEFT_HANDS) || (def_zone == BODY_ZONE_R_ARM && gun_hand == RIGHT_HANDS)) + if(def_zone == gun_hand) flinch_chance = 80 if(prob(flinch_chance)) - shooter.visible_message(span_danger("[shooter] flinches!"), \ - span_danger("You flinch!")) + source.visible_message( + span_danger("[source] flinches!"), + span_danger("You flinch!"), + ) INVOKE_ASYNC(src, PROC_REF(trigger_reaction)) #undef GUNPOINT_DELAY_STAGE_2 diff --git a/code/datums/components/healing_touch.dm b/code/datums/components/healing_touch.dm index 144cc7833992..965a52de9468 100644 --- a/code/datums/components/healing_touch.dm +++ b/code/datums/components/healing_touch.dm @@ -8,10 +8,15 @@ * This intercepts the attack and starts a do_after if the target is in its allowed type list. */ /datum/component/healing_touch + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS /// How much brute damage to heal var/heal_brute /// How much burn damage to heal var/heal_burn + /// How much toxin damage to heal + var/heal_tox + /// How much oxygen damage to heal + var/heal_oxy /// How much stamina damage to heal var/heal_stamina /// Interaction will use this key, and be blocked while this key is in use @@ -26,16 +31,26 @@ var/valid_biotypes /// Which kinds of carbon limbs can we heal, has no effect on non-carbon mobs. Set to null if you don't care about excluding prosthetics. var/required_bodytype - /// How targetting yourself works, expects one of HEALING_TOUCH_ANYONE, HEALING_TOUCH_NOT_SELF, or HEALING_TOUCH_SELF_ONLY - var/self_targetting + /// How targeting yourself works, expects one of HEALING_TOUCH_ANYONE, HEALING_TOUCH_NOT_SELF, or HEALING_TOUCH_SELF_ONLY + var/self_targeting /// Text to print when action starts, replaces %SOURCE% with healer and %TARGET% with healed mob var/action_text /// Text to print when action completes, replaces %SOURCE% with healer and %TARGET% with healed mob var/complete_text + /// Whether to print the target's remaining health after healing (for non-carbon targets only) + var/show_health + /// Color for the healing effect + var/heal_color + /// Optional click modifier required + var/required_modifier + /// Callback to run after healing a mob + var/datum/callback/after_healed /datum/component/healing_touch/Initialize( heal_brute = 20, heal_burn = 20, + heal_tox = 0, + heal_oxy = 0, heal_stamina = 0, heal_time = 2 SECONDS, interaction_key = DOAFTER_SOURCE_HEAL_TOUCH, @@ -43,15 +58,21 @@ list/valid_targets_typecache = list(), valid_biotypes = MOB_ORGANIC | MOB_MINERAL, required_bodytype = BODYTYPE_ORGANIC, - self_targetting = HEALING_TOUCH_NOT_SELF, + self_targeting = HEALING_TOUCH_NOT_SELF, action_text = "%SOURCE% begins healing %TARGET%", complete_text = "%SOURCE% finishes healing %TARGET%", + show_health = FALSE, + heal_color = COLOR_HEALING_CYAN, + required_modifier = null, + datum/callback/after_healed = null, ) if (!isliving(parent)) return COMPONENT_INCOMPATIBLE src.heal_brute = heal_brute src.heal_burn = heal_burn + src.heal_tox = heal_tox + src.heal_oxy = heal_oxy src.heal_stamina = heal_stamina src.heal_time = heal_time src.interaction_key = interaction_key @@ -59,13 +80,25 @@ src.valid_targets_typecache = valid_targets_typecache.Copy() src.valid_biotypes = valid_biotypes src.required_bodytype = required_bodytype - src.self_targetting = self_targetting + src.self_targeting = self_targeting src.action_text = action_text src.complete_text = complete_text + src.show_health = show_health + src.heal_color = heal_color + src.required_modifier = required_modifier + src.after_healed = after_healed RegisterSignal(parent, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(try_healing)) // Players RegisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(try_healing)) // NPCs +// Let's populate this list as we actually use it, this thing has too many args +/datum/component/healing_touch/InheritComponent( + datum/component/new_component, + i_am_original, + heal_color, +) + src.heal_color = heal_color + /datum/component/healing_touch/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET)) return ..() @@ -75,12 +108,15 @@ return ..() /// Validate our target, and interrupt the attack chain to start healing it if it is allowed -/datum/component/healing_touch/proc/try_healing(mob/living/healer, atom/target) +/datum/component/healing_touch/proc/try_healing(mob/living/healer, atom/target, proximity, modifiers) SIGNAL_HANDLER if (!isliving(target)) return - if (!is_type_in_typecache(target, valid_targets_typecache)) + if (!isnull(required_modifier) && !LAZYACCESS(modifiers, required_modifier)) + return + + if (length(valid_targets_typecache) && !is_type_in_typecache(target, valid_targets_typecache)) return // Fall back to attacking it if (extra_checks && !extra_checks.Invoke(healer, target)) @@ -90,7 +126,7 @@ healer.balloon_alert(healer, "busy!") return COMPONENT_CANCEL_ATTACK_CHAIN - switch (self_targetting) + switch (self_targeting) if (HEALING_TOUCH_NOT_SELF) if (target == healer) healer.balloon_alert(healer, "can't heal yourself!") @@ -123,6 +159,14 @@ return FALSE if (target.stamina.loss > 0 && heal_stamina) return TRUE + if (target.getOxyLoss() > 0 && heal_oxy) + return TRUE + if (target.getToxLoss() > 0 && heal_tox) + return TRUE + if (target.getOxyLoss() > 0 && heal_oxy) + return TRUE + if (target.getToxLoss() > 0 && heal_tox) + return TRUE if (!iscarbon(target)) return (target.getBruteLoss() > 0 && heal_brute) || (target.getFireLoss() > 0 && heal_burn) var/mob/living/carbon/carbon_target = target @@ -146,8 +190,26 @@ if (complete_text) healer.visible_message(span_notice("[format_string(complete_text, healer, target)]")) - target.heal_overall_damage(brute = heal_brute, burn = heal_burn, stamina = heal_stamina, required_bodytype = required_bodytype) - new /obj/effect/temp_visual/heal(get_turf(target), COLOR_HEALING_CYAN) + var/healed = target.heal_overall_damage( + brute = heal_brute, + burn = heal_burn, + stamina = heal_stamina, + required_bodytype = required_bodytype, + updating_health = FALSE, + ) + healed += target.adjustOxyLoss(-heal_oxy, updating_health = FALSE, required_biotype = valid_biotypes) + healed += target.adjustToxLoss(-heal_tox, updating_health = FALSE, required_biotype = valid_biotypes) + if (healed <= 0) + return + + target.updatehealth() + new /obj/effect/temp_visual/heal(get_turf(target), heal_color) + after_healed?.Invoke(target) + + if(!show_health) + return + var/formatted_string = format_string("%TARGET% now has [health_percentage(target)] health.", healer, target) + to_chat(healer, span_danger(formatted_string)) /// Reformats the passed string with the replacetext keys /datum/component/healing_touch/proc/format_string(string, atom/source, atom/target) diff --git a/code/datums/components/holderloving.dm b/code/datums/components/holderloving.dm index e8f797511c2a..bcd073b2600f 100644 --- a/code/datums/components/holderloving.dm +++ b/code/datums/components/holderloving.dm @@ -37,6 +37,7 @@ COMSIG_ITEM_EQUIPPED, COMSIG_ATOM_ENTERED, COMSIG_ATOM_EXITED, + COMSIG_ITEM_STORED, ), PROC_REF(check_my_loc)) /datum/component/holderloving/UnregisterFromParent() @@ -46,6 +47,7 @@ COMSIG_ITEM_EQUIPPED, COMSIG_ATOM_ENTERED, COMSIG_ATOM_EXITED, + COMSIG_ITEM_STORED, )) /datum/component/holderloving/PostTransfer() diff --git a/code/datums/components/joint_damage.dm b/code/datums/components/joint_damage.dm new file mode 100644 index 000000000000..5397bd307cab --- /dev/null +++ b/code/datums/components/joint_damage.dm @@ -0,0 +1,35 @@ +/* + * A component given to mobs to damage a linked mob + */ +/datum/component/joint_damage + ///the mob we will damage + var/datum/weakref/overlord_mob + ///our last health count + var/previous_health_count + +/datum/component/joint_damage/Initialize(mob/overlord_mob) + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + var/mob/living/parent_mob = parent + previous_health_count = parent_mob.health + if(overlord_mob) + src.overlord_mob = WEAKREF(overlord_mob) + +/datum/component/joint_damage/RegisterWithParent() + RegisterSignal(parent, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(damage_overlord)) + RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(damage_overlord)) + +/datum/component/joint_damage/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_LIVING_HEALTH_UPDATE, COMSIG_LIVING_DEATH)) + +/datum/component/joint_damage/Destroy() + overlord_mob = null + return ..() + +/datum/component/joint_damage/proc/damage_overlord(mob/living/source) + SIGNAL_HANDLER + + var/mob/living/overlord_to_damage = overlord_mob?.resolve() + if(!isnull(overlord_to_damage)) + overlord_to_damage.adjustBruteLoss(previous_health_count - source.health) ///damage or heal overlord + previous_health_count = source.health diff --git a/code/datums/components/leash.dm b/code/datums/components/leash.dm new file mode 100644 index 000000000000..66771682b1e9 --- /dev/null +++ b/code/datums/components/leash.dm @@ -0,0 +1,180 @@ +/// Keeps the parent within the distance of its owner as naturally as possible, +/// but teleporting if necessary. +/datum/component/leash + /// The owner of the leash. If this is qdeleted, the leash is as well. + var/atom/movable/owner + + /// The maximum distance you can move from your owner + var/distance + + /// The object type to create on the old turf when forcibly teleporting out + var/force_teleport_out_effect + + /// The object type to create on the new turf when forcibly teleporting out + var/force_teleport_in_effect + + VAR_PRIVATE + // Pathfinding can yield, so only move us closer if this is the best one + current_path_tick = 0 + last_completed_path_tick = 0 + + performing_path_move = FALSE + +/datum/component/leash/Initialize( + atom/movable/owner, + distance = 3, + force_teleport_out_effect, + force_teleport_in_effect, +) + . = ..() + + if (!ismovable(parent)) + stack_trace("Parent must be a movable") + return COMPONENT_INCOMPATIBLE + + if (!ismovable(owner)) + stack_trace("[owner] (owner) is not a movable") + return COMPONENT_INCOMPATIBLE + + if (!isnum(distance)) + stack_trace("[distance] (distance) must be a number") + return COMPONENT_INCOMPATIBLE + + if (!isnull(force_teleport_out_effect) && !ispath(force_teleport_out_effect)) + stack_trace("force_teleport_out_effect must be null or a path, not [force_teleport_out_effect]") + return COMPONENT_INCOMPATIBLE + + if (!isnull(force_teleport_in_effect) && !ispath(force_teleport_in_effect)) + stack_trace("force_teleport_in_effect must be null or a path, not [force_teleport_in_effect]") + return COMPONENT_INCOMPATIBLE + + src.owner = owner + src.distance = distance + src.force_teleport_out_effect = force_teleport_out_effect + src.force_teleport_in_effect = force_teleport_in_effect + + RegisterSignal(owner, COMSIG_PARENT_QDELETING, PROC_REF(on_owner_qdel)) + + var/static/list/container_connections = list( + COMSIG_MOVABLE_MOVED = PROC_REF(on_owner_moved), + ) + + AddComponent(/datum/component/connect_containers, owner, container_connections) + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_owner_moved)) + RegisterSignal(parent, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_parent_pre_move)) + + check_distance() + +/datum/component/leash/Destroy() + owner = null + return ..() + +/datum/component/leash/proc/set_distance(distance) + ASSERT(isnum(distance)) + src.distance = distance + check_distance() + +/datum/component/leash/proc/on_owner_qdel() + SIGNAL_HANDLER + PRIVATE_PROC(TRUE) + + qdel(src) + +/datum/component/leash/proc/on_owner_moved(atom/movable/source) + SIGNAL_HANDLER + PRIVATE_PROC(TRUE) + + check_distance() + +/datum/component/leash/proc/on_parent_pre_move(atom/movable/source, atom/new_location) + SIGNAL_HANDLER + PRIVATE_PROC(TRUE) + + if (performing_path_move) + return NONE + + var/turf/new_location_turf = get_turf(new_location) + if (get_dist(new_location_turf, owner) <= distance) + return NONE + + if (ismob(source)) + source.balloon_alert(source, "too far!") + + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE + +/datum/component/leash/proc/check_distance() + set waitfor = FALSE + PRIVATE_PROC(TRUE) + + if (get_dist(parent, owner) <= distance) + return + + SEND_SIGNAL(parent, COMSIG_LEASH_PATH_STARTED) + + current_path_tick += 1 + var/our_path_tick = current_path_tick + + var/list/path = get_path_to(parent, owner, mintargetdist = distance) + + if (last_completed_path_tick > our_path_tick) + return + + last_completed_path_tick = our_path_tick + + commit_path(path) + +/datum/component/leash/proc/commit_path(list/turf/path) + SHOULD_NOT_SLEEP(TRUE) + PRIVATE_PROC(TRUE) + + performing_path_move = TRUE + + var/atom/movable/movable_parent = parent + + for (var/turf/to_move as anything in path) + // Could be an older path, don't make us teleport back + if (!to_move.Adjacent(parent)) + continue + + if (!movable_parent.Move(to_move)) + force_teleport_back("bad path step") + return + + if (get_dist(parent, owner) > distance) + force_teleport_back("incomplete path") + + performing_path_move = FALSE + SEND_SIGNAL(parent, COMSIG_LEASH_PATH_COMPLETE) + +/datum/component/leash/proc/force_teleport_back(reason) + PRIVATE_PROC(TRUE) + + var/atom/movable/movable_parent = parent + + SSblackbox.record_feedback("tally", "leash_force_teleport_back", 1, reason) + + if (force_teleport_out_effect) + new force_teleport_out_effect(movable_parent.loc) + + movable_parent.forceMove(get_turf(owner)) + + if (force_teleport_in_effect) + new force_teleport_in_effect(movable_parent.loc) + + if (ismob(movable_parent)) + movable_parent.balloon_alert(movable_parent, "moved out of range!") + + SEND_SIGNAL(parent, COMSIG_LEASH_FORCE_TELEPORT) + +/// A debug spawner that will create a corgi leashed to a bike horn, plus a beam +/obj/effect/spawner/debug_leash + +/obj/effect/spawner/debug_leash/Initialize(mapload) + . = ..() + + var/obj/item/bikehorn/bike_horn = new(loc) + var/mob/living/basic/pet/dog/corgi/corgi = new(loc) + + corgi.AddComponent(/datum/component/leash, bike_horn) + + corgi.Beam(bike_horn) diff --git a/code/datums/components/life_link.dm b/code/datums/components/life_link.dm new file mode 100644 index 000000000000..c65206bc1ff2 --- /dev/null +++ b/code/datums/components/life_link.dm @@ -0,0 +1,169 @@ +/** + * A mob with this component passes all damage (and healing) it takes to another mob, passed as a parameter + * Essentially we use another mob's health bar as our health bar + */ +/datum/component/life_link + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + /// Mob we pass all of our damage to + var/mob/living/host + /// Optional callback invoked when damage gets transferred + var/datum/callback/on_passed_damage + /// Optional callback invoked when the linked mob dies + var/datum/callback/on_linked_death + +/datum/component/life_link/Initialize(mob/living/host, datum/callback/on_passed_damage, datum/callback/on_linked_death) + . = ..() + if (!isliving(parent)) + return COMPONENT_INCOMPATIBLE + if (!istype(host)) + CRASH("Life link created on [parent.type] and attempted to link to invalid type [host?.type].") + register_host(host) + src.on_passed_damage = on_passed_damage + src.on_linked_death = on_linked_death + +/datum/component/life_link/RegisterWithParent() + RegisterSignal(parent, COMSIG_CARBON_LIMB_DAMAGED, PROC_REF(on_limb_damage)) + RegisterSignals(parent, COMSIG_LIVING_ADJUST_STANDARD_DAMAGE_TYPES, PROC_REF(on_damage_adjusted)) + RegisterSignal(parent, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(on_health_updated)) + RegisterSignal(parent, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(on_status_tab_updated)) + if (!isnull(host)) + var/mob/living/living_parent = parent + living_parent.updatehealth() + +/datum/component/life_link/UnregisterFromParent() + unregister_host() + UnregisterSignal(parent, list(COMSIG_CARBON_LIMB_DAMAGED, COMSIG_LIVING_HEALTH_UPDATE, COMSIG_MOB_GET_STATUS_TAB_ITEMS) + COMSIG_LIVING_ADJUST_STANDARD_DAMAGE_TYPES) + +/datum/component/life_link/InheritComponent(datum/component/new_comp, i_am_original, mob/living/host, datum/callback/on_passed_damage, datum/callback/on_linked_death) + register_host(host) + +/// Set someone up as our new host +/datum/component/life_link/proc/register_host(mob/living/new_host) + unregister_host() + if (isnull(new_host)) + return + host = new_host + RegisterSignal(host, COMSIG_LIVING_DEATH, PROC_REF(on_host_died)) + RegisterSignal(host, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(on_health_updated)) + RegisterSignal(host, COMSIG_LIVING_REVIVE, PROC_REF(on_host_revived)) + RegisterSignal(host, COMSIG_PARENT_QDELETING, PROC_REF(on_host_deleted)) + var/mob/living/living_parent = parent + living_parent.updatehealth() + +/// Drop someone from being our host +/datum/component/life_link/proc/unregister_host() + if (isnull(host)) + return + UnregisterSignal(host, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_HEALTH_UPDATE, COMSIG_LIVING_REVIVE, COMSIG_PARENT_QDELETING)) + host = null + +/// Called when your damage goes up or down +/datum/component/life_link/proc/on_damage_adjusted(mob/living/our_mob, type, amount, forced) + SIGNAL_HANDLER + if (forced) + return + amount *= our_mob.get_damage_mod(type) + switch (type) + if(BRUTE) + host.adjustBruteLoss(amount, forced = TRUE) + if(BURN) + host.adjustFireLoss(amount, forced = TRUE) + if(TOX) + host.adjustToxLoss(amount, forced = TRUE) + if(OXY) + host.adjustOxyLoss(amount, forced = TRUE) + if(CLONE) + host.adjustCloneLoss(amount, forced = TRUE) + + on_passed_damage?.Invoke(our_mob, host, amount) + return COMPONENT_IGNORE_CHANGE + +/// Called when someone hurts one of our limbs, bypassing normal damage adjustment +/datum/component/life_link/proc/on_limb_damage(mob/living/our_mob, limb, brute, burn) + SIGNAL_HANDLER + if (brute != 0) + host.adjustBruteLoss(brute, updating_health = FALSE) + if (burn != 0) + host.adjustFireLoss(burn, updating_health = FALSE) + if (brute != 0 || burn != 0) + host.updatehealth() + on_passed_damage?.Invoke(our_mob, host, brute + burn) + return COMPONENT_PREVENT_LIMB_DAMAGE + +/// Called when either the host or parent's health tries to update, update our displayed health +/datum/component/life_link/proc/on_health_updated() + SIGNAL_HANDLER + update_health_hud(parent) + update_med_hud_health(parent) + update_med_hud_status(parent) + +/// Update our parent's health display based on how harmed our host is +/datum/component/life_link/proc/update_health_hud(mob/living/mob_parent) + var/severity = 0 + var/healthpercent = health_percentage(host) + switch(healthpercent) + if(100 to INFINITY) + severity = 0 + if(85 to 100) + severity = 1 + if(70 to 85) + severity = 2 + if(55 to 70) + severity = 3 + if(40 to 55) + severity = 4 + if(25 to 40) + severity = 5 + else + severity = 6 + if(severity > 0) + mob_parent.overlay_fullscreen("brute", /atom/movable/screen/fullscreen/brute, severity) + else + mob_parent.clear_fullscreen("brute") + if(mob_parent.hud_used?.healths) + mob_parent.hud_used.healths.maptext = MAPTEXT("
[round(healthpercent, 0.5)]%
") + +/// Update our health on the medical hud +/datum/component/life_link/proc/update_med_hud_health(mob/living/mob_parent) + var/image/holder = mob_parent.hud_list?[HEALTH_HUD] + if(isnull(holder)) + return + holder.icon_state = "hud[RoundHealth(host)]" + var/icon/size_check = icon(mob_parent.icon, mob_parent.icon_state, mob_parent.dir) + holder.pixel_y = size_check.Height() - world.icon_size + +/// Update our vital status on the medical hud +/datum/component/life_link/proc/update_med_hud_status(mob/living/mob_parent) + var/image/holder = mob_parent.hud_list?[STATUS_HUD] + if(isnull(holder)) + return + var/icon/size_check = icon(mob_parent.icon, mob_parent.icon_state, mob_parent.dir) + holder.pixel_y = size_check.Height() - world.icon_size + if(host.stat == DEAD || HAS_TRAIT(host, TRAIT_FAKEDEATH)) + holder.icon_state = "huddead" + else + holder.icon_state = "hudhealthy" + +/// When our status tab updates, draw how much HP our host has in there +/datum/component/life_link/proc/on_status_tab_updated(mob/living/source, list/items) + SIGNAL_HANDLER + var/healthpercent = health_percentage(host) + items += "Host Health: [round(healthpercent, 0.5)]%" + +/// Called when our host dies, we should die too +/datum/component/life_link/proc/on_host_died(mob/living/source, gibbed) + SIGNAL_HANDLER + on_linked_death?.Invoke(parent, host, gibbed) + var/mob/living/living_parent = parent + living_parent.death(gibbed) + +/// Called when our host undies, we should undie too +/datum/component/life_link/proc/on_host_revived(mob/living/source, full_heal_flags) + SIGNAL_HANDLER + var/mob/living/living_parent = parent + living_parent.revive(full_heal_flags) + +/// Called when +/datum/component/life_link/proc/on_host_deleted() + SIGNAL_HANDLER + qdel(src) diff --git a/code/datums/components/listen_and_repeat.dm b/code/datums/components/listen_and_repeat.dm new file mode 100644 index 000000000000..44a914a1b90a --- /dev/null +++ b/code/datums/components/listen_and_repeat.dm @@ -0,0 +1,83 @@ +/// The maximum number of phrases we can store in our speech buffer +#define MAX_SPEECH_BUFFER_SIZE 500 +/// Tendency we have to ignore radio chatter +#define RADIO_IGNORE_CHANCE 10 + +/// Simple element that will deterministically set a value based on stuff that the source has heard and will then compel the source to repeat it. +/// Requires a valid AI Blackboard. +/datum/component/listen_and_repeat + /// List of things that we start out having in our speech buffer + var/list/desired_phrases = null + /// The AI Blackboard Key we assign the value to. + var/blackboard_key = null + /// Probability we speak + var/speech_probability = null + /// Probabiliy we switch our phrase + var/switch_phrase_probability = null + /// List of things that we've heard and will repeat. + var/list/speech_buffer = null + +/datum/component/listen_and_repeat/Initialize(list/desired_phrases, blackboard_key) + . = ..() + if(!ismovable(parent)) + return COMPONENT_INCOMPATIBLE + + if(!isnull(desired_phrases)) + LAZYADD(speech_buffer, desired_phrases) + + src.blackboard_key = blackboard_key + + RegisterSignal(parent, COMSIG_MOVABLE_PRE_HEAR, PROC_REF(on_hear)) + RegisterSignal(parent, COMSIG_NEEDS_NEW_PHRASE, PROC_REF(set_new_blackboard_phrase)) + RegisterSignal(parent, COMSIG_LIVING_WRITE_MEMORY, PROC_REF(on_write_memory)) + + ADD_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + +/datum/component/listen_and_repeat/Destroy(force, silent) + REMOVE_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + return ..() + +/// Called when we hear something. +/datum/component/listen_and_repeat/proc/on_hear(datum/source, list/passed_arguments) + SIGNAL_HANDLER + + var/message = passed_arguments[HEARING_RAW_MESSAGE] + var/speaker = passed_arguments[HEARING_SPEAKER] + var/over_radio = !!passed_arguments[HEARING_RADIO_FREQ] + if(speaker == source) // don't parrot ourselves + return + + if(over_radio && prob(RADIO_IGNORE_CHANCE)) + return + + var/number_of_excess_strings = LAZYLEN(speech_buffer) - MAX_SPEECH_BUFFER_SIZE + if(number_of_excess_strings > 0) // only remove if we're overfull + for(var/i in 1 to number_of_excess_strings) + LAZYREMOVE(speech_buffer, pick(speech_buffer)) + + LAZYOR(speech_buffer, html_decode(message)) + +/// Called to set a new value for the blackboard key. +/datum/component/listen_and_repeat/proc/set_new_blackboard_phrase(datum/source) + SIGNAL_HANDLER + var/atom/movable/atom_source = source + var/datum/ai_controller/controller = atom_source.ai_controller + if(!LAZYLEN(speech_buffer)) + controller.clear_blackboard_key(blackboard_key) + return NO_NEW_PHRASE_AVAILABLE + + var/selected_phrase = pick(speech_buffer) + controller.set_blackboard_key(blackboard_key, selected_phrase) + +/// Exports all the speech buffer data to a dedicated blackboard key on the source. +/datum/component/listen_and_repeat/proc/on_write_memory(datum/source, dead, gibbed) + SIGNAL_HANDLER + var/atom/movable/atom_source = source + var/datum/ai_controller/controller = atom_source.ai_controller + if(LAZYLEN(speech_buffer)) // what? well whatever let's just move on + return + + controller.set_blackboard_key(BB_EXPORTABLE_STRING_BUFFER_LIST, speech_buffer.Copy()) + +#undef MAX_SPEECH_BUFFER_SIZE +#undef RADIO_IGNORE_CHANCE diff --git a/code/datums/components/lock_on_cursor.dm b/code/datums/components/lock_on_cursor.dm index 1811a13aa9b0..71c729b03f35 100644 --- a/code/datums/components/lock_on_cursor.dm +++ b/code/datums/components/lock_on_cursor.dm @@ -8,13 +8,13 @@ */ /datum/component/lock_on_cursor dupe_mode = COMPONENT_DUPE_ALLOWED - /// Appearance to overlay onto whatever we are targetting + /// Appearance to overlay onto whatever we are targeting var/mutable_appearance/lock_appearance /// Current images we are displaying to the client var/list/image/lock_images /// Typecache of things we are allowed to target var/list/target_typecache - /// Cache of weakrefs to ignore targetting formatted as `list(weakref = TRUE)` + /// Cache of weakrefs to ignore targeting formatted as `list(weakref = TRUE)` var/list/immune_weakrefs /// Number of things we can target at once var/lock_amount diff --git a/code/datums/components/manual_blinking.dm b/code/datums/components/manual_blinking.dm index 1a742c686785..40ec88529b19 100644 --- a/code/datums/components/manual_blinking.dm +++ b/code/datums/components/manual_blinking.dm @@ -8,7 +8,7 @@ var/check_every = 20 SECONDS var/grace_period = 6 SECONDS var/damage_rate = 1 // organ damage taken per tick - var/list/valid_emotes = list(/datum/emote/living/carbon/blink, /datum/emote/living/carbon/blink_r) + var/list/valid_emotes = list(/datum/emote/living/carbon/blink, /datum/emote/living/carbon/blink/blink_r) /datum/component/manual_blinking/Initialize() if(!iscarbon(parent)) diff --git a/code/datums/components/mob_chain.dm b/code/datums/components/mob_chain.dm new file mode 100644 index 000000000000..f3cda5cf22d1 --- /dev/null +++ b/code/datums/components/mob_chain.dm @@ -0,0 +1,227 @@ +/** + * Component allowing you to create a linked list of mobs. + * These mobs will follow each other and attack as one, as well as sharing damage taken. + */ +/datum/component/mob_chain + + /// If true then damage we take is passed backwards along the line + var/pass_damage_back + /// If true then we will set our icon state based on line position + var/vary_icon_state + + /// Mob in front of us in the chain + var/mob/living/front + /// Mob behind us in the chain + var/mob/living/back + +/datum/component/mob_chain/Initialize(mob/living/front, pass_damage_back = TRUE, vary_icon_state = FALSE) + . = ..() + if (!isliving(parent)) + return COMPONENT_INCOMPATIBLE + + src.front = front + src.pass_damage_back = pass_damage_back + src.vary_icon_state = vary_icon_state + if (!isnull(front)) + SEND_SIGNAL(front, COMSIG_MOB_GAINED_CHAIN_TAIL, parent) + parent.AddComponent(/datum/component/leash, owner = front, distance = 1) // Handles catching up gracefully + var/mob/living/living_parent = parent + living_parent.set_glide_size(front.glide_size) + +/datum/component/mob_chain/Destroy(force, silent) + if (!isnull(front)) + SEND_SIGNAL(front, COMSIG_MOB_LOST_CHAIN_TAIL, parent) + front = null + back = null + return ..() + +/datum/component/mob_chain/RegisterWithParent() + RegisterSignal(parent, COMSIG_MOB_GAINED_CHAIN_TAIL, PROC_REF(on_gained_tail)) + RegisterSignal(parent, COMSIG_MOB_LOST_CHAIN_TAIL, PROC_REF(on_lost_tail)) + RegisterSignal(parent, COMSIG_MOB_CHAIN_CONTRACT, PROC_REF(on_contracted)) + RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + RegisterSignal(parent, COMSIG_PARENT_QDELETING, PROC_REF(on_deletion)) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + RegisterSignal(parent, COMSIG_ATOM_CAN_BE_PULLED, PROC_REF(on_pulled)) + RegisterSignals(parent, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, COMSIG_MOB_ATTACK_RANGED), PROC_REF(on_attack)) + RegisterSignal(parent, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, PROC_REF(on_glide_size_changed)) + if (vary_icon_state) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON_STATE, PROC_REF(on_update_icon_state)) + update_mob_appearance() + if (pass_damage_back) + RegisterSignals(parent, COMSIG_LIVING_ADJUST_STANDARD_DAMAGE_TYPES, PROC_REF(on_adjust_damage)) + RegisterSignal(parent, COMSIG_LIVING_ADJUST_STAMINA_DAMAGE, PROC_REF(on_adjust_stamina)) + RegisterSignal(parent, COMSIG_CARBON_LIMB_DAMAGED, PROC_REF(on_limb_damage)) + + var/datum/action/cooldown/worm_contract/shrink = new(parent) + shrink.Grant(parent) + +/datum/component/mob_chain/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_ATOM_CAN_BE_PULLED, + COMSIG_ATOM_UPDATE_ICON_STATE, + COMSIG_CARBON_LIMB_DAMAGED, + COMSIG_HUMAN_EARLY_UNARMED_ATTACK, + COMSIG_LIVING_ADJUST_BRUTE_DAMAGE, + COMSIG_LIVING_ADJUST_BURN_DAMAGE, + COMSIG_LIVING_ADJUST_CLONE_DAMAGE, + COMSIG_LIVING_DEATH, + COMSIG_LIVING_ADJUST_OXY_DAMAGE, + COMSIG_LIVING_ADJUST_STAMINA_DAMAGE, + COMSIG_LIVING_ADJUST_TOX_DAMAGE, + COMSIG_LIVING_UNARMED_ATTACK, + COMSIG_MOB_ATTACK_RANGED, + COMSIG_MOB_CHAIN_CONTRACT, + COMSIG_MOB_GAINED_CHAIN_TAIL, + COMSIG_MOB_LOST_CHAIN_TAIL, + COMSIG_MOVABLE_MOVED, + COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, + COMSIG_PARENT_QDELETING, + )) + qdel(parent.GetComponent(/datum/component/leash)) + var/mob/living/living_parent = parent + var/datum/action/cooldown/worm_contract/shrink = locate() in living_parent.actions + qdel(shrink) + +/// Update how we look +/datum/component/mob_chain/proc/update_mob_appearance() + if (!vary_icon_state) + return + var/mob/living/body = parent + body.update_appearance(UPDATE_ICON_STATE) + +/// Called when something sets us as IT'S front +/datum/component/mob_chain/proc/on_gained_tail(mob/living/body, mob/living/tail) + SIGNAL_HANDLER + back = tail + update_mob_appearance() + +/// Called when our tail loses its chain component +/datum/component/mob_chain/proc/on_lost_tail() + SIGNAL_HANDLER + back = null + update_mob_appearance() + +/// Called when our tail gets pulled up to our body +/datum/component/mob_chain/proc/on_contracted(mob/living/shrinking) + SIGNAL_HANDLER + if (isnull(back)) + return + back.forceMove(shrinking.loc) + var/datum/action/cooldown/worm_contract/shrink = locate() in back.actions + if (isnull(shrink)) + return + INVOKE_ASYNC(shrink, TYPE_PROC_REF(/datum/action, Trigger)) + +/// If we die so does the guy behind us, then stop following the leader +/datum/component/mob_chain/proc/on_death() + SIGNAL_HANDLER + back?.death() + qdel(src) + +/// If we get deleted so does the guy behind us +/datum/component/mob_chain/proc/on_deletion() + SIGNAL_HANDLER + QDEL_NULL(back) + front?.update_appearance(UPDATE_ICON) + +/// Pull our tail behind us when we move +/datum/component/mob_chain/proc/on_moved(mob/living/mover, turf/old_loc) + SIGNAL_HANDLER + if(isnull(back) || back.loc == old_loc) + return + back.Move(old_loc) + +/// Update our visuals based on if we have someone in front and behind +/datum/component/mob_chain/proc/on_update_icon_state(mob/living/our_mob) + SIGNAL_HANDLER + var/current_icon_state = our_mob.base_icon_state + if(isnull(front)) + current_icon_state = "[current_icon_state]_start" + else if(isnull(back)) + current_icon_state = "[current_icon_state]_end" + else + current_icon_state = "[current_icon_state]_mid" + + our_mob.icon_state = current_icon_state + if (isanimal_or_basicmob(our_mob)) + var/mob/living/basic/basic_parent = our_mob + basic_parent.icon_living = current_icon_state + +/// Do not allow someone to be pulled out of the chain +/datum/component/mob_chain/proc/on_pulled(mob/living/our_mob) + SIGNAL_HANDLER + if (!isnull(front)) + return COMSIG_ATOM_CANT_PULL + +/// Tell our tail to attack too +/datum/component/mob_chain/proc/on_attack(mob/living/our_mob, atom/target) + SIGNAL_HANDLER + if (target == back || target == front) + return COMPONENT_CANCEL_ATTACK_CHAIN + if (isnull(back) || QDELETED(target)) + return + INVOKE_ASYNC(back, TYPE_PROC_REF(/mob, ClickOn), target) + +/// Maintain glide size backwards +/datum/component/mob_chain/proc/on_glide_size_changed(mob/living/our_mob, new_size) + SIGNAL_HANDLER + back?.set_glide_size(new_size) + +/// On gain or lose stamina, adjust our tail too +/datum/component/mob_chain/proc/on_adjust_stamina(mob/living/our_mob, type, amount, forced) + SIGNAL_HANDLER + if (forced) + return + back?.stamina.adjust(-amount, forced) + +/// On damage or heal, affect our furthest segment +/datum/component/mob_chain/proc/on_adjust_damage(mob/living/our_mob, type, amount, forced) + SIGNAL_HANDLER + if (isnull(back) || forced) + return + if (type == STAMINA) + back.stamina.adjust(-amount, forced) + return // Pass stamina changes all the way along so we maintain consistent speed + switch (type) + if(BRUTE) + back.adjustBruteLoss(amount, forced = forced) + if(BURN) + back.adjustFireLoss(amount, forced = forced) + if(TOX) + back.adjustToxLoss(amount, forced = forced) + if(OXY) // If all segments are suffocating we pile damage backwards until our ass starts dying forwards + back.adjustOxyLoss(amount, forced = forced) + if(CLONE) + back.adjustCloneLoss(amount, forced = forced) + return COMPONENT_IGNORE_CHANGE + +/// Special handling for if damage is delegated to a mob's limbs instead of its overall damage +/datum/component/mob_chain/proc/on_limb_damage(mob/living/our_mob, limb, brute, burn) + SIGNAL_HANDLER + if (isnull(back)) + return + if (brute != 0) + back.adjustBruteLoss(brute, updating_health = FALSE) + if (burn != 0) + back.adjustFireLoss(burn, updating_health = FALSE) + if (brute != 0 || burn != 0) + back.updatehealth() + return COMPONENT_PREVENT_LIMB_DAMAGE + +/** + * Shrink the chain of mobs into one tile. + */ +/datum/action/cooldown/worm_contract + name = "Force Contract" + desc = "Forces your body to contract onto a single tile." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "worm_contract" + cooldown_time = 30 SECONDS + melee_cooldown_time = 0 SECONDS + +/datum/action/cooldown/worm_contract/Activate(atom/target) + SEND_SIGNAL(owner, COMSIG_MOB_CHAIN_CONTRACT) + StartCooldown() diff --git a/code/datums/components/omen.dm b/code/datums/components/omen.dm index 3a7b4d42f8d0..d218729aea07 100644 --- a/code/datums/components/omen.dm +++ b/code/datums/components/omen.dm @@ -78,7 +78,7 @@ for(var/turf/the_turf as anything in get_adjacent_open_turfs(living_guy)) if(istype(the_turf, /turf/open/floor/glass/reinforced/tram)) // don't fall off the tram bridge, we want to hit you instead return - if(the_turf.zPassOut(living_guy, DOWN) && living_guy.can_z_move(DOWN, the_turf, z_move_flags = ZMOVE_FALL_FLAGS)) + if(living_guy.can_z_move(DOWN, the_turf, z_move_flags = ZMOVE_FALL_FLAGS)) to_chat(living_guy, span_warning("A malevolent force guides you towards the edge...")) living_guy.throw_at(the_turf, 1, 10, force = MOVE_FORCE_EXTREMELY_STRONG) if(!permanent) diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm index 620f28f1c134..c54ac6b430b0 100644 --- a/code/datums/components/pellet_cloud.dm +++ b/code/datums/components/pellet_cloud.dm @@ -307,7 +307,7 @@ var/damage_dealt = wound_info_by_part[hit_part][CLOUD_POSITION_DAMAGE] var/w_bonus = wound_info_by_part[hit_part][CLOUD_POSITION_W_BONUS] var/bw_bonus = wound_info_by_part[hit_part][CLOUD_POSITION_BW_BONUS] - var/wound_type = (initial(P.damage_type) == BRUTE) ? WOUND_BLUNT : WOUND_BURN // sharpness is handled in the wound rolling + var/wounding_type = (initial(P.damage_type) == BRUTE) ? WOUND_BLUNT : WOUND_BURN // sharpness is handled in the wound rolling wound_info_by_part -= hit_part // technically this only checks armor worn the moment that all the pellets resolve rather than as each one hits you, @@ -320,7 +320,7 @@ armor_factor *= ARMOR_WEAKENED_MULTIPLIER damage_dealt *= max(0, 1 - armor_factor*0.01) - hit_part.painless_wound_roll(wound_type, damage_dealt, w_bonus, bw_bonus, initial(P.sharpness)) + hit_part.painless_wound_roll(wounding_type, damage_dealt, w_bonus, bw_bonus, initial(P.sharpness)) var/limb_hit_text = "" if(hit_part) diff --git a/code/datums/components/pet_commands/fetch.dm b/code/datums/components/pet_commands/fetch.dm index a8723f8bd4bd..fa0b3193a447 100644 --- a/code/datums/components/pet_commands/fetch.dm +++ b/code/datums/components/pet_commands/fetch.dm @@ -3,7 +3,7 @@ * Watch for someone throwing or pointing at something and then go get it and bring it back. * If it's food we might eat it instead. */ -/datum/pet_command/point_targetting/fetch +/datum/pet_command/point_targeting/fetch command_name = "Fetch" command_desc = "Command your pet to retrieve something you throw or point at." radial_icon = 'icons/mob/actions/actions_spells.dmi' @@ -16,20 +16,22 @@ /// If true, this is a poorly trained pet who will eat food you throw instead of bringing it back var/will_eat_targets = TRUE -/datum/pet_command/point_targetting/fetch/New(mob/living/parent) +/datum/pet_command/point_targeting/fetch/New(mob/living/parent) . = ..() + if(isnull(parent)) + return parent.AddElement(/datum/element/ai_held_item) // We don't remove this on destroy because they might still be holding something -/datum/pet_command/point_targetting/fetch/add_new_friend(mob/living/tamer) +/datum/pet_command/point_targeting/fetch/add_new_friend(mob/living/tamer) . = ..() RegisterSignal(tamer, COMSIG_MOB_THROW, PROC_REF(listened_throw)) -/datum/pet_command/point_targetting/fetch/remove_friend(mob/living/unfriended) +/datum/pet_command/point_targeting/fetch/remove_friend(mob/living/unfriended) . = ..() UnregisterSignal(unfriended, COMSIG_MOB_THROW) /// A friend has thrown something, if we're listening or at least not busy then go get it -/datum/pet_command/point_targetting/fetch/proc/listened_throw(mob/living/carbon/thrower) +/datum/pet_command/point_targeting/fetch/proc/listened_throw(mob/living/carbon/thrower) SIGNAL_HANDLER var/mob/living/parent = weak_parent.resolve() @@ -55,7 +57,7 @@ RegisterSignal(thrown_thing, COMSIG_MOVABLE_THROW_LANDED, PROC_REF(listen_throw_land)) /// A throw we were listening to has finished, see if it's in range for us to try grabbing it -/datum/pet_command/point_targetting/fetch/proc/listen_throw_land(obj/item/thrown_thing, datum/thrownthing/throwing_datum) +/datum/pet_command/point_targeting/fetch/proc/listen_throw_land(obj/item/thrown_thing, datum/thrownthing/throwing_datum) SIGNAL_HANDLER UnregisterSignal(thrown_thing, COMSIG_MOVABLE_THROW_LANDED) @@ -72,7 +74,7 @@ parent.ai_controller.set_blackboard_key(BB_FETCH_DELIVER_TO, throwing_datum.thrower) // Don't try and fetch turfs or anchored objects if someone points at them -/datum/pet_command/point_targetting/fetch/look_for_target(mob/living/pointing_friend, obj/item/pointed_atom) +/datum/pet_command/point_targeting/fetch/look_for_target(mob/living/pointing_friend, obj/item/pointed_atom) if (!istype(pointed_atom)) return FALSE if (pointed_atom.anchored) @@ -85,7 +87,7 @@ parent.ai_controller.set_blackboard_key(BB_FETCH_DELIVER_TO, pointing_friend) // Finally, plan our actions -/datum/pet_command/point_targetting/fetch/execute_action(datum/ai_controller/controller) +/datum/pet_command/point_targeting/fetch/execute_action(datum/ai_controller/controller) controller.queue_behavior(/datum/ai_behavior/forget_failed_fetches) var/atom/target = controller.blackboard[BB_CURRENT_PET_TARGET] diff --git a/code/datums/components/pet_commands/pet_command.dm b/code/datums/components/pet_commands/pet_command.dm index 7899ffce40ae..7762b9b2aa81 100644 --- a/code/datums/components/pet_commands/pet_command.dm +++ b/code/datums/components/pet_commands/pet_command.dm @@ -109,25 +109,25 @@ CRASH("Pet command execute action not implemented.") /** - * # Point Targetting Pet Command + * # Point Targeting Pet Command * As above but also listens for you pointing at something and marks it as a target */ -/datum/pet_command/point_targetting +/datum/pet_command/point_targeting /// Text describing an action we perform upon receiving a new target var/pointed_reaction - /// Blackboard key for targetting datum, this is likely going to need it - var/targetting_datum_key = BB_PET_TARGETTING_DATUM + /// Blackboard key for targeting strategy, this is likely going to need it + var/targeting_strategy_key = BB_PET_TARGETING_STRATEGY -/datum/pet_command/point_targetting/add_new_friend(mob/living/tamer) +/datum/pet_command/point_targeting/add_new_friend(mob/living/tamer) . = ..() RegisterSignal(tamer, COMSIG_MOB_POINTED, PROC_REF(look_for_target)) -/datum/pet_command/point_targetting/remove_friend(mob/living/unfriended) +/datum/pet_command/point_targeting/remove_friend(mob/living/unfriended) . = ..() UnregisterSignal(unfriended, COMSIG_MOB_POINTED) /// Target the pointed atom for actions -/datum/pet_command/point_targetting/proc/look_for_target(mob/living/friend, atom/pointed_atom) +/datum/pet_command/point_targeting/proc/look_for_target(mob/living/friend, atom/pointed_atom) SIGNAL_HANDLER var/mob/living/parent = weak_parent.resolve() diff --git a/code/datums/components/pet_commands/pet_commands_basic.dm b/code/datums/components/pet_commands/pet_commands_basic.dm index a562c1168432..211b995b22e2 100644 --- a/code/datums/components/pet_commands/pet_commands_basic.dm +++ b/code/datums/components/pet_commands/pet_commands_basic.dm @@ -100,7 +100,7 @@ * # Pet Command: Attack * Tells a pet to chase and bite the next thing you point at */ -/datum/pet_command/point_targetting/attack +/datum/pet_command/point_targeting/attack command_name = "Attack" command_desc = "Command your pet to attack things that you point out to it." radial_icon = 'icons/effects/effects.dmi' @@ -111,17 +111,17 @@ pointed_reaction = "and growls" /// Balloon alert to display if providing an invalid target var/refuse_reaction = "shakes head" - /// Attack behaviour to use, generally you will want to override this to add some kind of cooldown + /// Attack behaviour to use var/attack_behaviour = /datum/ai_behavior/basic_melee_attack // Refuse to target things we can't target, chiefly other friends -/datum/pet_command/point_targetting/attack/set_command_target(mob/living/parent, atom/target) +/datum/pet_command/point_targeting/attack/set_command_target(mob/living/parent, atom/target) if (!target) return var/mob/living/living_parent = parent if (!living_parent.ai_controller) return - var/datum/targetting_datum/targeter = living_parent.ai_controller.blackboard[targetting_datum_key] + var/datum/targeting_strategy/targeter = GET_TARGETING_STRATEGY(living_parent.ai_controller.blackboard[targeting_strategy_key]) if (!targeter) return if (!targeter.can_attack(living_parent, target)) @@ -129,21 +129,51 @@ return return ..() -/// Display feedback about not targetting something -/datum/pet_command/point_targetting/attack/proc/refuse_target(mob/living/parent, atom/target) +/// Display feedback about not targeting something +/datum/pet_command/point_targeting/attack/proc/refuse_target(mob/living/parent, atom/target) var/mob/living/living_parent = parent living_parent.balloon_alert_to_viewers("[refuse_reaction]") living_parent.visible_message(span_notice("[living_parent] refuses to attack [target].")) -/datum/pet_command/point_targetting/attack/execute_action(datum/ai_controller/controller) - controller.queue_behavior(attack_behaviour, BB_CURRENT_PET_TARGET, targetting_datum_key) +/datum/pet_command/point_targeting/attack/execute_action(datum/ai_controller/controller) + controller.queue_behavior(attack_behaviour, BB_CURRENT_PET_TARGET, targeting_strategy_key) + return SUBTREE_RETURN_FINISH_PLANNING + +/** + * # Breed command. breed with a partner! + */ +/datum/pet_command/point_targeting/breed + command_name = "Breed" + command_desc = "Command your pet to attempt to breed with a partner." + radial_icon = 'icons/mob/simple/animal.dmi' + radial_icon_state = "heart" + speech_commands = list("breed", "consummate") + +/datum/pet_command/point_targeting/breed/set_command_target(mob/living/parent, atom/target) + if(isnull(target) || !isliving(target)) + return + if(!HAS_TRAIT(parent, TRAIT_MOB_BREEDER) || !HAS_TRAIT(target, TRAIT_MOB_BREEDER)) + return + if(isnull(parent.ai_controller)) + return + if(!parent.ai_controller.blackboard[BB_BREED_READY] || isnull(parent.ai_controller.blackboard[BB_BABIES_PARTNER_TYPES])) + return + var/mob/living/living_target = target + if(!living_target.ai_controller?.blackboard[BB_BREED_READY]) + return + return ..() + +/datum/pet_command/point_targeting/breed/execute_action(datum/ai_controller/controller) + if(is_type_in_list(controller.blackboard[BB_CURRENT_PET_TARGET], controller.blackboard[BB_BABIES_PARTNER_TYPES])) + controller.queue_behavior(/datum/ai_behavior/make_babies, BB_CURRENT_PET_TARGET) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) return SUBTREE_RETURN_FINISH_PLANNING /** * # Pet Command: Targetted Ability * Tells a pet to use some kind of ability on the next thing you point at */ -/datum/pet_command/point_targetting/use_ability +/datum/pet_command/point_targeting/use_ability command_name = "Use ability" command_desc = "Command your pet to use one of its special skills on something that you point out to it." radial_icon = 'icons/mob/actions/actions_spells.dmi' @@ -154,7 +184,7 @@ /// Blackboard key where a reference to some kind of mob ability is stored var/pet_ability_key -/datum/pet_command/point_targetting/use_ability/execute_action(datum/ai_controller/controller) +/datum/pet_command/point_targeting/use_ability/execute_action(datum/ai_controller/controller) if (!pet_ability_key) return var/datum/action/cooldown/using_action = controller.blackboard[pet_ability_key] @@ -164,3 +194,45 @@ // We also don't check if the cooldown is over because there's no way a pet owner can know that, the behaviour will handle it controller.queue_behavior(/datum/ai_behavior/pet_use_ability, pet_ability_key, BB_CURRENT_PET_TARGET) return SUBTREE_RETURN_FINISH_PLANNING + +/datum/pet_command/protect_owner + command_name = "Protect owner" + command_desc = "Your pet will run to your aid." + hidden = TRUE + ///the range our owner needs to be in for us to protect him + var/protect_range = 9 + ///the behavior we will use when he is attacked + var/protect_behavior = /datum/ai_behavior/basic_melee_attack + +/datum/pet_command/protect_owner/add_new_friend(mob/living/tamer) + RegisterSignal(tamer, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(set_attacking_target)) + if(!HAS_TRAIT(tamer, TRAIT_RELAYING_ATTACKER)) + tamer.AddElement(/datum/element/relay_attackers) + +/datum/pet_command/protect_owner/remove_friend(mob/living/unfriended) + UnregisterSignal(unfriended, COMSIG_ATOM_WAS_ATTACKED) + +/datum/pet_command/protect_owner/execute_action(datum/ai_controller/controller) + var/mob/living/victim = controller.blackboard[BB_CURRENT_PET_TARGET] + if(QDELETED(victim)) + return + // cancel the action if they're below our given crit stat, OR if we're trying to attack ourselves (this can happen on tamed mobs w/ protect subtree rarely) + if(victim.stat > controller.blackboard[BB_TARGET_MINIMUM_STAT] || victim == controller.pawn) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + return + controller.queue_behavior(protect_behavior, BB_CURRENT_PET_TARGET, BB_PET_TARGETING_STRATEGY) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/pet_command/protect_owner/set_command_active(mob/living/parent, mob/living/victim) + . = ..() + set_command_target(parent, victim) + +/datum/pet_command/protect_owner/proc/set_attacking_target(atom/source, mob/living/attacker) + var/mob/living/basic/owner = weak_parent.resolve() + if(isnull(owner)) + return + var/mob/living/current_target = owner.ai_controller?.blackboard[BB_CURRENT_PET_TARGET] + if(attacker == current_target) //we are already dealing with this target + return + if(isliving(attacker) && can_see(owner, attacker, protect_range)) + set_command_active(owner, attacker) diff --git a/code/datums/components/pinata.dm b/code/datums/components/pinata.dm index 8f6866c5d949..1056200e3e27 100644 --- a/code/datums/components/pinata.dm +++ b/code/datums/components/pinata.dm @@ -33,7 +33,7 @@ return return COMPONENT_INCOMPATIBLE -/datum/component/pinata/proc/damage_inflicted(obj/target, damage, damage_type) +/datum/component/pinata/proc/damage_inflicted(obj/target, damage, damage_type, ...) SIGNAL_HANDLER if(damage < minimum_damage || damage_type == STAMINA || damage_type == OXY) return diff --git a/code/datums/components/pry_open_door.dm b/code/datums/components/pry_open_door.dm deleted file mode 100644 index 17e445d25ca8..000000000000 --- a/code/datums/components/pry_open_door.dm +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Attached to a basic mob. - * Causes attacks on doors to attempt to open them. - */ -/datum/component/pry_open_door - /// Odds the attack opens the door - var/open_chance - /// Time it takes to open a door with force - var/force_wait - -/datum/component/pry_open_door/Initialize(open_chance = 100, force_wait = 10 SECONDS) - . = ..() - - if(!isbasicmob(parent)) - return COMPONENT_INCOMPATIBLE - src.open_chance = open_chance - src.force_wait = force_wait - -/datum/component/pry_open_door/RegisterWithParent() - RegisterSignal(parent, COMSIG_HOSTILE_POST_ATTACKINGTARGET, PROC_REF(hostile_attackingtarget)) - -/datum/component/pry_open_door/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_HOSTILE_POST_ATTACKINGTARGET) - -/datum/component/pry_open_door/proc/hostile_attackingtarget(mob/living/basic/attacker, atom/target, success) - SIGNAL_HANDLER - - if(!success) - return - if(istype(target, /obj/machinery/door/airlock) && prob(open_chance)) - var/obj/machinery/door/airlock/airlock_target = target - INVOKE_ASYNC(src, PROC_REF(open_door), attacker, airlock_target) - -/datum/component/pry_open_door/proc/open_door(mob/living/basic/attacker, obj/machinery/door/airlock/airlock_target) - if(airlock_target.locked) - to_chat(attacker, span_warning("The airlock's bolts prevent it from being forced!")) - return - else if(!airlock_target.allowed(attacker) && airlock_target.hasPower()) - attacker.visible_message(span_warning("We start forcing the [airlock_target] open."), \ - span_hear("You hear a metal screeching sound.")) - playsound(airlock_target, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) - if(!do_after(attacker, force_wait, airlock_target)) - return - if(airlock_target.locked) - return - attacker.visible_message(span_warning("We force the [airlock_target] to open.")) - airlock_target.open(BYPASS_DOOR_CHECKS) - else if(!airlock_target.hasPower()) - attacker.visible_message(span_warning("We force the [airlock_target] to open.")) - airlock_target.open(FORCING_DOOR_CHECKS) - else - airlock_target.open(DEFAULT_DOOR_CHECKS) diff --git a/code/datums/components/ranged_attacks.dm b/code/datums/components/ranged_attacks.dm index 1a3bcacd5d05..aecaa2c18086 100644 --- a/code/datums/components/ranged_attacks.dm +++ b/code/datums/components/ranged_attacks.dm @@ -8,6 +8,10 @@ var/projectile_type /// Sound to play when we fire our projectile var/projectile_sound + /// how many shots we will fire + var/burst_shots + /// intervals between shots + var/burst_intervals /// Time to wait between shots var/cooldown_time /// Tracks time between shots @@ -17,6 +21,8 @@ casing_type, projectile_type, projectile_sound = 'sound/weapons/gun/pistol/shot.ogg', + burst_shots, + burst_intervals = 0.2 SECONDS, cooldown_time = 3 SECONDS, ) . = ..() @@ -32,6 +38,10 @@ CRASH("Set both casing type and projectile type in [parent]'s ranged attacks component! uhoh! stinky!") if (!casing_type && !projectile_type) CRASH("Set neither casing type nor projectile type in [parent]'s ranged attacks component! What are they supposed to be attacking with, air?") + if(burst_shots <= 1) + return + src.burst_shots = burst_shots + src.burst_intervals = burst_intervals /datum/component/ranged_attacks/RegisterWithParent() . = ..() @@ -49,12 +59,16 @@ return COOLDOWN_START(src, fire_cooldown, cooldown_time) INVOKE_ASYNC(src, PROC_REF(async_fire_ranged_attack), firer, target, modifiers) - SEND_SIGNAL(parent, COMSIG_BASICMOB_POST_ATTACK_RANGED, target, modifiers) + if(isnull(burst_shots)) + return + for(var/i in 1 to (burst_shots - 1)) + addtimer(CALLBACK(src, PROC_REF(async_fire_ranged_attack), firer, target, modifiers), i * burst_intervals) /// Actually fire the damn thing /datum/component/ranged_attacks/proc/async_fire_ranged_attack(mob/living/basic/firer, atom/target, modifiers) if(projectile_type) firer.fire_projectile(projectile_type, target, projectile_sound) + SEND_SIGNAL(parent, COMSIG_BASICMOB_POST_ATTACK_RANGED, target, modifiers) return playsound(firer, projectile_sound, 100, TRUE) var/turf/startloc = get_turf(firer) @@ -66,6 +80,8 @@ else target_zone = ran_zone() casing.fire_casing(target, firer, null, null, null, target_zone, 0, firer) + casing.update_appearance() casing.AddElement(/datum/element/temporary_atom, 30 SECONDS) + SEND_SIGNAL(parent, COMSIG_BASICMOB_POST_ATTACK_RANGED, target, modifiers) return diff --git a/code/datums/components/ranged_mob_full_auto.dm b/code/datums/components/ranged_mob_full_auto.dm new file mode 100644 index 000000000000..13cf3b1a4952 --- /dev/null +++ b/code/datums/components/ranged_mob_full_auto.dm @@ -0,0 +1,203 @@ +#define AUTOFIRE_MOUSEUP 1 +#define AUTOFIRE_MOUSEDOWN 0 + +/// Allows a mob to autofire by holding down the cursor +/datum/component/ranged_mob_full_auto + /// Delay before attempting to fire again, note that this is just when we make attempts and is separate from mob's actual firing cooldown + var/autofire_shot_delay + /// Our client for click tracking + var/client/clicker + /// Are we currently firing? + var/is_firing = FALSE + /// This seems hacky but there can be two MouseDown() without a MouseUp() in between if the user holds click and uses alt+tab, printscreen or similar. + var/awaiting_status = AUTOFIRE_MOUSEDOWN + /// What are we currently shooting at? + var/atom/target + /// Where are we currently shooting at? + var/turf/target_loc + /// When will we next try to shoot? + COOLDOWN_DECLARE(next_shot_cooldown) + +/datum/component/ranged_mob_full_auto/Initialize(autofire_shot_delay = 0.5 SECONDS) + . = ..() + if (!isliving(parent)) + return COMPONENT_INCOMPATIBLE + + src.autofire_shot_delay = autofire_shot_delay + + var/mob/living/living_parent = parent + if (isnull(living_parent.client)) + return + on_gained_client(parent) + +/datum/component/ranged_mob_full_auto/RegisterWithParent() + RegisterSignal(parent, COMSIG_MOB_LOGIN, PROC_REF(on_gained_client)) + RegisterSignal(parent, COMSIG_MOB_LOGOUT, PROC_REF(on_lost_client)) + +/datum/component/ranged_mob_full_auto/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_MOB_LOGIN, COMSIG_MOB_LOGOUT)) + +/datum/component/ranged_mob_full_auto/process(seconds_per_tick) + if (!try_shooting()) + return PROCESS_KILL + +/// Try and take a shot, returns false if we are unable to do so and should stop trying +/datum/component/ranged_mob_full_auto/proc/try_shooting() + if (!is_firing) + return FALSE + if (!COOLDOWN_FINISHED(src, next_shot_cooldown)) + return TRUE // Don't fire but also keep processing + + var/mob/living/living_parent = parent + + if (isnull(target) || get_turf(target) != target_loc) // Target moved or got destroyed since we last aimed. + set_target(target_loc) + target = target_loc // So we keep firing on the emptied tile until we move our mouse and find a new target. + if (get_dist(living_parent, target) <= 0) + set_target(get_step(living_parent, living_parent.dir)) // Shoot in the direction faced if the mouse is on the same tile as we are. + target_loc = target + else if (!in_view_range(living_parent, target)) + stop_firing() + return FALSE // Can't see shit + + living_parent.face_atom(target) + COOLDOWN_START(src, next_shot_cooldown, autofire_shot_delay) + living_parent.RangedAttack(target) + return TRUE + +/// Setter for reference handling +/datum/component/ranged_mob_full_auto/proc/set_target(atom/new_target) + if (!isnull(target)) + UnregisterSignal(target, COMSIG_PARENT_QDELETING) + target = new_target + if (!isnull(target)) + RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(on_target_deleted)) + +/// Don't hang references +/datum/component/ranged_mob_full_auto/proc/on_target_deleted() + SIGNAL_HANDLER + set_target(null) + +/// When we gain a client, start tracking clicks +/datum/component/ranged_mob_full_auto/proc/on_gained_client(mob/living/source) + SIGNAL_HANDLER + clicker = source.client + RegisterSignal(clicker, COMSIG_CLIENT_MOUSEDOWN, PROC_REF(on_mouse_down)) + +/// When we lose our client, stop functioning +/datum/component/ranged_mob_full_auto/proc/on_lost_client(mob/living/source) + SIGNAL_HANDLER + if (!isnull(clicker)) + UnregisterSignal(clicker, list(COMSIG_CLIENT_MOUSEDOWN, COMSIG_CLIENT_MOUSEDRAG, COMSIG_CLIENT_MOUSEUP)) + stop_firing() + clicker = null + +/// On mouse down start shooting! +/datum/component/ranged_mob_full_auto/proc/on_mouse_down(client/source, atom/target, turf/location, control, params) + SIGNAL_HANDLER + if (awaiting_status != AUTOFIRE_MOUSEDOWN) + return // Avoid a double mousedown with no mouseup + var/list/modifiers = params2list(params) + + if (LAZYACCESS(modifiers, SHIFT_CLICK)) + return + if (LAZYACCESS(modifiers, CTRL_CLICK)) + return + if (LAZYACCESS(modifiers, MIDDLE_CLICK)) + return + if (LAZYACCESS(modifiers, RIGHT_CLICK)) + return + if (LAZYACCESS(modifiers, ALT_CLICK)) + return + var/mob/living/living_parent = parent + if (!isturf(living_parent.loc) || living_parent.Adjacent(target)) + return + + if (isnull(location) || istype(target, /atom/movable/screen)) // Clicking on a screen object. + if (target.plane != CLICKCATCHER_PLANE) // The clickcatcher is a special case. We want the click to trigger then, under it. + return // If we click and drag on our worn backpack, for example, we want it to open instead. + set_target(parse_caught_click_modifiers(modifiers, get_turf(source.eye), source)) + params = list2params(modifiers) + if (isnull(target)) + CRASH("Failed to get the turf under clickcatcher") + + awaiting_status = AUTOFIRE_MOUSEUP + source.click_intercept_time = world.time // From this point onwards Click() will no longer be triggered. + if (is_firing) + stop_firing() + + set_target(target) + target_loc = get_turf(target) + INVOKE_ASYNC(src, PROC_REF(start_firing)) + +/// Start tracking mouse movement and processing our shots +/datum/component/ranged_mob_full_auto/proc/start_firing() + if (is_firing) + return + + is_firing = TRUE + if (!try_shooting()) // First one is immediate + stop_firing() + return + + clicker.mouse_override_icon = 'icons/effects/mouse_pointers/weapon_pointer.dmi' + clicker.mouse_pointer_icon = clicker.mouse_override_icon + + START_PROCESSING(SSprojectiles, src) + RegisterSignal(clicker, COMSIG_CLIENT_MOUSEUP, PROC_REF(on_mouse_up)) + RegisterSignal(clicker, COMSIG_CLIENT_MOUSEDRAG, PROC_REF(on_mouse_drag)) + +/// When the mouse moved let's try and shift our aim +/datum/component/ranged_mob_full_auto/proc/on_mouse_drag(client/source, atom/src_object, atom/over_object, turf/src_location, turf/over_location, src_control, over_control, params) + SIGNAL_HANDLER + if (!isnull(over_location)) + set_target(over_object) + target_loc = get_turf(over_object) + return + + //This happens when the mouse is over an inventory or screen object, or on entering deep darkness, for example. + var/list/modifiers = params2list(params) + var/new_target = parse_caught_click_modifiers(modifiers, get_turf(source.eye), source) + params = list2params(modifiers) + + if (!isnull(new_target)) + set_target(new_target) + target_loc = new_target + return + + if (QDELETED(target)) //No new target acquired, and old one was deleted, get us out of here. + stop_firing() + CRASH("on_mouse_drag failed to get the turf under screen object [over_object.type]. Old target was incidentally QDELETED.") + + + set_target(get_turf(target)) //If previous target wasn't a turf, let's turn it into one to avoid locking onto a potentially moving target. + target_loc = target + CRASH("on_mouse_drag failed to get the turf under screen object [over_object.type]") + +/// When the mouse is released we should stop +/datum/component/ranged_mob_full_auto/proc/on_mouse_up() + SIGNAL_HANDLER + if (awaiting_status != AUTOFIRE_MOUSEUP) + return + stop_firing() + return COMPONENT_CLIENT_MOUSEUP_INTERCEPT + +/// Stop watching our mouse and processing shots +/datum/component/ranged_mob_full_auto/proc/stop_firing() + if (!is_firing) + return + + is_firing = FALSE + set_target(null) + target_loc = null + STOP_PROCESSING(SSprojectiles, src) + awaiting_status = AUTOFIRE_MOUSEDOWN + + if (isnull(clicker)) + return + UnregisterSignal(clicker, list(COMSIG_CLIENT_MOUSEDRAG, COMSIG_CLIENT_MOUSEUP)) + clicker.mouse_override_icon = null + clicker.mouse_pointer_icon = null + +#undef AUTOFIRE_MOUSEUP +#undef AUTOFIRE_MOUSEDOWN diff --git a/code/datums/components/recharging_attacks.dm b/code/datums/components/recharging_attacks.dm new file mode 100644 index 000000000000..ad4670b2dbfc --- /dev/null +++ b/code/datums/components/recharging_attacks.dm @@ -0,0 +1,66 @@ +/// Reduces the cooldown of a given action upon landing attacks, critting, or killing mobs. +/datum/component/recharging_attacks + /// The target of the most recent attack + var/last_target + /// The stat of the most recently attacked mob + var/last_stat + /// The action to recharge when attacking + var/datum/action/cooldown/recharged_action + /// The amount of cooldown to refund on a successful attack + var/attack_refund + /// The amount of cooldown to refund when putting a target into critical + var/crit_refund + +/datum/component/recharging_attacks/Initialize( + datum/action/cooldown/recharged_action, + attack_refund = 1 SECONDS, + crit_refund = 5 SECONDS, +) + . = ..() + if (!isbasicmob(parent) || !istype(recharged_action)) + return COMPONENT_INCOMPATIBLE + src.recharged_action = recharged_action + src.attack_refund = attack_refund + src.crit_refund = crit_refund + +/datum/component/recharging_attacks/Destroy() + UnregisterSignal(recharged_action, COMSIG_PARENT_QDELETING) + recharged_action = null + return ..() + +/datum/component/recharging_attacks/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(set_old_stat)) + RegisterSignal(parent, COMSIG_HOSTILE_POST_ATTACKINGTARGET, PROC_REF(check_stat)) + RegisterSignal(recharged_action, COMSIG_PARENT_QDELETING, PROC_REF(on_action_qdel)) + +/datum/component/recharging_attacks/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, list(COMSIG_HOSTILE_PRE_ATTACKINGTARGET, COMSIG_HOSTILE_POST_ATTACKINGTARGET)) + if(recharged_action) + UnregisterSignal(recharged_action, COMSIG_PARENT_QDELETING) + +/datum/component/recharging_attacks/proc/set_old_stat(mob/attacker, mob/attacked) + SIGNAL_HANDLER + if(!isliving(attacked)) + return + last_target = attacked + last_stat = attacked.stat + +/datum/component/recharging_attacks/proc/check_stat(mob/living/attacker, mob/living/attacked, success) + SIGNAL_HANDLER + if(!isliving(attacked) || attacked != last_target || attacker.faction_check_atom(attacked)) + return + + var/final_refund = attack_refund + if(QDELETED(attacked) || (attacked.stat == DEAD && last_stat != DEAD)) //The target is dead and we killed them - full refund + final_refund = recharged_action.cooldown_time + else if(attacked.stat > CONSCIOUS && last_stat == CONSCIOUS) //We knocked the target unconscious - partial refund + final_refund = crit_refund + + recharged_action.next_use_time -= final_refund + recharged_action.build_all_button_icons() + +/datum/component/recharging_attacks/proc/on_action_qdel() + SIGNAL_HANDLER + qdel(src) diff --git a/code/datums/components/regenerator.dm b/code/datums/components/regenerator.dm index a6182935a3f0..b33e68abcbc5 100644 --- a/code/datums/components/regenerator.dm +++ b/code/datums/components/regenerator.dm @@ -45,7 +45,7 @@ deltimer(regeneration_start_timer) /// When you take damage, reset the cooldown and start processing -/datum/component/regenerator/proc/on_take_damage(datum/source, damage, damagetype) +/datum/component/regenerator/proc/on_take_damage(datum/source, damage, damagetype, ...) SIGNAL_HANDLER if (damage <= 0) diff --git a/code/datums/components/revenge_ability.dm b/code/datums/components/revenge_ability.dm index a4ba7b4fb515..b79f435662bc 100644 --- a/code/datums/components/revenge_ability.dm +++ b/code/datums/components/revenge_ability.dm @@ -8,7 +8,7 @@ /// The ability to use when we are attacked var/datum/action/cooldown/ability /// Optional datum for validating targets - var/datum/targetting_datum/targetting + var/datum/targeting_strategy/targeting /// Trigger only if target is at least this far away var/min_range /// Trigger only if target is at least this close @@ -16,12 +16,12 @@ /// Target the ability at ourself instead of at the offender var/target_self -/datum/component/revenge_ability/Initialize(datum/action/cooldown/ability, datum/targetting_datum/targetting, min_range = 0, max_range = INFINITY, target_self = FALSE) +/datum/component/revenge_ability/Initialize(datum/action/cooldown/ability, datum/targeting_strategy/targeting, min_range = 0, max_range = INFINITY, target_self = FALSE) . = ..() if (!isliving(parent)) return COMPONENT_INCOMPATIBLE src.ability = ability - src.targetting = targetting + src.targeting = targeting src.min_range = min_range src.max_range = max_range src.target_self = target_self @@ -45,7 +45,7 @@ var/distance = get_dist(ability_user, attacker) if (distance < min_range || distance > max_range) return - if (targetting && !targetting.can_attack(victim, attacker)) + if (targeting && !targeting.can_attack(victim, attacker)) return INVOKE_ASYNC(ability, TYPE_PROC_REF(/datum/action/cooldown, InterceptClickOn), ability_user, null, (target_self) ? ability_user : attacker) diff --git a/code/datums/components/riding/riding.dm b/code/datums/components/riding/riding.dm index 14358a5c5a38..5a043ef6f069 100644 --- a/code/datums/components/riding/riding.dm +++ b/code/datums/components/riding/riding.dm @@ -64,6 +64,8 @@ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(vehicle_moved)) RegisterSignal(parent, COMSIG_MOVABLE_BUMP, PROC_REF(vehicle_bump)) RegisterSignal(parent, COMSIG_BUCKLED_CAN_Z_MOVE, PROC_REF(riding_can_z_move)) + RegisterSignals(parent, GLOB.movement_type_addtrait_signals, PROC_REF(on_movement_type_trait_gain)) + RegisterSignals(parent, GLOB.movement_type_removetrait_signals, PROC_REF(on_movement_type_trait_loss)) /** * This proc handles all of the proc calls to things like set_vehicle_dir_layer() that a type of riding datum needs to call on creation @@ -84,6 +86,10 @@ unequip_buckle_inhands(rider) rider.updating_glide_size = TRUE UnregisterSignal(rider, COMSIG_LIVING_TRY_PULL) + for (var/trait in GLOB.movement_type_trait_to_flag) + if (HAS_TRAIT(parent, trait)) + REMOVE_TRAIT(rider, trait, REF(src)) + REMOVE_TRAIT(rider, TRAIT_NO_FLOATING_ANIM, REF(src)) if(!movable_parent.has_buckled_mobs()) qdel(src) @@ -99,6 +105,11 @@ rider.stop_pulling() RegisterSignal(rider, COMSIG_LIVING_TRY_PULL, PROC_REF(on_rider_try_pull)) + for (var/trait in GLOB.movement_type_trait_to_flag) + if (HAS_TRAIT(parent, trait)) + ADD_TRAIT(rider, trait, REF(src)) + ADD_TRAIT(rider, TRAIT_NO_FLOATING_ANIM, REF(src)) + /// This proc is called when the rider attempts to grab the thing they're riding, preventing them from doing so. /datum/component/riding/proc/on_rider_try_pull(mob/living/rider_pulling, atom/movable/target, force) SIGNAL_HANDLER @@ -273,3 +284,24 @@ /datum/component/riding/proc/riding_can_z_move(atom/movable/movable_parent, direction, turf/start, turf/destination, z_move_flags, mob/living/rider) SIGNAL_HANDLER return COMPONENT_RIDDEN_ALLOW_Z_MOVE + +/// Called when our vehicle gains a movement trait, so we can apply it to the riders +/datum/component/riding/proc/on_movement_type_trait_gain(atom/movable/source, trait) + SIGNAL_HANDLER + var/atom/movable/movable_parent = parent + for (var/mob/rider in movable_parent.buckled_mobs) + ADD_TRAIT(rider, trait, REF(src)) + +/// Called when our vehicle loses a movement trait, so we can remove it from the riders +/datum/component/riding/proc/on_movement_type_trait_loss(atom/movable/source, trait) + SIGNAL_HANDLER + var/atom/movable/movable_parent = parent + for (var/mob/rider in movable_parent.buckled_mobs) + REMOVE_TRAIT(rider, trait, REF(src)) + +/datum/component/riding/proc/force_unbuckle(atom/movable/source, mob/living/living_hitter) + SIGNAL_HANDLER + + if((living_hitter in source.buckled_mobs)) + return + return COMPONENT_CANCEL_ATTACK_CHAIN diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index 5a829df75f81..d72b9e3c8d7d 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -203,7 +203,7 @@ human_parent.buckle_lying = 0 // the riding mob is made nondense so they don't bump into any dense atoms the carrier is pulling, // since pulled movables are moved before buckled movables - riding_mob.set_density(FALSE) + ADD_TRAIT(riding_mob, TRAIT_UNDENSE, VEHICLE_TRAIT) else if(ride_check_flags & CARRIER_NEEDS_ARM) // fireman human_parent.buckle_lying = 90 @@ -227,7 +227,7 @@ unequip_buckle_inhands(parent) var/mob/living/carbon/human/H = parent H.remove_movespeed_modifier(/datum/movespeed_modifier/human_carry) - former_rider.set_density(!former_rider.body_position) + REMOVE_TRAIT(H, TRAIT_UNDENSE, VEHICLE_TRAIT) return ..() /// If the carrier shoves the person they're carrying, force the carried mob off @@ -440,7 +440,7 @@ set_vehicle_dir_layer(WEST, ABOVE_MOB_LAYER) /datum/component/riding/creature/guardian/ride_check(mob/living/user, consequences = TRUE) - var/mob/living/simple_animal/hostile/guardian/charger = parent + var/mob/living/basic/guardian/charger = parent if(!istype(charger)) return ..() return charger.summoner == user diff --git a/code/datums/components/rot.dm b/code/datums/components/rot.dm index beea0d209b27..3dafdf420d4a 100644 --- a/code/datums/components/rot.dm +++ b/code/datums/components/rot.dm @@ -114,7 +114,7 @@ /datum/component/rot/proc/rot_react_touch(datum/source, mob/living/react_to) SIGNAL_HANDLER - rot_react(source, react_to, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + rot_react(source, react_to, pick(GLOB.arm_zones)) /// Triggered when something enters the component's parent. /datum/component/rot/proc/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) diff --git a/code/datums/components/seethrough_mob.dm b/code/datums/components/seethrough_mob.dm new file mode 100644 index 000000000000..4359c454f1a1 --- /dev/null +++ b/code/datums/components/seethrough_mob.dm @@ -0,0 +1,135 @@ +///A component that lets you turn your character transparent in order to see and click through yourself. +/datum/component/seethrough_mob + ///The atom that enables our dark magic + var/atom/movable/render_source_atom + ///The fake version of ourselves + var/image/trickery_image + ///Which alpha do we animate towards? + var/target_alpha + ///How long our faze in/out takes + var/animation_time + ///Does this object let clicks from players its transparent to pass through it + var/clickthrough + ///Is the seethrough effect currently active + var/is_active + ///The mob's original render_target value + var/initial_render_target_value + ///This component's personal uid + var/personal_uid + +/datum/component/seethrough_mob/Initialize(target_alpha = 100, animation_time = 0.5 SECONDS, clickthrough = TRUE) + . = ..() + + if(!ismob(parent)) + return COMPONENT_INCOMPATIBLE + + src.target_alpha = target_alpha + src.animation_time = animation_time + src.clickthrough = clickthrough + src.is_active = FALSE + src.render_source_atom = new() + + var/static/uid = 0 + uid++ + src.personal_uid = uid + + render_source_atom.appearance_flags |= ( RESET_COLOR | RESET_TRANSFORM) + + render_source_atom.vis_flags |= (VIS_INHERIT_ID | VIS_INHERIT_PLANE | VIS_INHERIT_LAYER) + + render_source_atom.render_source = "*transparent_bigmob[personal_uid]" + + var/datum/action/cooldown/toggle_seethrough/action = new(src) + action.Grant(parent) + +/datum/component/seethrough_mob/Destroy(force, silent) + QDEL_NULL(render_source_atom) + return ..() + +///Set up everything we need to trick the client and keep it looking normal for everyone else +/datum/component/seethrough_mob/proc/trick_mob() + SIGNAL_HANDLER + + var/mob/fool = parent + var/datum/hud/our_hud = fool.hud_used + for(var/atom/movable/screen/plane_master/seethrough as anything in our_hud.get_true_plane_masters(SEETHROUGH_PLANE)) + seethrough.unhide_plane(fool) + + var/icon/current_mob_icon = icon(fool.icon, fool.icon_state) + render_source_atom.pixel_x = -fool.pixel_x + render_source_atom.pixel_y = ((current_mob_icon.Height() - 32) * 0.5) + + initial_render_target_value = fool.render_target + fool.render_target = "*transparent_bigmob[personal_uid]" + fool.vis_contents.Add(render_source_atom) + + trickery_image = new(render_source_atom) + trickery_image.loc = render_source_atom + trickery_image.override = TRUE + + trickery_image.pixel_x = 0 + trickery_image.pixel_y = 0 + + if(clickthrough) + //Special plane so we can click through the overlay + SET_PLANE_EXPLICIT(trickery_image, SEETHROUGH_PLANE, fool) + + fool.client.images += trickery_image + + animate(trickery_image, alpha = target_alpha, time = animation_time) + + RegisterSignal(fool, COMSIG_MOB_LOGOUT, PROC_REF(on_client_disconnect)) + +///Remove the screen object and make us appear solid to ourselves again +/datum/component/seethrough_mob/proc/untrick_mob() + var/mob/fool = parent + animate(trickery_image, alpha = 255, time = animation_time) + UnregisterSignal(fool, COMSIG_MOB_LOGOUT) + + //after playing the fade-in animation, remove the image and the trick atom + addtimer(CALLBACK(src, PROC_REF(clear_image), trickery_image, fool.client), animation_time) + +///Remove the image and the trick atom +/datum/component/seethrough_mob/proc/clear_image(image/removee, client/remove_from) + var/atom/movable/atom_parent = parent + atom_parent.vis_contents -= render_source_atom + atom_parent.render_target = initial_render_target_value + remove_from?.images -= removee + +///Effect is disabled when they log out because client gets deleted +/datum/component/seethrough_mob/proc/on_client_disconnect() + SIGNAL_HANDLER + + var/mob/fool = parent + UnregisterSignal(fool, COMSIG_MOB_LOGOUT) + var/datum/hud/our_hud = fool.hud_used + for(var/atom/movable/screen/plane_master/seethrough as anything in our_hud.get_true_plane_masters(SEETHROUGH_PLANE)) + seethrough.hide_plane(fool) + clear_image(trickery_image, fool.client) + +/datum/component/seethrough_mob/proc/toggle_active() + is_active = !is_active + if(is_active) + trick_mob() + else + untrick_mob() + +/datum/action/cooldown/toggle_seethrough + name = "Toggle Seethrough" + desc = "Allows you to see behind your massive body and click through it." + button_icon = 'icons/mob/actions/actions_xeno.dmi' + button_icon_state = "alien_sneak" + background_icon_state = "bg_alien" + cooldown_time = 1 SECONDS + melee_cooldown_time = 0 + +/datum/action/cooldown/toggle_seethrough/Remove(mob/remove_from) + var/datum/component/seethrough_mob/transparency = target + if(transparency.is_active) + transparency.untrick_mob() + return ..() + +/datum/action/cooldown/toggle_seethrough/Activate(atom/t) + StartCooldown() + var/datum/component/seethrough_mob/transparency = target + transparency.toggle_active() diff --git a/code/datums/components/shrink.dm b/code/datums/components/shrink.dm index 9c1c5f76dcde..67cd3d39e23c 100644 --- a/code/datums/components/shrink.dm +++ b/code/datums/components/shrink.dm @@ -10,10 +10,11 @@ parent_atom.transform = parent_atom.transform.Scale(0.5,0.5) olddens = parent_atom.density oldopac = parent_atom.opacity - parent_atom.set_density(FALSE) + parent_atom.set_opacity(FALSE) if(isliving(parent_atom)) var/mob/living/L = parent_atom + ADD_TRAIT(L, TRAIT_UNDENSE, SHRUNKEN_TRAIT) L.add_movespeed_modifier(/datum/movespeed_modifier/shrink_ray) if(iscarbon(L)) var/mob/living/carbon/C = L @@ -23,6 +24,8 @@ if(ishuman(C)) var/mob/living/carbon/human/H = C H.physiology.damage_resistance -= 100//carbons take double damage while shrunk + else + parent_atom.set_density(FALSE) // this is handled by the UNDENSE trait on mobs parent_atom.visible_message(span_warning("[parent_atom] shrinks down to a tiny size!"), span_userdanger("Everything grows bigger!")) QDEL_IN(src, shrink_time) @@ -30,12 +33,14 @@ /datum/component/shrink/Destroy() var/atom/parent_atom = parent parent_atom.transform = parent_atom.transform.Scale(2,2) - parent_atom.set_density(olddens) parent_atom.set_opacity(oldopac) if(isliving(parent_atom)) var/mob/living/L = parent_atom L.remove_movespeed_modifier(/datum/movespeed_modifier/shrink_ray) + REMOVE_TRAIT(L, TRAIT_UNDENSE, SHRUNKEN_TRAIT) if(ishuman(L)) var/mob/living/carbon/human/H = L H.physiology.damage_resistance += 100 + else + parent_atom.set_density(olddens) // this is handled by the UNDENSE trait on mobs return ..() diff --git a/code/datums/components/singularity.dm b/code/datums/components/singularity.dm index 9637a2a746c1..5fdc230c3e14 100644 --- a/code/datums/components/singularity.dm +++ b/code/datums/components/singularity.dm @@ -101,7 +101,7 @@ ) AddComponent(/datum/component/connect_loc_behalf, parent, loc_connections) - RegisterSignal(parent, COMSIG_ATOM_BULLET_ACT, PROC_REF(consume_bullets)) + RegisterSignal(parent, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(consume_bullets)) if (notify_admins) admin_investigate_setup() @@ -127,7 +127,7 @@ COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_BSA_BEAM, - COMSIG_ATOM_BULLET_ACT, + COMSIG_ATOM_PRE_BULLET_ACT, COMSIG_ATOM_BUMPED, COMSIG_MOVABLE_PRE_MOVE, COMSIG_PARENT_ATTACKBY, @@ -180,6 +180,7 @@ SIGNAL_HANDLER qdel(projectile) + return COMPONENT_BULLET_BLOCKED /// Calls singularity_act on the thing passed, usually destroying the object /datum/component/singularity/proc/default_singularity_act(atom/thing) diff --git a/code/datums/components/sitcomlaughter.dm b/code/datums/components/sitcomlaughter.dm index 8dfef21b749d..04a190d15f01 100644 --- a/code/datums/components/sitcomlaughter.dm +++ b/code/datums/components/sitcomlaughter.dm @@ -1,6 +1,6 @@ /datum/component/wearertargeting/sitcomlaughter valid_slots = list(ITEM_SLOT_HANDS, ITEM_SLOT_BELT, ITEM_SLOT_ID, ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET, ITEM_SLOT_SUITSTORE, ITEM_SLOT_DEX_STORAGE) - signals = list(COMSIG_MOB_CREAMED, COMSIG_ON_CARBON_SLIP, COMSIG_ON_VENDOR_CRUSH, COMSIG_MOB_CLUMSY_SHOOT_FOOT) + signals = list(COMSIG_MOB_CREAMED, COMSIG_ON_CARBON_SLIP, COMSIG_POST_TILT_AND_CRUSH, COMSIG_MOB_CLUMSY_SHOOT_FOOT) proctype = PROC_REF(EngageInComedy) mobtype = /mob/living ///Sounds used for when user has a sitcom action occur diff --git a/code/datums/components/slippery.dm b/code/datums/components/slippery.dm index ce9c80c5d348..3e0bbde193cb 100644 --- a/code/datums/components/slippery.dm +++ b/code/datums/components/slippery.dm @@ -42,9 +42,29 @@ if(isitem(parent)) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) + RegisterSignal(parent, COMSIG_ITEM_APPLY_FANTASY_BONUSES, PROC_REF(apply_fantasy_bonuses)) + RegisterSignal(parent, COMSIG_ITEM_REMOVE_FANTASY_BONUSES, PROC_REF(remove_fantasy_bonuses)) else RegisterSignal(parent, COMSIG_ATOM_ENTERED, PROC_REF(Slip)) +/datum/component/slippery/proc/apply_fantasy_bonuses(obj/item/source, bonus) + SIGNAL_HANDLER + knockdown_time = source.modify_fantasy_variable("knockdown_time", knockdown_time, bonus) + if(bonus >= 5) + paralyze_time = source.modify_fantasy_variable("paralyze_time", paralyze_time, bonus) + LAZYSET(source.fantasy_modifications, "lube_flags", lube_flags) + lube_flags |= SLIDE + if(bonus >= 10) + lube_flags |= GALOSHES_DONT_HELP|SLIP_WHEN_CRAWLING + +/datum/component/slippery/proc/remove_fantasy_bonuses(obj/item/source, bonus) + SIGNAL_HANDLER + knockdown_time = source.reset_fantasy_variable("knockdown_time", knockdown_time) + paralyze_time = source.reset_fantasy_variable("paralyze_time", paralyze_time) + var/previous_lube_flags = LAZYACCESS(source.fantasy_modifications, "lube_flags") + if(!isnull(previous_lube_flags)) + lube_flags = previous_lube_flags + /datum/component/slippery/proc/add_connect_loc_behalf_to_parent() if(ismovable(parent)) AddComponent(/datum/component/connect_loc_behalf, parent, default_connections) diff --git a/code/datums/components/soul_stealer.dm b/code/datums/components/soul_stealer.dm index 88ce917e7e11..9c0619cfc8c2 100644 --- a/code/datums/components/soul_stealer.dm +++ b/code/datums/components/soul_stealer.dm @@ -5,13 +5,16 @@ * Used in the cult bastard sword! */ /datum/component/soul_stealer + var/obj/item/soulstone/soulstone_type /// List of soulstones captured by this item. var/list/obj/item/soulstone/soulstones = list() -/datum/component/soul_stealer/Initialize() +/datum/component/soul_stealer/Initialize(soulstone_type = /obj/item/soulstone/anybody/purified) if(!isitem(parent)) return COMPONENT_INCOMPATIBLE + src.soulstone_type = soulstone_type + /datum/component/soul_stealer/Destroy() QDEL_LIST(soulstones) // We own these, so we'll also just get rid of them. Any souls inside will die, this is fine. return ..() @@ -60,7 +63,7 @@ /datum/component/soul_stealer/proc/try_capture(mob/living/carbon/human/victim, mob/living/captor) if(victim.stat == CONSCIOUS) return - var/obj/item/soulstone/soulstone = new(parent) + var/obj/item/soulstone/soulstone = new soulstone_type(parent) soulstone.attack(victim, captor) if(!length(soulstone.contents)) // failed qdel(soulstone) diff --git a/code/datums/components/spirit_holding.dm b/code/datums/components/spirit_holding.dm index dc11d5fd7292..daae8f8b43f5 100644 --- a/code/datums/components/spirit_holding.dm +++ b/code/datums/components/spirit_holding.dm @@ -7,7 +7,7 @@ ///bool on if this component is currently polling for observers to inhabit the item var/attempting_awakening = FALSE ///mob contained in the item. - var/mob/living/simple_animal/shade/bound_spirit + var/mob/living/basic/shade/bound_spirit /datum/component/spirit_holding/Initialize() if(!ismovable(parent)) //you may apply this to mobs, i take no responsibility for how that works out diff --git a/code/datums/components/style/style.dm b/code/datums/components/style/style.dm index a0d6958582ce..c527653d8a6c 100644 --- a/code/datums/components/style/style.dm +++ b/code/datums/components/style/style.dm @@ -452,7 +452,7 @@ // Negative effects -/datum/component/style/proc/on_take_damage() +/datum/component/style/proc/on_take_damage(...) SIGNAL_HANDLER point_multiplier = round(max(point_multiplier - 0.3, 1), 0.1) diff --git a/code/datums/components/surgery_initiator.dm b/code/datums/components/surgery_initiator.dm index af725c1b6982..2f7fb3c3f7c9 100644 --- a/code/datums/components/surgery_initiator.dm +++ b/code/datums/components/surgery_initiator.dm @@ -61,7 +61,7 @@ var/list/available_surgeries = get_available_surgeries(user, target) if(!length(available_surgeries)) - if (target.body_position == LYING_DOWN) + if (target.body_position == LYING_DOWN || !(target.mobility_flags & MOBILITY_LIEDOWN)) target.balloon_alert(user, "no surgeries available!") else target.balloon_alert(user, "make them lie down!") @@ -99,7 +99,7 @@ continue else if(carbon_target && (surgery.surgery_flags & SURGERY_REQUIRE_LIMB)) //mob with no limb in surgery zone when we need a limb continue - if((surgery.surgery_flags & SURGERY_REQUIRE_RESTING) && target.body_position != LYING_DOWN) + if(IS_IN_INVALID_SURGICAL_POSITION(target, surgery)) continue if(!surgery.can_start(user, target)) continue @@ -307,7 +307,7 @@ target.balloon_alert(user, "not the right type of limb!") return - if ((surgery.surgery_flags & SURGERY_REQUIRE_RESTING) && target.body_position != LYING_DOWN) + if (IS_IN_INVALID_SURGICAL_POSITION(target, surgery)) target.balloon_alert(user, "patient is not lying down!") return diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index daa66ea9fb5b..bfdd2ce481fb 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -365,7 +365,7 @@ /datum/component/tackler/proc/splat(mob/living/carbon/user, atom/hit) if(istype(hit, /obj/machinery/vending)) // before we do anything else- var/obj/machinery/vending/darth_vendor = hit - darth_vendor.tilt(user, TRUE) + darth_vendor.tilt(user, 100) return else if(istype(hit, /obj/structure/window)) var/obj/structure/window/W = hit diff --git a/code/datums/components/torn_wall.dm b/code/datums/components/torn_wall.dm new file mode 100644 index 000000000000..cadd7895349f --- /dev/null +++ b/code/datums/components/torn_wall.dm @@ -0,0 +1,105 @@ + +#define TORN_WALL_RUINED 2 +#define TORN_WALL_DAMAGED 1 +#define TORN_WALL_INITIAL 0 + +/** + * Component applied to a wall to progressively destroy it. + * If component is applied to something which already has it, stage increases. + * Wall is destroyed on third application. + * Can be fixed using a welder + */ +/datum/component/torn_wall + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + var/current_stage = TORN_WALL_INITIAL + +/datum/component/torn_wall/Initialize() + . = ..() + if (!isclosedturf(parent) || isindestructiblewall(parent)) + return COMPONENT_INCOMPATIBLE + +/datum/component/torn_wall/RegisterWithParent() + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examined)) + RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_WELDER), PROC_REF(on_welded)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) + RegisterSignal(parent, COMSIG_TURF_CHANGE, PROC_REF(on_turf_changed)) + apply_visuals() + +/datum/component/torn_wall/UnregisterFromParent() + var/atom/atom_parent = parent + UnregisterSignal(parent, list( + COMSIG_PARENT_EXAMINE, + COMSIG_ATOM_TOOL_ACT(TOOL_WELDER), + COMSIG_ATOM_UPDATE_OVERLAYS, + COMSIG_TURF_CHANGE, + )) + atom_parent.update_appearance(UPDATE_ICON) + +/datum/component/torn_wall/InheritComponent(datum/component/C, i_am_original) + increase_stage() + +/// Play a fun animation and make our wall look damaged +/datum/component/torn_wall/proc/apply_visuals() + var/atom/atom_parent = parent + playsound(atom_parent, 'sound/effects/bang.ogg', 50, vary = TRUE) + atom_parent.update_appearance(UPDATE_ICON) + atom_parent.Shake(shake_interval = 0.1 SECONDS, duration = 0.5 SECONDS) + +/// Make the effect more dramatic +/datum/component/torn_wall/proc/increase_stage() + current_stage++ + if (current_stage != TORN_WALL_RUINED) + apply_visuals() + return + var/turf/closed/wall/attached_wall = parent + playsound(attached_wall, 'sound/effects/meteorimpact.ogg', 100, vary = TRUE) + + if(ismineralturf(attached_wall)) + var/turf/closed/mineral/mineral_turf = attached_wall + mineral_turf.gets_drilled() + return + + attached_wall.dismantle_wall(devastated = TRUE) + +/// Fix it up on weld +/datum/component/torn_wall/proc/on_welded(atom/source, mob/user, obj/item/tool) + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(try_repair), source, user, tool) + return COMPONENT_BLOCK_TOOL_ATTACK + +/// Fix us up +/datum/component/torn_wall/proc/try_repair(atom/source, mob/user, obj/item/tool) + source.balloon_alert(user, "repairing...") + if(!tool.use_tool(source, user, 5 SECONDS, amount = 2, volume = 50)) + source.balloon_alert(user, "interrupted!") + return + current_stage-- + if (current_stage < TORN_WALL_INITIAL) + qdel(src) + return + source.update_appearance(UPDATE_ICON) + source.tool_act(user, tool, TOOL_WELDER, is_right_clicking = FALSE) // Keep going + +/// Give them a hint +/datum/component/torn_wall/proc/on_examined(atom/source, mob/user, list/examine_list) + SIGNAL_HANDLER + var/intensity = (current_stage == TORN_WALL_INITIAL) ? "slightly" : "badly" + examine_list += span_notice("It looks [intensity] damaged.") + examine_list += span_info("You may be able to repair it using a welding tool.") + +/// Show a little crack on here +/datum/component/torn_wall/proc/on_update_overlays(turf/source, list/overlays) + SIGNAL_HANDLER + var/mutable_appearance/crack = mutable_appearance('icons/turf/overlays.dmi', "explodable", source.layer + 0.1) + if (current_stage == TORN_WALL_INITIAL) + crack.alpha *= 0.5 + overlays += crack + +/// If the wall becomes any other turf, delete us. Transforming into a different works fine as a fix. +/datum/component/torn_wall/proc/on_turf_changed() + SIGNAL_HANDLER + qdel(src) + +#undef TORN_WALL_RUINED +#undef TORN_WALL_DAMAGED +#undef TORN_WALL_INITIAL diff --git a/code/datums/components/trader/trader.dm b/code/datums/components/trader/trader.dm new file mode 100644 index 000000000000..21fd143528ab --- /dev/null +++ b/code/datums/components/trader/trader.dm @@ -0,0 +1,457 @@ +#define TRADER_RADIAL_BUY "TRADER_RADIAL_BUY" +#define TRADER_RADIAL_SELL "TRADER_RADIAL_SELL" +#define TRADER_RADIAL_TALK "TRADER_RADIAL_TALK" +#define TRADER_RADIAL_LORE "TRADER_RADIAL_LORE" +#define TRADER_RADIAL_NO "TRADER_RADIAL_NO" +#define TRADER_RADIAL_YES "TRADER_RADIAL_YES" +#define TRADER_RADIAL_OUT_OF_STOCK "TRADER_RADIAL_OUT_OF_STOCK" +#define TRADER_RADIAL_DISCUSS_BUY "TRADER_RADIAL_DISCUSS_BUY" +#define TRADER_RADIAL_DISCUSS_SELL "TRADER_RADIAL_DISCUSS_SELL" + +#define TRADER_OPTION_BUY "Buy" +#define TRADER_OPTION_SELL "Sell" +#define TRADER_OPTION_TALK "Talk" +#define TRADER_OPTION_LORE "Lore" +#define TRADER_OPTION_NO "No" +#define TRADER_OPTION_YES "Yes" +#define TRADER_OPTION_BUYING "Buying?" +#define TRADER_OPTION_SELLING "Selling?" + +//The defines below show the index the info is located in the product_info entry list + +#define TRADER_PRODUCT_INFO_PRICE 1 +#define TRADER_PRODUCT_INFO_QUANTITY 2 +//Only valid for wanted_items +#define TRADER_PRODUCT_INFO_PRICE_MOD_DESCRIPTION 3 + +/** + * # Trader NPC Component + * Manages the barks and the stocks of the traders + * Also manages the interactive radial menu + */ +/datum/component/trader + + /** + * Format; list(TYPEPATH = list(PRICE, QUANTITY)) + * Associated list of items the NPC sells with how much they cost and the quantity available before a restock + * This list is filled by Initialize(), if you want to change the starting products, modify initial_products() + * * + */ + var/list/obj/item/products = list() + /** + * A list of wanted items that the trader would wish to buy, each typepath has a assigned value, quantity and additional flavor text + * + * CHILDREN OF TYPEPATHS INCLUDED IN WANTED_ITEMS WILL BE TREATED AS THE PARENT IF NO ENTRY EXISTS FOR THE CHILDREN + * + * As an additional note; if you include multiple children of a typepath; the typepath with the most children should be placed after all other typepaths + * Bad; list(/obj/item/milk = list(100, 1, ""), /obj/item/milk/small = list(50, 2, "")) + * Good; list(/obj/item/milk/small = list(50, 2, ""), /obj/item/milk = list(100, 1, "")) + * This is mainly because sell_item() uses a istype(item_being_sold, item_in_entry) to determine what parent should the child be automatically considered as + * If /obj/item/milk/small/spooky was being sold; /obj/item/milk/small would be the first to check against rather than /obj/item/milk + * + * Format; list(TYPEPATH = list(PRICE, QUANTITY, ADDITIONAL_DESCRIPTION)) + * Associated list of items able to be sold to the NPC with the money given for them. + * The price given should be the "base" price; any price manipulation based on variables should be done with apply_sell_price_mods() + * ADDITIONAL_DESCRIPTION is any additional text added to explain how the variables of the item effect the price; if it's stack based, it's final price depends how much is in the stack + * EX; /obj/item/stack/sheet/mineral/diamond = list(500, INFINITY, ", per 100 cm3 sheet of diamond") + * This list is filled by Initialize(), if you want to change the starting wanted items, modify initial_wanteds() + */ + var/list/wanted_items = list() + + ///Contains images of all radial icons + var/static/list/radial_icons_cache = list() + + ///Contains information of a specific trader + var/datum/trader_data/trader_data + +/* +Can accept both a type path, and an instance of a datum. Type path has priority. +*/ +/datum/component/trader/Initialize(trader_data_path = null, trader_data = null) + . = ..() + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + + if(ispath(trader_data_path, /datum/trader_data)) + trader_data = new trader_data_path + if(isnull(trader_data)) + CRASH("Initialised trader component with no trader data.") + + src.trader_data = trader_data + + radial_icons_cache = list( + TRADER_RADIAL_BUY = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_buy"), + TRADER_RADIAL_SELL = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_sell"), + TRADER_RADIAL_TALK = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_talk"), + TRADER_RADIAL_LORE = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_lore"), + TRADER_RADIAL_DISCUSS_BUY = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_buying"), + TRADER_RADIAL_DISCUSS_SELL = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_selling"), + TRADER_RADIAL_YES = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_yes"), + TRADER_RADIAL_NO = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_no"), + TRADER_RADIAL_OUT_OF_STOCK = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_center"), + ) + + restock_products() + renew_item_demands() + +/datum/component/trader/RegisterWithParent() + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand)) + +/datum/component/trader/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_ATOM_ATTACK_HAND) + +///If our trader is alive, and the customer left clicks them with an empty hand without combat mode +/datum/component/trader/proc/on_attack_hand(atom/source, mob/living/carbon/customer) + SIGNAL_HANDLER + if(!can_trade(customer) || (customer.istate & ISTATE_HARM)) + return + var/list/npc_options = list() + if(length(products)) + npc_options[TRADER_OPTION_BUY] = radial_icons_cache[TRADER_RADIAL_BUY] + if(length(wanted_items)) + npc_options[TRADER_OPTION_SELL] = radial_icons_cache[TRADER_RADIAL_SELL] + if(length(trader_data.say_phrases)) + npc_options[TRADER_OPTION_TALK] = radial_icons_cache[TRADER_RADIAL_TALK] + if(!length(npc_options)) + return + + var/mob/living/trader = parent + trader.face_atom(customer) + + INVOKE_ASYNC(src, PROC_REF(open_npc_options), customer, npc_options) + + return COMPONENT_CANCEL_ATTACK_CHAIN + +/** + * Generates a radial of the initial radials of the NPC + * Called via asynch, due to the sleep caused by show_radial_menu + * Arguments: + * * customer - (Mob REF) The mob trying to buy something + */ +/datum/component/trader/proc/open_npc_options(mob/living/carbon/customer, list/npc_options) + if(!can_trade(customer)) + return + var/npc_result = show_radial_menu(customer, parent, npc_options, custom_check = CALLBACK(src, PROC_REF(check_menu), customer), require_near = TRUE, tooltips = TRUE) + switch(npc_result) + if(TRADER_OPTION_BUY) + buy_item(customer) + if(TRADER_OPTION_SELL) + try_sell(customer) + if(TRADER_OPTION_TALK) + discuss(customer) + +/** + * Checks if the customer is ok to use the radial + * + * Checks if the customer is not a mob or is incapacitated or not adjacent to the source of the radial, in those cases returns FALSE, otherwise returns TRUE + * Arguments: + * * customer - (Mob REF) The mob checking the menu + */ +/datum/component/trader/proc/check_menu(mob/customer) + if(!istype(customer)) + return FALSE + if(IS_DEAD_OR_INCAP(customer) || !customer.Adjacent(parent)) + return FALSE + return TRUE + +/** + * Generates a radial of the items the NPC sells and lets the user try to buy one + * Arguments: + * * customer - (Mob REF) The mob trying to buy something + */ +/datum/component/trader/proc/buy_item(mob/customer) + if(!can_trade(customer)) + return + + if(!LAZYLEN(products)) + return + + var/list/display_names = list() + var/list/items = list() + var/list/product_info + + for(var/obj/item/thing as anything in products) + display_names["[initial(thing.name)]"] = thing + + if(!radial_icons_cache[thing]) + radial_icons_cache[thing] = image(icon = initial(thing.icon), icon_state = initial(thing.icon_state_preview) ? initial(thing.icon_state_preview) : initial(thing.icon_state)) + + var/image/item_image = radial_icons_cache[thing] + product_info = products[thing] + + if(product_info[TRADER_PRODUCT_INFO_QUANTITY] <= 0) //out of stock + item_image.overlays += radial_icons_cache[TRADER_RADIAL_OUT_OF_STOCK] + + items += list("[initial(thing.name)]" = item_image) + + var/pick = show_radial_menu(customer, parent, items, custom_check = CALLBACK(src, PROC_REF(check_menu), customer), require_near = TRUE, tooltips = TRUE) + if(!pick || !can_trade(customer)) + return + + var/obj/item/item_to_buy = display_names[pick] + var/mob/living/trader = parent + trader.face_atom(customer) + product_info = products[item_to_buy] + + if(!product_info[TRADER_PRODUCT_INFO_QUANTITY]) + trader.say("[initial(item_to_buy.name)] appears to be out of stock.") + return + + trader.say("It will cost you [product_info[TRADER_PRODUCT_INFO_PRICE]] [trader_data.currency_name] to buy \the [initial(item_to_buy.name)]. Are you sure you want to buy it?") + var/list/npc_options = list( + TRADER_OPTION_YES = radial_icons_cache[TRADER_RADIAL_YES], + TRADER_OPTION_NO = radial_icons_cache[TRADER_RADIAL_NO], + ) + + var/buyer_will_buy = show_radial_menu(customer, trader, npc_options, custom_check = CALLBACK(src, PROC_REF(check_menu), customer), require_near = TRUE, tooltips = TRUE) + if(buyer_will_buy != TRADER_OPTION_YES || !can_trade(customer)) + return + + trader.face_atom(customer) + + if(!spend_buyer_offhand_money(customer, product_info[TRADER_PRODUCT_INFO_PRICE])) + trader.say(trader_data.return_trader_phrase(NO_CASH_PHRASE)) + return + + item_to_buy = new item_to_buy(get_turf(customer)) + customer.put_in_hands(item_to_buy) + playsound(trader, trader_data.sell_sound, 50, TRUE) + log_econ("[item_to_buy] has been sold to [customer] (typepath used for product info; [item_to_buy.type]) by [trader] for [product_info[TRADER_PRODUCT_INFO_PRICE]] cash.") + product_info[TRADER_PRODUCT_INFO_QUANTITY] -= 1 + trader.say(trader_data.return_trader_phrase(BUY_PHRASE)) + +///Calculates the value of money in the hand of the buyer and spends it if it's sufficient +/datum/component/trader/proc/spend_buyer_offhand_money(mob/customer, the_cost) + var/value = 0 + var/obj/item/holochip/cash = customer.is_holding_item_of_type(/obj/item/holochip) + if(cash) + value += cash.credits + if((value >= the_cost) && cash) + return cash.spend(the_cost) + return FALSE //Purchase unsuccessful + +/** + * Tries to call sell_item on one of the customer's held items, if fail gives a chat message + * + * Gets both items in the customer's hands, and then tries to call sell_item on them, if both fail, he gives a chat message + * Arguments: + * * customer - (Mob REF) The mob trying to sell something + */ +/datum/component/trader/proc/try_sell(mob/customer) + if(!can_trade(customer)) + return + var/sold_item = FALSE + for(var/obj/item/an_item in customer.held_items) + if(sell_item(customer, an_item)) + sold_item = TRUE + break + if(!sold_item && can_trade(customer)) //only talk if you are not dead or in combat + var/mob/living/trader = parent + trader.say(trader_data.return_trader_phrase(ITEM_REJECTED_PHRASE)) + + +/** + * Checks if an item is in the list of wanted items and if it is after a Yes/No radial returns generate_cash with the value of the item for the NPC + * Arguments: + * * customer - (Mob REF) The mob trying to sell something + * * selling - (Item REF) The item being sold + */ +/datum/component/trader/proc/sell_item(mob/customer, obj/item/selling) + if(isnull(selling)) + return FALSE + var/list/product_info + //Keep track of the typepath; rather mundane but it's required for correctly modifying the wanted_items + //should a product be sellable because even if it doesn't have a entry because it's a child of a parent that is present on the list + var/typepath_for_product_info + + if(selling.type in wanted_items) + product_info = wanted_items[selling.type] + typepath_for_product_info = selling.type + else //Assume wanted_items is setup in the correct way; read wanted_items documentation for more info + for(var/typepath in wanted_items) + if(!istype(selling, typepath)) + continue + + product_info = wanted_items[typepath] + typepath_for_product_info = typepath + break + + if(!product_info) //Nothing interesting to sell + return FALSE + + var/mob/living/trader = parent + + if(product_info[TRADER_PRODUCT_INFO_QUANTITY] <= 0) + trader.say(trader_data.return_trader_phrase(TRADER_HAS_ENOUGH_ITEM_PHRASE)) + return FALSE + + var/cost = apply_sell_price_mods(selling, product_info[TRADER_PRODUCT_INFO_PRICE]) + if(cost <= 0) + trader.say(trader_data.return_trader_phrase(ITEM_IS_WORTHLESS_PHRASE)) + return FALSE + + trader.say(trader_data.return_trader_phrase(INTERESTED_PHRASE)) + trader.say("You will receive [cost] [trader_data.currency_name] for the [selling].") + var/list/npc_options = list( + TRADER_OPTION_YES = radial_icons_cache[TRADER_RADIAL_YES], + TRADER_OPTION_NO = radial_icons_cache[TRADER_RADIAL_NO], + ) + + trader.face_atom(customer) + + var/npc_result = show_radial_menu(customer, trader, npc_options, custom_check = CALLBACK(src, PROC_REF(check_menu), customer), require_near = TRUE, tooltips = TRUE) + if(!can_trade(customer)) + return + if(npc_result != TRADER_OPTION_YES) + trader.say(trader_data.return_trader_phrase(ITEM_SELLING_CANCELED_PHRASE)) + return TRUE + + trader.say(trader_data.return_trader_phrase(ITEM_SELLING_ACCEPTED_PHRASE)) + playsound(trader, trader_data.sell_sound, 50, TRUE) + log_econ("[selling] has been sold to [trader] (typepath used for product info; [typepath_for_product_info]) by [customer] for [cost] cash.") + exchange_sold_items(selling, cost, typepath_for_product_info) + generate_cash(cost, customer) + return TRUE + +/** + * Modifies the 'base' price of a item based on certain variables + * + * Arguments: + * * Reference to the item; this is the item being sold + * * Original cost; the original cost of the item, to be manipulated depending on the variables of the item, one example is using item.amount if it's a stack + */ +/datum/component/trader/proc/apply_sell_price_mods(obj/item/selling, original_cost) + if(isstack(selling)) + var/obj/item/stack/stackoverflow = selling + original_cost *= stackoverflow.amount + return original_cost + +/** + * Handles modifying/deleting the items to ensure that a proper amount is converted into cash; put into it's own proc to make the children of this not override a 30+ line sell_item() + * + * Arguments: + * * selling - (Item REF) this is the item being sold + * * value_exchanged_for - (Number) the "value", useful for a scenario where you want to remove enough items equal to the value + * * original_typepath - (Typepath) For scenarios where a children of a parent is being sold but we want to modify the parent's product information + */ +/datum/component/trader/proc/exchange_sold_items(obj/item/selling, value_exchanged_for, original_typepath) + var/list/product_info = wanted_items[original_typepath] + if(isstack(selling)) + var/obj/item/stack/the_stack = selling + var/actually_sold = min(the_stack.amount, product_info[TRADER_PRODUCT_INFO_QUANTITY]) + the_stack.use(actually_sold) + product_info[TRADER_PRODUCT_INFO_QUANTITY] -= (actually_sold) + else + qdel(selling) + product_info[TRADER_PRODUCT_INFO_QUANTITY] -= 1 + +/** + * Creates an item equal to the value set by the proc and puts it in the user's hands if possible + * Arguments: + * * value - A number; The amount of cash that will be on the holochip + * * customer - Reference to a mob; The mob we put the holochip in hands of + */ +/datum/component/trader/proc/generate_cash(value, mob/customer) + var/obj/item/holochip/chip = new /obj/item/holochip(get_turf(customer), value) + customer.put_in_hands(chip) + +///Talk about what items are being sold/wanted by the trader and in what quantity or lore +/datum/component/trader/proc/discuss(mob/customer) + var/list/npc_options = list( + TRADER_OPTION_LORE = radial_icons_cache[TRADER_RADIAL_LORE], + TRADER_OPTION_SELLING = radial_icons_cache[TRADER_RADIAL_DISCUSS_SELL], + TRADER_OPTION_BUYING = radial_icons_cache[TRADER_RADIAL_DISCUSS_BUY], + ) + var/pick = show_radial_menu(customer, parent, npc_options, custom_check = CALLBACK(src, PROC_REF(check_menu), customer), require_near = TRUE, tooltips = TRUE) + if(!can_trade(customer)) + return + switch(pick) + if(TRADER_OPTION_LORE) + var/mob/living/trader = parent + trader.say(trader_data.return_trader_phrase(TRADER_LORE_PHRASE)) + if(TRADER_OPTION_BUYING) + trader_buys_what(customer) + if(TRADER_OPTION_SELLING) + trader_sells_what(customer) + +///Displays to the customer what the trader is willing to buy and how much until a restock happens +/datum/component/trader/proc/trader_buys_what(mob/customer) + if(!can_trade(customer)) + return + if(!length(wanted_items)) + var/mob/living/trader = parent + trader.say(trader_data.return_trader_phrase(TRADER_NOT_BUYING_ANYTHING)) + return + + var/list/buy_info = list(span_green("I'm willing to buy the following:")) + + var/list/product_info + for(var/obj/item/thing as anything in wanted_items) + product_info = wanted_items[thing] + var/tern_op_result = (product_info[TRADER_PRODUCT_INFO_QUANTITY] == INFINITY ? "as many as I can." : "[product_info[TRADER_PRODUCT_INFO_QUANTITY]]") //Coder friendly string concat + if(product_info[TRADER_PRODUCT_INFO_QUANTITY] <= 0) //Zero demand + buy_info += span_notice("• [span_red("(DOESN'T WANT MORE)")] [initial(thing.name)] for [product_info[TRADER_PRODUCT_INFO_PRICE]] [trader_data.currency_name][product_info[TRADER_PRODUCT_INFO_PRICE_MOD_DESCRIPTION]]; willing to buy [span_red("[tern_op_result]")] more.") + else + buy_info += span_notice("• [initial(thing.name)] for [product_info[TRADER_PRODUCT_INFO_PRICE]] [trader_data.currency_name][product_info[TRADER_PRODUCT_INFO_PRICE_MOD_DESCRIPTION]]; willing to buy [span_green("[tern_op_result]")]") + + to_chat(customer, examine_block(buy_info.Join("\n"))) + +///Displays to the customer what the trader is selling and how much is in stock +/datum/component/trader/proc/trader_sells_what(mob/customer) + if(!can_trade(customer)) + return + var/mob/living/trader = parent + if(!length(products)) + trader.say(trader_data.return_trader_phrase(TRADER_NOT_SELLING_ANYTHING)) + return + var/list/sell_info = list(span_green("I'm currently selling the following:")) + var/list/product_info + for(var/obj/item/thing as anything in products) + product_info = products[thing] + var/tern_op_result = (product_info[TRADER_PRODUCT_INFO_QUANTITY] == INFINITY ? "an infinite amount" : "[product_info[TRADER_PRODUCT_INFO_QUANTITY]]") //Coder friendly string concat + if(product_info[TRADER_PRODUCT_INFO_QUANTITY] <= 0) //Out of stock + sell_info += span_notice("• [span_red("(OUT OF STOCK)")] [initial(thing.name)] for [product_info[TRADER_PRODUCT_INFO_PRICE]] [trader_data.currency_name]; [span_red("[tern_op_result]")] left in stock") + else + sell_info += span_notice("• [initial(thing.name)] for [product_info[TRADER_PRODUCT_INFO_PRICE]] [trader_data.currency_name]; [span_green("[tern_op_result]")] left in stock") + to_chat(customer, examine_block(sell_info.Join("\n"))) + +///Sets quantity of all products to initial(quanity); this proc is currently called during initialize +/datum/component/trader/proc/restock_products() + products = trader_data.initial_products.Copy() + +///Sets quantity of all wanted_items to initial(quanity); this proc is currently called during initialize +/datum/component/trader/proc/renew_item_demands() + wanted_items = trader_data.initial_wanteds.Copy() + +///Returns if the trader is conscious and its combat mode is disabled. +/datum/component/trader/proc/can_trade(mob/customer) + var/mob/living/trader = parent + if(trader.istate & ISTATE_HARM) + trader.balloon_alert(customer, "in combat!") + return FALSE + if(IS_DEAD_OR_INCAP(trader)) + trader.balloon_alert(customer, "indisposed!") + return FALSE + return TRUE + +#undef TRADER_RADIAL_BUY +#undef TRADER_RADIAL_SELL +#undef TRADER_RADIAL_TALK +#undef TRADER_RADIAL_LORE +#undef TRADER_RADIAL_DISCUSS_BUY +#undef TRADER_RADIAL_DISCUSS_SELL +#undef TRADER_RADIAL_NO +#undef TRADER_RADIAL_YES +#undef TRADER_RADIAL_OUT_OF_STOCK +#undef TRADER_PRODUCT_INFO_PRICE +#undef TRADER_PRODUCT_INFO_QUANTITY +#undef TRADER_PRODUCT_INFO_PRICE_MOD_DESCRIPTION + +#undef TRADER_OPTION_BUY +#undef TRADER_OPTION_SELL +#undef TRADER_OPTION_TALK +#undef TRADER_OPTION_LORE +#undef TRADER_OPTION_NO +#undef TRADER_OPTION_YES +#undef TRADER_OPTION_BUYING +#undef TRADER_OPTION_SELLING diff --git a/code/datums/components/transforming.dm b/code/datums/components/transforming.dm index d704ca2098df..3c3fec196c23 100644 --- a/code/datums/components/transforming.dm +++ b/code/datums/components/transforming.dm @@ -89,6 +89,23 @@ RegisterSignal(parent, COMSIG_ITEM_SHARPEN_ACT, PROC_REF(on_sharpen)) RegisterSignal(parent, COMSIG_DETECTIVE_SCANNED, PROC_REF(on_scan)) + RegisterSignal(parent, COMSIG_ITEM_APPLY_FANTASY_BONUSES, PROC_REF(apply_fantasy_bonuses)) + RegisterSignal(parent, COMSIG_ITEM_REMOVE_FANTASY_BONUSES, PROC_REF(remove_fantasy_bonuses)) + +/datum/component/transforming/proc/apply_fantasy_bonuses(obj/item/source, bonus) + SIGNAL_HANDLER + active = FALSE + set_inactive(source) + force_on = source.modify_fantasy_variable("force_on", force_on, bonus) + throwforce_on = source.modify_fantasy_variable("throwforce_on", throwforce_on, bonus) + +/datum/component/transforming/proc/remove_fantasy_bonuses(obj/item/source, bonus) + SIGNAL_HANDLER + active = FALSE + set_inactive(source) + force_on = source.reset_fantasy_variable("force_on", force_on) + throwforce_on = source.reset_fantasy_variable("throwforce_on", throwforce_on) + /datum/component/transforming/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_SHARPEN_ACT, COMSIG_DETECTIVE_SCANNED)) diff --git a/code/datums/components/tree_climber.dm b/code/datums/components/tree_climber.dm index 2a0534a38b85..eaa2136687eb 100644 --- a/code/datums/components/tree_climber.dm +++ b/code/datums/components/tree_climber.dm @@ -12,6 +12,8 @@ return COMPONENT_INCOMPATIBLE src.climbing_distance = climbing_distance + ADD_TRAIT(parent, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type) + /datum/component/tree_climber/RegisterWithParent() RegisterSignals(parent, list(COMSIG_HOSTILE_PRE_ATTACKINGTARGET, COMSIG_LIVING_CLIMB_TREE), PROC_REF(climb_tree)) RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm index 756f30bd644d..8ac0f0896da6 100644 --- a/code/datums/components/twohanded.dm +++ b/code/datums/components/twohanded.dm @@ -92,6 +92,25 @@ RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON, PROC_REF(on_update_icon)) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) RegisterSignal(parent, COMSIG_ITEM_SHARPEN_ACT, PROC_REF(on_sharpen)) + RegisterSignal(parent, COMSIG_ITEM_APPLY_FANTASY_BONUSES, PROC_REF(apply_fantasy_bonuses)) + RegisterSignal(parent, COMSIG_ITEM_REMOVE_FANTASY_BONUSES, PROC_REF(remove_fantasy_bonuses)) + +/datum/component/two_handed/proc/apply_fantasy_bonuses(obj/item/source, bonus) + SIGNAL_HANDLER + force_wielded = source.modify_fantasy_variable("force_wielded", force_wielded, bonus) + force_unwielded = source.modify_fantasy_variable("force_unwielded", force_unwielded, bonus) + if(wielded && ismob(source.loc)) + unwield(source.loc) + if(force_multiplier) + force_multiplier = source.modify_fantasy_variable("force_multiplier", force_multiplier, bonus/10, minimum = 1) + +/datum/component/two_handed/proc/remove_fantasy_bonuses(obj/item/source, bonus) + SIGNAL_HANDLER + force_wielded = source.reset_fantasy_variable("force_wielded", force_wielded) + force_unwielded = source.reset_fantasy_variable("force_unwielded", force_unwielded) + if(wielded && ismob(source.loc)) + unwield(source.loc) + force_multiplier = source.reset_fantasy_variable("force_multiplier", force_multiplier) // Remove all siginals registered to the parent item /datum/component/two_handed/UnregisterFromParent() diff --git a/code/datums/components/udder.dm b/code/datums/components/udder.dm index 149cb6ee6f00..44367327d3fb 100644 --- a/code/datums/components/udder.dm +++ b/code/datums/components/udder.dm @@ -13,7 +13,8 @@ /datum/component/udder/Initialize(udder_type = /obj/item/udder, datum/callback/on_milk_callback, datum/callback/on_generate_callback, reagent_produced_typepath = /datum/reagent/consumable/milk) if(!isliving(parent)) //technically is possible to drop this on carbons... but you wouldn't do that to me, would you? return COMPONENT_INCOMPATIBLE - udder = new udder_type(null, parent, on_generate_callback, reagent_produced_typepath) + udder = new udder_type(null) + udder.add_features(parent, on_generate_callback, reagent_produced_typepath) src.on_milk_callback = on_milk_callback /datum/component/udder/RegisterWithParent() @@ -69,14 +70,68 @@ var/mob/living/udder_mob ///optional proc to callback to when the udder generates milk var/datum/callback/on_generate_callback - -/obj/item/udder/Initialize(mapload, udder_mob, on_generate_callback, reagent_produced_typepath = /datum/reagent/consumable/milk) - src.udder_mob = udder_mob - src.on_generate_callback = on_generate_callback + ///do we require some food to generate milk? + var/require_consume_type + ///how long does each food consumption allow us to make milk + var/require_consume_timer = 2 MINUTES + ///hunger key we set to look for food + var/hunger_key = BB_CHECK_HUNGRY + +/obj/item/udder/proc/add_features(parent, callback, reagent = /datum/reagent/consumable/milk) + udder_mob = parent + on_generate_callback = callback create_reagents(size, REAGENT_HOLDER_ALIVE) - src.reagent_produced_typepath = reagent_produced_typepath + reagent_produced_typepath = reagent initial_conditions() + if(isnull(require_consume_type)) + return + RegisterSignal(udder_mob, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_mob_consume)) + RegisterSignal(udder_mob, COMSIG_PARENT_ATTACKBY, PROC_REF(on_mob_feed)) + udder_mob.ai_controller?.set_blackboard_key(BB_CHECK_HUNGRY, TRUE) + +/obj/item/udder/proc/on_mob_consume(datum/source, atom/feed) + SIGNAL_HANDLER + + if(!istype(feed, require_consume_type)) + return + INVOKE_ASYNC(src, PROC_REF(handle_consumption), feed) + return COMPONENT_HOSTILE_NO_ATTACK + +/obj/item/udder/proc/on_mob_feed(datum/source, atom/used_item, mob/living/user) + SIGNAL_HANDLER + + if(!istype(used_item, require_consume_type)) + return + INVOKE_ASYNC(src, PROC_REF(handle_consumption), used_item, user) + return COMPONENT_NO_AFTERATTACK + +/obj/item/udder/proc/handle_consumption(atom/movable/food, mob/user) + if(locate(food.type) in src) + if(user) + user.balloon_alert(user, "already full!") + return + playsound(udder_mob.loc,'sound/items/eatfood.ogg', 50, TRUE) + udder_mob.visible_message(span_notice("[udder_mob] gobbles up [food]!"), span_notice("You gobble up [food]!")) + var/atom/movable/final_food = food + if(isstack(food)) //if stack, only consume 1 + var/obj/item/stack/food_stack = food + final_food = food_stack.split_stack(udder_mob, 1) + final_food.forceMove(src) + +/obj/item/udder/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + if(!istype(arrived, require_consume_type)) + return ..() + + udder_mob.ai_controller?.set_blackboard_key(hunger_key, FALSE) + QDEL_IN(arrived, require_consume_timer) + return ..() + +/obj/item/udder/Exited(atom/movable/gone, direction) . = ..() + if(!istype(gone, require_consume_type)) + return + udder_mob.ai_controller?.set_blackboard_key(hunger_key, TRUE) + /obj/item/udder/Destroy() . = ..() @@ -99,10 +154,13 @@ * Proc called every 2 seconds from SSMobs to add whatever reagent the udder is generating. */ /obj/item/udder/proc/generate() - if(prob(5)) - reagents.add_reagent(reagent_produced_typepath, rand(5, 10)) - if(on_generate_callback) - on_generate_callback.Invoke(reagents.total_volume, reagents.maximum_volume) + if(!isnull(require_consume_type) && !(locate(require_consume_type) in src)) + return + if(prob(95)) + return + reagents.add_reagent(reagent_produced_typepath, rand(5, 10), added_purity = 1) + if(on_generate_callback) + on_generate_callback.Invoke(reagents.total_volume, reagents.maximum_volume) /** * Proc called from attacking the component parent with the correct item, moves reagents into the glass basically. @@ -123,48 +181,20 @@ /** * # gutlunch udder subtype - * - * Used by gutlunches, and generates healing reagents instead of milk on eating gibs instead of a process. Starts empty! - * Female gutlunches (ahem, guthens if you will) make babies when their udder is full under processing, instead of milk generation */ + /obj/item/udder/gutlunch name = "nutrient sac" - -/obj/item/udder/gutlunch/initial_conditions() - if(!udder_mob) - return - if(udder_mob.gender == FEMALE) - START_PROCESSING(SSobj, src) - RegisterSignal(udder_mob, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_mob_attacking)) - -/obj/item/udder/gutlunch/process(seconds_per_tick) - var/mob/living/simple_animal/hostile/asteroid/gutlunch/gutlunch = udder_mob - if(reagents.total_volume != reagents.maximum_volume) - return - if(gutlunch.make_babies()) - reagents.clear_reagents() - //usually this would be a callback but this is a specifically gutlunch feature so fuck it, gutlunch specific proccall - gutlunch.regenerate_icons(reagents.total_volume, reagents.maximum_volume) - -/** - * signal called on parent attacking an atom -*/ -/obj/item/udder/gutlunch/proc/on_mob_attacking(mob/living/simple_animal/hostile/gutlunch, atom/target) - SIGNAL_HANDLER - - if(is_type_in_typecache(target, gutlunch.wanted_objects)) //we eats - generate() - gutlunch.visible_message(span_notice("[udder_mob] slurps up [target].")) - qdel(target) - return COMPONENT_HOSTILE_NO_ATTACK //there is no longer a target to attack + require_consume_type = /obj/item/stack/ore + reagent_produced_typepath = /datum/reagent/medicine/mine_salve /obj/item/udder/gutlunch/generate() - var/made_something = FALSE - if(prob(60)) - reagents.add_reagent(/datum/reagent/consumable/cream, rand(2, 5)) - made_something = TRUE - if(prob(45)) + . = ..() + if(!.) + return + if(locate(/obj/item/stack/ore/gold) in src) + reagents.add_reagent(/datum/reagent/consumable/cream, rand(2, 5), added_purity = 1) + if(locate(/obj/item/stack/ore/bluespace_crystal) in src) reagents.add_reagent(/datum/reagent/medicine/salglu_solution, rand(2,5)) - made_something = TRUE - if(made_something && on_generate_callback) + if(on_generate_callback) on_generate_callback.Invoke(reagents.total_volume, reagents.maximum_volume) diff --git a/code/datums/components/unusual_effect.dm b/code/datums/components/unusual_effect.dm new file mode 100644 index 000000000000..eb67b9537997 --- /dev/null +++ b/code/datums/components/unusual_effect.dm @@ -0,0 +1,60 @@ + +/particles/unusual_effect + icon = 'icons/effects/particles/pollen.dmi' + icon_state = "pollen" + width = 100 + height = 100 + count = 1000 + spawning = 4 + lifespan = 0.7 SECONDS + fade = 1 SECONDS + grow = -0.01 + velocity = list(0, 0) + position = generator(GEN_CIRCLE, 0, 16, NORMAL_RAND) + drift = generator(GEN_VECTOR, list(0, -0.2), list(0, 0.2)) + gravity = list(0, 0.95) + scale = generator(GEN_VECTOR, list(0.3, 0.3), list(1,1), NORMAL_RAND) + rotation = 30 + spin = generator(GEN_NUM, -20, 20) + +/// Creates a cool looking effect on the movable. +/// In the future, this could be expanded to have more interesting particles and effects. +/datum/component/unusual_effect + dupe_mode = COMPONENT_DUPE_HIGHLANDER + + var/obj/effect/abstract/particle_holder/special_effects + + var/color + + COOLDOWN_DECLARE(glow_cooldown) + +/datum/component/unusual_effect/Initialize(color, include_particles = FALSE) + var/atom/movable/parent_movable = parent + if (!istype(parent_movable)) + return COMPONENT_INCOMPATIBLE + + src.color = color + parent_movable.add_filter("unusual_effect", 2, list("type" = "outline", "color" = color, "size" = 2)) + if(include_particles) + special_effects = new(parent_movable, /particles/unusual_effect) + START_PROCESSING(SSobj, src) + +/datum/component/unusual_effect/Destroy(force, silent) + var/atom/movable/parent_movable = parent + if (istype(parent_movable)) + parent_movable.remove_filter("unusual_effect") + STOP_PROCESSING(SSobj, src) + return ..() + +/datum/component/unusual_effect/process(seconds_per_tick) + var/atom/movable/parent_movable = parent + var/filter = parent_movable.get_filter("unusual_effect") + if (!filter) + parent_movable.add_filter("unusual_effect", 2, list("type" = "outline", "color" = color, "size" = 2)) + return + if(!COOLDOWN_FINISHED(src, glow_cooldown)) + return + + animate(filter, alpha = 110, time = 1.5 SECONDS, loop = -1) + animate(alpha = 40, time = 2.5 SECONDS) + COOLDOWN_START(src, glow_cooldown, 4 SECONDS) diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index cec757486abc..e7fe90891cf1 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -253,6 +253,7 @@ data["current_stock"] = remaining_stock data["shop_locked"] = uplink_handler.shop_locked data["purchased_items"] = length(uplink_handler.purchase_log?.purchase_log) + data["locked_entries"] = uplink_handler.locked_entries //monkestation edit return data /datum/component/uplink/ui_static_data(mob/user) diff --git a/code/datums/diseases/gastrolisis.dm b/code/datums/diseases/gastrolisis.dm index 455e0773e333..f82f8b3269f6 100644 --- a/code/datums/diseases/gastrolisis.dm +++ b/code/datums/diseases/gastrolisis.dm @@ -65,7 +65,7 @@ if(shell && eyes && tongue && SPT_PROB(2.5, seconds_per_tick)) affected_mob.set_species(/datum/species/snail) - affected_mob.client?.give_award(/datum/award/achievement/misc/snail, affected_mob) + affected_mob.client?.give_award(/datum/award/achievement/jobs/snail, affected_mob) affected_mob.visible_message(span_warning("[affected_mob] turns into a snail!"), \ span_boldnotice("You turned into a snail person! You feel an urge to cccrrraaawwwlll...")) cure() diff --git a/code/datums/diseases/parrotpossession.dm b/code/datums/diseases/parrotpossession.dm index 23f68e1a42ff..442a046643b6 100644 --- a/code/datums/diseases/parrotpossession.dm +++ b/code/datums/diseases/parrotpossession.dm @@ -13,24 +13,41 @@ severity = DISEASE_SEVERITY_MEDIUM infectable_biotypes = MOB_ORGANIC|MOB_UNDEAD|MOB_ROBOTIC|MOB_MINERAL bypasses_immunity = TRUE //2spook - var/mob/living/simple_animal/parrot/poly/ghost/parrot + ///chance we speak + var/speak_chance = 5 + ///controller we speak from + var/datum/ai_controller/basic_controller/parrot_controller /datum/disease/parrot_possession/stage_act(seconds_per_tick, times_fired) . = ..() - if(!.) + + if(!. || isnull(parrot_controller)) return - if(QDELETED(parrot) || parrot.loc != affected_mob) - cure() - return FALSE + var/potential_phrase = parrot_controller.blackboard[BB_PARROT_REPEAT_STRING] - if(length(parrot.speech_buffer) && SPT_PROB(parrot.speak_chance, seconds_per_tick)) // I'm not going to dive into polycode trying to adjust that probability. Enjoy doubled ghost parrot speach - affected_mob.say(pick(parrot.speech_buffer), forced = "parrot possession") + if(SPT_PROB(speak_chance, seconds_per_tick) && !isnull(potential_phrase)) + affected_mob.say(potential_phrase, forced = "parrot possession") /datum/disease/parrot_possession/cure() - if(parrot && parrot.loc == affected_mob) - parrot.forceMove(affected_mob.drop_location()) - affected_mob.visible_message(span_danger("[parrot] is violently driven out of [affected_mob]!"), span_userdanger("[parrot] bursts out of your chest!")) - ..() + var/atom/movable/inside_parrot = locate(/mob/living/basic/parrot/poly/ghost) in affected_mob + if(inside_parrot) + UnregisterSignal(inside_parrot, list(COMSIG_PARENT_PREQDELETED, COMSIG_MOVABLE_MOVED)) + inside_parrot.forceMove(affected_mob.drop_location()) + affected_mob.visible_message( + span_danger("[inside_parrot] is violently driven out of [affected_mob]!"), + span_userdanger("[inside_parrot] bursts out of your chest!"), + ) + parrot_controller = null + return ..() + +/datum/disease/parrot_possession/proc/set_parrot(mob/living/parrot) + parrot_controller = parrot.ai_controller + RegisterSignals(parrot, list(COMSIG_PARENT_PREQDELETED, COMSIG_MOVABLE_MOVED), PROC_REF(on_parrot_exit)) + +/datum/disease/parrot_possession/proc/on_parrot_exit(datum/source) + SIGNAL_HANDLER + UnregisterSignal(source, list(COMSIG_PARENT_PREQDELETED, COMSIG_MOVABLE_MOVED)) + cure() diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 0405b72e854e..43269cb2ee73 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -58,10 +58,10 @@ to_chat(affected_mob, pick(stage5)) if(QDELETED(affected_mob)) return - if(affected_mob.notransform) + if(HAS_TRAIT_FROM(affected_mob, TRAIT_NO_TRANSFORM, REF(src))) return - affected_mob.notransform = 1 - for(var/obj/item/W in affected_mob.get_equipped_items(TRUE)) + ADD_TRAIT(affected_mob, TRAIT_NO_TRANSFORM, REF(src)) + for(var/obj/item/W in affected_mob.get_equipped_items(include_pockets = TRUE)) affected_mob.dropItemToGround(W) for(var/obj/item/I in affected_mob.held_items) affected_mob.dropItemToGround(I) diff --git a/code/datums/elements/ai_flee_while_injured.dm b/code/datums/elements/ai_flee_while_injured.dm index fc1a2e332816..eca709dbee5d 100644 --- a/code/datums/elements/ai_flee_while_injured.dm +++ b/code/datums/elements/ai_flee_while_injured.dm @@ -19,6 +19,7 @@ src.stop_fleeing_at = stop_fleeing_at src.start_fleeing_below = start_fleeing_below RegisterSignal(target, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(on_health_changed)) + on_health_changed(target) /datum/element/ai_flee_while_injured/Detach(datum/source) . = ..() @@ -28,18 +29,18 @@ /datum/element/ai_flee_while_injured/proc/on_health_changed(mob/living/source) SIGNAL_HANDLER - if (!source.ai_controller) + if (isnull(source.ai_controller)) return var/current_health_percentage = source.health / source.maxHealth - if (source.ai_controller.blackboard[BB_BASIC_MOB_FLEEING]) - if (current_health_percentage < stop_fleeing_at) + if (source.ai_controller.blackboard[BB_BASIC_MOB_STOP_FLEEING]) + if (current_health_percentage > start_fleeing_below) return - source.ai_controller.CancelActions() // Stop fleeing go back to whatever you were doing - source.ai_controller.set_blackboard_key(BB_BASIC_MOB_FLEEING, FALSE) + source.ai_controller.CancelActions() + source.ai_controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, FALSE) return - if (current_health_percentage > start_fleeing_below) + if (current_health_percentage < stop_fleeing_at) return - source.ai_controller.CancelActions() - source.ai_controller.set_blackboard_key(BB_BASIC_MOB_FLEEING, TRUE) + source.ai_controller.CancelActions() // Stop fleeing go back to whatever you were doing + source.ai_controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE) diff --git a/code/datums/elements/ai_swap_combat_mode.dm b/code/datums/elements/ai_swap_combat_mode.dm new file mode 100644 index 000000000000..cbd271f314b8 --- /dev/null +++ b/code/datums/elements/ai_swap_combat_mode.dm @@ -0,0 +1,64 @@ +/** + * Attached to a mob with an AI controller, updates combat mode when the affected mob acquires or loses targets + */ +/datum/element/ai_swap_combat_mode + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// The message we yell when we enter combat mode + var/list/battle_start_barks + /// A one liner said when we exit combat mode + var/list/battle_end_barks + /// The chance to yell the above lines + var/speech_chance + /// Target key + var/target_key + +/datum/element/ai_swap_combat_mode/Attach(datum/target, target_key, list/battle_start_barks = null, list/battle_end_barks = null) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + var/mob/living/living_target = target + if(!living_target.ai_controller) + return ELEMENT_INCOMPATIBLE + + if(isnull(battle_start_barks)) + battle_start_barks = list("En Garde!",) + + if(isnull(battle_end_barks)) + battle_end_barks = list("Never should have come here",) + + src.battle_start_barks = battle_start_barks + src.battle_end_barks = battle_end_barks + src.target_key = target_key + RegisterSignal(target, COMSIG_AI_BLACKBOARD_KEY_SET(target_key), PROC_REF(on_target_gained)) + RegisterSignal(target, COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), PROC_REF(on_target_cleared)) + +/datum/element/ai_swap_combat_mode/Detach(datum/source) + . = ..() + UnregisterSignal(source, list( + COMSIG_AI_BLACKBOARD_KEY_SET(target_key), + COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), + )) + +/// When the mob gains a target, and it was not already in combat mode, enter it +/datum/element/ai_swap_combat_mode/proc/on_target_gained(mob/living/source) + SIGNAL_HANDLER + + if(swap_mode(source, TRUE)) + INVOKE_ASYNC(src, PROC_REF(speak_bark), source, battle_start_barks) + +/// When the mob loses its target, and it was not already out of combat mode, exit it +/datum/element/ai_swap_combat_mode/proc/on_target_cleared(mob/living/source) + SIGNAL_HANDLER + + if(swap_mode(source, FALSE)) + INVOKE_ASYNC(src, PROC_REF(speak_bark), source, battle_end_barks) + +///Says a quip, if the RNG allows it +/datum/element/ai_swap_combat_mode/proc/speak_bark(mob/living/source, line) + source.say(pick(line)) + +///If the combat mode would be changed into a different state, updates it and returns TRUE, otherwise returns FALSE +/datum/element/ai_swap_combat_mode/proc/swap_mode(mob/living/source, new_mode) + source.set_combat_mode(new_mode) + return TRUE diff --git a/code/datums/elements/amputating_limbs.dm b/code/datums/elements/amputating_limbs.dm index c2fe7c454a96..16a99e96f6c1 100644 --- a/code/datums/elements/amputating_limbs.dm +++ b/code/datums/elements/amputating_limbs.dm @@ -1,4 +1,4 @@ -/// This component will intercept bare-handed attacks by the owner on critically injured carbons and amputate random limbs instead +/// This component will intercept bare-handed attacks by the owner on sufficiently injured carbons and amputate random limbs instead /datum/element/amputating_limbs element_flags = ELEMENT_BESPOKE argument_hash_start_idx = 2 @@ -6,6 +6,10 @@ var/surgery_time /// What is the means by which we describe the act of amputation? var/surgery_verb + /// How awake must our target be? + var/minimum_stat + /// How likely are we to perform this action? + var/snip_chance /// The types of limb we can remove var/list/target_zones @@ -13,6 +17,8 @@ datum/target, surgery_time = 5 SECONDS, surgery_verb = "prying", + minimum_stat = SOFT_CRIT, + snip_chance = 100, list/target_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_ARM, BODY_ZONE_R_LEG), ) . = ..() @@ -23,6 +29,8 @@ src.surgery_time = surgery_time src.surgery_verb = surgery_verb + src.minimum_stat = minimum_stat + src.snip_chance = snip_chance src.target_zones = target_zones RegisterSignals(target, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET), PROC_REF(try_amputate)) @@ -33,11 +41,11 @@ /// Called when you click on literally anything with your hands, see if it is an injured carbon and then try to cut it up /datum/element/amputating_limbs/proc/try_amputate(mob/living/surgeon, atom/victim) SIGNAL_HANDLER - if (!iscarbon(victim) || HAS_TRAIT(victim, TRAIT_NODISMEMBER)) + if (!iscarbon(victim) || HAS_TRAIT(victim, TRAIT_NODISMEMBER) || !prob(snip_chance)) return var/mob/living/carbon/limbed_victim = victim - if (limbed_victim.stat == CONSCIOUS) + if (limbed_victim.stat < minimum_stat) return if (DOING_INTERACTION_WITH_TARGET(surgeon, victim)) @@ -60,7 +68,7 @@ /// Chop one off /datum/element/amputating_limbs/proc/amputate(mob/living/surgeon, mob/living/carbon/victim, obj/item/bodypart/to_remove) - surgeon.visible_message(span_warning("[surgeon] begins [surgery_verb] [to_remove] off of [victim]!")) - if (!do_after(surgeon, delay = surgery_time, target = victim)) + surgeon.visible_message(span_warning("[surgeon] [surgery_verb] [to_remove] off of [victim]!")) + if (surgery_time > 0 && !do_after(surgeon, delay = surgery_time, target = victim)) return to_remove.dismember() diff --git a/code/datums/elements/basic_eating.dm b/code/datums/elements/basic_eating.dm index 86f4be63cac3..3201eeff846f 100644 --- a/code/datums/elements/basic_eating.dm +++ b/code/datums/elements/basic_eating.dm @@ -12,10 +12,12 @@ var/damage_amount /// Type of hurt to apply var/damage_type + /// Whether to flavor it as drinking rather than eating. + var/drinking /// Types the animal can eat. var/list/food_types -/datum/element/basic_eating/Attach(datum/target, heal_amt = 0, damage_amount = 0, damage_type = null, food_types = list()) +/datum/element/basic_eating/Attach(datum/target, heal_amt = 0, damage_amount = 0, damage_type = null, drinking = FALSE, food_types = list()) . = ..() if(!isliving(target)) @@ -24,6 +26,7 @@ src.heal_amt = heal_amt src.damage_amount = damage_amount src.damage_type = damage_type + src.drinking = drinking src.food_types = food_types //this lets players eat @@ -45,8 +48,12 @@ /datum/element/basic_eating/proc/try_eating(mob/living/eater, atom/target) if(!is_type_in_list(target, food_types)) - return - var/eat_verb = pick("bite","chew","nibble","gnaw","gobble","chomp") + return FALSE + var/eat_verb + if(drinking) + eat_verb = pick("slurp","sip","guzzle","drink","quaff","suck") + else + eat_verb = pick("bite","chew","nibble","gnaw","gobble","chomp") if (heal_amt > 0) var/healed = heal_amt && eater.health < eater.maxHealth @@ -66,5 +73,8 @@ finish_eating(eater, target) /datum/element/basic_eating/proc/finish_eating(mob/living/eater, atom/target) - playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE) + if(drinking) + playsound(eater.loc,'sound/items/drink.ogg', rand(10,50), TRUE) + else + playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE) qdel(target) diff --git a/code/datums/elements/climbable.dm b/code/datums/elements/climbable.dm index b7e93c61e246..76062b051159 100644 --- a/code/datums/elements/climbable.dm +++ b/code/datums/elements/climbable.dm @@ -131,15 +131,13 @@ ///Handles climbing onto the atom when you click-drag /datum/element/climbable/proc/mousedrop_receive(atom/climbed_thing, atom/movable/dropped_atom, mob/user, params) SIGNAL_HANDLER - if(user == dropped_atom && isliving(dropped_atom)) - var/mob/living/living_target = dropped_atom - if(isanimal(living_target)) - var/mob/living/simple_animal/animal = dropped_atom - if (!animal.dextrous) - return - if(living_target.mobility_flags & MOBILITY_MOVE) - INVOKE_ASYNC(src, PROC_REF(climb_structure), climbed_thing, living_target, params) - return + if(user != dropped_atom || !isliving(dropped_atom)) + return + if(!HAS_TRAIT(dropped_atom, TRAIT_FENCE_CLIMBER) && !HAS_TRAIT(dropped_atom, TRAIT_CAN_HOLD_ITEMS)) // If you can hold items you can probably climb a fence + return + var/mob/living/living_target = dropped_atom + if(living_target.mobility_flags & MOBILITY_MOVE) + INVOKE_ASYNC(src, PROC_REF(climb_structure), climbed_thing, living_target, params) ///Tries to climb onto the target if the forced movement of the mob allows it /datum/element/climbable/proc/try_speedrun(datum/source, mob/bumpee) diff --git a/code/datums/elements/content_barfer.dm b/code/datums/elements/content_barfer.dm index 782574a22217..2959ff9d58e7 100644 --- a/code/datums/elements/content_barfer.dm +++ b/code/datums/elements/content_barfer.dm @@ -4,18 +4,17 @@ * Used for morphs and bileworms! */ /datum/element/content_barfer - argument_hash_start_idx = 2 -/datum/element/content_barfer/Attach(datum/target, tally_string) +/datum/element/content_barfer/Attach(datum/target) . = ..() if(!isliving(target)) return ELEMENT_INCOMPATIBLE - RegisterSignals(target, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_ON_WABBAJACKED), PROC_REF(barf_contents)) + RegisterSignals(target, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_ON_WABBAJACKED, COMSIG_MOB_CHANGED_TYPE), PROC_REF(barf_contents)) /datum/element/content_barfer/Detach(datum/target) - UnregisterSignal(target, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_ON_WABBAJACKED)) + UnregisterSignal(target, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_ON_WABBAJACKED, COMSIG_MOB_CHANGED_TYPE)) return ..() /datum/element/content_barfer/proc/barf_contents(mob/living/target) diff --git a/code/datums/elements/death_drops.dm b/code/datums/elements/death_drops.dm index c02ba37cad72..070ed8063d25 100644 --- a/code/datums/elements/death_drops.dm +++ b/code/datums/elements/death_drops.dm @@ -16,7 +16,7 @@ if(!loot) stack_trace("[type] added to [target] with NO LOOT.") src.loot = loot - RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(on_death), override = TRUE) /datum/element/death_drops/Detach(datum/target) . = ..() diff --git a/code/datums/elements/dextrous.dm b/code/datums/elements/dextrous.dm new file mode 100644 index 000000000000..ef4fa290eb2b --- /dev/null +++ b/code/datums/elements/dextrous.dm @@ -0,0 +1,73 @@ +/** + * Sets up the attachee to have hands and manages things like dropping items on death and displaying them on examine + * Actual hand performance is managed by code on /living/ and not encapsulated here, we just enable it + */ +/datum/element/dextrous + +/datum/element/dextrous/Attach(datum/target, hands_count = 2, hud_type = /datum/hud/dextrous) + . = ..() + if (!isliving(target) || iscarbon(target)) + return ELEMENT_INCOMPATIBLE // Incompatible with the carbon typepath because that already has its own hand handling and doesn't need hand holding + + var/mob/living/mob_parent = target + set_available_hands(mob_parent, hands_count) + mob_parent.set_hud_used(new hud_type(target)) + mob_parent.hud_used.show_hud(mob_parent.hud_used.hud_version) + ADD_TRAIT(target, TRAIT_CAN_HOLD_ITEMS, REF(src)) + RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + RegisterSignal(target, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_hand_clicked)) + RegisterSignal(target, COMSIG_PARENT_EXAMINE, PROC_REF(on_examined)) + +/datum/element/dextrous/Detach(datum/source) + . = ..() + var/mob/living/mob_parent = source + set_available_hands(mob_parent, initial(mob_parent.default_num_hands)) + var/initial_hud = initial(mob_parent.hud_type) + mob_parent.set_hud_used(new initial_hud(source)) + mob_parent.hud_used.show_hud(mob_parent.hud_used.hud_version) + REMOVE_TRAIT(source, TRAIT_CAN_HOLD_ITEMS, REF(src)) + UnregisterSignal(source, list( + COMSIG_PARENT_EXAMINE, + COMSIG_LIVING_DEATH, + COMSIG_LIVING_UNARMED_ATTACK, + )) + +/// Set up how many hands we should have +/datum/element/dextrous/proc/set_available_hands(mob/living/hand_owner, hands_count) + hand_owner.drop_all_held_items() + var/held_items = list() + for (var/i in 1 to hands_count) + held_items += null + hand_owner.held_items = held_items + hand_owner.set_num_hands(hands_count) + hand_owner.set_usable_hands(hands_count) + +/// Drop our shit when we die +/datum/element/dextrous/proc/on_death(mob/living/died, gibbed) + SIGNAL_HANDLER + died.drop_all_held_items() + +/// Try picking up items +/datum/element/dextrous/proc/on_hand_clicked(mob/living/hand_haver, atom/target, proximity, modifiers) + SIGNAL_HANDLER + if (!proximity && target.loc != hand_haver) + var/obj/item/obj_item = target + if (istype(obj_item) && !obj_item.atom_storage && !(obj_item.item_flags & IN_STORAGE)) + return NONE + if (!isitem(target) && (hand_haver.istate & ISTATE_HARM)) + return NONE + if (hand_haver.istate & ISTATE_SECONDARY) + INVOKE_ASYNC(target, TYPE_PROC_REF(/atom, attack_hand_secondary), hand_haver, modifiers) + else + INVOKE_ASYNC(target, TYPE_PROC_REF(/atom, attack_hand), hand_haver, modifiers) + INVOKE_ASYNC(hand_haver, TYPE_PROC_REF(/mob, update_held_items)) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/// Tell people what we are holding +/datum/element/dextrous/proc/on_examined(mob/living/examined, mob/user, list/examine_list) + SIGNAL_HANDLER + for(var/obj/item/held_item in examined.held_items) + if(held_item.item_flags & (ABSTRACT|EXAMINE_SKIP|HAND_ITEM)) + continue + examine_list += span_info("[examined.p_They()] [examined.p_have()] [held_item.get_examine_string(user)] in [examined.p_their()] \ + [examined.get_held_index_name(examined.get_held_index_of_item(held_item))].") diff --git a/code/datums/elements/door_pryer.dm b/code/datums/elements/door_pryer.dm new file mode 100644 index 000000000000..cb30a48399c0 --- /dev/null +++ b/code/datums/elements/door_pryer.dm @@ -0,0 +1,70 @@ +/** + * Attached to a basic mob. + * Causes attacks on doors to attempt to open them. + */ +/datum/element/door_pryer + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// Time it takes to open a door with force + var/pry_time + /// Interaction key for if we force a door open + var/interaction_key + +/datum/element/door_pryer/Attach(datum/target, pry_time = 10 SECONDS, interaction_key = null) + . = ..() + if (!isliving(target)) + return ELEMENT_INCOMPATIBLE + src.pry_time = pry_time + src.interaction_key = interaction_key + RegisterSignals(target, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK), PROC_REF(on_attack)) + +/datum/element/door_pryer/Detach(datum/source) + . = ..() + UnregisterSignal(source, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK)) + +/// If we're targeting an airlock, open it +/datum/element/door_pryer/proc/on_attack(mob/living/basic/attacker, atom/target, proximity_flag) + SIGNAL_HANDLER + if(!istype(target, /obj/machinery/door/airlock)) + return + var/obj/machinery/door/airlock/airlock_target = target + if (!airlock_target.density) + return // It's already open numbnuts + + if(DOING_INTERACTION_WITH_TARGET(attacker, target) || (!isnull(interaction_key) && DOING_INTERACTION(attacker, interaction_key))) + attacker.balloon_alert(attacker, "busy!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + if (airlock_target.locked || airlock_target.welded || airlock_target.seal) + if (!(attacker.istate & ISTATE_HARM)) + airlock_target.balloon_alert(attacker, "it's sealed!") + return COMPONENT_CANCEL_ATTACK_CHAIN + return // Attack the door + + INVOKE_ASYNC(src, PROC_REF(open_door), attacker, airlock_target) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/// Try opening the door, and if we can't then try forcing it +/datum/element/door_pryer/proc/open_door(mob/living/basic/attacker, obj/machinery/door/airlock/airlock_target) + if (!airlock_target.hasPower()) + attacker.visible_message(span_warning("[attacker] forces the [airlock_target] to open.")) + airlock_target.open(FORCING_DOOR_CHECKS) + return + + if (airlock_target.allowed(attacker)) + airlock_target.open(DEFAULT_DOOR_CHECKS) + return + + attacker.visible_message(\ + message = span_warning("[attacker] starts forcing the [airlock_target] open!"), + blind_message = span_hear("You hear a metal screeching sound."), + ) + playsound(airlock_target, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) + airlock_target.balloon_alert(attacker, "prying...") + if(!do_after(attacker, pry_time, airlock_target)) + airlock_target.balloon_alert(attacker, "interrupted!") + return + if(airlock_target.locked) + return + attacker.visible_message(span_warning("[attacker] forces the [airlock_target] to open.")) + airlock_target.open(BYPASS_DOOR_CHECKS) diff --git a/code/datums/elements/food/venue_price.dm b/code/datums/elements/food/venue_price.dm index 1fcf9de040dc..be846d7c004d 100644 --- a/code/datums/elements/food/venue_price.dm +++ b/code/datums/elements/food/venue_price.dm @@ -21,19 +21,19 @@ UnregisterSignal(target, COMSIG_ITEM_SOLD_TO_CUSTOMER) UnregisterSignal(target, COMSIG_REAGENT_SOLD_TO_CUSTOMER) -/datum/element/venue_price/proc/item_sold(obj/item/thing_sold, mob/living/simple_animal/robot_customer/sold_to) +/datum/element/venue_price/proc/item_sold(obj/item/thing_sold, mob/living/basic/robot_customer/sold_to) SIGNAL_HANDLER produce_cash(sold_to, thing_sold) return TRANSACTION_SUCCESS -/datum/element/venue_price/proc/reagent_sold(datum/reagent/reagent_sold, mob/living/simple_animal/robot_customer/sold_to, obj/item/container) +/datum/element/venue_price/proc/reagent_sold(datum/reagent/reagent_sold, mob/living/basic/robot_customer/sold_to, obj/item/container) SIGNAL_HANDLER produce_cash(sold_to, container) return TRANSACTION_SUCCESS -/datum/element/venue_price/proc/produce_cash(mob/living/simple_animal/robot_customer/sold_to, obj/item/container) +/datum/element/venue_price/proc/produce_cash(mob/living/basic/robot_customer/sold_to, obj/item/container) new /obj/item/holochip(get_turf(container), venue_price) playsound(container, 'sound/effects/cashregister.ogg', 60, TRUE) diff --git a/code/datums/elements/footstep.dm b/code/datums/elements/footstep.dm index 86cd5c27ce6b..f3e5176d0972 100644 --- a/code/datums/elements/footstep.dm +++ b/code/datums/elements/footstep.dm @@ -40,6 +40,8 @@ footstep_sounds = GLOB.heavyfootstep if(FOOTSTEP_MOB_SHOE) footstep_sounds = GLOB.footstep + if(FOOTSTEP_MOB_RUST) + footstep_sounds = 'sound/effects/footstep/rustystep1.ogg' if(FOOTSTEP_MOB_SLIME) footstep_sounds = 'sound/effects/footstep/slime1.ogg' if(FOOTSTEP_OBJ_MACHINE) @@ -89,37 +91,32 @@ if(steps != 0 && !source.has_gravity()) // don't need to step as often when you hop around return - return turf + + . = list(FOOTSTEP_MOB_SHOE = turf.footstep, FOOTSTEP_MOB_BAREFOOT = turf.barefootstep, FOOTSTEP_MOB_HEAVY = turf.heavyfootstep, FOOTSTEP_MOB_CLAW = turf.clawfootstep, STEP_SOUND_PRIORITY = STEP_SOUND_NO_PRIORITY) + SEND_SIGNAL(turf, COMSIG_TURF_PREPARE_STEP_SOUND, .) + return . /datum/element/footstep/proc/play_simplestep(mob/living/source, atom/oldloc, direction, forced, list/old_locs, momentum_change) SIGNAL_HANDLER - + var/turf/source_loc = get_turf(source) if (forced || SHOULD_DISABLE_FOOTSTEPS(source)) return - var/turf/open/source_loc = prepare_step(source) - if(!source_loc) + var/list/prepared_steps = prepare_step(source) + if(!prepared_steps) return + if(isfile(footstep_sounds) || istext(footstep_sounds)) playsound(source_loc, footstep_sounds, volume, falloff_distance = 1, vary = sound_vary, mixer_channel = CHANNEL_SOUND_FOOTSTEPS) return - var/turf_footstep - switch(footstep_type) - if(FOOTSTEP_MOB_CLAW) - turf_footstep = source_loc.clawfootstep - if(FOOTSTEP_MOB_BAREFOOT) - turf_footstep = source_loc.barefootstep - if(FOOTSTEP_MOB_HEAVY) - turf_footstep = source_loc.heavyfootstep - if(FOOTSTEP_MOB_SHOE) - turf_footstep = source_loc.footstep + + var/turf_footstep = prepared_steps[footstep_type] if(!turf_footstep) return playsound(source_loc, pick(footstep_sounds[turf_footstep][1]), footstep_sounds[turf_footstep][2] * volume, TRUE, footstep_sounds[turf_footstep][3] + e_range, falloff_distance = 1, vary = sound_vary, mixer_channel = CHANNEL_SOUND_FOOTSTEPS) /datum/element/footstep/proc/play_humanstep(mob/living/carbon/human/source, atom/oldloc, direction, forced, list/old_locs, momentum_change) SIGNAL_HANDLER - if (forced || SHOULD_DISABLE_FOOTSTEPS(source) || !momentum_change) return @@ -130,8 +127,8 @@ volume_multiplier = 0.6 range_adjustment = -2 - var/turf/open/source_loc = prepare_step(source) - if(!source_loc) + var/list/prepared_steps = prepare_step(source) + if(!prepared_steps) return //cache for sanic speed (lists are references anyways) @@ -142,20 +139,22 @@ if ((source.wear_suit?.body_parts_covered | source.w_uniform?.body_parts_covered | source.shoes?.body_parts_covered) & FEET) // we are wearing shoes - heard_clients = playsound(source_loc, pick(footstep_sounds[source_loc.footstep][1]), - footstep_sounds[source_loc.footstep][2] * volume * volume_multiplier, + var/shoestep_type = prepared_steps[FOOTSTEP_MOB_SHOE] + heard_clients = playsound(source.loc, pick(footstep_sounds[shoestep_type][1]), + footstep_sounds[shoestep_type][2] * volume * volume_multiplier, TRUE, - footstep_sounds[source_loc.footstep][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary, mixer_channel = CHANNEL_SOUND_FOOTSTEPS) + footstep_sounds[shoestep_type][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary, mixer_channel = CHANNEL_SOUND_FOOTSTEPS) else + var/barefoot_type = prepared_steps[FOOTSTEP_MOB_BAREFOOT] if(source.dna.species.special_step_sounds) - heard_clients = playsound(source_loc, pick(source.dna.species.special_step_sounds), 50, TRUE, falloff_distance = 1, vary = sound_vary) + heard_clients = 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 - heard_clients = playsound(source_loc, pick(bare_footstep_sounds[source_loc.barefootstep][1]), - bare_footstep_sounds[source_loc.barefootstep][2] * volume * volume_multiplier, + heard_clients = playsound(source.loc, pick(bare_footstep_sounds[barefoot_type][1]), + bare_footstep_sounds[barefoot_type][2] * volume * volume_multiplier, TRUE, - bare_footstep_sounds[source_loc.barefootstep][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary, mixer_channel = CHANNEL_SOUND_FOOTSTEPS) + bare_footstep_sounds[barefoot_type][3] + e_range + range_adjustment, falloff_distance = 1, vary = sound_vary, mixer_channel = CHANNEL_SOUND_FOOTSTEPS) if(heard_clients) play_fov_effect(source, 5, "footstep", direction, ignore_self = TRUE, override_list = heard_clients) diff --git a/code/datums/elements/footstep_override.dm b/code/datums/elements/footstep_override.dm new file mode 100644 index 000000000000..4e0c346c5be2 --- /dev/null +++ b/code/datums/elements/footstep_override.dm @@ -0,0 +1,80 @@ +///When attached, the footstep sound played by the footstep element will be replaced by this one's +/datum/element/footstep_override + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH_ON_HOST_DESTROY + argument_hash_start_idx = 2 + ///The sound played for movables with claw step sound type. + var/clawfootstep + ///The sound played for movables with barefoot step sound type. + var/barefootstep + ///The sound played for movables with heavy step sound type. + var/heavyfootstep + ///The sound played for movables with shoed step sound type. + var/footstep + ///The priority this element has in relation to other elements of the same type attached to other movables on the same turf. + var/priority + /** + * A list of turfs occupied by the movables this element is attached to. + * Needed so it stops listening the turf's signals ONLY when it has no movable with the element. + */ + var/list/occupied_turfs = list() + +/datum/element/footstep_override/Attach(atom/movable/target, clawfootstep = FOOTSTEP_HARD_CLAW, barefootstep = FOOTSTEP_HARD_BAREFOOT, heavyfootstep = FOOTSTEP_GENERIC_HEAVY, footstep = FOOTSTEP_FLOOR, priority = STEP_SOUND_NO_PRIORITY) + . = ..() + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + + src.clawfootstep = clawfootstep + src.barefootstep = barefootstep + src.heavyfootstep = heavyfootstep + src.footstep = footstep + src.priority = priority + + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + if(isturf(target.loc)) + occupy_turf(target, target.loc) + +/datum/element/footstep_override/Detach(atom/movable/source) + if(isturf(source.loc)) + vacate_turf(source, source.loc) + return ..() + +/datum/element/footstep_override/proc/on_moved(atom/movable/source, atom/oldloc) + SIGNAL_HANDLER + if(isturf(oldloc)) + vacate_turf(source, oldloc) + if(isturf(source.loc)) + occupy_turf(source, source.loc) + +/** + * Adds the movable to the list of movables with the element occupying the turf. + * If the turf was not on the list of occupied turfs before, a signal will be registered + * to it. + */ +/datum/element/footstep_override/proc/occupy_turf(atom/movable/movable, turf/location) + if(occupied_turfs[location]) + occupied_turfs[location] |= movable + return + occupied_turfs[location] = list(movable) + RegisterSignal(location, COMSIG_TURF_PREPARE_STEP_SOUND, PROC_REF(prepare_steps)) + +/** + * Removes the movable from the list of movables with the element occupying the turf. + * If the turf is no longer occupied, it'll be removed from the list, and the signal + * unregistered from it + */ +/datum/element/footstep_override/proc/vacate_turf(atom/movable/movable, turf/location) + LAZYREMOVE(occupied_turfs[location], movable) + if(!occupied_turfs[location]) + occupied_turfs -= location + UnregisterSignal(location, COMSIG_TURF_PREPARE_STEP_SOUND) + +///Changes the sound types to be played if the element priority is higher than the one in the steps list. +/datum/element/footstep_override/proc/prepare_steps(turf/source, list/steps) + SIGNAL_HANDLER + if(steps[STEP_SOUND_PRIORITY] > priority) + return + steps[FOOTSTEP_MOB_SHOE] = footstep + steps[FOOTSTEP_MOB_BAREFOOT] = barefootstep + steps[FOOTSTEP_MOB_HEAVY] = heavyfootstep + steps[FOOTSTEP_MOB_CLAW] = clawfootstep + steps[STEP_SOUND_PRIORITY] = priority diff --git a/code/datums/elements/kneecapping.dm b/code/datums/elements/kneecapping.dm index f0a1cd096812..f6ff92e6e0d5 100644 --- a/code/datums/elements/kneecapping.dm +++ b/code/datums/elements/kneecapping.dm @@ -7,7 +7,7 @@ * Kneecapping attacks have a wounding bonus between severe and critical+10 wound thresholds. Without some serious wound protecting * armour this all but guarantees a wound of some sort. The attack is directed specifically at a limb and the limb takes the damage. * - * Requires the attacker to be aiming for either leg zone, which will be targetted specifically. They will than have a 3-second long + * Requires the attacker to be aiming for either leg zone, which will be targeted specifically. They will than have a 3-second long * do_after before executing the attack. * * Kneecapping requires the target to either be on the floor, immobilised or buckled to something. And also to have an appropriate leg. @@ -80,9 +80,11 @@ if(do_after(attacker, 3 SECONDS, target, interaction_key = weapon)) attacker.visible_message(span_warning("[attacker] swings [attacker.p_their()] [weapon] at [target]'s kneecaps!"), span_danger("You swing \the [weapon] at [target]'s kneecaps!")) - var/datum/wound/blunt/severe/severe_wound_type = /datum/wound/blunt/severe - var/datum/wound/blunt/critical/critical_wound_type = /datum/wound/blunt/critical - leg.receive_damage(brute = weapon.force, wound_bonus = rand(initial(severe_wound_type.threshold_minimum), initial(critical_wound_type.threshold_minimum) + 10)) + + var/min_wound = leg.get_wound_threshold_of_wound_type(WOUND_BLUNT, WOUND_SEVERITY_SEVERE, return_value_if_no_wound = 30, wound_source = weapon) + var/max_wound = leg.get_wound_threshold_of_wound_type(WOUND_BLUNT, WOUND_SEVERITY_CRITICAL, return_value_if_no_wound = 50, wound_source = weapon) + + leg.receive_damage(brute = weapon.force, wound_bonus = rand(min_wound, max_wound + 10)) target.emote("scream") log_combat(attacker, target, "broke the kneecaps of", weapon) target.update_damage_overlays() diff --git a/code/datums/elements/mob_grabber.dm b/code/datums/elements/mob_grabber.dm new file mode 100644 index 000000000000..a85c5dc48b25 --- /dev/null +++ b/code/datums/elements/mob_grabber.dm @@ -0,0 +1,30 @@ +/// Grab onto mobs we attack +/datum/element/mob_grabber + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// What state must the mob be in to be grabbed? + var/minimum_stat + /// If someone else is already grabbing this, will we take it? + var/steal_from_others + +/datum/element/mob_grabber/Attach(datum/target, minimum_stat = SOFT_CRIT, steal_from_others = TRUE) + . = ..() + if (!isliving(target)) + return ELEMENT_INCOMPATIBLE + src.minimum_stat = minimum_stat + src.steal_from_others = steal_from_others + RegisterSignals(target, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET), PROC_REF(grab_mob)) + +/datum/element/mob_grabber/Detach(datum/source) + UnregisterSignal(source, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET)) + . = ..() + +/// Try and grab something we attacked +/datum/element/mob_grabber/proc/grab_mob(mob/living/source, mob/living/target) + SIGNAL_HANDLER + if (!isliving(target) || !source.Adjacent(target) || target.stat < minimum_stat) + return + var/atom/currently_pulled = target.pulledby + if (!isnull(currently_pulled) && (!steal_from_others || currently_pulled == source)) + return + INVOKE_ASYNC(target, TYPE_PROC_REF(/mob/living, grabbedby), source) diff --git a/code/datums/elements/ore_collecting.dm b/code/datums/elements/ore_collecting.dm new file mode 100644 index 000000000000..30c9ecc7598d --- /dev/null +++ b/code/datums/elements/ore_collecting.dm @@ -0,0 +1,26 @@ +/* + * A component to allow us to collect ore + */ +/datum/element/ore_collecting + + +/datum/element/ore_collecting/Attach(datum/target) + . = ..() + + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(collect_ore)) + +/datum/element/ore_collecting/Detach(datum/target) + . = ..() + UnregisterSignal(target, COMSIG_HOSTILE_PRE_ATTACKINGTARGET) + +/datum/element/ore_collecting/proc/collect_ore(mob/living/source, atom/target) + SIGNAL_HANDLER + + if(!istype(target, /obj/item/stack/ore)) + return + + var/atom/movable/movable_target = target + movable_target.forceMove(source) + return COMPONENT_HOSTILE_NO_ATTACK diff --git a/code/datums/elements/pet_bonus.dm b/code/datums/elements/pet_bonus.dm index a3302645ee50..7c69927691bc 100644 --- a/code/datums/elements/pet_bonus.dm +++ b/code/datums/elements/pet_bonus.dm @@ -33,6 +33,7 @@ return new /obj/effect/temp_visual/heart(pet.loc) + SEND_SIGNAL(pet, COMSIG_ANIMAL_PET, petter, modifiers) if(emote_message && prob(33)) pet.manual_emote(emote_message) petter.add_mood_event("petting_bonus", moodlet, pet) diff --git a/code/datums/elements/relay_attackers.dm b/code/datums/elements/relay_attackers.dm index f94fba531eed..cdc86e6058cb 100644 --- a/code/datums/elements/relay_attackers.dm +++ b/code/datums/elements/relay_attackers.dm @@ -15,6 +15,7 @@ RegisterSignal(target, COMSIG_ATOM_PREHITBY, PROC_REF(on_hitby)) RegisterSignal(target, COMSIG_ATOM_HULK_ATTACK, PROC_REF(on_attack_hulk)) RegisterSignal(target, COMSIG_ATOM_ATTACK_MECH, PROC_REF(on_attack_mech)) + ADD_TRAIT(target, TRAIT_RELAYING_ATTACKER, REF(src)) /datum/element/relay_attackers/Detach(datum/source, ...) . = ..() @@ -30,22 +31,29 @@ COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_MECH, )) + REMOVE_TRAIT(source, TRAIT_RELAYING_ATTACKER, REF(src)) /datum/element/relay_attackers/proc/after_attackby(atom/target, obj/item/weapon, mob/attacker) SIGNAL_HANDLER if(weapon.force) - relay_attacker(target, attacker, weapon.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : NONE) + relay_attacker(target, attacker, weapon.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : ATTACKER_DAMAGING_ATTACK) /datum/element/relay_attackers/proc/on_attack_generic(atom/target, mob/living/attacker, list/modifiers) SIGNAL_HANDLER - var/shoving = (attacker.istate & ISTATE_SECONDARY) ? ATTACKER_SHOVING : NONE - if((attacker.istate & ISTATE_HARM) || (attacker.istate & ISTATE_SECONDARY)) - relay_attacker(target, attacker, shoving) + // Check for a shove. + if((attacker.istate & ISTATE_SECONDARY)) + relay_attacker(target, attacker, ATTACKER_SHOVING) + return + + // Else check for combat mode. + if((attacker.istate & ISTATE_HARM)) + relay_attacker(target, attacker, ATTACKER_DAMAGING_ATTACK) + return /datum/element/relay_attackers/proc/on_attack_npc(atom/target, mob/living/attacker) SIGNAL_HANDLER if(attacker.melee_damage_upper > 0) - relay_attacker(target, attacker) + relay_attacker(target, attacker, ATTACKER_DAMAGING_ATTACK) /// Even if another component blocked this hit, someone still shot at us /datum/element/relay_attackers/proc/on_bullet_act(atom/target, list/bullet_args, obj/projectile/hit_projectile) @@ -54,7 +62,7 @@ return if(!ismob(hit_projectile.firer)) return - relay_attacker(target, hit_projectile.firer, hit_projectile.damage_type == STAMINA ? ATTACKER_STAMINA_ATTACK : NONE) + relay_attacker(target, hit_projectile.firer, hit_projectile.damage_type == STAMINA ? ATTACKER_STAMINA_ATTACK : ATTACKER_DAMAGING_ATTACK) /// Even if another component blocked this hit, someone still threw something /datum/element/relay_attackers/proc/on_hitby(atom/target, atom/movable/hit_atom, datum/thrownthing/throwingdatum) @@ -67,15 +75,15 @@ var/mob/thrown_by = hit_item.thrownby?.resolve() if(!ismob(thrown_by)) return - relay_attacker(target, thrown_by, hit_item.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : NONE) + relay_attacker(target, thrown_by, hit_item.damtype == STAMINA ? ATTACKER_STAMINA_ATTACK : ATTACKER_DAMAGING_ATTACK) /datum/element/relay_attackers/proc/on_attack_hulk(atom/target, mob/attacker) SIGNAL_HANDLER - relay_attacker(target, attacker) + relay_attacker(target, attacker, ATTACKER_DAMAGING_ATTACK) /datum/element/relay_attackers/proc/on_attack_mech(atom/target, obj/vehicle/sealed/mecha/mecha_attacker, mob/living/pilot) SIGNAL_HANDLER - relay_attacker(target, mecha_attacker) + relay_attacker(target, mecha_attacker, ATTACKER_DAMAGING_ATTACK) /// Send out a signal identifying whoever just attacked us (usually a mob but sometimes a mech or turret) /datum/element/relay_attackers/proc/relay_attacker(atom/victim, atom/attacker, attack_flags) diff --git a/code/datums/elements/sticker.dm b/code/datums/elements/sticker.dm deleted file mode 100644 index d089d9944da9..000000000000 --- a/code/datums/elements/sticker.dm +++ /dev/null @@ -1,45 +0,0 @@ -/datum/element/sticker - ///The typepath for our attached sticker component - var/stick_type = /datum/component/attached_sticker - ///If TRUE, our attached_sticker can be washed off - var/washable = TRUE - -/datum/element/sticker/Attach(datum/target, sticker_type, cleanable=TRUE) - . = ..() - if(!isitem(target)) - return ELEMENT_INCOMPATIBLE - RegisterSignal(target, COMSIG_ITEM_AFTERATTACK, PROC_REF(on_afterattack)) - RegisterSignal(target, COMSIG_MOVABLE_IMPACT, PROC_REF(on_throw_impact)) - if(sticker_type) - stick_type = sticker_type - washable = cleanable - -/datum/element/sticker/Detach(datum/source) - . = ..() - UnregisterSignal(source, list(COMSIG_ITEM_AFTERATTACK, COMSIG_MOVABLE_IMPACT)) - -/datum/element/sticker/proc/on_afterattack(obj/item/source, atom/target, mob/living/user, prox, params) - SIGNAL_HANDLER - if(!prox) - return - if(!isatom(target)) - return - var/list/parameters = params2list(params) - if(!LAZYACCESS(parameters, ICON_X) || !LAZYACCESS(parameters, ICON_Y)) - return - var/divided_size = world.icon_size / 2 - var/px = text2num(LAZYACCESS(parameters, ICON_X)) - divided_size - var/py = text2num(LAZYACCESS(parameters, ICON_Y)) - divided_size - - user.do_attack_animation(target) - do_stick(source, target, user, px, py) - -///Add our stick_type to the target with px and py as pixel x and pixel y respectively -/datum/element/sticker/proc/do_stick(obj/item/source, atom/target, mob/living/user, px, py) - target.AddComponent(stick_type, px, py, source, user, washable) - -/datum/element/sticker/proc/on_throw_impact(obj/item/source, atom/hit_atom, datum/thrownthing/throwingdatum) - SIGNAL_HANDLER - if(prob(50)) - do_stick(source, hit_atom, null, rand(-7,7), rand(-7,7)) - source.balloon_alert_to_viewers("the sticker lands on its sticky side!") diff --git a/code/datums/elements/structure_repair.dm b/code/datums/elements/structure_repair.dm new file mode 100644 index 000000000000..d3b26eed815b --- /dev/null +++ b/code/datums/elements/structure_repair.dm @@ -0,0 +1,45 @@ +/// Intercepts attacks from mobs with this component to instead repair specified structures. +/datum/element/structure_repair + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// How much to heal structures by + var/heal_amount + /// Typecache of types of structures to repair + var/list/structure_types_typecache + +/datum/element/structure_repair/Attach( + datum/target, + heal_amount = 5, + structure_types_typecache = typecacheof(list(/obj/structure)), +) + . = ..() + if (!isliving(target)) + return ELEMENT_INCOMPATIBLE + + src.heal_amount = heal_amount + src.structure_types_typecache = structure_types_typecache + RegisterSignals(target, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET), PROC_REF(try_repair)) + +/datum/element/structure_repair/Detach(datum/source) + UnregisterSignal(source, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET)) + return ..() + +/// If the target is of a valid type, interrupt the attack chain to repair it instead +/datum/element/structure_repair/proc/try_repair(mob/living/fixer, atom/target) + SIGNAL_HANDLER + + if (!is_type_in_typecache(target, structure_types_typecache)) + return + + if (target.get_integrity() >= target.max_integrity) + target.balloon_alert(fixer, "not damaged!") + return COMPONENT_CANCEL_ATTACK_CHAIN + + target.repair_damage(heal_amount) + fixer.Beam(target, icon_state = "sendbeam", time = 0.4 SECONDS) + fixer.visible_message( + span_danger("[fixer] repairs [target]."), + span_danger("You repair [target], leaving it at [round(target.get_integrity() * 100 / target.max_integrity)]% stability."), + ) + + return COMPONENT_CANCEL_ATTACK_CHAIN diff --git a/code/datums/elements/waddling.dm b/code/datums/elements/waddling.dm index eff201455d85..825b0c4e4cb8 100644 --- a/code/datums/elements/waddling.dm +++ b/code/datums/elements/waddling.dm @@ -4,27 +4,23 @@ . = ..() if(!ismovable(target)) return ELEMENT_INCOMPATIBLE - if(isliving(target)) - RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(LivingWaddle)) - else - RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(Waddle)) + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(Waddle)) /datum/element/waddling/Detach(datum/source) . = ..() UnregisterSignal(source, COMSIG_MOVABLE_MOVED) - -/datum/element/waddling/proc/LivingWaddle(mob/living/target) +/datum/element/waddling/proc/Waddle(atom/movable/moved, atom/oldloc, direction, forced) SIGNAL_HANDLER - - if(target.incapacitated() || target.body_position == LYING_DOWN) + if(forced || CHECK_MOVE_LOOP_FLAGS(moved, MOVEMENT_LOOP_OUTSIDE_CONTROL)) return - Waddle(target) - - -/datum/element/waddling/proc/Waddle(atom/movable/target) - SIGNAL_HANDLER + if(isliving(moved)) + var/mob/living/living_moved = moved + if (living_moved.incapacitated() || living_moved.body_position == LYING_DOWN) + return + waddling_animation(moved) +/datum/element/waddling/proc/waddling_animation(atom/movable/target) animate(target, pixel_z = 4, time = 0) var/prev_trans = matrix(target.transform) animate(pixel_z = 0, transform = turn(target.transform, pick(-12, 0, 12)), time=2) diff --git a/code/datums/elements/wall_tearer.dm b/code/datums/elements/wall_tearer.dm new file mode 100644 index 000000000000..19e84dd2720b --- /dev/null +++ b/code/datums/elements/wall_tearer.dm @@ -0,0 +1,81 @@ +/// Returned if we can rip up this target +#define WALL_TEAR_ALLOWED TRUE +/// Returned if we can't rip up this target +#define WALL_TEAR_INVALID FALSE +/// Returned if we can't rip up the target but still don't want to attack it +#define WALL_TEAR_FAIL_CANCEL_CHAIN -1 + +/** + * Allows attached mobs to destroy walls over time, a little less unreasonable than the instant wall deletion of wall_smasher + */ +/datum/element/wall_tearer + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// Whether we can break reinforced walls + var/allow_reinforced + /// How long it takes for us to destroy a wall completely (its a 3 step process so this will be divided by three) + var/tear_time + /// How much longer it takes to break reinforced walls + var/reinforced_multiplier + /// What interaction key do we use for our interaction + var/do_after_key + +/datum/element/wall_tearer/Attach(datum/target, allow_reinforced = TRUE, tear_time = 4 SECONDS, reinforced_multiplier = 3, do_after_key = null) + . = ..() + if (!isliving(target)) + return ELEMENT_INCOMPATIBLE + src.allow_reinforced = allow_reinforced + src.tear_time = tear_time + src.reinforced_multiplier = reinforced_multiplier + src.do_after_key = do_after_key + RegisterSignals(target, list(COMSIG_HOSTILE_PRE_ATTACKINGTARGET, COMSIG_LIVING_UNARMED_ATTACK), PROC_REF(on_attacked_wall)) + +/datum/element/wall_tearer/Detach(datum/source) + . = ..() + UnregisterSignal(source, list(COMSIG_HOSTILE_PRE_ATTACKINGTARGET, COMSIG_LIVING_UNARMED_ATTACK)) + +/// Try to tear up a wall +/datum/element/wall_tearer/proc/on_attacked_wall(mob/living/tearer, atom/target, proximity_flag) + SIGNAL_HANDLER + if (DOING_INTERACTION_WITH_TARGET(tearer, target) || (!isnull(do_after_key) && DOING_INTERACTION(tearer, do_after_key))) + tearer.balloon_alert(tearer, "busy!") + return COMPONENT_HOSTILE_NO_ATTACK + var/is_valid = validate_target(target, tearer) + if (is_valid != WALL_TEAR_ALLOWED) + return is_valid == WALL_TEAR_FAIL_CANCEL_CHAIN ? COMPONENT_HOSTILE_NO_ATTACK : NONE + INVOKE_ASYNC(src, PROC_REF(rip_and_tear), tearer, target) + return COMPONENT_HOSTILE_NO_ATTACK + +/datum/element/wall_tearer/proc/rip_and_tear(mob/living/tearer, atom/target) + // We need to do this three times to actually destroy it + var/rip_time = (istype(target, /turf/closed/wall/r_wall) ? tear_time * reinforced_multiplier : tear_time) / 3 + if (rip_time > 0) + tearer.visible_message(span_warning("[tearer] begins tearing through [target]!")) + playsound(tearer, 'sound/machines/airlock_alien_prying.ogg', vol = 100, vary = TRUE) + target.balloon_alert(tearer, "tearing...") + if (!do_after(tearer, delay = rip_time, target = target, interaction_key = do_after_key)) + tearer.balloon_alert(tearer, "interrupted!") + return + // Might have been replaced, removed, or reinforced during our do_after + var/is_valid = validate_target(target, tearer) + if (is_valid != WALL_TEAR_ALLOWED) + return + target.AddComponent(/datum/component/torn_wall) + is_valid = validate_target(target, tearer) // And now we might have just destroyed it + if (is_valid == WALL_TEAR_ALLOWED) + tearer.UnarmedAttack(target, proximity_flag = TRUE) + +/// Check if the target atom is a wall we can actually rip up +/datum/element/wall_tearer/proc/validate_target(atom/target, mob/living/tearer) + if (!isclosedturf(target) || isindestructiblewall(target)) + return WALL_TEAR_INVALID + + var/reinforced = istype(target, /turf/closed/wall/r_wall) + if (!allow_reinforced && reinforced) + target.balloon_alert(tearer, "it's too strong!") + return WALL_TEAR_FAIL_CANCEL_CHAIN + return WALL_TEAR_ALLOWED + +#undef WALL_TEAR_ALLOWED +#undef WALL_TEAR_INVALID +#undef WALL_TEAR_FAIL_CANCEL_CHAIN diff --git a/code/datums/elements/wall_walker.dm b/code/datums/elements/wall_walker.dm new file mode 100644 index 000000000000..92ac3318c128 --- /dev/null +++ b/code/datums/elements/wall_walker.dm @@ -0,0 +1,49 @@ +/// This element will allow the mob it's attached to to pass through a specified type of wall, and drag anything through it. +/datum/element/wall_walker + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + /// What kind of walls can we pass through? + var/wall_type + +/datum/element/wall_walker/Attach( + datum/target, + wall_type = /turf/closed/wall, +) + . = ..() + if (!isliving(target)) + return ELEMENT_INCOMPATIBLE + + src.wall_type = wall_type + RegisterSignal(target, COMSIG_LIVING_WALL_BUMP, PROC_REF(try_pass_wall)) + RegisterSignal(target, COMSIG_LIVING_WALL_EXITED, PROC_REF(exit_wall)) + +/datum/element/wall_walker/Detach(datum/source) + UnregisterSignal(source, list(COMSIG_LIVING_WALL_BUMP, COMSIG_LIVING_WALL_EXITED)) + return ..() + +/// If the wall is of the proper type, pass into it and keep hold on whatever you're pulling +/datum/element/wall_walker/proc/try_pass_wall(mob/living/passing_mob, turf/closed/bumped_wall) + if(!istype(bumped_wall, wall_type)) + return + + var/atom/movable/stored_pulling = passing_mob.pulling + if(stored_pulling) //force whatever you're pulling to come with you + stored_pulling.setDir(get_dir(stored_pulling.loc, passing_mob.loc)) + stored_pulling.forceMove(passing_mob.loc) + passing_mob.forceMove(bumped_wall) + + if(stored_pulling) //don't drop them because we went into a wall + passing_mob.start_pulling(stored_pulling, supress_message = TRUE) + +/// If the wall is of the proper type, pull whatever you're pulling into it +/datum/element/wall_walker/proc/exit_wall(mob/living/passing_mob, turf/closed/exited_wall) + if(!istype(exited_wall, wall_type)) + return + + var/atom/movable/stored_pulling = passing_mob.pulling + if(isnull(stored_pulling)) + return + + stored_pulling.setDir(get_dir(stored_pulling.loc, passing_mob.loc)) + stored_pulling.forceMove(exited_wall) + passing_mob.start_pulling(stored_pulling, supress_message = TRUE) diff --git a/code/datums/elements/wheel.dm b/code/datums/elements/wheel.dm new file mode 100644 index 000000000000..2bb8977ca5ca --- /dev/null +++ b/code/datums/elements/wheel.dm @@ -0,0 +1,28 @@ +/// Element which spins you as you move +/datum/element/wheel + +/datum/element/wheel/Attach(datum/target) + . = ..() + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + +/datum/element/wheel/Detach(datum/source) + . = ..() + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + +/datum/element/wheel/proc/on_moved(atom/movable/moved, atom/oldloc, direction, forced) + SIGNAL_HANDLER + if(forced || CHECK_MOVE_LOOP_FLAGS(moved, MOVEMENT_LOOP_OUTSIDE_CONTROL)) + return + if(isliving(moved)) + var/mob/living/living_moved = moved + if (living_moved.incapacitated() || living_moved.body_position == LYING_DOWN) + return + var/rotation_degree = (360 / 3) + if(direction & SOUTHWEST) + rotation_degree *= -1 + + var/matrix/to_turn = matrix(moved.transform) + to_turn = turn(moved.transform, rotation_degree) + animate(moved, transform = to_turn, time = 0.1 SECONDS, flags = ANIMATION_PARALLEL) diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 2151a384f62f..226253183825 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -101,7 +101,7 @@ var/tmp_sound = get_sound(user) if(tmp_sound && should_play_sound(user, intentional) && !TIMER_COOLDOWN_CHECK(user, type)) TIMER_COOLDOWN_START(user, type, audio_cooldown) - playsound(user, tmp_sound, 50, vary) + playsound(user, tmp_sound, 50, vary, mixer_channel = CHANNEL_MOB_SOUNDS) var/user_turf = get_turf(user) if (user.client) diff --git a/code/datums/greyscale/config_types/greyscale_configs.dm b/code/datums/greyscale/config_types/greyscale_configs.dm index 552d2351f7a2..4f7223a78f74 100644 --- a/code/datums/greyscale/config_types/greyscale_configs.dm +++ b/code/datums/greyscale/config_types/greyscale_configs.dm @@ -1096,6 +1096,19 @@ name = "simian Hardsuit" json_config = 'code/datums/greyscale/json_configs/simian_fallbacks/hardsuit.json' +/datum/greyscale_config/lizard + name = "lizard Clothing" + icon_file = 'monkestation/icons/mob/gags/clothing/lizard_fallbacks.dmi' + json_config = 'code/datums/greyscale/json_configs/lizard_fallbacks/shoes.json' + +/datum/greyscale_config/lizard/shoes + name = "lizard Shoes" + json_config = 'code/datums/greyscale/json_configs/lizard_fallbacks/shoes.json' + +/datum/greyscale_config/lizard/under + name = "lizard Under" + json_config = 'code/datums/greyscale/json_configs/lizard_fallbacks/under.json' + /datum/greyscale_config/polycloak name = "cloak" @@ -1141,3 +1154,49 @@ name = "Worn Fish Analyzer" icon_file = 'icons/mob/clothing/belt.dmi' json_config = 'code/datums/greyscale/json_configs/fish_analyzer_worn.json' + +/* +* MASKS +*/ + +// BANDANAS + +/datum/greyscale_config/bandana_worn/snouted + name = "Worn Bandana" + icon_file = SNOUTED_MASK_FILE + +/datum/greyscale_config/bandstriped_worn/snouted + name = "Worn Striped Bandana" + icon_file = SNOUTED_MASK_FILE + +/datum/greyscale_config/bandskull_worn/snouted + name = "Worn Skull Bandana" + icon_file = SNOUTED_MASK_FILE + +/* +* SUITS +*/ + +// JUMPSUITS + +/datum/greyscale_config/jumpsuit_worn/digitigrade + name = "Worn Jumpsuit - Digitigrade" + icon_file = DIGITIGRADE_UNIFORM_FILE + +/datum/greyscale_config/jumpsuit_prison_worn/digitigrade + name = "Worn Prison Jumpsuit - Digitigrade" + icon_file = DIGITIGRADE_UNIFORM_FILE + +/* +* SHOES +*/ + +// SNEAKERS + +/datum/greyscale_config/sneakers_worn/digitigrade + name = "Worn Sneakers - Digitigrade" + icon_file = DIGITIGRADE_SHOES_FILE + +/datum/greyscale_config/sneakers_orange_worn/digitigrade + name = "Worn Orange Sneakers - Digitigrade" + icon_file = DIGITIGRADE_SHOES_FILE diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_mobs.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_mobs.dm new file mode 100644 index 000000000000..f8a0f4a062c6 --- /dev/null +++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_mobs.dm @@ -0,0 +1,37 @@ +// +// CARP +// + +/datum/greyscale_config/carp + name = "Space Carp" + icon_file = 'icons/mob/simple/carp.dmi' + json_config = 'code/datums/greyscale/json_configs/carp.json' + +/datum/greyscale_config/carp_magic + name = "Magicarp" + icon_file = 'icons/mob/simple/carp.dmi' + json_config = 'code/datums/greyscale/json_configs/carp_magic.json' + +/datum/greyscale_config/carp_mega + name = "Megacarp" + icon_file = 'icons/mob/simple/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' + +// +// MISC +// + +/datum/greyscale_config/garden_gnome + name = "Garden Gnome" + icon_file = 'icons/mob/simple/garden_gnome.dmi' + json_config = 'code/datums/greyscale/json_configs/garden_gnome.json' + +/datum/greyscale_config/gutlunch + name = "Gutlunch" + icon_file = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + json_config = 'code/datums/greyscale/json_configs/gutlunch.json' + diff --git a/code/datums/greyscale/json_configs/gutlunch.json b/code/datums/greyscale/json_configs/gutlunch.json new file mode 100644 index 000000000000..0b9303381634 --- /dev/null +++ b/code/datums/greyscale/json_configs/gutlunch.json @@ -0,0 +1,15 @@ +{ + "gutlunch": [ + { + "type": "icon_state", + "icon_state": "gutlunch", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "gutlunch_face", + "blend_mode": "overlay" + } + ] +} diff --git a/code/datums/greyscale/json_configs/lizard_fallbacks/shoes.json b/code/datums/greyscale/json_configs/lizard_fallbacks/shoes.json new file mode 100644 index 000000000000..48cba2bac661 --- /dev/null +++ b/code/datums/greyscale/json_configs/lizard_fallbacks/shoes.json @@ -0,0 +1,10 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "boots", + "blend_mode": "overlay", + "color_ids": [ 1 ] + } + ] +} diff --git a/code/datums/greyscale/json_configs/lizard_fallbacks/under.json b/code/datums/greyscale/json_configs/lizard_fallbacks/under.json new file mode 100644 index 000000000000..6e4854948920 --- /dev/null +++ b/code/datums/greyscale/json_configs/lizard_fallbacks/under.json @@ -0,0 +1,16 @@ +{ + "": [ + { + "type": "icon_state", + "icon_state": "jumpsuit", + "blend_mode": "overlay", + "color_ids": [ 1 ] + }, + { + "type": "icon_state", + "icon_state": "jumpsuit_accessories", + "blend_mode": "overlay", + "color_ids": [ 2 ] + } + ] +} diff --git a/code/datums/keybinding/_keybindings.dm b/code/datums/keybinding/_keybindings.dm index dfcf492c1809..b1bff05efb9e 100644 --- a/code/datums/keybinding/_keybindings.dm +++ b/code/datums/keybinding/_keybindings.dm @@ -16,6 +16,11 @@ if(LAZYLEN(hotkey_keys) && !LAZYLEN(classic_keys)) classic_keys = hotkey_keys.Copy() + //MONKESTAITON EDIT - GOONIMIZATIONS + if(LAZYLEN(goon_keys) && !LAZYLEN(goon_keys)) + goon_keys = hotkey_keys.Copy() + //MONKESTAITON EDIT - GOONIMIZATIONS + /datum/keybinding/proc/down(client/user) SHOULD_CALL_PARENT(TRUE) return SEND_SIGNAL(user.mob, keybind_signal) & COMSIG_KB_ACTIVATED diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm index cdaabc387267..7f0c5535add2 100644 --- a/code/datums/looping_sounds/_looping_sound.dm +++ b/code/datums/looping_sounds/_looping_sound.dm @@ -160,7 +160,8 @@ ignore_walls = ignore_walls, falloff_distance = falloff_distance, use_reverb = use_reverb, - channel = channel //monkestation edit + channel = channel, //monkestation edit + mixer_channel = channel ) /// Returns the sound we should now be playing. diff --git a/code/datums/mapgen/CaveGenerator.dm b/code/datums/mapgen/CaveGenerator.dm index 505ac87766a3..e407198faf3f 100644 --- a/code/datums/mapgen/CaveGenerator.dm +++ b/code/datums/mapgen/CaveGenerator.dm @@ -55,7 +55,7 @@ /mob/living/basic/mining/basilisk = 4, /mob/living/basic/mining/goldgrub = 1, /mob/living/basic/mining/goliath/ancient = 5, - /mob/living/simple_animal/hostile/asteroid/hivelord = 3, + /mob/living/basic/mining/hivelord = 3, ) mob_spawn_list = expand_weights(weighted_mob_spawn_list) mob_spawn_no_mega_list = expand_weights(weighted_mob_spawn_list - SPAWN_MEGAFAUNA) diff --git a/code/datums/mapgen/Cavegens/IcemoonCaves.dm b/code/datums/mapgen/Cavegens/IcemoonCaves.dm index 3f6f5fd60acc..a6638919c81b 100644 --- a/code/datums/mapgen/Cavegens/IcemoonCaves.dm +++ b/code/datums/mapgen/Cavegens/IcemoonCaves.dm @@ -4,11 +4,11 @@ weighted_mob_spawn_list = list( - /mob/living/basic/mining/lobstrosity = 15, /mob/living/basic/mining/goldgrub = 10, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50, + /mob/living/basic/mining/legion/snow = 50, + /mob/living/basic/mining/lobstrosity = 15, + /mob/living/basic/mining/wolf = 50, /mob/living/simple_animal/hostile/asteroid/polarbear = 30, - /mob/living/simple_animal/hostile/asteroid/wolf = 50, /obj/structure/spawner/ice_moon = 3, /obj/structure/spawner/ice_moon/polarbear = 3, ) @@ -42,12 +42,12 @@ weighted_closed_turf_types = list(/turf/closed/mineral/random/snow/underground = 1) weighted_mob_spawn_list = list( SPAWN_MEGAFAUNA = 1, + /mob/living/basic/mining/ice_demon = 100, /mob/living/basic/mining/ice_whelp = 60, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 100, - /mob/living/simple_animal/hostile/asteroid/ice_demon = 100, + /mob/living/basic/mining/legion/snow = 100, /obj/structure/spawner/ice_moon/demonic_portal = 6, - /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 6, /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 6, + /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 6, ) weighted_megafauna_spawn_list = list(/mob/living/simple_animal/hostile/megafauna/colossus = 1) weighted_flora_spawn_list = list(/obj/structure/flora/rock/icy/style_random = 6, /obj/structure/flora/rock/pile/icy/style_random = 6, /obj/structure/flora/ash/chilly = 1) diff --git a/code/datums/mapgen/Cavegens/LavalandGenerator.dm b/code/datums/mapgen/Cavegens/LavalandGenerator.dm index be8294fada66..6f8aa7ed1bbf 100644 --- a/code/datums/mapgen/Cavegens/LavalandGenerator.dm +++ b/code/datums/mapgen/Cavegens/LavalandGenerator.dm @@ -8,8 +8,8 @@ /obj/effect/spawner/random/lavaland_mob/legion = 30, /obj/effect/spawner/random/lavaland_mob/watcher = 40, /mob/living/basic/mining/bileworm = 20, + /mob/living/basic/mining/brimdemon = 20, /mob/living/basic/mining/lobstrosity/lava = 20, - /mob/living/simple_animal/hostile/asteroid/brimdemon = 20, /mob/living/basic/mining/goldgrub = 10, /obj/structure/spawner/lavaland = 2, /obj/structure/spawner/lavaland/goliath = 3, diff --git a/code/datums/martial/_martial.dm b/code/datums/martial/_martial.dm index a6cfbb3d7259..1ffa67397e0a 100644 --- a/code/datums/martial/_martial.dm +++ b/code/datums/martial/_martial.dm @@ -91,7 +91,3 @@ if(help_verb) remove_verb(holder_living, help_verb) return - -///Gets called when a projectile hits the owner. Returning anything other than BULLET_ACT_HIT will stop the projectile from hitting the mob. -/datum/martial_art/proc/on_projectile_hit(mob/living/attacker, obj/projectile/P, def_zone) - return BULLET_ACT_HIT diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 72e6cd5ada37..2ed42452d406 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -15,11 +15,13 @@ return target.add_traits(list(TRAIT_NOGUNS, TRAIT_HARDLY_WOUNDED, TRAIT_NODISMEMBER), SLEEPING_CARP_TRAIT) RegisterSignal(target, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attackby)) + RegisterSignal(target, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(hit_by_projectile)) target.faction |= FACTION_CARP //:D /datum/martial_art/the_sleeping_carp/on_remove(mob/living/target) target.remove_traits(list(TRAIT_NOGUNS, TRAIT_HARDLY_WOUNDED, TRAIT_NODISMEMBER), SLEEPING_CARP_TRAIT) UnregisterSignal(target, COMSIG_PARENT_ATTACKBY) + UnregisterSignal(target, COMSIG_ATOM_PRE_BULLET_ACT) target.faction -= FACTION_CARP //:( . = ..() @@ -113,6 +115,8 @@ return ..() /datum/martial_art/the_sleeping_carp/proc/can_deflect(mob/living/carp_user) + if(!can_use(carp_user) || !carp_user.throw_mode) + return FALSE if(carp_user.incapacitated(IGNORE_GRAB)) //NO STUN return FALSE if(!(carp_user.mobility_flags & MOBILITY_USE)) //NO UNABLE TO USE @@ -124,17 +128,20 @@ return FALSE return TRUE -/datum/martial_art/the_sleeping_carp/on_projectile_hit(mob/living/carp_user, obj/projectile/P, def_zone) - . = ..() +/datum/martial_art/the_sleeping_carp/proc/hit_by_projectile(mob/living/carp_user, obj/projectile/hitting_projectile, def_zone) + SIGNAL_HANDLER + if(!can_deflect(carp_user)) - return BULLET_ACT_HIT - if(carp_user.throw_mode) - carp_user.visible_message(span_danger("[carp_user] effortlessly swats the projectile aside! They can block bullets with their bare hands!"), span_userdanger("You deflect the projectile!")) - playsound(get_turf(carp_user), pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) - P.firer = carp_user - P.set_angle(rand(0, 360))//SHING - return BULLET_ACT_FORCE_PIERCE - return BULLET_ACT_HIT + return NONE + + carp_user.visible_message( + span_danger("[carp_user] effortlessly swats [hitting_projectile] aside! [carp_user.p_They()] can block bullets with [carp_user.p_their()] bare hands!"), + span_userdanger("You deflect [hitting_projectile]!"), + ) + playsound(carp_user, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) + hitting_projectile.firer = carp_user + hitting_projectile.set_angle(rand(0, 360))//SHING + return COMPONENT_BULLET_PIERCED ///Signal from getting attacked with an item, for a special interaction with touch spells /datum/martial_art/the_sleeping_carp/proc/on_attackby(mob/living/carp_user, obj/item/attack_weapon, mob/attacker, params) diff --git a/code/datums/memory/_memory.dm b/code/datums/memory/_memory.dm index ae49549a68d9..76cce94bcafa 100644 --- a/code/datums/memory/_memory.dm +++ b/code/datums/memory/_memory.dm @@ -230,6 +230,7 @@ var/static/list/something_pool = list( /mob/living/basic/bat, /mob/living/basic/bear, + /mob/living/basic/blob_minion/blobbernaut, /mob/living/basic/butterfly, /mob/living/basic/carp, /mob/living/basic/carp/magic, @@ -237,9 +238,8 @@ /mob/living/basic/cow, /mob/living/basic/cow/wisdom, /mob/living/basic/crab, - /mob/living/basic/spider/giant, - /mob/living/basic/spider/giant/hunter, - /mob/living/basic/mining/goliath, + /mob/living/basic/goat, + /mob/living/basic/gorilla, /mob/living/basic/headslug, /mob/living/basic/killer_tomato, /mob/living/basic/lizard, @@ -248,6 +248,7 @@ /mob/living/basic/morph, /mob/living/basic/mouse, /mob/living/basic/mushroom, + /mob/living/basic/parrot, /mob/living/basic/pet/dog/breaddog, /mob/living/basic/pet/dog/corgi, /mob/living/basic/pet/dog/pug, @@ -257,11 +258,7 @@ /mob/living/basic/statue, /mob/living/basic/stickman, /mob/living/basic/stickman/dog, - /mob/living/simple_animal/hostile/blob/blobbernaut/independent, - /mob/living/simple_animal/hostile/gorilla, /mob/living/simple_animal/hostile/megafauna/dragon/lesser, - /mob/living/simple_animal/hostile/retaliate/goat, - /mob/living/simple_animal/parrot, /mob/living/simple_animal/pet/cat, /mob/living/simple_animal/pet/cat/cak, /obj/item/food/sausage/american, diff --git a/code/datums/mind/initialization.dm b/code/datums/mind/initialization.dm index 12a5dddb229c..eb622cc5af54 100644 --- a/code/datums/mind/initialization.dm +++ b/code/datums/mind/initialization.dm @@ -11,6 +11,7 @@ mind.set_current(src) // There's nowhere else to set this up, mind code makes me depressed mind.antag_hud = add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/antagonist_hud, "combo_hud", mind) + SEND_SIGNAL(src, COMSIG_MOB_MIND_INITIALIZED, mind) /mob/living/carbon/mind_initialize() ..() diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index ef4cec4ea467..7603e275f8c3 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -143,6 +143,9 @@ mood_change = -4 timeout = 2 MINUTES +/datum/mood_event/healsbadman/long_term + timeout = 10 MINUTES + /datum/mood_event/jittery description = "I'm nervous and on edge and I can't stand still!!" mood_change = -2 diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm index 4186ade577f6..ca3f0820ea01 100644 --- a/code/datums/mutations/antenna.dm +++ b/code/datums/mutations/antenna.dm @@ -91,32 +91,11 @@ // 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] - + var/list/recent_speech = cast_on.copy_recent_speech(copy_amount = 3, line_chance = 50) 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]]")) + to_chat(owner, span_notice("[spoken_memory]")) if(iscarbon(cast_on)) var/mob/living/carbon/carbon_cast_on = cast_on diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index e1784f009c8f..77bd426ed299 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -63,13 +63,19 @@ *arg1 is the arm to evaluate damage of and possibly break. */ /datum/mutation/human/hulk/proc/break_an_arm(obj/item/bodypart/arm) + var/severity switch(arm.brute_dam) if(45 to 50) - arm.force_wound_upwards(/datum/wound/blunt/critical) + severity = WOUND_SEVERITY_CRITICAL if(41 to 45) - arm.force_wound_upwards(/datum/wound/blunt/severe) + severity = WOUND_SEVERITY_SEVERE if(35 to 41) - arm.force_wound_upwards(/datum/wound/blunt/moderate) + severity = WOUND_SEVERITY_MODERATE + + if (isnull(severity)) + return + + owner.cause_wound_of_type_and_severity(WOUND_BLUNT, arm, severity, wound_source = "hulk smashing") /datum/mutation/human/hulk/on_life(seconds_per_tick, times_fired) if(owner.health < owner.crit_threshold) diff --git a/code/datums/mutations/void_magnet.dm b/code/datums/mutations/void_magnet.dm index 56b22d664a85..d6636b0b6306 100644 --- a/code/datums/mutations/void_magnet.dm +++ b/code/datums/mutations/void_magnet.dm @@ -60,7 +60,7 @@ /datum/action/cooldown/spell/void/cursed/proc/on_life(mob/living/source, seconds_per_tick, times_fired) SIGNAL_HANDLER - if(!isliving(source) || IS_IN_STASIS(source) || source.stat == DEAD || source.notransform) + if(!isliving(source) || IS_IN_STASIS(source) || source.stat == DEAD || HAS_TRAIT(source, TRAIT_NO_TRANSFORM)) return if(!is_valid_target(source)) diff --git a/code/datums/proximity_monitor/fields/timestop.dm b/code/datums/proximity_monitor/fields/timestop.dm index 7fad290fc74d..86ea41aee013 100644 --- a/code/datums/proximity_monitor/fields/timestop.dm +++ b/code/datums/proximity_monitor/fields/timestop.dm @@ -36,7 +36,7 @@ for(var/mob/living/to_check in GLOB.player_list) if(HAS_TRAIT(to_check, TRAIT_TIME_STOP_IMMUNE)) immune[to_check] = TRUE - for(var/mob/living/simple_animal/hostile/guardian/stand in GLOB.parasites) + for(var/mob/living/basic/guardian/stand in GLOB.parasites) if(stand.summoner && HAS_TRAIT(stand.summoner, TRAIT_TIME_STOP_IMMUNE)) //It would only make sense that a person's stand would also be immune. immune[stand] = TRUE if(start) diff --git a/code/datums/quirks/_quirk.dm b/code/datums/quirks/_quirk.dm index 28ef4df4b584..fdee54d6cc93 100644 --- a/code/datums/quirks/_quirk.dm +++ b/code/datums/quirks/_quirk.dm @@ -207,32 +207,25 @@ * Arguments: * * Medical- If we want the long, fancy descriptions that show up in medical records, or if not, just the name * * Category- Which types of quirks we want to print out. Defaults to everything + * * from_scan- If the source of this call is like a health analyzer or HUD, in which case QUIRK_HIDE_FROM_MEDICAL hides the quirk. */ -/mob/living/proc/get_quirk_string(medical, category = CAT_QUIRK_ALL) //helper string. gets a string of all the quirks the mob has +/mob/living/proc/get_quirk_string(medical = FALSE, category = CAT_QUIRK_ALL, from_scan = FALSE) var/list/dat = list() - switch(category) - if(CAT_QUIRK_ALL) - for(var/V in quirks) - var/datum/quirk/T = V - dat += medical ? T.medical_record_text : T.name - //Major Disabilities - if(CAT_QUIRK_MAJOR_DISABILITY) - for(var/V in quirks) - var/datum/quirk/T = V - if(T.value < -4) - dat += medical ? T.medical_record_text : T.name - //Minor Disabilities - if(CAT_QUIRK_MINOR_DISABILITY) - for(var/V in quirks) - var/datum/quirk/T = V - if(T.value >= -4 && T.value < 0) - dat += medical ? T.medical_record_text : T.name - //Neutral and Positive quirks - if(CAT_QUIRK_NOTES) - for(var/V in quirks) - var/datum/quirk/T = V - if(T.value > -1) - dat += medical ? T.medical_record_text : T.name + for(var/datum/quirk/candidate as anything in quirks) + if(from_scan & candidate.quirk_flags & QUIRK_HIDE_FROM_SCAN) + continue + switch(category) + if(CAT_QUIRK_MAJOR_DISABILITY) + if(candidate.value >= -4) + continue + if(CAT_QUIRK_MINOR_DISABILITY) + if(!ISINRANGE(candidate.value, -4, -1)) + continue + if(CAT_QUIRK_NOTES) + if(candidate.value < 0) + continue + dat += medical ? candidate.medical_record_text : candidate.name + if(!dat.len) return medical ? "No issues have been declared." : "None" return medical ? dat.Join("
") : dat.Join(", ") diff --git a/code/datums/quirks/negative_quirks.dm b/code/datums/quirks/negative_quirks.dm index 6a2acce90cd3..25a73d2cfbb8 100644 --- a/code/datums/quirks/negative_quirks.dm +++ b/code/datums/quirks/negative_quirks.dm @@ -1162,3 +1162,44 @@ /datum/quirk/cursed/add(client/client_source) quirk_holder.AddComponent(/datum/component/omen/quirk) + +/datum/quirk/indebted + name = "Indebted" + desc = "Bad life decisions, medical bills, student loans, whatever it may be, you've incurred quite the debt. A portion of all you receive will go towards extinguishing it." + icon = FA_ICON_DOLLAR + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_HIDE_FROM_SCAN + value = -2 + medical_record_text = "Alas, the patient struggled to scrape together enough money to pay the checkup bill." + hardcore_value = 2 + +/datum/quirk/indebted/add_unique(client/client_source) + var/mob/living/carbon/human/human_holder = quirk_holder + if(!human_holder.account_id) + return + var/datum/bank_account/account = SSeconomy.bank_accounts_by_id["[human_holder.account_id]"] + var/debt = PAYCHECK_CREW * rand(275, 325) + account.account_debt += debt + RegisterSignal(account, COMSIG_BANK_ACCOUNT_DEBT_PAID, PROC_REF(on_debt_paid)) + to_chat(client_source.mob, span_warning("You remember, you've a hefty, [debt] credits debt to pay...")) + +///Once the debt is extinguished, award an achievement and a pin for actually taking care of it. +/datum/quirk/indebted/proc/on_debt_paid(datum/bank_account/source) + SIGNAL_HANDLER + if(source.account_debt) + return + UnregisterSignal(source, COMSIG_BANK_ACCOUNT_DEBT_PAID) + ///The debt was extinguished while the quirk holder was logged out, so let's kindly award it once they come back. + if(!quirk_holder.client) + RegisterSignal(quirk_holder, COMSIG_MOB_LOGIN, PROC_REF(award_on_login)) + else + quirk_holder.client.give_award(/datum/award/achievement/misc/debt_extinguished, quirk_holder) + podspawn(list( + "target" = get_turf(quirk_holder), + "style" = STYLE_BLUESPACE, + "spawn" = /obj/item/clothing/accessory/debt_payer_pin, + )) + +/datum/quirk/indebted/proc/award_on_login(mob/source) + SIGNAL_HANDLER + quirk_holder.client.give_award(/datum/award/achievement/misc/debt_extinguished, quirk_holder) + UnregisterSignal(source, COMSIG_MOB_LOGIN) diff --git a/code/datums/records/manifest.dm b/code/datums/records/manifest.dm index d26f78a5fb08..cc906e81b96e 100644 --- a/code/datums/records/manifest.dm +++ b/code/datums/records/manifest.dm @@ -142,9 +142,9 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new) trim = assignment, // Crew specific lock_ref = REF(lockfile), - major_disabilities = person.get_quirk_string(FALSE, CAT_QUIRK_MAJOR_DISABILITY), + major_disabilities = person.get_quirk_string(FALSE, CAT_QUIRK_MAJOR_DISABILITY, from_scan = TRUE), major_disabilities_desc = person.get_quirk_string(TRUE, CAT_QUIRK_MAJOR_DISABILITY), - minor_disabilities = person.get_quirk_string(FALSE, CAT_QUIRK_MINOR_DISABILITY), + minor_disabilities = person.get_quirk_string(FALSE, CAT_QUIRK_MINOR_DISABILITY, from_scan = TRUE), minor_disabilities_desc = person.get_quirk_string(TRUE, CAT_QUIRK_MINOR_DISABILITY), quirk_notes = person.get_quirk_string(TRUE, CAT_QUIRK_NOTES), ) diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index d6483e7e0c34..b0d73d36a919 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -268,3 +268,28 @@ cost = 5 suffix = "lavaland_surface_bileworm_nest.dmm" allow_duplicates = FALSE + +/datum/map_template/ruin/lavaland/lava_phonebooth + name = "Phonebooth" + id = "lava_phonebooth" + description = "A venture by nanotrasen to help popularize the use of holopads. This one somehow made its way here." + suffix = "lavaland_surface_phonebooth.dmm" + allow_duplicates = FALSE + cost = 5 + +/datum/map_template/ruin/lavaland/battle_site + name = "Battle Site" + id = "battle_site" + description = "The long past site of a battle between beast and humanoids. The victor is unknown, but the losers are clear." + suffix = "lavaland_battle_site.dmm" + allow_duplicates = TRUE + cost = 3 + +/datum/map_template/ruin/lavaland/mook_village + name = "Mook Village" + id = "mook_village" + description = "A village hosting a community of friendly mooks!" + suffix = "lavaland_surface_mookvillage.dmm" + allow_duplicates = FALSE + cost = 5 + always_place = TRUE diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index 78ec5e6af38a..60d3bd594e2d 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -77,8 +77,8 @@ /datum/saymode/binary/handle_message(mob/living/user, message, datum/language/language) if(isdrone(user)) - var/mob/living/simple_animal/drone/D = user - D.drone_chat(message) + var/mob/living/basic/drone/drone_user = user + drone_user.drone_chat(message) return FALSE if(user.binarycheck()) user.robot_talk(message) diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm index a328506bb959..0eb7668c6d8e 100644 --- a/code/datums/station_traits/negative_traits.dm +++ b/code/datums/station_traits/negative_traits.dm @@ -381,7 +381,7 @@ if(istype(current_thing, /obj/machinery/vending) && prob(45)) var/obj/machinery/vending/vendor_to_trash = current_thing if(prob(50)) - vendor_to_trash.tilt(get_turf(vendor_to_trash)) + vendor_to_trash.tilt(get_turf(vendor_to_trash), 0) // crit effects can do some real weird shit, lets disable it if(prob(50)) vendor_to_trash.take_damage(150) diff --git a/code/datums/station_traits/neutral_traits.dm b/code/datums/station_traits/neutral_traits.dm index 494008bb8f79..2c86b6188417 100644 --- a/code/datums/station_traits/neutral_traits.dm +++ b/code/datums/station_traits/neutral_traits.dm @@ -148,7 +148,7 @@ show_in_report = FALSE // Selective attention test. Did you spot the gorilla? /// The gorilla we created, we only hold this ref until the round starts. - var/mob/living/simple_animal/hostile/gorilla/cargo_domestic/cargorilla + var/mob/living/basic/gorilla/cargorilla/cargorilla /datum/station_trait/cargorilla/New() . = ..() @@ -158,8 +158,8 @@ /datum/station_trait/cargorilla/proc/replace_cargo(datum/source) SIGNAL_HANDLER - var/mob/living/simple_animal/sloth/cargo_sloth = GLOB.cargo_sloth - if(!cargo_sloth) + var/mob/living/basic/sloth/cargo_sloth = GLOB.cargo_sloth + if(isnull(cargo_sloth)) return cargorilla = new(cargo_sloth.loc) @@ -189,7 +189,7 @@ cargorilla = null /// Get us a ghost for the gorilla. -/datum/station_trait/cargorilla/proc/get_ghost_for_gorilla(mob/living/simple_animal/hostile/gorilla/cargo_domestic/gorilla) +/datum/station_trait/cargorilla/proc/get_ghost_for_gorilla(mob/living/basic/gorilla/cargorilla/gorilla) if(QDELETED(gorilla)) return diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 72dece18b8bd..4dea910b43a6 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -294,10 +294,10 @@ /datum/status_effect/hippocratic_oath/proc/consume_owner() owner.visible_message(span_notice("[owner]'s soul is absorbed into the rod, relieving the previous snake of its duty.")) var/list/chems = list(/datum/reagent/medicine/sal_acid, /datum/reagent/medicine/c2/convermol, /datum/reagent/medicine/oxandrolone) - var/mob/living/simple_animal/hostile/retaliate/snake/healSnake = new(owner.loc, pick(chems)) - healSnake.name = "Asclepius's Snake" - healSnake.real_name = "Asclepius's Snake" - healSnake.desc = "A mystical snake previously trapped upon the Rod of Asclepius, now freed of its burden. Unlike the average snake, its bites contain chemicals with minor healing properties." + var/mob/living/basic/snake/spawned = new(owner.loc, pick(chems)) + spawned.name = "Asclepius's Snake" + spawned.real_name = "Asclepius's Snake" + spawned.desc = "A mystical snake previously trapped upon the Rod of Asclepius, now freed of its burden. Unlike the average snake, its bites contain chemicals with minor healing properties." new /obj/effect/decal/cleanable/ash(owner.loc) new /obj/item/rod_of_asclepius(owner.loc) owner.investigate_log("has been consumed by the Rod of Asclepius.", INVESTIGATE_DEATHS) diff --git a/code/datums/status_effects/debuffs/choke.dm b/code/datums/status_effects/debuffs/choke.dm index 16c64376cb85..d2e502d75de7 100644 --- a/code/datums/status_effects/debuffs/choke.dm +++ b/code/datums/status_effects/debuffs/choke.dm @@ -215,8 +215,8 @@ if(iscarbon(victim)) var/mob/living/carbon/carbon_victim = victim var/obj/item/bodypart/chest = carbon_victim.get_bodypart(BODY_ZONE_CHEST) - if(chest) - chest.force_wound_upwards(/datum/wound/blunt/severe) + carbon_victim.cause_wound_of_type_and_severity(WOUND_BLUNT, chest, WOUND_SEVERITY_SEVERE, wound_source = "human force to the chest") + playsound(owner, 'sound/creatures/crack_vomit.ogg', 120, extrarange = 5, falloff_exponent = 4) vomit_up() diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index a1708a69d893..d4b4f789f0e5 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -397,7 +397,9 @@ var/still_bleeding = FALSE for(var/datum/wound/bleeding_thing as anything in throat.wounds) - if(bleeding_thing.wound_type == WOUND_SLASH && bleeding_thing.severity > WOUND_SEVERITY_MODERATE) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[bleeding_thing.type] + + if(pregen_data.wounding_types_valid(list(WOUND_SLASH)) && bleeding_thing.severity > WOUND_SEVERITY_MODERATE && bleeding_thing.blood_flow > 0) still_bleeding = TRUE break if(!still_bleeding) diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index 369c4dc44e5d..9ffdd73a741f 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -256,10 +256,10 @@ if(firelight_type) firelight_ref = WEAKREF(new firelight_type(owner)) - SEND_SIGNAL(owner, COMSIG_LIVING_IGNITED, owner) cache_stacks() update_overlay() update_particles() + SEND_SIGNAL(owner, COMSIG_LIVING_IGNITED, owner) return TRUE /** diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm index d0bdbd536024..ed0b7b555e46 100644 --- a/code/datums/status_effects/wound_effects.dm +++ b/code/datums/status_effects/wound_effects.dm @@ -54,11 +54,11 @@ right = C.get_bodypart(BODY_ZONE_R_LEG) update_limp() RegisterSignal(C, COMSIG_MOVABLE_MOVED, PROC_REF(check_step)) - RegisterSignals(C, list(COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB), PROC_REF(update_limp)) + RegisterSignals(C, list(COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_POST_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB), PROC_REF(update_limp)) return TRUE /datum/status_effect/limp/on_remove() - UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB)) + UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_POST_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB)) /atom/movable/screen/alert/status_effect/limp name = "Limping" @@ -165,51 +165,41 @@ if(W == linked_wound) qdel(src) +/datum/status_effect/wound/nextmove_modifier() + var/mob/living/carbon/C = owner -// bones -/datum/status_effect/wound/blunt - -/datum/status_effect/wound/blunt/on_apply() - . = ..() - RegisterSignal(owner, COMSIG_MOB_SWAP_HANDS, PROC_REF(on_swap_hands)) - on_swap_hands() - -/datum/status_effect/wound/blunt/on_remove() - . = ..() - UnregisterSignal(owner, COMSIG_MOB_SWAP_HANDS) - var/mob/living/carbon/wound_owner = owner - wound_owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/blunt_wound) - -/datum/status_effect/wound/blunt/proc/on_swap_hands() - SIGNAL_HANDLER + if(C.get_active_hand() == linked_limb) + return linked_wound.get_action_delay_mult() - var/mob/living/carbon/wound_owner = owner - if(wound_owner.get_active_hand() == linked_limb) - wound_owner.add_actionspeed_modifier(/datum/actionspeed_modifier/blunt_wound, (linked_wound.interaction_efficiency_penalty - 1)) - else - wound_owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/blunt_wound) + return ..() -/datum/status_effect/wound/blunt/nextmove_modifier() +/datum/status_effect/wound/nextmove_adjust() var/mob/living/carbon/C = owner if(C.get_active_hand() == linked_limb) - return linked_wound.interaction_efficiency_penalty + return linked_wound.get_action_delay_increment() + + return ..() - return 1 + +// bones +/datum/status_effect/wound/blunt/bone // blunt -/datum/status_effect/wound/blunt/moderate +/datum/status_effect/wound/blunt/bone/moderate id = "disjoint" -/datum/status_effect/wound/blunt/severe +/datum/status_effect/wound/blunt/bone/severe id = "hairline" -/datum/status_effect/wound/blunt/critical +/datum/status_effect/wound/blunt/bone/critical id = "compound" + // slash -/datum/status_effect/wound/slash/moderate + +/datum/status_effect/wound/slash/flesh/moderate id = "abrasion" -/datum/status_effect/wound/slash/severe +/datum/status_effect/wound/slash/flesh/severe id = "laceration" -/datum/status_effect/wound/slash/critical +/datum/status_effect/wound/slash/flesh/critical id = "avulsion" // pierce /datum/status_effect/wound/pierce/moderate @@ -219,9 +209,9 @@ /datum/status_effect/wound/pierce/critical id = "rupture" // burns -/datum/status_effect/wound/burn/moderate +/datum/status_effect/wound/burn/flesh/moderate id = "seconddeg" -/datum/status_effect/wound/burn/severe +/datum/status_effect/wound/burn/flesh/severe id = "thirddeg" -/datum/status_effect/wound/burn/critical +/datum/status_effect/wound/burn/flesh/critical id = "fourthdeg" diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index ce0175849090..4efe8d80dadc 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -404,6 +404,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) to_insert.forceMove(resolve_location) item_insertion_feedback(user, to_insert, override) resolve_location.update_appearance() + SEND_SIGNAL(to_insert, COMSIG_ITEM_STORED) return TRUE /** @@ -983,7 +984,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) resolve_parent.balloon_alert(to_show, "can't reach!") return FALSE - if(!isliving(to_show) || to_show.incapacitated()) + if(!isliving(to_show) || to_show.incapacitated(IGNORE_CRIT)) return FALSE if(locked) diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 1414fb55a441..e289110a6814 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -69,14 +69,14 @@ /datum/wires/airlock/interactable(mob/user) if(!..()) return FALSE - var/obj/machinery/door/airlock/A = holder - if(!issilicon(user) && A.isElectrified()) + var/obj/machinery/door/airlock/airlock = holder + if(!issilicon(user) && !isdrone(user) && airlock.isElectrified()) var/mob/living/carbon/carbon_user = user if (!istype(carbon_user) || carbon_user.should_electrocute(src)) return FALSE - if(A.is_secure()) + if(airlock.is_secure()) return FALSE - if(A.panel_open) + if(airlock.panel_open) return TRUE /datum/wires/airlock/get_status() diff --git a/code/datums/wounds/_wound_static_data.dm b/code/datums/wounds/_wound_static_data.dm new file mode 100644 index 000000000000..7a59ea57413a --- /dev/null +++ b/code/datums/wounds/_wound_static_data.dm @@ -0,0 +1,199 @@ +// This datum is merely a singleton instance that allows for custom "can be applied" behaviors without instantiating a wound instance. +// For example: You can make a pregen_data subtype for your wound that overrides can_be_applied_to to only apply to specifically slimeperson limbs. +// Without this, youre stuck with very static initial variables. + +/// A singleton datum that holds pre-gen and static data about a wound. Each wound datum should have a corresponding wound_pregen_data. +/datum/wound_pregen_data + /// The typepath of the wound we will be handling and storing data of. NECESSARY IF THIS IS A NON-ABSTRACT TYPE! + var/datum/wound/wound_path_to_generate + + /// Will this be instantiated? + var/abstract = FALSE + + /// If true, our wound can be selected in ordinary wound rolling. If this is set to false, our wound can only be directly instantiated by use of specific typepath. + var/can_be_randomly_generated = TRUE + + /// A list of biostates a limb must have to receive our wound, in wounds.dm. + var/required_limb_biostate + /// If false, we will check if the limb has all of our required biostates instead of just any. + var/require_any_biostate = FALSE + + /// If false, we will iterate through wounds on a given limb, and if any match our type, we wont add our wound. + var/duplicates_allowed = FALSE + + /// If we require BIO_BLOODED, we will not add our wound if this is true and the limb cannot bleed. + var/ignore_cannot_bleed = TRUE // a lot of bleed wounds should still be applied for purposes of mangling flesh + + /// A list of bodyzones we are applicable to. + var/list/viable_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + /// The types of attack that can generate this wound. E.g. WOUND_SLASH = A sharp attack can cause this, WOUND_BLUNT = an attack with no sharpness/an attack with sharpness against a limb with mangled exterior can cause this. + var/list/required_wounding_types + /// If true, this wound can only be generated by all [required_wounding_types] at once, not just any. + var/match_all_wounding_types = FALSE + + /// The weight that will be used if, by the end of wound selection, there are multiple valid wounds. This will be inserted into pick_weight, so use integers. + var/weight = WOUND_DEFAULT_WEIGHT + + /// The minimum injury roll a attack must get to generate us. Affected by our wound's threshold_penalty and series_threshold_penalty, as well as the attack's wound_bonus. See check_wounding_mods(). + var/threshold_minimum + + /// The series of wounds this is in. See wounds.dm (the defines file) for a more detailed explanation - but tldr is that no 2 wounds of the same series can be on a limb. + var/wound_series + + /// If true, we will attempt to, during a random wound roll, overpower and remove other wound typepaths from the possible wounds list using [competition_mode] and [overpower_wounds_of_even_severity]. + var/compete_for_wounding = TRUE + /// The competition mode with which we will remove other wounds from a possible wound roll assuming [compete_for_wounding] is TRUE. See wounds.dm, the defines file, for more information on what these do. + var/competition_mode = WOUND_COMPETITION_OVERPOWER_LESSERS + /// If this and [compete_for_wounding] is true, we will remove wounds of an even severity to us during a random wound roll. + var/overpower_wounds_of_even_severity = FALSE + + /// A list of BIO_ defines that will be iterated over in order to determine the scar file our wound will generate. + /// Use generate_scar_priorities to create a custom list. + var/list/scar_priorities + +/datum/wound_pregen_data/New() + . = ..() + + if (!abstract) + if (required_limb_biostate == null) + stack_trace("required_limb_biostate null - please set it! occured on: [src.type]") + if (wound_path_to_generate == null) + stack_trace("wound_path_to_generate null - please set it! occured on: [src.type]") + + scar_priorities = generate_scar_priorities() + +/// Should return a list of BIO_ biostate priorities, in order. See [scar_priorities] for further documentation. +/datum/wound_pregen_data/proc/generate_scar_priorities() + RETURN_TYPE(/list) + + var/list/priorities = list( + "[BIO_FLESH]", + "[BIO_BONE]", + ) + + return priorities + +// this proc is the primary reason this datum exists - a singleton instance so we can always run this proc even without the wound existing +/** + * Args: + * * obj/item/bodypart/limb: The limb we are considering. + * * list/suggested_wounding_types: The wounding types to be checked against the wounding types we require. Defaults to required_wounding_types. + * * datum/wound/old_wound: If we would replace a wound, this would be said wound. Nullable. + * * random_roll = FALSE: If this is in the context of a random wound generation, and this wound wasn't specifically checked. + * + * Returns: + * FALSE if the limb cannot be wounded, if the wounding types dont match ours (via wounding_types_valid()), if we have a higher severity wound already in our series, + * if we have a biotype mismatch, if the limb isnt in a viable zone, or if theres any duplicate wound types. + * TRUE otherwise. + */ +/datum/wound_pregen_data/proc/can_be_applied_to(obj/item/bodypart/limb, list/suggested_wounding_types = required_wounding_types, datum/wound/old_wound, random_roll = FALSE, duplicates_allowed = src.duplicates_allowed, care_about_existing_wounds = TRUE) + SHOULD_BE_PURE(TRUE) + + if (!istype(limb) || !limb.owner) + return FALSE + + if (random_roll && !can_be_randomly_generated) + return FALSE + + if (HAS_TRAIT(limb.owner, TRAIT_NEVER_WOUNDED) || (limb.owner.status_flags & GODMODE)) + return FALSE + + if (!wounding_types_valid(suggested_wounding_types)) + return FALSE + + if (care_about_existing_wounds) + for (var/datum/wound/preexisting_wound as anything in limb.wounds) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[preexisting_wound.type] + if (pregen_data.wound_series == wound_series) + if (preexisting_wound.severity >= initial(wound_path_to_generate.severity)) + return FALSE + + if (!ignore_cannot_bleed && ((required_limb_biostate & BIO_BLOODED) && !limb.can_bleed())) + return FALSE + + if (!biostate_valid(limb.biological_state)) + return FALSE + + if (!(limb.body_zone in viable_zones)) + return FALSE + + // we accept promotions and demotions, but no point in redundancy. This should have already been checked wherever the wound was rolled and applied for (see: bodypart damage code), but we do an extra check + // in case we ever directly add wounds + if (!duplicates_allowed) + for (var/datum/wound/preexisting_wound as anything in limb.wounds) + if (preexisting_wound.type == wound_path_to_generate && (preexisting_wound != old_wound)) + return FALSE + return TRUE + +/// Returns true if we have the given biostates, or any biostate in it if check_for_any is true. False otherwise. +/datum/wound_pregen_data/proc/biostate_valid(biostate) + if (require_any_biostate) + if (!(biostate & required_limb_biostate)) + return FALSE + else if (!((biostate & required_limb_biostate) == required_limb_biostate)) // check for all + return FALSE + + return TRUE + +/** + * A simple getter for [weight], with arguments supplied to allow custom behavior. + * + * Args: + * * obj/item/bodypart/limb: The limb we are contemplating being added to. Nullable. + * * woundtype: The woundtype of the assumed attack that would generate us. Nullable. + * * damage: The raw damage that would cause us. Nullable. + * * attack_direction: The direction of the attack that'd cause us. Nullable. + * * damage_source: The entity that would cause us. Nullable. + * + * Returns: + * Our weight. + */ +/datum/wound_pregen_data/proc/get_weight(obj/item/bodypart/limb, woundtype, damage, attack_direction, damage_source) + return weight + +/// Returns TRUE if we use WOUND_ALL, or we require all types and have all/if we require any and have any, FALSE otherwise. +/datum/wound_pregen_data/proc/wounding_types_valid(list/suggested_wounding_types) + if (WOUND_ALL in required_wounding_types) + return TRUE + if (!length(suggested_wounding_types)) + return FALSE + + for (var/iter_wounding_type as anything in suggested_wounding_types) + if (!(iter_wounding_type in required_wounding_types)) + if (match_all_wounding_types) + return FALSE + else + if (!match_all_wounding_types) + return TRUE + + return match_all_wounding_types // if we get here, we've matched everything + +/** + * A simple getter for [threshold_minimum], with arguments supplied to allow custom behavior. + * + * Args: + * * obj/item/bodypart/part: The limb we are contemplating being added to. + * * attack_direction: The direction of the attack that'd generate us. Nullable. + * * damage_source: The source of the damage that'd cause us. Nullable. + */ +/datum/wound_pregen_data/proc/get_threshold_for(obj/item/bodypart/part, attack_direction, damage_source) + return threshold_minimum + +/// Returns a new instance of our wound datum. +/datum/wound_pregen_data/proc/generate_instance(obj/item/bodypart/limb, ...) + RETURN_TYPE(/datum/wound) + + return new wound_path_to_generate + +/datum/wound_pregen_data/Destroy(force, ...) + var/error_message = "[src], a singleton wound pregen data instance, was destroyed! This should not happen!" + if (force) + error_message += " NOTE: This Destroy() was called with force == TRUE. This instance will be deleted and replaced with a new one." + stack_trace(error_message) + + if (!force) + return QDEL_HINT_LETMELIVE + + . = ..() + + GLOB.all_wound_pregen_data[wound_path_to_generate] = new src.type //recover diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index 6f64a559ae1e..65669db9fd14 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -14,6 +14,13 @@ deciding what specific wound will be applied. I'd like to have a few different types of wounds for at least some of the choices, but I'm just doing rough generals for now. Expect polishing */ +#define WOUND_CRITICAL_BLUNT_DISMEMBER_BONUS 15 + +// Applied into wounds when they're scanned with the wound analyzer, halves time to treat them manually. +#define TRAIT_WOUND_SCANNED "wound_scanned" +// I dunno lol +#define ANALYZER_TRAIT "analyzer_trait" + /datum/wound /// What it's named var/name = "Wound" @@ -24,51 +31,61 @@ /// What the limb looks like on a cursory examine var/examine_desc = "is badly hurt" + /// Simple description, shortened for clarity if defined. Otherwise just takes the normal desc in the analyzer proc. + var/simple_desc + /// Simple analyzer's wound description, which focuses less on the clinical aspect of the wound and more on easily readable treatment instructions. + var/simple_treat_text = "Go to medbay idiot" + /// Improvised remedies indicated by the first aid analyzer only. + var/homemade_treat_text = "Remember to drink lots of water!" + + + /// If this wound can generate a scar. + var/can_scar = TRUE + + /// The default file we take our scar descriptions from, if we fail to get the ideal file. + var/default_scar_file + /// needed for "your arm has a compound fracture" vs "your arm has some third degree burns" var/a_or_from = "a" /// The visible message when this happens var/occur_text = "" /// This sound will be played upon the wound being applied var/sound_effect + /// The volume of [sound_effect] + var/sound_volume = 70 /// Either WOUND_SEVERITY_TRIVIAL (meme wounds like stubbed toe), WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_SEVERE, or WOUND_SEVERITY_CRITICAL (or maybe WOUND_SEVERITY_LOSS) var/severity = WOUND_SEVERITY_MODERATE - /// The list of wounds it belongs in, WOUND_LIST_BLUNT, WOUND_LIST_SLASH, or WOUND_LIST_BURN - var/wound_type - /// What body zones can we affect - var/list/viable_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) /// Who owns the body part that we're wounding var/mob/living/carbon/victim = null - /// The bodypart we're parented to + /// The bodypart we're parented to. Not guaranteed to be non-null, especially after/during removal or if we haven't been applied var/obj/item/bodypart/limb = null /// Specific items such as bandages or sutures that can try directly treating this wound var/list/treatable_by /// Specific items such as bandages or sutures that can try directly treating this wound only if the user has the victim in an aggressive grab or higher var/list/treatable_by_grabbed - /// Tools with the specified tool flag will also be able to try directly treating this wound - var/treatable_tool + /// Any tools with any of the flags in this list will be usable to try directly treating this wound + var/list/treatable_tools /// How long it will take to treat this wound with a standard effective tool, assuming it doesn't need surgery var/base_treat_time = 5 SECONDS /// Using this limb in a do_after interaction will multiply the length by this duration (arms) var/interaction_efficiency_penalty = 1 /// Incoming damage on this limb will be multiplied by this, to simulate tenderness and vulnerability (mostly burns). - var/damage_mulitplier_penalty = 1 + var/damage_multiplier_penalty = 1 /// If set and this wound is applied to a leg, we take this many deciseconds extra per step on this leg var/limp_slowdown /// If this wound has a limp_slowdown and is applied to a leg, it has this chance to limp each step var/limp_chance /// How much we're contributing to this limb's bleed_rate var/blood_flow - /// Essentially, keeps track of whether or not this wound is capable of bleeding (in case the owner has the NOBLOOD species trait) - var/no_bleeding = FALSE - /// The minimum we need to roll on [/obj/item/bodypart/proc/check_wounding] to begin suffering this wound, see check_wounding_mods() for more - var/threshold_minimum /// How much having this wound will add to all future check_wounding() rolls on this limb, to allow progression to worse injuries with repeated damage var/threshold_penalty + /// How much having this wound will add to all future check_wounding() rolls on this limb, but only for wounds of its own series + var/series_threshold_penalty = 0 /// If we need to process each life tick var/processes = FALSE @@ -79,27 +96,83 @@ var/status_effect_type /// If we're operating on this wound and it gets healed, we'll nix the surgery too var/datum/surgery/attached_surgery - /// if you're a lazy git and just throw them in cryo, the wound will go away after accumulating severity * 25 power + /// if you're a lazy git and just throw them in cryo, the wound will go away after accumulating severity * [base_xadone_progress_to_qdel] power var/cryo_progress + /// The base amount of [cryo_progress] required to have ourselves fully healed by cryo. Multiplied against severity. + var/base_xadone_progress_to_qdel = 33 + /// What kind of scars this wound will create description wise once healed var/scar_keyword = "generic" /// If we've already tried scarring while removing (remove_wound can be called twice in a del chain, let's be nice to our code yeah?) TODO: make this cleaner var/already_scarred = FALSE - /// If we forced this wound through badmin smite, we won't count it towards the round totals - var/from_smite + /// The source of how we got the wound, typically a weapon. + var/wound_source /// What flags apply to this wound - var/wound_flags = (FLESH_WOUND | BONE_WOUND | ACCEPTS_GAUZE) + var/wound_flags = (ACCEPTS_GAUZE) + + /// The unique ID of our wound for use with [actionspeed_mod]. Defaults to REF(src). + var/unique_id + /// The actionspeed modifier we will use in case we are on the arms and have a interaction penalty. Qdelled on destroy. + var/datum/actionspeed_modifier/wound_interaction_inefficiency/actionspeed_mod + +/datum/wound/New() + . = ..() + + unique_id = generate_unique_id() + update_actionspeed_modifier() /datum/wound/Destroy() - if(attached_surgery) - QDEL_NULL(attached_surgery) - remove_wound() - set_limb(null) - victim = null + QDEL_NULL(attached_surgery) + if (limb) + remove_wound() + + QDEL_NULL(actionspeed_mod) + return ..() +/// If we should have an actionspeed_mod, ensures we do and updates its slowdown. Otherwise, ensures we dont have one +/// by qdeleting any existing modifier. +/datum/wound/proc/update_actionspeed_modifier() + if (should_have_actionspeed_modifier()) + if (!actionspeed_mod) + generate_actionspeed_modifier() + actionspeed_mod.multiplicative_slowdown = get_effective_actionspeed_modifier() + victim?.update_actionspeed() + else + remove_actionspeed_modifier() + +/// Returns TRUE if we have an interaction_efficiency_penalty, and if we are on the arms, FALSE otherwise. +/datum/wound/proc/should_have_actionspeed_modifier() + return (limb && victim && (limb.body_zone == BODY_ZONE_L_ARM || limb.body_zone == BODY_ZONE_R_ARM) && interaction_efficiency_penalty != 0) + +/// If we have no actionspeed_mod, generates a new one with our unique ID, sets actionspeed_mod to it, then returns it. +/datum/wound/proc/generate_actionspeed_modifier() + RETURN_TYPE(/datum/actionspeed_modifier) + + if (actionspeed_mod) + return actionspeed_mod + + var/datum/actionspeed_modifier/wound_interaction_inefficiency/new_modifier = new /datum/actionspeed_modifier/wound_interaction_inefficiency(unique_id, src) + new_modifier.multiplicative_slowdown = get_effective_actionspeed_modifier() + victim?.add_actionspeed_modifier(new_modifier) + + actionspeed_mod = new_modifier + return actionspeed_mod + +/// If we have an actionspeed_mod, qdels it and sets our ref of it to null. +/datum/wound/proc/remove_actionspeed_modifier() + if (!actionspeed_mod) + return + + victim?.remove_actionspeed_modifier(actionspeed_mod) + QDEL_NULL(actionspeed_mod) + +/// Generates the ID we use for [unique_id], which is also set as our actionspeed mod's ID +/datum/wound/proc/generate_unique_id() + return REF(src) // unique, cannot change, a perfect id + /** * apply_wound() is used once a wound type is instantiated to assign it to a bodypart, and actually come into play. * @@ -111,31 +184,16 @@ * * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented) * * attack_direction: For bloodsplatters, if relevant */ -/datum/wound/proc/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE, attack_direction = null) - if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || (!IS_ORGANIC_LIMB(L) && !HAS_TRAIT(L.owner, TRAIT_ROBOT_CAN_BLEED)) || HAS_TRAIT(L.owner, TRAIT_NEVER_WOUNDED)) - qdel(src) - return +/datum/wound/proc/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE, attack_direction = null, wound_source = "Unknown") - // Checks for biological state, to ensure only valid wounds are applied on the limb - if(((wound_flags & BONE_WOUND) && !(L.biological_state & BIO_BONE)) || ((wound_flags & FLESH_WOUND) && !(L.biological_state & BIO_FLESH))) + if (!can_be_applied_to(L, old_wound)) qdel(src) - return - - // we accept promotions and demotions, but no point in redundancy. This should have already been checked wherever the wound was rolled and applied for (see: bodypart damage code), but we do an extra check - // in case we ever directly add wounds - for(var/i in L.wounds) - var/datum/wound/preexisting_wound = i - if((preexisting_wound.type == type) && (preexisting_wound != old_wound)) - qdel(src) - return + return FALSE set_victim(L.owner) set_limb(L) LAZYADD(victim.all_wounds, src) LAZYADD(limb.wounds, src) - //it's ok to not typecheck, humans are the only ones that deal with wounds - var/mob/living/carbon/human/human_victim = victim - no_bleeding = HAS_TRAIT(human_victim, TRAIT_NOBLOOD) update_descriptions() limb.update_wounds() if(status_effect_type) @@ -155,18 +213,41 @@ var/msg = span_danger("[victim]'s [limb.plaintext_zone] [occur_text]!") var/vis_dist = COMBAT_MESSAGE_RANGE - if(severity != WOUND_SEVERITY_MODERATE) + if(severity > WOUND_SEVERITY_MODERATE) msg = "[msg]" vis_dist = DEFAULT_MESSAGE_RANGE victim.visible_message(msg, span_userdanger("Your [limb.plaintext_zone] [occur_text]!"), vision_distance = vis_dist) if(sound_effect) - playsound(L.owner, sound_effect, 70 + 20 * severity, TRUE) + playsound(L.owner, sound_effect, sound_volume + (20 * severity), TRUE) wound_injury(old_wound, attack_direction = attack_direction) if(!demoted) second_wind() + return TRUE + +/// Returns TRUE if we can be applied to the limb. +/datum/wound/proc/can_be_applied_to(obj/item/bodypart/L, datum/wound/old_wound) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[type] + + // We assume we aren't being randomly applied - we have no reason to believe we are + // And, besides, if we were, you could just as easily check our pregen data rather than run this proc + // Generally speaking this proc is called in apply_wound, which is called when the caller is already confidant in its ability to be applied + return pregen_data.can_be_applied_to(L, old_wound = old_wound) + +/// Returns the zones we can be applied to. +/datum/wound/proc/get_viable_zones() + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[type] + + return pregen_data.viable_zones + +/// Returns the biostate we require to be applied. +/datum/wound/proc/get_required_biostate() + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[type] + + return pregen_data.required_limb_biostate + // Updates descriptive texts for the wound, in case it can get altered for whatever reason /datum/wound/proc/update_descriptions() return @@ -175,13 +256,66 @@ SIGNAL_HANDLER set_victim(null) +/// Setter for [victim]. Should completely transfer signals, attributes, etc. To the new victim - if there is any, as it can be null. /datum/wound/proc/set_victim(new_victim) if(victim) + UnregisterSignal(victim, list(COMSIG_PARENT_QDELETING, COMSIG_MOB_SWAP_HANDS, COMSIG_CARBON_POST_REMOVE_LIMB, COMSIG_CARBON_POST_ATTACH_LIMB)) UnregisterSignal(victim, COMSIG_PARENT_QDELETING) + UnregisterSignal(victim, COMSIG_MOB_SWAP_HANDS) + UnregisterSignal(victim, COMSIG_CARBON_POST_REMOVE_LIMB) + if (actionspeed_mod) + victim.remove_actionspeed_modifier(actionspeed_mod) // no need to qdelete it, just remove it from our victim + remove_wound_from_victim() victim = new_victim if(victim) RegisterSignal(victim, COMSIG_PARENT_QDELETING, PROC_REF(null_victim)) + RegisterSignals(victim, list(COMSIG_MOB_SWAP_HANDS, COMSIG_CARBON_POST_REMOVE_LIMB, COMSIG_CARBON_POST_ATTACH_LIMB), PROC_REF(add_or_remove_actionspeed_mod)) + + if (limb) + start_limping_if_we_should() // the status effect already handles removing itself + add_or_remove_actionspeed_mod() + +/// Proc called to change the variable `limb` and react to the event. +/datum/wound/proc/set_limb(obj/item/bodypart/new_value, replaced = FALSE) + if(limb == new_value) + return FALSE //Limb can either be a reference to something or `null`. Returning the number variable makes it clear no change was made. + . = limb + if(limb) // if we're nulling limb, we're basically detaching from it, so we should remove ourselves in that case + UnregisterSignal(limb, COMSIG_PARENT_QDELETING) + UnregisterSignal(limb, list(COMSIG_BODYPART_GAUZED, COMSIG_BODYPART_GAUZE_DESTROYED)) + LAZYREMOVE(limb.wounds, src) + limb.update_wounds(replaced) + if (disabling) + limb.remove_traits(list(TRAIT_PARALYSIS, TRAIT_DISABLED_BY_WOUND), REF(src)) + + limb = new_value + + // POST-CHANGE + + if (limb) + RegisterSignal(limb, COMSIG_PARENT_QDELETING, PROC_REF(source_died)) + RegisterSignals(limb, list(COMSIG_BODYPART_GAUZED, COMSIG_BODYPART_GAUZE_DESTROYED), PROC_REF(gauze_state_changed)) + if (disabling) + limb.add_traits(list(TRAIT_PARALYSIS, TRAIT_DISABLED_BY_WOUND), REF(src)) + + if (victim) + start_limping_if_we_should() // the status effect already handles removing itself + add_or_remove_actionspeed_mod() + + update_inefficiencies() + +/datum/wound/proc/add_or_remove_actionspeed_mod() + update_actionspeed_modifier() + if (actionspeed_mod) + if(victim.get_active_hand() == limb) + victim.add_actionspeed_modifier(actionspeed_mod, TRUE) + else + victim.remove_actionspeed_modifier(actionspeed_mod) + +/datum/wound/proc/start_limping_if_we_should() + if ((limb.body_zone == BODY_ZONE_L_LEG || limb.body_zone == BODY_ZONE_R_LEG) && limp_slowdown > 0 && limp_chance > 0) + victim.apply_status_effect(/datum/status_effect/limp) /datum/wound/proc/source_died() SIGNAL_HANDLER @@ -190,15 +324,26 @@ /// Remove the wound from whatever it's afflicting, and cleans up whateverstatus effects it had or modifiers it had on interaction times. ignore_limb is used for detachments where we only want to forget the victim /datum/wound/proc/remove_wound(ignore_limb, replaced = FALSE) //TODO: have better way to tell if we're getting removed without replacement (full heal) scar stuff + var/old_victim = victim + var/old_limb = limb + set_disabling(FALSE) - if(limb && !already_scarred && !replaced) + if(limb && can_scar && !already_scarred && !replaced) already_scarred = TRUE var/datum/scar/new_scar = new new_scar.generate(limb, src) - remove_wound_from_victim() + + remove_actionspeed_modifier() + + null_victim() // we use the proc here because some behaviors may depend on changing victim to some new value + if(limb && !ignore_limb) - LAZYREMOVE(limb.wounds, src) - limb.update_wounds(replaced) + set_limb(null, replaced) // since we're removing limb's ref to us, we should do the same + // if you want to keep the ref, do it externally, theres no reason for us to remember it + + if (ismob(old_victim)) + var/mob/mob_victim = old_victim + SEND_SIGNAL(mob_victim, COMSIG_CARBON_POST_LOSE_WOUND, src, old_limb, ignore_limb, replaced) /datum/wound/proc/remove_wound_from_victim() if(!victim) @@ -211,17 +356,15 @@ /** * replace_wound() is used when you want to replace the current wound with a new wound, presumably of the same category, just of a different severity (either up or down counts) * - * This proc actually instantiates the new wound based off the specific type path passed, then returns the new instantiated wound datum. - * * Arguments: - * * new_type- The TYPE PATH of the wound you want to replace this, like /datum/wound/slash/severe + * * new_wound- The wound instance you want to replace this * * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented) */ -/datum/wound/proc/replace_wound(new_type, smited = FALSE, attack_direction = attack_direction) - var/datum/wound/new_wound = new new_type +/datum/wound/proc/replace_wound(datum/wound/new_wound, smited = FALSE, attack_direction = attack_direction) already_scarred = TRUE + var/obj/item/bodypart/cached_limb = limb // remove_wound() nulls limb so we have to track it locally remove_wound(replaced=TRUE) - new_wound.apply_wound(limb, old_wound = src, smited = smited, attack_direction = attack_direction) + new_wound.apply_wound(cached_limb, old_wound = src, smited = smited, attack_direction = attack_direction, wound_source = wound_source) . = new_wound qdel(src) @@ -229,24 +372,6 @@ /datum/wound/proc/wound_injury(datum/wound/old_wound = null, attack_direction = null) return - -/// Proc called to change the variable `limb` and react to the event. -/datum/wound/proc/set_limb(new_value) - if(limb == new_value) - return FALSE //Limb can either be a reference to something or `null`. Returning the number variable makes it clear no change was made. - . = limb - if(limb) - UnregisterSignal(limb, COMSIG_PARENT_QDELETING) - limb = new_value - RegisterSignal(new_value, COMSIG_PARENT_QDELETING, PROC_REF(source_died)) - if(. && disabling) - var/obj/item/bodypart/old_limb = . - old_limb.remove_traits(list(TRAIT_PARALYSIS, TRAIT_DISABLED_BY_WOUND), REF(src)) - if(limb) - if(disabling) - limb.add_traits(list(TRAIT_PARALYSIS, TRAIT_DISABLED_BY_WOUND), REF(src)) - - /// Proc called to change the variable `disabling` and react to the event. /datum/wound/proc/set_disabling(new_value) if(disabling == new_value) @@ -261,6 +386,60 @@ if(limb?.can_be_disabled) limb.update_disabled() +/// Setter for [interaction_efficiency_penalty]. Updates the actionspeed of our actionspeed mod. +/datum/wound/proc/set_interaction_efficiency_penalty(new_value) + var/should_update = (new_value != interaction_efficiency_penalty) + + interaction_efficiency_penalty = new_value + + if (should_update) + update_actionspeed_modifier() + +/// Returns a "adjusted" interaction_efficiency_penalty that will be used for the actionspeed mod. +/datum/wound/proc/get_effective_actionspeed_modifier() + return interaction_efficiency_penalty - 1 + +/// Returns the decisecond multiplier of any click interactions, assuming our limb is being used. +/datum/wound/proc/get_action_delay_mult() + SHOULD_BE_PURE(TRUE) + + return interaction_efficiency_penalty + +/// Returns the decisecond increment of any click interactions, assuming our limb is being used. +/datum/wound/proc/get_action_delay_increment() + SHOULD_BE_PURE(TRUE) + + return 0 + +/// Signal proc for if gauze has been applied or removed from our limb. +/datum/wound/proc/gauze_state_changed() + SIGNAL_HANDLER + + if (wound_flags & ACCEPTS_GAUZE) + update_inefficiencies() + +/// Updates our limping and interaction penalties in accordance with our gauze. +/datum/wound/proc/update_inefficiencies() + if (wound_flags & ACCEPTS_GAUZE) + if(limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) + if(limb.current_gauze?.splint_factor) + limp_slowdown = initial(limp_slowdown) * limb.current_gauze.splint_factor + limp_chance = initial(limp_chance) * limb.current_gauze.splint_factor + else + limp_slowdown = initial(limp_slowdown) + limp_chance = initial(limp_chance) + else if(limb.body_zone in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + if(limb.current_gauze?.splint_factor) + set_interaction_efficiency_penalty(1 + ((get_effective_actionspeed_modifier()) * limb.current_gauze.splint_factor)) + else + set_interaction_efficiency_penalty(initial(interaction_efficiency_penalty)) + + if(initial(disabling)) + set_disabling(!limb.current_gauze) + + limb.update_wounds() + + start_limping_if_we_should() /// Additional beneficial effects when the wound is gained, in case you want to give a temporary boost to allow the victim to try an escape or last stand /datum/wound/proc/second_wind() @@ -294,25 +473,7 @@ if(I.force && (tendee.istate & ISTATE_HARM)) return FALSE - var/allowed = FALSE - - // check if we have a valid treatable tool - if(I.tool_behaviour == treatable_tool) - allowed = TRUE - else if(treatable_tool == TOOL_CAUTERY && I.get_temperature() && user == victim) // allow improvised cauterization on yourself without an aggro grab - allowed = TRUE - // failing that, see if we're aggro grabbing them and if we have an item that works for aggro grabs only - else if(user.pulling == victim && user.grab_state >= GRAB_AGGRESSIVE && check_grab_treatments(I, user)) - allowed = TRUE - // failing THAT, we check if we have a generally allowed item - else - for(var/allowed_type in treatable_by) - if(istype(I, allowed_type)) - allowed = TRUE - break - - // if none of those apply, we return false to avoid interrupting - if(!allowed) + if(!item_can_treat(I, user)) return FALSE // now that we've determined we have a valid attempt at treating, we can stomp on their dreams if we're already interacting with the patient or if their part is obscured @@ -328,8 +489,22 @@ return TRUE // lastly, treat them - treat(I, user) - return TRUE + return treat(I, user) // we allow treat to return a value so it can control if the item does its normal interaction or not + +/// Returns TRUE if the item can be used to treat our wounds. Hooks into treat() - only things that return TRUE here may be used there. +/datum/wound/proc/item_can_treat(obj/item/potential_treater, mob/user) + // check if we have a valid treatable tool + if(potential_treater.tool_behaviour in treatable_tools) + return TRUE + if(TOOL_CAUTERY in treatable_tools && potential_treater.get_temperature() && user == victim) // allow improvised cauterization on yourself without an aggro grab + return TRUE + // failing that, see if we're aggro grabbing them and if we have an item that works for aggro grabs only + if(user.pulling == victim && user.grab_state >= GRAB_AGGRESSIVE && check_grab_treatments(potential_treater, user)) + return TRUE + // failing THAT, we check if we have a generally allowed item + for(var/allowed_type in treatable_by) + if(istype(potential_treater, allowed_type)) + return TRUE /// Return TRUE if we have an item that can only be used while aggro grabbed (unhanded aggro grab treatments go in [/datum/wound/proc/try_handling]). Treatment is still is handled in [/datum/wound/proc/treat] /datum/wound/proc/check_grab_treatments(obj/item/I, mob/user) @@ -351,16 +526,27 @@ /datum/wound/proc/still_exists() return (!QDELETED(src) && limb) -/// When our parent bodypart is hurt -/datum/wound/proc/receive_damage(wounding_type, wounding_dmg, wound_bonus, attack_direction) +/// When our parent bodypart is hurt. +/datum/wound/proc/receive_damage(wounding_type, wounding_dmg, wound_bonus, attack_direction, damage_source) return /// Called from cryoxadone and pyroxadone when they're proc'ing. Wounds will slowly be fixed separately from other methods when these are in effect. crappy name but eh /datum/wound/proc/on_xadone(power) cryo_progress += power - if(cryo_progress > 33 * severity) + + return handle_xadone_progress() + +/// Does various actions based on [cryo_progress]. By default, qdeletes the wound past a certain threshold. +/datum/wound/proc/handle_xadone_progress() + if(cryo_progress > get_xadone_progress_to_qdel()) qdel(src) +/// Returns the amount of [cryo_progress] we need to be qdeleted. +/datum/wound/proc/get_xadone_progress_to_qdel() + SHOULD_BE_PURE(TRUE) + + return base_xadone_progress_to_qdel * severity + /// When synthflesh is applied to the victim, we call this. No sense in setting up an entire chem reaction system for wounds when we only care for a few chems. Probably will change in the future /datum/wound/proc/on_synthflesh(power) return @@ -410,8 +596,50 @@ * * mob/user: The user examining the wound's owner, if that matters */ /datum/wound/proc/get_examine_description(mob/user) - . = "[victim.p_their(TRUE)] [limb.plaintext_zone] [examine_desc]" - . = severity <= WOUND_SEVERITY_MODERATE ? "[.]." : "[.]!" + . = get_wound_description(user) + if(HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + . += span_notice("\nThere is a holo-image next to the wound that seems to contain indications for treatment.") + + return . + +/datum/wound/proc/get_wound_description(mob/user) + var/desc + + if ((wound_flags & ACCEPTS_GAUZE) && limb.current_gauze) + var/sling_condition = get_gauze_condition() + desc = "[victim.p_Their()] [limb.plaintext_zone] is [sling_condition] fastened in a sling of [limb.current_gauze.name]" + else + desc = "[victim.p_Their()] [limb.plaintext_zone] [examine_desc]" + + desc = modify_desc_before_span(desc, user) + + return get_desc_intensity(desc) + +/// A hook proc used to modify desc before it is spanned via [get_desc_intensity]. Useful for inserting spans yourself. +/datum/wound/proc/modify_desc_before_span(desc, mob/user) + return desc + +/datum/wound/proc/get_gauze_condition() + SHOULD_BE_PURE(TRUE) + if (!limb.current_gauze) + return null + + switch(limb.current_gauze.absorption_capacity) + if(0 to 1.25) + return "just barely" + if(1.25 to 2.75) + return "loosely" + if(2.75 to 4) + return "mostly" + if(4 to INFINITY) + return "tightly" + +/// Spans [desc] based on our severity. +/datum/wound/proc/get_desc_intensity(desc) + SHOULD_BE_PURE(TRUE) + if (severity > WOUND_SEVERITY_MODERATE) + return span_bold("[desc]!") + return "[desc]." /datum/wound/proc/get_scanner_description(mob/user) return "Type: [name]\nSeverity: [severity_text()]\nDescription: [desc]\nRecommended Treatment: [treat_text]" @@ -426,3 +654,50 @@ return "Severe" if(WOUND_SEVERITY_CRITICAL) return "Critical" + +/// Returns TRUE if our limb is the head or chest, FALSE otherwise. +/// Essential in the sense of "we cannot live without it". +/datum/wound/proc/limb_essential() + return (limb.body_zone == BODY_ZONE_HEAD || limb.body_zone == BODY_ZONE_CHEST) + +/// Getter proc for our scar_keyword, in case we might have some custom scar gen logic. +/datum/wound/proc/get_scar_keyword(obj/item/bodypart/scarred_limb, add_to_scars) + return scar_keyword + +/// Getter proc for our scar_file, in case we might have some custom scar gen logic. +/datum/wound/proc/get_scar_file(obj/item/bodypart/scarred_limb, add_to_scars) + var/datum/wound_pregen_data/pregen_data = get_pregen_data() + // basically we iterate over biotypes until we find the one we want + // fleshy burns will look for flesh then bone + // dislocations will look for flesh, then bone, then metal + var/file = default_scar_file + for (var/biotype as anything in pregen_data.scar_priorities) + if (scarred_limb.biological_state & text2num(biotype)) + file = GLOB.biotypes_to_scar_file[biotype] + break + + return file + +/// Returns what string is displayed when a limb that has sustained this wound is examined +/// (This is examining the LIMB ITSELF, when it's not attached to someone.) +/datum/wound/proc/get_limb_examine_description() + return + +/// Gets the flat percentage chance increment of a dismember occuring, if a dismember is attempted (requires mangled flesh and bone). returning 15 = +15%. +/datum/wound/proc/get_dismember_chance_bonus(existing_chance) + SHOULD_BE_PURE(TRUE) + + var/datum/wound_pregen_data/pregen_data = get_pregen_data() + + if (WOUND_BLUNT in pregen_data.required_wounding_types && severity >= WOUND_SEVERITY_CRITICAL) + return WOUND_CRITICAL_BLUNT_DISMEMBER_BONUS // we only require mangled bone (T2 blunt), but if there's a critical blunt, we'll add 15% more + +/// Returns our pregen data, which is practically guaranteed to exist, so this proc can safely be used raw. +/// In fact, since it's RETURN_TYPEd to wound_pregen_data, you can even directly access the variables without having to store the value of this proc in a typed variable. +/// Ex. get_pregen_data().wound_series +/datum/wound/proc/get_pregen_data() + RETURN_TYPE(/datum/wound_pregen_data) + + return GLOB.all_wound_pregen_data[type] + +#undef WOUND_CRITICAL_BLUNT_DISMEMBER_BONUS diff --git a/code/datums/wounds/blunt.dm b/code/datums/wounds/blunt.dm new file mode 100644 index 000000000000..219b7dd8805c --- /dev/null +++ b/code/datums/wounds/blunt.dm @@ -0,0 +1,3 @@ +/datum/wound/blunt + name = "Blunt Wound" + sound_effect = 'sound/effects/wounds/crack1.ogg' diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm index 9f68916f9021..f3d0ea3ac001 100644 --- a/code/datums/wounds/bones.dm +++ b/code/datums/wounds/bones.dm @@ -4,11 +4,19 @@ */ // TODO: well, a lot really, but i'd kill to get overlays and a bonebreaking effect like Blitz: The League, similar to electric shock skeletons -/datum/wound/blunt +/datum/wound_pregen_data/bone + abstract = TRUE + required_limb_biostate = BIO_BONE + + required_wounding_types = list(WOUND_BLUNT) + + wound_series = WOUND_SERIES_BONE_BLUNT_BASIC + +/datum/wound/blunt/bone name = "Blunt (Bone) Wound" - sound_effect = 'sound/effects/wounds/crack1.ogg' - wound_type = WOUND_BLUNT - wound_flags = (BONE_WOUND | ACCEPTS_GAUZE) + wound_flags = (ACCEPTS_GAUZE) + + default_scar_file = BONE_SCAR_FILE /// Have we been bone gel'd? var/gelled @@ -32,16 +40,13 @@ /* Overwriting of base procs */ -/datum/wound/blunt/wound_injury(datum/wound/old_wound = null, attack_direction = null) +/datum/wound/blunt/bone/wound_injury(datum/wound/old_wound = null, attack_direction = null) // hook into gaining/losing gauze so crit bone wounds can re-enable/disable depending if they're slung or not - RegisterSignals(limb, list(COMSIG_BODYPART_GAUZED, COMSIG_BODYPART_GAUZE_DESTROYED), PROC_REF(update_inefficiencies)) - if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group) processes = TRUE active_trauma = victim.gain_trauma_type(brain_trauma_group, TRAUMA_RESILIENCE_WOUND) next_trauma_cycle = world.time + (rand(100-WOUND_BONE_HEAD_TIME_VARIANCE, 100+WOUND_BONE_HEAD_TIME_VARIANCE) * 0.01 * trauma_cycle_cooldown) - RegisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(attack_with_hurt_hand)) if(limb.held_index && victim.get_item_for_held_index(limb.held_index) && (disabling || prob(30 * severity))) var/obj/item/I = victim.get_item_for_held_index(limb.held_index) if(istype(I, /obj/item/offhand)) @@ -51,19 +56,29 @@ victim.visible_message(span_danger("[victim] drops [I] in shock!"), span_warning("The force on your [limb.plaintext_zone] causes you to drop [I]!"), vision_distance=COMBAT_MESSAGE_RANGE) update_inefficiencies() + return ..() + +/datum/wound/blunt/bone/set_victim(new_victim) + + if (victim) + UnregisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK) + if (new_victim) + RegisterSignal(new_victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(attack_with_hurt_hand)) + + return ..() -/datum/wound/blunt/remove_wound(ignore_limb, replaced) +/datum/wound/blunt/bone/remove_wound(ignore_limb, replaced) limp_slowdown = 0 limp_chance = 0 QDEL_NULL(active_trauma) - if(limb) - UnregisterSignal(limb, list(COMSIG_BODYPART_GAUZED, COMSIG_BODYPART_GAUZE_DESTROYED)) - if(victim) - UnregisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK) return ..() -/datum/wound/blunt/handle_process(seconds_per_tick, times_fired) +/datum/wound/blunt/bone/handle_process(seconds_per_tick, times_fired) . = ..() + + if (!victim || IS_IN_STASIS(victim)) + return + if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group && world.time > next_trauma_cycle) if(active_trauma) QDEL_NULL(active_trauma) @@ -96,7 +111,7 @@ remove_wound() /// If we're a human who's punching something with a broken arm, we might hurt ourselves doing so -/datum/wound/blunt/proc/attack_with_hurt_hand(mob/M, atom/target, proximity) +/datum/wound/blunt/bone/proc/attack_with_hurt_hand(mob/M, atom/target, proximity) SIGNAL_HANDLER if(victim.get_active_hand() != limb || !(victim.istate & ISTATE_HARM) || !ismob(target) || severity <= WOUND_SEVERITY_MODERATE) @@ -117,7 +132,7 @@ return COMPONENT_CANCEL_ATTACK_CHAIN -/datum/wound/blunt/receive_damage(wounding_type, wounding_dmg, wound_bonus) +/datum/wound/blunt/bone/receive_damage(wounding_type, wounding_dmg, wound_bonus) if(!victim || wounding_dmg < WOUND_MINIMUM_DAMAGE) return if(ishuman(victim)) @@ -143,99 +158,74 @@ new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) victim.add_splatter_floor(get_step(victim.loc, victim.dir)) +/datum/wound/blunt/bone/modify_desc_before_span(desc) + . = ..() -/datum/wound/blunt/get_examine_description(mob/user) - if(!limb.current_gauze && !gelled && !taped) - return ..() - - var/list/msg = list() - if(!limb.current_gauze) - msg += "[victim.p_their(TRUE)] [limb.plaintext_zone] [examine_desc]" - else - var/sling_condition = "" - // how much life we have left in these bandages - switch(limb.current_gauze.absorption_capacity) - if(0 to 1.25) - sling_condition = "just barely" - if(1.25 to 2.75) - sling_condition = "loosely" - if(2.75 to 4) - sling_condition = "mostly" - if(4 to INFINITY) - sling_condition = "tightly" - - msg += "[victim.p_their(TRUE)] [limb.plaintext_zone] is [sling_condition] fastened in a sling of [limb.current_gauze.name]" - - if(taped) - msg += ", [span_notice("and appears to be reforming itself under some surgical tape!")]" - else if(gelled) - msg += ", [span_notice("with fizzing flecks of blue bone gel sparking off the bone!")]" - else - msg += "!" - return "[msg.Join()]" + if (!limb.current_gauze) + if(taped) + . += ", [span_notice("and appears to be reforming itself under some surgical tape!")]" + else if(gelled) + . += ", [span_notice("with fizzing flecks of blue bone gel sparking off the bone!")]" /* - New common procs for /datum/wound/blunt/ + New common procs for /datum/wound/blunt/bone/ */ -/datum/wound/blunt/proc/update_inefficiencies() - SIGNAL_HANDLER - - if(limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - if(limb.current_gauze?.splint_factor) - limp_slowdown = initial(limp_slowdown) * limb.current_gauze.splint_factor - limp_chance = initial(limp_chance) * limb.current_gauze.splint_factor - else - limp_slowdown = initial(limp_slowdown) - limp_chance = initial(limp_chance) - victim.apply_status_effect(/datum/status_effect/limp) - else if(limb.body_zone in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) - if(limb.current_gauze?.splint_factor) - interaction_efficiency_penalty = 1 + ((interaction_efficiency_penalty - 1) * limb.current_gauze.splint_factor) - else - interaction_efficiency_penalty = initial(interaction_efficiency_penalty) +/datum/wound/blunt/bone/get_scar_file(obj/item/bodypart/scarred_limb, add_to_scars) + if (scarred_limb.biological_state & BIO_BONE && (!(scarred_limb.biological_state & BIO_FLESH))) // only bone + return BONE_SCAR_FILE + else if (scarred_limb.biological_state & BIO_FLESH && (!(scarred_limb.biological_state & BIO_BONE))) + return FLESH_SCAR_FILE - if(initial(disabling)) - set_disabling(!limb.current_gauze) - - limb.update_wounds() + return ..() /// Joint Dislocation (Moderate Blunt) -/datum/wound/blunt/moderate +/datum/wound/blunt/bone/moderate name = "Joint Dislocation" - desc = "Patient's bone has been unset from socket, causing pain and reduced motor function." + desc = "Patient's limb has been unset from socket, causing pain and reduced motor function." treat_text = "Recommended application of bonesetter to affected limb, though manual relocation by applying an aggressive grab to the patient and helpfully interacting with afflicted limb may suffice." examine_desc = "is awkwardly janked out of place" occur_text = "janks violently and becomes unseated" severity = WOUND_SEVERITY_MODERATE - viable_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) interaction_efficiency_penalty = 1.3 limp_slowdown = 3 limp_chance = 50 - threshold_minimum = 35 threshold_penalty = 15 - treatable_tool = TOOL_BONESET - wound_flags = (BONE_WOUND) - status_effect_type = /datum/status_effect/wound/blunt/moderate - scar_keyword = "bluntmoderate" + treatable_tools = list(TOOL_BONESET) + status_effect_type = /datum/status_effect/wound/blunt/bone/moderate + scar_keyword = "dislocate" + +/datum/wound_pregen_data/bone/dislocate + abstract = FALSE + + wound_path_to_generate = /datum/wound/blunt/bone/moderate + + required_limb_biostate = BIO_JOINTED -/datum/wound/blunt/moderate/Destroy() + threshold_minimum = 35 + +/datum/wound/blunt/bone/moderate/Destroy() if(victim) UnregisterSignal(victim, COMSIG_LIVING_DOORCRUSHED) return ..() -/datum/wound/blunt/moderate/wound_injury(datum/wound/old_wound, attack_direction = null) - . = ..() - RegisterSignal(victim, COMSIG_LIVING_DOORCRUSHED, PROC_REF(door_crush)) +/datum/wound/blunt/bone/moderate/set_victim(new_victim) + + if (victim) + UnregisterSignal(victim, COMSIG_LIVING_DOORCRUSHED) + if (new_victim) + RegisterSignal(new_victim, COMSIG_LIVING_DOORCRUSHED, PROC_REF(door_crush)) + + return ..() /// Getting smushed in an airlock/firelock is a last-ditch attempt to try relocating your limb -/datum/wound/blunt/moderate/proc/door_crush() +/datum/wound/blunt/bone/moderate/proc/door_crush() SIGNAL_HANDLER if(prob(40)) victim.visible_message(span_danger("[victim]'s dislocated [limb.plaintext_zone] pops back into place!"), span_userdanger("Your dislocated [limb.plaintext_zone] pops back into place! Ow!")) remove_wound() -/datum/wound/blunt/moderate/try_handling(mob/living/carbon/human/user) +/datum/wound/blunt/bone/moderate/try_handling(mob/living/carbon/human/user) if(user.pulling != victim || user.zone_selected != limb.body_zone) return FALSE @@ -253,7 +243,7 @@ return TRUE /// If someone is snapping our dislocated joint back into place by hand with an aggro grab and help intent -/datum/wound/blunt/moderate/proc/chiropractice(mob/living/carbon/human/user) +/datum/wound/blunt/bone/moderate/proc/chiropractice(mob/living/carbon/human/user) var/time = base_treat_time if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) @@ -272,7 +262,7 @@ chiropractice(user) /// If someone is snapping our dislocated joint into a fracture by hand with an aggro grab and harm or disarm intent -/datum/wound/blunt/moderate/proc/malpractice(mob/living/carbon/human/user) +/datum/wound/blunt/bone/moderate/proc/malpractice(mob/living/carbon/human/user) var/time = base_treat_time if(!do_after(user, time, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) @@ -290,13 +280,18 @@ malpractice(user) -/datum/wound/blunt/moderate/treat(obj/item/I, mob/user) +/datum/wound/blunt/bone/moderate/treat(obj/item/I, mob/user) + var/scanned = HAS_TRAIT(src, TRAIT_WOUND_SCANNED) + var/self_penalty_mult = user == victim ? 1.5 : 1 + var/scanned_mult = scanned ? 0.5 : 1 + var/treatment_delay = base_treat_time * self_penalty_mult * scanned_mult + if(victim == user) - victim.visible_message(span_danger("[user] begins resetting [victim.p_their()] [limb.plaintext_zone] with [I]."), span_warning("You begin resetting your [limb.plaintext_zone] with [I]...")) + victim.visible_message(span_danger("[user] begins [scanned ? "expertly" : ""] resetting [victim.p_their()] [limb.plaintext_zone] with [I]."), span_warning("You begin resetting your [limb.plaintext_zone] with [I][scanned ? ", keeping the holo-image's indications in mind" : ""]...")) else - user.visible_message(span_danger("[user] begins resetting [victim]'s [limb.plaintext_zone] with [I]."), span_notice("You begin resetting [victim]'s [limb.plaintext_zone] with [I]...")) + user.visible_message(span_danger("[user] begins [scanned ? "expertly" : ""] resetting [victim]'s [limb.plaintext_zone] with [I]."), span_notice("You begin resetting [victim]'s [limb.plaintext_zone] with [I][scanned ? ", keeping the holo-image's indications in mind" : ""]...")) - if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, PROC_REF(still_exists)))) + if(!do_after(user, treatment_delay, target = victim, extra_checks=CALLBACK(src, PROC_REF(still_exists)))) return if(victim == user) @@ -314,7 +309,7 @@ Severe (Hairline Fracture) */ -/datum/wound/blunt/severe +/datum/wound/blunt/bone/severe name = "Hairline Fracture" desc = "Patient's bone has suffered a crack in the foundation, causing serious pain and reduced limb functionality." treat_text = "Recommended light surgical application of bone gel, though a sling of medical gauze will prevent worsening situation." @@ -325,19 +320,25 @@ interaction_efficiency_penalty = 2 limp_slowdown = 6 limp_chance = 60 - threshold_minimum = 60 threshold_penalty = 30 treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/bone_gel) - status_effect_type = /datum/status_effect/wound/blunt/severe + status_effect_type = /datum/status_effect/wound/blunt/bone/severe scar_keyword = "bluntsevere" brain_trauma_group = BRAIN_TRAUMA_MILD trauma_cycle_cooldown = 1.5 MINUTES internal_bleeding_chance = 40 - wound_flags = (BONE_WOUND | ACCEPTS_GAUZE | MANGLES_BONE) + wound_flags = (ACCEPTS_GAUZE | MANGLES_INTERIOR) regen_ticks_needed = 120 // ticks every 2 seconds, 240 seconds, so roughly 4 minutes default +/datum/wound_pregen_data/bone/hairline + abstract = FALSE + + wound_path_to_generate = /datum/wound/blunt/bone/severe + + threshold_minimum = 60 + /// Compound Fracture (Critical Blunt) -/datum/wound/blunt/critical +/datum/wound/blunt/bone/critical name = "Compound Fracture" desc = "Patient's bones have suffered multiple gruesome fractures, causing significant pain and near uselessness of limb." treat_text = "Immediate binding of affected limb, followed by surgical intervention ASAP." @@ -349,40 +350,45 @@ limp_slowdown = 7 limp_chance = 70 sound_effect = 'sound/effects/wounds/crack2.ogg' - threshold_minimum = 115 threshold_penalty = 50 disabling = TRUE treatable_by = list(/obj/item/stack/sticky_tape/surgical, /obj/item/stack/medical/bone_gel) - status_effect_type = /datum/status_effect/wound/blunt/critical + status_effect_type = /datum/status_effect/wound/blunt/bone/critical scar_keyword = "bluntcritical" brain_trauma_group = BRAIN_TRAUMA_SEVERE trauma_cycle_cooldown = 2.5 MINUTES internal_bleeding_chance = 60 - wound_flags = (BONE_WOUND | ACCEPTS_GAUZE | MANGLES_BONE) + wound_flags = (ACCEPTS_GAUZE | MANGLES_INTERIOR) regen_ticks_needed = 240 // ticks every 2 seconds, 480 seconds, so roughly 8 minutes default +/datum/wound_pregen_data/bone/compound + abstract = FALSE + + wound_path_to_generate = /datum/wound/blunt/bone/critical + + threshold_minimum = 115 + // doesn't make much sense for "a" bone to stick out of your head -/datum/wound/blunt/critical/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE, attack_direction = null) +/datum/wound/blunt/bone/critical/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE, attack_direction = null, wound_source = "Unknown") if(L.body_zone == BODY_ZONE_HEAD) occur_text = "splits open, exposing a bare, cracked skull through the flesh and blood" examine_desc = "has an unsettling indent, with bits of skull poking out" . = ..() /// if someone is using bone gel on our wound -/datum/wound/blunt/proc/gel(obj/item/stack/medical/bone_gel/I, mob/user) +/datum/wound/blunt/bone/proc/gel(obj/item/stack/medical/bone_gel/I, mob/user) // skellies get treated nicer with bone gel since their "reattach dismembered limbs by hand" ability sucks when it's still critically wounded if((limb.biological_state & BIO_BONE) && !(limb.biological_state & BIO_FLESH)) - skelly_gel(I, user) - return + return skelly_gel(I, user) if(gelled) to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.plaintext_zone] is already coated with bone gel!")) - return + return TRUE user.visible_message(span_danger("[user] begins hastily applying [I] to [victim]'s' [limb.plaintext_zone]..."), span_warning("You begin hastily applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone], disregarding the warning label...")) if(!do_after(user, base_treat_time * 1.5 * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, PROC_REF(still_exists)))) - return + return TRUE I.use(1) victim.emote("scream") @@ -405,15 +411,16 @@ if(prob(25 + (20 * (severity - 2)) - painkiller_bonus)) // 25%/45% chance to fail self-applying with severe and critical wounds, modded by painkillers victim.visible_message(span_danger("[victim] fails to finish applying [I] to [victim.p_their()] [limb.plaintext_zone], passing out from the pain!"), span_notice("You pass out from the pain of applying [I] to your [limb.plaintext_zone] before you can finish!")) victim.AdjustUnconscious(5 SECONDS) - return + return TRUE victim.visible_message(span_notice("[victim] finishes applying [I] to [victim.p_their()] [limb.plaintext_zone], grimacing from the pain!"), span_notice("You finish applying [I] to your [limb.plaintext_zone], and your bones explode in pain!")) limb.receive_damage(25, wound_bonus=CANT_WOUND) victim.stamina.adjust(-100) gelled = TRUE + return TRUE /// skellies are less averse to bone gel, since they're literally all bone -/datum/wound/blunt/proc/skelly_gel(obj/item/stack/medical/bone_gel/I, mob/user) +/datum/wound/blunt/bone/proc/skelly_gel(obj/item/stack/medical/bone_gel/I, mob/user) if(gelled) to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.plaintext_zone] is already coated with bone gel!")) return @@ -432,20 +439,21 @@ gelled = TRUE processes = TRUE + return TRUE /// if someone is using surgical tape on our wound -/datum/wound/blunt/proc/tape(obj/item/stack/sticky_tape/surgical/I, mob/user) +/datum/wound/blunt/bone/proc/tape(obj/item/stack/sticky_tape/surgical/I, mob/user) if(!gelled) to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.plaintext_zone] must be coated with bone gel to perform this emergency operation!")) - return + return TRUE if(taped) to_chat(user, span_warning("[user == victim ? "Your" : "[victim]'s"] [limb.plaintext_zone] is already wrapped in [I.name] and reforming!")) - return + return TRUE user.visible_message(span_danger("[user] begins applying [I] to [victim]'s' [limb.plaintext_zone]..."), span_warning("You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone]...")) if(!do_after(user, base_treat_time * (user == victim ? 1.5 : 1), target = victim, extra_checks=CALLBACK(src, PROC_REF(still_exists)))) - return + return TRUE if(victim == user) regen_ticks_needed *= 1.5 @@ -459,14 +467,15 @@ taped = TRUE processes = TRUE + return TRUE -/datum/wound/blunt/treat(obj/item/I, mob/user) +/datum/wound/blunt/bone/treat(obj/item/I, mob/user) if(istype(I, /obj/item/stack/medical/bone_gel)) - gel(I, user) + return gel(I, user) else if(istype(I, /obj/item/stack/sticky_tape/surgical)) - tape(I, user) + return tape(I, user) -/datum/wound/blunt/get_scanner_description(mob/user) +/datum/wound/blunt/bone/get_scanner_description(mob/user) . = ..() . += "
" diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm index 21b5e0040e8a..37f4072ffbf9 100644 --- a/code/datums/wounds/burns.dm +++ b/code/datums/wounds/burns.dm @@ -7,20 +7,24 @@ /datum/wound/burn name = "Burn Wound" a_or_from = "from" - wound_type = WOUND_BURN - processes = TRUE sound_effect = 'sound/effects/wounds/sizzle1.ogg' - wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE) + +/datum/wound/burn/flesh + name = "Burn (Flesh) Wound" + a_or_from = "from" + processes = TRUE + + default_scar_file = FLESH_SCAR_FILE treatable_by = list(/obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) // sterilizer and alcohol will require reagent treatments, coming soon - // Flesh damage vars + // Flesh damage vars /// How much damage to our flesh we currently have. Once both this and infestation reach 0, the wound is considered healed var/flesh_damage = 5 /// Our current counter for how much flesh regeneration we have stacked from regenerative mesh/synthflesh/whatever, decrements each tick and lowers flesh_damage var/flesh_healing = 0 - // Infestation vars (only for severe and critical) + // Infestation vars (only for severe and critical) /// How quickly infection breeds on this burn if we don't have disinfectant var/infestation_rate = 0 /// Our current level of infection @@ -31,8 +35,11 @@ /// Once we reach infestation beyond WOUND_INFESTATION_SEPSIS, we get this many warnings before the limb is completely paralyzed (you'd have to ignore a really bad burn for a really long time for this to happen) var/strikes_to_lose_limb = 3 +/datum/wound/burn/flesh/handle_process(seconds_per_tick, times_fired) + + if (!victim || IS_IN_STASIS(victim)) + return -/datum/wound/burn/handle_process(seconds_per_tick, times_fired) . = ..() if(strikes_to_lose_limb == 0) // we've already hit sepsis, nothing more to do victim.adjustToxLoss(0.25 * seconds_per_tick) @@ -128,7 +135,7 @@ var/datum/brain_trauma/severe/paralysis/sepsis = new (limb.body_zone) victim.gain_trauma(sepsis) -/datum/wound/burn/get_examine_description(mob/user) +/datum/wound/burn/flesh/get_wound_description(mob/user) if(strikes_to_lose_limb <= 0) return span_deadsay("[victim.p_their(TRUE)] [limb.plaintext_zone] has locked up completely and is non-functional.") @@ -161,8 +168,8 @@ return "[condition.Join()]" -/datum/wound/burn/get_scanner_description(mob/user) - if(strikes_to_lose_limb == 0) +/datum/wound/burn/flesh/get_scanner_description(mob/user) + if(strikes_to_lose_limb <= 0) // Unclear if it can go below 0, best to not take the chance var/oopsie = "Type: [name]\nSeverity: [severity_text()]" oopsie += "
Infection Level: [span_deadsay("The body part has suffered complete sepsis and must be removed. Amputate or augment limb immediately.")]
" return oopsie @@ -194,12 +201,12 @@ */ /// if someone is using ointment or mesh on our burns -/datum/wound/burn/proc/ointmentmesh(obj/item/stack/medical/I, mob/user) +/datum/wound/burn/flesh/proc/ointmentmesh(obj/item/stack/medical/I, mob/user) user.visible_message(span_notice("[user] begins applying [I] to [victim]'s [limb.plaintext_zone]..."), span_notice("You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone]...")) if (I.amount <= 0) - return + return TRUE if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return + return TRUE limb.heal_damage(I.heal_brute, I.heal_burn) user.visible_message(span_green("[user] applies [I] to [victim]."), span_green("You apply [I] to [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone].")) @@ -209,36 +216,38 @@ if((infestation <= 0 || sanitization >= infestation) && (flesh_damage <= 0 || flesh_healing > flesh_damage)) to_chat(user, span_notice("You've done all you can with [I], now you must wait for the flesh on [victim]'s [limb.plaintext_zone] to recover.")) + return TRUE else - try_treating(I, user) + return try_treating(I, user) /// Paramedic UV penlights -/datum/wound/burn/proc/uv(obj/item/flashlight/pen/paramedic/I, mob/user) +/datum/wound/burn/flesh/proc/uv(obj/item/flashlight/pen/paramedic/I, mob/user) if(!COOLDOWN_FINISHED(I, uv_cooldown)) to_chat(user, span_notice("[I] is still recharging!")) - return + return TRUE if(infestation <= 0 || infestation < sanitization) to_chat(user, span_notice("There's no infection to treat on [victim]'s [limb.plaintext_zone]!")) - return + return TRUE user.visible_message(span_notice("[user] flashes the burns on [victim]'s [limb] with [I]."), span_notice("You flash the burns on [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]."), vision_distance=COMBAT_MESSAGE_RANGE) sanitization += I.uv_power COOLDOWN_START(I, uv_cooldown, I.uv_cooldown_length) + return TRUE -/datum/wound/burn/treat(obj/item/I, mob/user) +/datum/wound/burn/flesh/treat(obj/item/I, mob/user) if(istype(I, /obj/item/stack/medical/ointment)) - ointmentmesh(I, user) + return ointmentmesh(I, user) else if(istype(I, /obj/item/stack/medical/mesh)) var/obj/item/stack/medical/mesh/mesh_check = I if(!mesh_check.is_open) to_chat(user, span_warning("You need to open [mesh_check] first.")) return - ointmentmesh(mesh_check, user) + return ointmentmesh(mesh_check, user) else if(istype(I, /obj/item/flashlight/pen/paramedic)) - uv(I, user) + return uv(I, user) // people complained about burns not healing on stasis beds, so in addition to checking if it's cured, they also get the special ability to very slowly heal on stasis beds if they have the healing effects stored -/datum/wound/burn/on_stasis(seconds_per_tick, times_fired) +/datum/wound/burn/flesh/on_stasis(seconds_per_tick, times_fired) . = ..() if(strikes_to_lose_limb == 0) // we've already hit sepsis, nothing more to do if(SPT_PROB(0.5, seconds_per_tick)) @@ -253,60 +262,108 @@ if(sanitization > 0) infestation = max(infestation - (0.1 * WOUND_BURN_SANITIZATION_RATE * seconds_per_tick), 0) -/datum/wound/burn/on_synthflesh(amount) +/datum/wound/burn/flesh/on_synthflesh(amount) flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard +/datum/wound_pregen_data/flesh_burn + abstract = TRUE + + required_wounding_types = list(WOUND_BURN) + required_limb_biostate = BIO_FLESH + + wound_series = WOUND_SERIES_FLESH_BURN_BASIC + +/datum/wound/burn/get_limb_examine_description() + return span_warning("The flesh on this limb appears badly cooked.") + // we don't even care about first degree burns, straight to second -/datum/wound/burn/moderate +/datum/wound/burn/flesh/moderate name = "Second Degree Burns" desc = "Patient is suffering considerable burns with mild skin penetration, weakening limb integrity and increased burning sensations." treat_text = "Recommended application of topical ointment or regenerative mesh to affected region." examine_desc = "is badly burned and breaking out in blisters" occur_text = "breaks out with violent red burns" severity = WOUND_SEVERITY_MODERATE - damage_mulitplier_penalty = 1.1 - threshold_minimum = 40 threshold_penalty = 30 // burns cause significant decrease in limb integrity compared to other wounds - status_effect_type = /datum/status_effect/wound/burn/moderate + status_effect_type = /datum/status_effect/wound/burn/flesh/moderate flesh_damage = 5 scar_keyword = "burnmoderate" -/datum/wound/burn/severe +/datum/wound_pregen_data/flesh_burn/second_degree + abstract = FALSE + + wound_path_to_generate = /datum/wound/burn/flesh/moderate + + threshold_minimum = 40 + +/datum/wound/burn/flesh/severe name = "Third Degree Burns" desc = "Patient is suffering extreme burns with full skin penetration, creating serious risk of infection and greatly reduced limb integrity." treat_text = "Recommended immediate disinfection and excision of any infected skin, followed by bandaging and ointment." examine_desc = "appears seriously charred, with aggressive red splotches" occur_text = "chars rapidly, exposing ruined tissue and spreading angry red burns" severity = WOUND_SEVERITY_SEVERE - damage_mulitplier_penalty = 1.2 - threshold_minimum = 80 threshold_penalty = 40 - status_effect_type = /datum/status_effect/wound/burn/severe + status_effect_type = /datum/status_effect/wound/burn/flesh/severe treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) infestation_rate = 0.07 // appx 9 minutes to reach sepsis without any treatment flesh_damage = 12.5 scar_keyword = "burnsevere" -/datum/wound/burn/critical +/datum/wound_pregen_data/flesh_burn/third_degree + abstract = FALSE + + wound_path_to_generate = /datum/wound/burn/flesh/severe + + threshold_minimum = 80 + +/datum/wound/burn/flesh/critical name = "Catastrophic Burns" desc = "Patient is suffering near complete loss of tissue and significantly charred muscle and bone, creating life-threatening risk of infection and negligible limb integrity." treat_text = "Immediate surgical debriding of any infected skin, followed by potent tissue regeneration formula and bandaging." examine_desc = "is a ruined mess of blanched bone, melted fat, and charred tissue" occur_text = "vaporizes as flesh, bone, and fat melt together in a horrifying mess" severity = WOUND_SEVERITY_CRITICAL - damage_mulitplier_penalty = 1.3 sound_effect = 'sound/effects/wounds/sizzle2.ogg' - threshold_minimum = 140 threshold_penalty = 80 - status_effect_type = /datum/status_effect/wound/burn/critical + status_effect_type = /datum/status_effect/wound/burn/flesh/critical treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) infestation_rate = 0.075 // appx 4.33 minutes to reach sepsis without any treatment flesh_damage = 20 scar_keyword = "burncritical" +/datum/wound_pregen_data/flesh_burn/fourth_degree + abstract = FALSE + + wound_path_to_generate = /datum/wound/burn/flesh/critical + + threshold_minimum = 140 + ///special severe wound caused by sparring interference or other god related punishments. -/datum/wound/burn/severe/brand +/datum/wound/burn/flesh/severe/brand name = "Holy Brand" desc = "Patient is suffering extreme burns from a strange brand marking, creating serious risk of infection and greatly reduced limb integrity." examine_desc = "appears to have holy symbols painfully branded into their flesh, leaving severe burns." occur_text = "chars rapidly into a strange pattern of holy symbols, burned into the flesh." + +/datum/wound_pregen_data/flesh_burn/third_degree/holy + abstract = FALSE + can_be_randomly_generated = FALSE + + wound_path_to_generate = /datum/wound/burn/flesh/severe/brand +/// special severe wound caused by the cursed slot machine. + +/datum/wound/burn/flesh/severe/cursed_brand + name = "Ancient Brand" + desc = "Patient is suffering extreme burns with oddly ornate brand markings, creating serious risk of infection and greatly reduced limb integrity." + examine_desc = "appears to have ornate symbols painfully branded into their flesh, leaving severe burns" + occur_text = "chars rapidly into a pattern that can only be described as an agglomeration of several financial symbols, burned into the flesh" + +/datum/wound/burn/flesh/severe/cursed_brand/get_limb_examine_description() + return span_warning("The flesh on this limb has several ornate symbols burned into it, with pitting throughout.") + +/datum/wound_pregen_data/flesh_burn/third_degree/cursed_brand + abstract = FALSE + can_be_randomly_generated = FALSE + + wound_path_to_generate = /datum/wound/burn/flesh/severe/cursed_brand diff --git a/code/datums/wounds/loss.dm b/code/datums/wounds/loss.dm index b1853840ced1..479656a8a429 100644 --- a/code/datums/wounds/loss.dm +++ b/code/datums/wounds/loss.dm @@ -1,3 +1,15 @@ +/datum/wound_pregen_data/loss + abstract = FALSE + + wound_path_to_generate = /datum/wound/loss + required_limb_biostate = NONE + require_any_biostate = TRUE + + required_wounding_types = list(WOUND_ALL) + + wound_series = WOUND_SERIES_LOSS_BASIC + + threshold_minimum = WOUND_DISMEMBER_OUTRIGHT_THRESH // not actually used since dismembering is handled differently, but may as well assign it since we got it /datum/wound/loss name = "Dismemberment Wound" @@ -5,15 +17,17 @@ sound_effect = 'sound/effects/dismember.ogg' severity = WOUND_SEVERITY_LOSS - threshold_minimum = WOUND_DISMEMBER_OUTRIGHT_THRESH // not actually used since dismembering is handled differently, but may as well assign it since we got it status_effect_type = null scar_keyword = "dismember" wound_flags = null already_scarred = TRUE // We manually assign scars for dismembers through endround missing limbs and aheals + /// The wounding_type of the attack that caused us. Used to generate the description of our scar. Currently unused, but primarily exists in case non-biological wounds are added. + var/loss_wounding_type + /// Our special proc for our special dismembering, the wounding type only matters for what text we have -/datum/wound/loss/proc/apply_dismember(obj/item/bodypart/dismembered_part, wounding_type=WOUND_SLASH, outright = FALSE, attack_direction) - if(!istype(dismembered_part) || !dismembered_part.owner || !(dismembered_part.body_zone in viable_zones) || isalien(dismembered_part.owner) || !dismembered_part.can_dismember()) +/datum/wound/loss/proc/apply_dismember(obj/item/bodypart/dismembered_part, wounding_type = WOUND_SLASH, outright = FALSE, attack_direction) + if(!istype(dismembered_part) || !dismembered_part.owner || !(dismembered_part.body_zone in get_viable_zones()) || isalien(dismembered_part.owner) || !dismembered_part.can_dismember()) qdel(src) return @@ -22,10 +36,31 @@ if(dismembered_part.body_zone == BODY_ZONE_CHEST) occur_text = "is split open, causing [victim.p_their()] internal [dismembered_part.bodytype & BODYTYPE_ROBOTIC? "components": "organs"] to spill out!" self_msg = "is split open, causing your internal organs to spill out!" - else if(outright) + else + occur_text = dismembered_part.get_dismember_message(wounding_type, outright) + + var/msg = span_bolddanger("[victim]'s [dismembered_part.plaintext_zone] [occur_text]") + + victim.visible_message(msg, span_userdanger("Your [dismembered_part.plaintext_zone] [self_msg ? self_msg : occur_text]")) + + loss_wounding_type = wounding_type + + set_limb(dismembered_part) + second_wind() + log_wound(victim, src) + if(dismembered_part.can_bleed() && wounding_type != WOUND_BURN && victim.blood_volume) + victim.spray_blood(attack_direction, severity) + dismembered_part.dismember(wounding_type == WOUND_BURN ? BURN : BRUTE, wounding_type = wounding_type) + qdel(src) + return TRUE + +/obj/item/bodypart/proc/get_dismember_message(wounding_type, outright) + var/occur_text + + if(outright) switch(wounding_type) if(WOUND_BLUNT) - occur_text = "is outright smashed to a [dismembered_part.bodytype & BODYTYPE_ROBOTIC? "misshapen heap of scrap": "gross pulp"], severing it completely!" + occur_text = "is outright smashed to a gross pulp, severing it completely!" if(WOUND_SLASH) occur_text = "is outright slashed off, severing it completely!" if(WOUND_PIERCE) @@ -33,25 +68,17 @@ if(WOUND_BURN) occur_text = "is outright incinerated, falling to dust!" else + var/bone_text = get_internal_description() + var/tissue_text = get_external_description() + switch(wounding_type) if(WOUND_BLUNT) - occur_text = "is shattered through the last [dismembered_part.bodytype & BODYTYPE_ROBOTIC? "bit of wires": "bone"] holding it together, severing it completely!" + occur_text = "is shattered through the last [bone_text] holding it together, severing it completely!" if(WOUND_SLASH) - occur_text = "is slashed through the last [dismembered_part.bodytype & BODYTYPE_ROBOTIC? "bit of wires": "tissue"] holding it together, severing it completely!" + occur_text = "is slashed through the last [tissue_text] holding it together, severing it completely!" if(WOUND_PIERCE) - occur_text = "is pierced through the last [dismembered_part.bodytype & BODYTYPE_ROBOTIC? "bit of wires": "tissue"] holding it together, severing it completely!" + occur_text = "is pierced through the last [tissue_text] holding it together, severing it completely!" if(WOUND_BURN) occur_text = "is completely incinerated, falling to dust!" - var/msg = span_bolddanger("[victim]'s [dismembered_part.plaintext_zone] [occur_text]") - - victim.visible_message(msg, span_userdanger("Your [dismembered_part.plaintext_zone] [self_msg ? self_msg : occur_text]")) - - set_limb(dismembered_part) - second_wind() - log_wound(victim, src) - if(wounding_type != WOUND_BURN && victim.blood_volume) - victim.spray_blood(attack_direction, severity) - dismembered_part.dismember(wounding_type == WOUND_BURN ? BURN : BRUTE) - qdel(src) - return TRUE + return occur_text diff --git a/code/datums/wounds/pierce.dm b/code/datums/wounds/pierce.dm index 1612b3159a6f..b52926dec16d 100644 --- a/code/datums/wounds/pierce.dm +++ b/code/datums/wounds/pierce.dm @@ -2,16 +2,19 @@ /* Piercing wounds */ - /datum/wound/pierce + +/datum/wound/pierce/bleed name = "Piercing Wound" sound_effect = 'sound/weapons/slice.ogg' processes = TRUE - wound_type = WOUND_PIERCE treatable_by = list(/obj/item/stack/medical/suture) - treatable_tool = TOOL_CAUTERY + treatable_tools = list(TOOL_CAUTERY) base_treat_time = 3 SECONDS - wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE) + wound_flags = (ACCEPTS_GAUZE | CAN_BE_GRASPED) + + default_scar_file = FLESH_SCAR_FILE + /// How much blood we start losing when this wound is first applied var/initial_flow @@ -23,13 +26,15 @@ /// If we let off blood when hit, the max blood lost is this * the incoming damage var/internal_bleeding_coefficient -/datum/wound/pierce/wound_injury(datum/wound/old_wound = null, attack_direction = null) +/datum/wound/pierce/bleed/wound_injury(datum/wound/old_wound = null, attack_direction = null) set_blood_flow(initial_flow) - if(!no_bleeding && attack_direction && victim.blood_volume > BLOOD_VOLUME_OKAY) + if(limb.can_bleed() && attack_direction && victim.blood_volume > BLOOD_VOLUME_OKAY) victim.spray_blood(attack_direction, severity) -/datum/wound/pierce/receive_damage(wounding_type, wounding_dmg, wound_bonus) - if(victim.stat == DEAD || (wounding_dmg < 5) || no_bleeding || !victim.blood_volume || !prob(internal_bleeding_chance + wounding_dmg)) + return ..() + +/datum/wound/pierce/bleed/receive_damage(wounding_type, wounding_dmg, wound_bonus) + if(victim.stat == DEAD || (wounding_dmg < 5) || !limb.can_bleed() || !victim.blood_volume || !prob(internal_bleeding_chance + wounding_dmg)) return if(limb.current_gauze?.splint_factor) wounding_dmg *= (1 - limb.current_gauze.splint_factor) @@ -50,9 +55,9 @@ new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir) victim.add_splatter_floor(get_step(victim.loc, victim.dir)) -/datum/wound/pierce/get_bleed_rate_of_change() +/datum/wound/pierce/bleed/get_bleed_rate_of_change() //basically if a species doesn't bleed, the wound is stagnant and will not heal on it's own (nor get worse) - if(no_bleeding) + if(!limb.can_bleed()) return BLOOD_FLOW_STEADY if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS)) return BLOOD_FLOW_INCREASING @@ -60,10 +65,13 @@ return BLOOD_FLOW_DECREASING return BLOOD_FLOW_STEADY -/datum/wound/pierce/handle_process(seconds_per_tick, times_fired) +/datum/wound/pierce/bleed/handle_process(seconds_per_tick, times_fired) + if (!victim || IS_IN_STASIS(victim)) + return + set_blood_flow(min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW)) - if(!no_bleeding) + if(limb.can_bleed()) if(victim.bodytemperature < (BODYTEMP_NORMAL - 10)) adjust_blood_flow(-0.1 * seconds_per_tick) if(SPT_PROB(2.5, seconds_per_tick)) @@ -79,36 +87,45 @@ if(blood_flow <= 0) qdel(src) -/datum/wound/pierce/on_stasis(seconds_per_tick, times_fired) +/datum/wound/pierce/bleed/on_stasis(seconds_per_tick, times_fired) . = ..() if(blood_flow <= 0) qdel(src) -/datum/wound/pierce/check_grab_treatments(obj/item/I, mob/user) +/datum/wound/pierce/bleed/check_grab_treatments(obj/item/I, mob/user) if(I.get_temperature()) // if we're using something hot but not a cautery, we need to be aggro grabbing them first, so we don't try treating someone we're eswording return TRUE -/datum/wound/pierce/treat(obj/item/I, mob/user) +/datum/wound/pierce/bleed/treat(obj/item/I, mob/user) if(istype(I, /obj/item/stack/medical/suture)) - suture(I, user) + return suture(I, user) else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature()) - tool_cauterize(I, user) + return tool_cauterize(I, user) -/datum/wound/pierce/on_xadone(power) +/datum/wound/pierce/bleed/on_xadone(power) . = ..() - adjust_blood_flow(-0.03 * power) // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort -/datum/wound/pierce/on_synthflesh(power) + if (limb) // parent can cause us to be removed, so its reasonable to check if we're still applied + adjust_blood_flow(-0.03 * power) // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort + +/datum/wound/pierce/bleed/on_synthflesh(power) . = ..() adjust_blood_flow(-0.025 * power) // 20u * 0.05 = -1 blood flow, less than with slashes but still good considering smaller bleed rates /// If someone is using a suture to close this puncture -/datum/wound/pierce/proc/suture(obj/item/stack/medical/suture/I, mob/user) +/datum/wound/pierce/bleed/proc/suture(obj/item/stack/medical/suture/I, mob/user) var/self_penalty_mult = (user == victim ? 1.4 : 1) - user.visible_message(span_notice("[user] begins stitching [victim]'s [limb.plaintext_zone] with [I]..."), span_notice("You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]...")) - if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return - var/bleeding_wording = (no_bleeding ? "holes" : "bleeding") + var/treatment_delay = base_treat_time * self_penalty_mult + + if(HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + treatment_delay *= 0.5 + user.visible_message(span_notice("[user] begins expertly stitching [victim]'s [limb.plaintext_zone] with [I]..."), span_notice("You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I], keeping the holo-image information in mind...")) + else + user.visible_message(span_notice("[user] begins stitching [victim]'s [limb.plaintext_zone] with [I]..."), span_notice("You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]...")) + + if(!do_after(user, treatment_delay, target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return TRUE + var/bleeding_wording = (!limb.can_bleed() ? "holes" : "bleeding") user.visible_message(span_green("[user] stitches up some of the [bleeding_wording] on [victim]."), span_green("You stitch up some of the [bleeding_wording] on [user == victim ? "yourself" : "[victim]"].")) var/blood_sutured = I.stop_bleeding / self_penalty_mult adjust_blood_flow(-blood_sutured) @@ -116,20 +133,29 @@ I.use(1) if(blood_flow > 0) - try_treating(I, user) + return try_treating(I, user) else to_chat(user, span_green("You successfully close the hole in [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone].")) + return TRUE /// If someone is using either a cautery tool or something with heat to cauterize this pierce -/datum/wound/pierce/proc/tool_cauterize(obj/item/I, mob/user) +/datum/wound/pierce/bleed/proc/tool_cauterize(obj/item/I, mob/user) + var/improv_penalty_mult = (I.tool_behaviour == TOOL_CAUTERY ? 1 : 1.25) // 25% longer and less effective if you don't use a real cautery var/self_penalty_mult = (user == victim ? 1.5 : 1) // 50% longer and less effective if you do it to yourself - user.visible_message(span_danger("[user] begins cauterizing [victim]'s [limb.plaintext_zone] with [I]..."), span_warning("You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]...")) - if(!do_after(user, base_treat_time * self_penalty_mult * improv_penalty_mult, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return + var/treatment_delay = base_treat_time * self_penalty_mult * improv_penalty_mult - var/bleeding_wording = (no_bleeding ? "holes" : "bleeding") + if(HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + treatment_delay *= 0.5 + user.visible_message(span_danger("[user] begins expertly cauterizing [victim]'s [limb.plaintext_zone] with [I]..."), span_warning("You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I], keeping the holo-image indications in mind...")) + else + user.visible_message(span_danger("[user] begins cauterizing [victim]'s [limb.plaintext_zone] with [I]..."), span_warning("You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]...")) + + if(!do_after(user, treatment_delay, target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return TRUE + + var/bleeding_wording = (!limb.can_bleed() ? "holes" : "bleeding") user.visible_message(span_green("[user] cauterizes some of the [bleeding_wording] on [victim]."), span_green("You cauterize some of the [bleeding_wording] on [victim].")) limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND) if(prob(30)) @@ -138,10 +164,30 @@ adjust_blood_flow(-blood_cauterized) if(blood_flow > 0) - try_treating(I, user) + return try_treating(I, user) + return TRUE + +/datum/wound_pregen_data/flesh_pierce + abstract = TRUE -/datum/wound/pierce/moderate - name = "Minor Breakage" + required_limb_biostate = (BIO_FLESH) + required_wounding_types = list(WOUND_PIERCE) + + wound_series = WOUND_SERIES_FLESH_PUNCTURE_BLEED + +/datum/wound_pregen_data/flesh_pierce + abstract = TRUE + + required_limb_biostate = (BIO_FLESH) + required_wounding_types = list(WOUND_PIERCE) + + wound_series = WOUND_SERIES_FLESH_PUNCTURE_BLEED + +/datum/wound/pierce/get_limb_examine_description() + return span_warning("The flesh on this limb appears badly perforated.") + +/datum/wound/pierce/bleed/moderate + name = "Minor Skin Breakage" desc = "Patient's skin has been broken open, causing severe bruising and minor internal bleeding in affected area." treat_text = "Treat affected site with bandaging or exposure to extreme cold. In dire cases, brief exposure to vacuum may suffice." // space is cold in ss13, so it's like an ice pack! examine_desc = "has a small, circular hole, gently bleeding" @@ -152,17 +198,23 @@ gauzed_clot_rate = 0.8 internal_bleeding_chance = 30 internal_bleeding_coefficient = 1.25 - threshold_minimum = 30 threshold_penalty = 20 status_effect_type = /datum/status_effect/wound/pierce/moderate scar_keyword = "piercemoderate" -/datum/wound/pierce/moderate/update_descriptions() - if(no_bleeding) +/datum/wound_pregen_data/flesh_pierce/breakage + abstract = FALSE + + wound_path_to_generate = /datum/wound/pierce/bleed/moderate + + threshold_minimum = 30 + +/datum/wound/pierce/bleed/moderate/update_descriptions() + if(!limb.can_bleed()) examine_desc = "has a small, circular hole" occur_text = "splits a small hole open" -/datum/wound/pierce/severe +/datum/wound/pierce/bleed/severe name = "Open Puncture" desc = "Patient's internal tissue is penetrated, causing sizeable internal bleeding and reduced limb stability." treat_text = "Repair punctures in skin by suture or cautery, extreme cold may also work." @@ -174,16 +226,22 @@ gauzed_clot_rate = 0.6 internal_bleeding_chance = 60 internal_bleeding_coefficient = 1.5 - threshold_minimum = 50 threshold_penalty = 35 status_effect_type = /datum/status_effect/wound/pierce/severe scar_keyword = "piercesevere" -/datum/wound/pierce/severe/update_descriptions() - if(no_bleeding) +/datum/wound_pregen_data/flesh_pierce/open_puncture + abstract = FALSE + + wound_path_to_generate = /datum/wound/pierce/bleed/severe + + threshold_minimum = 50 + +/datum/wound/pierce/bleed/severe/update_descriptions() + if(!limb.can_bleed()) occur_text = "tears a hole open" -/datum/wound/pierce/critical +/datum/wound/pierce/bleed/critical name = "Ruptured Cavity" desc = "Patient's internal tissue and circulatory system is shredded, causing significant internal bleeding and damage to internal organs." treat_text = "Surgical repair of puncture wound, followed by supervised resanguination." @@ -195,8 +253,14 @@ gauzed_clot_rate = 0.4 internal_bleeding_chance = 80 internal_bleeding_coefficient = 1.75 - threshold_minimum = 100 threshold_penalty = 50 status_effect_type = /datum/status_effect/wound/pierce/critical scar_keyword = "piercecritical" - wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE | MANGLES_FLESH) + wound_flags = (ACCEPTS_GAUZE | MANGLES_EXTERIOR | CAN_BE_GRASPED) + +/datum/wound_pregen_data/flesh_pierce/cavity + abstract = FALSE + + wound_path_to_generate = /datum/wound/pierce/bleed/critical + + threshold_minimum = 100 diff --git a/code/datums/wounds/scars/_scars.dm b/code/datums/wounds/scars/_scars.dm index 743ac98e730d..5ee38f34f67a 100644 --- a/code/datums/wounds/scars/_scars.dm +++ b/code/datums/wounds/scars/_scars.dm @@ -22,11 +22,14 @@ var/visibility = 2 /// Whether this scar can actually be covered up by clothing var/coverable = TRUE - /// Obviously, scars that describe damaged flesh wouldn't apply to a skeleton (in some cases like bone wounds, there can be different descriptions for skeletons and fleshy humanoids) - var/biology = BIO_FLESH_BONE /// If we're a persistent scar or may become one, we go in this character slot var/persistent_character_slot = 0 + /// The biostates we require from a limb to give them our scar. + var/required_limb_biostate + /// If false, we will only check to see if a limb has ALL our biostates, instead of just any. + var/check_any_biostates + /datum/scar/Destroy(force, ...) if(limb) LAZYREMOVE(limb.scars, src) @@ -47,6 +50,19 @@ * * add_to_scars- Should always be TRUE unless you're just storing a scar for later usage, like how cuts want to store a scar for the highest severity of cut, rather than the severity when the wound is fully healed (probably demoted to moderate) */ /datum/scar/proc/generate(obj/item/bodypart/BP, datum/wound/W, add_to_scars=TRUE) + + if (!W.can_scar) + qdel(src) + return + + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[W.type] + if (!pregen_data) + qdel(src) + return + + required_limb_biostate = pregen_data.required_limb_biostate + check_any_biostates = pregen_data.require_any_biostate + limb = BP RegisterSignal(limb, COMSIG_PARENT_QDELETING, PROC_REF(limb_gone)) @@ -59,12 +75,13 @@ if(victim) LAZYADD(victim.all_scars, src) - biology = limb?.biological_state || BIO_FLESH_BONE + var/scar_file = W.get_scar_file(BP, add_to_scars) + var/scar_keyword = W.get_scar_keyword(BP, add_to_scars) + if (!scar_file || !scar_keyword) + qdel(src) + return - if((biology & BIO_BONE) && !(biology & BIO_FLESH)) - description = pick_list(BONE_SCAR_FILE, W.scar_keyword) || "general disfigurement" - else // no specific support for flesh w/o bone scars since it's not really useful - description = pick_list(FLESH_SCAR_FILE, W.scar_keyword) || "general disfigurement" + description = pick_list(W.get_scar_file(BP, add_to_scars), W.get_scar_keyword(BP, add_to_scars)) || "general disfigurement" precise_location = pick_list_replacements(SCAR_LOC_FILE, limb.body_zone) switch(W.severity) @@ -86,22 +103,28 @@ LAZYADD(victim.all_scars, src) /// Used to "load" a persistent scar -/datum/scar/proc/load(obj/item/bodypart/BP, version, description, specific_location, severity=WOUND_SEVERITY_SEVERE, biology=BIO_FLESH_BONE, char_slot) - if(!IS_ORGANIC_LIMB(BP)) +/datum/scar/proc/load(obj/item/bodypart/BP, version, description, specific_location, severity = WOUND_SEVERITY_SEVERE, required_limb_biostate = BIO_STANDARD_UNJOINTED, char_slot, check_any_biostates = FALSE) + if(!BP.scarrable) qdel(src) return limb = BP RegisterSignal(limb, COMSIG_PARENT_QDELETING, PROC_REF(limb_gone)) - if(limb.owner) - victim = limb.owner - if(limb.biological_state != biology) + if (isnull(check_any_biostates)) // so we dont break old scars. NOTE: REMOVE AFTER VERSION NUMBER MOVES PAST 3 + check_any_biostates = FALSE + if (check_any_biostates) + if (!(limb.biological_state & required_limb_biostate)) qdel(src) return + else if (!((limb.biological_state & required_limb_biostate) == required_limb_biostate)) // check for all + qdel(src) + return + if(limb.owner) + victim = limb.owner LAZYADD(victim.all_scars, src) src.severity = severity - src.biology = biology + src.required_limb_biostate = required_limb_biostate persistent_character_slot = char_slot LAZYADD(limb.scars, src) @@ -163,9 +186,9 @@ /// Used to format a scar to save for either persistent scars, or for changeling disguises /datum/scar/proc/format() - return "[SCAR_CURRENT_VERSION]|[limb.body_zone]|[description]|[precise_location]|[severity]|[biology]|[persistent_character_slot]" + return "[SCAR_CURRENT_VERSION]|[limb.body_zone]|[description]|[precise_location]|[severity]|[required_limb_biostate]|[persistent_character_slot]|[check_any_biostates]" /// Used to format a scar to save in preferences for persistent scars -/datum/scar/proc/format_amputated(body_zone) - description = pick_list(FLESH_SCAR_FILE, "dismember") - return "[SCAR_CURRENT_VERSION]|[body_zone]|[description]|amputated|[WOUND_SEVERITY_LOSS]|[BIO_FLESH_BONE]|[persistent_character_slot]" +/datum/scar/proc/format_amputated(body_zone, scar_file = FLESH_SCAR_FILE) + description = pick_list(scar_file, "dismember") + return "[SCAR_CURRENT_VERSION]|[body_zone]|[description]|amputated|[WOUND_SEVERITY_LOSS]|[required_limb_biostate]|[persistent_character_slot]|[check_any_biostates]" diff --git a/code/datums/wounds/scars/_static_scar_data.dm b/code/datums/wounds/scars/_static_scar_data.dm new file mode 100644 index 000000000000..942dcffff9c2 --- /dev/null +++ b/code/datums/wounds/scars/_static_scar_data.dm @@ -0,0 +1,20 @@ +GLOBAL_LIST_INIT_TYPED(all_static_scar_data, /datum/static_scar_data, generate_static_scar_data()) + +/proc/generate_static_scar_data() + RETURN_TYPE(/list/datum/static_scar_data) + + var/list/datum/wound_pregen_data/data = list() + + for (var/datum/wound_pregen_data/path as anything in typecacheof(path = /datum/static_scar_data, ignore_root_path = TRUE)) + if (initial(path.abstract)) + continue + + var/datum/wound_pregen_data/pregen_data = new path + data[pregen_data.wound_path_to_generate] = pregen_data + + return data + +/datum/static_scar_data + var/abstract = FALSE + + diff --git a/code/datums/wounds/slash.dm b/code/datums/wounds/slash.dm index 181bfc2a012d..c2869c947375 100644 --- a/code/datums/wounds/slash.dm +++ b/code/datums/wounds/slash.dm @@ -6,13 +6,25 @@ /datum/wound/slash name = "Slashing (Cut) Wound" sound_effect = 'sound/weapons/slice.ogg' + +/datum/wound_pregen_data/flesh_slash + abstract = TRUE + + required_wounding_types = list(WOUND_SLASH) + required_limb_biostate = BIO_FLESH + + wound_series = WOUND_SERIES_FLESH_SLASH_BLEED + +/datum/wound/slash/flesh + name = "Slashing (Cut) Flesh Wound" processes = TRUE - wound_type = WOUND_SLASH treatable_by = list(/obj/item/stack/medical/suture) treatable_by_grabbed = list(/obj/item/gun/energy/laser) - treatable_tool = TOOL_CAUTERY + treatable_tools = list(TOOL_CAUTERY) base_treat_time = 3 SECONDS - wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE) + wound_flags = (ACCEPTS_GAUZE|CAN_BE_GRASPED) + + default_scar_file = FLESH_SCAR_FILE /// How much blood we start losing when this wound is first applied var/initial_flow @@ -30,7 +42,12 @@ /// A bad system I'm using to track the worst scar we earned (since we can demote, we want the biggest our wound has been, not what it was when it was cured (probably moderate)) var/datum/scar/highest_scar -/datum/wound/slash/wound_injury(datum/wound/slash/old_wound = null, attack_direction = null) +/datum/wound/slash/flesh/Destroy() + highest_scar = null + + return ..() + +/datum/wound/slash/flesh/wound_injury(datum/wound/slash/flesh/old_wound = null, attack_direction = null) if(old_wound) set_blood_flow(max(old_wound.blood_flow, initial_flow)) if(old_wound.severity > severity && old_wound.highest_scar) @@ -38,7 +55,7 @@ old_wound.clear_highest_scar() else set_blood_flow(initial_flow) - if(!no_bleeding && attack_direction && victim.blood_volume > BLOOD_VOLUME_OKAY) + if(limb.can_bleed() && attack_direction && victim.blood_volume > BLOOD_VOLUME_OKAY) victim.spray_blood(attack_direction, severity) if(!highest_scar) @@ -46,24 +63,26 @@ set_highest_scar(new_scar) new_scar.generate(limb, src, add_to_scars=FALSE) -/datum/wound/slash/proc/set_highest_scar(datum/scar/new_scar) + return ..() + +/datum/wound/slash/flesh/proc/set_highest_scar(datum/scar/new_scar) if(highest_scar) UnregisterSignal(highest_scar, COMSIG_PARENT_QDELETING) if(new_scar) RegisterSignal(new_scar, COMSIG_PARENT_QDELETING, PROC_REF(clear_highest_scar)) highest_scar = new_scar -/datum/wound/slash/proc/clear_highest_scar(datum/source) +/datum/wound/slash/flesh/proc/clear_highest_scar(datum/source) SIGNAL_HANDLER set_highest_scar(null) -/datum/wound/slash/remove_wound(ignore_limb, replaced) +/datum/wound/slash/flesh/remove_wound(ignore_limb, replaced) if(!replaced && highest_scar) already_scarred = TRUE highest_scar.lazy_attach(limb) return ..() -/datum/wound/slash/get_examine_description(mob/user) +/datum/wound/slash/flesh/get_wound_description(mob/user) if(!limb.current_gauze) return ..() @@ -82,11 +101,16 @@ return "[msg.Join()]" -/datum/wound/slash/receive_damage(wounding_type, wounding_dmg, wound_bonus) +/datum/wound/slash/flesh/receive_damage(wounding_type, wounding_dmg, wound_bonus) + if (!victim) // if we are dismembered, we can still take damage, its fine to check here + return + if(victim.stat != DEAD && wound_bonus != CANT_WOUND && wounding_type == WOUND_SLASH) // can't stab dead bodies to make it bleed faster this way adjust_blood_flow(WOUND_SLASH_DAMAGE_FLOW_COEFF * wounding_dmg) -/datum/wound/slash/drag_bleed_amount() + return ..() + +/datum/wound/slash/flesh/drag_bleed_amount() // say we have 3 severe cuts with 3 blood flow each, pretty reasonable // compare with being at 100 brute damage before, where you bled (brute/100 * 2), = 2 blood per tile var/bleed_amt = min(blood_flow * 0.1, 1) // 3 * 3 * 0.1 = 0.9 blood total, less than before! the share here is .3 blood of course. @@ -97,9 +121,9 @@ return bleed_amt -/datum/wound/slash/get_bleed_rate_of_change() +/datum/wound/slash/flesh/get_bleed_rate_of_change() //basically if a species doesn't bleed, the wound is stagnant and will not heal on it's own (nor get worse) - if(no_bleeding) + if(!limb.can_bleed()) return BLOOD_FLOW_STEADY if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS)) return BLOOD_FLOW_INCREASING @@ -108,9 +132,13 @@ if(clot_rate < 0) return BLOOD_FLOW_INCREASING -/datum/wound/slash/handle_process(seconds_per_tick, times_fired) +/datum/wound/slash/flesh/handle_process(seconds_per_tick, times_fired) + + if (!victim || IS_IN_STASIS(victim)) + return + // in case the victim has the NOBLOOD trait, the wound will simply not clot on it's own - if(!no_bleeding) + if(limb.can_bleed()) set_blood_flow(min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW)) if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS)) @@ -123,7 +151,7 @@ adjust_blood_flow(-limb.current_gauze.absorption_rate * seconds_per_tick) limb.seep_gauze(limb.current_gauze.absorption_rate * seconds_per_tick) //otherwise, only clot if it's a bleeder - else if(!no_bleeding) + else if(limb.can_bleed()) adjust_blood_flow(-clot_rate * seconds_per_tick) if(blood_flow > highest_flow) @@ -131,36 +159,36 @@ if(blood_flow < minimum_flow) if(demotes_to) - replace_wound(demotes_to) + replace_wound(new demotes_to) else - to_chat(victim, span_green("The cut on your [limb.plaintext_zone] has [no_bleeding ? "healed up" : "stopped bleeding"]!")) + to_chat(victim, span_green("The cut on your [limb.plaintext_zone] has [!limb.can_bleed() ? "healed up" : "stopped bleeding"]!")) qdel(src) -/datum/wound/slash/on_stasis(seconds_per_tick, times_fired) +/datum/wound/slash/flesh/on_stasis(seconds_per_tick, times_fired) if(blood_flow >= minimum_flow) return if(demotes_to) - replace_wound(demotes_to) + replace_wound(new demotes_to) return qdel(src) /* BEWARE, THE BELOW NONSENSE IS MADNESS. bones.dm looks more like what I have in mind and is sufficiently clean, don't pay attention to this messiness */ -/datum/wound/slash/check_grab_treatments(obj/item/I, mob/user) +/datum/wound/slash/flesh/check_grab_treatments(obj/item/I, mob/user) if(istype(I, /obj/item/gun/energy/laser)) return TRUE if(I.get_temperature()) // if we're using something hot but not a cautery, we need to be aggro grabbing them first, so we don't try treating someone we're eswording return TRUE -/datum/wound/slash/treat(obj/item/I, mob/user) +/datum/wound/slash/flesh/treat(obj/item/I, mob/user) if(istype(I, /obj/item/gun/energy/laser)) - las_cauterize(I, user) + return las_cauterize(I, user) else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature()) - tool_cauterize(I, user) + return tool_cauterize(I, user) else if(istype(I, /obj/item/stack/medical/suture)) - suture(I, user) + return suture(I, user) -/datum/wound/slash/try_handling(mob/living/carbon/human/user) +/datum/wound/slash/flesh/try_handling(mob/living/carbon/human/user) if(user.pulling != victim || user.zone_selected != limb.body_zone || !victim.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE)) return FALSE if(DOING_INTERACTION_WITH_TARGET(user, victim)) @@ -175,16 +203,41 @@ return TRUE -/datum/wound/slash/on_xadone(power) +/// if a felinid is licking this cut to reduce bleeding +/datum/wound/slash/flesh/proc/lick_wounds(mob/living/carbon/human/user) + // transmission is one way patient -> felinid since google said cat saliva is antiseptic or whatever, and also because felinids are already risking getting beaten for this even without people suspecting they're spreading a deathvirus + for(var/i in victim.diseases) + var/datum/disease/iter_disease = i + if(iter_disease.spread_flags & (DISEASE_SPREAD_SPECIAL | DISEASE_SPREAD_NON_CONTAGIOUS)) + continue + user.ForceContractDisease(iter_disease) + + user.visible_message(span_notice("[user] begins licking the wounds on [victim]'s [limb.plaintext_zone]."), span_notice("You begin licking the wounds on [victim]'s [limb.plaintext_zone]..."), ignored_mobs=victim) + to_chat(victim, span_notice("[user] begins to lick the wounds on your [limb.plaintext_zone].")) + if(!do_after(user, base_treat_time, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return + + user.visible_message(span_notice("[user] licks the wounds on [victim]'s [limb.plaintext_zone]."), span_notice("You lick some of the wounds on [victim]'s [limb.plaintext_zone]"), ignored_mobs=victim) + to_chat(victim, span_green("[user] licks the wounds on your [limb.plaintext_zone]!")) + adjust_blood_flow(-0.5) + + if(blood_flow > minimum_flow) + try_handling(user) + else if(demotes_to) + to_chat(user, span_green("You successfully lower the severity of [victim]'s cuts.")) + +/datum/wound/slash/flesh/on_xadone(power) . = ..() - adjust_blood_flow(-0.03 * power) // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort -/datum/wound/slash/on_synthflesh(power) + if (limb) // parent can cause us to be removed, so its reasonable to check if we're still applied + adjust_blood_flow(-0.03 * power) // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort + +/datum/wound/slash/flesh/on_synthflesh(power) . = ..() adjust_blood_flow(-0.075 * power) // 20u * 0.075 = -1.5 blood flow, pretty good for how little effort it is /// If someone's putting a laser gun up to our cut to cauterize it -/datum/wound/slash/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user) +/datum/wound/slash/flesh/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user) var/self_penalty_mult = (user == victim ? 1.25 : 1) user.visible_message(span_warning("[user] begins aiming [lasgun] directly at [victim]'s [limb.plaintext_zone]..."), span_userdanger("You begin aiming [lasgun] directly at [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone]...")) if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) @@ -197,16 +250,17 @@ victim.emote("scream") adjust_blood_flow(-1 * (damage / (5 * self_penalty_mult))) // 20 / 5 = 4 bloodflow removed, p good victim.visible_message(span_warning("The cuts on [victim]'s [limb.plaintext_zone] scar over!")) + return TRUE /// If someone is using either a cautery tool or something with heat to cauterize this cut -/datum/wound/slash/proc/tool_cauterize(obj/item/I, mob/user) +/datum/wound/slash/flesh/proc/tool_cauterize(obj/item/I, mob/user) var/improv_penalty_mult = (I.tool_behaviour == TOOL_CAUTERY ? 1 : 1.25) // 25% longer and less effective if you don't use a real cautery var/self_penalty_mult = (user == victim ? 1.5 : 1) // 50% longer and less effective if you do it to yourself user.visible_message(span_danger("[user] begins cauterizing [victim]'s [limb.plaintext_zone] with [I]..."), span_warning("You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]...")) if(!do_after(user, base_treat_time * self_penalty_mult * improv_penalty_mult, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) return - var/bleeding_wording = (no_bleeding ? "cuts" : "bleeding") + var/bleeding_wording = (!limb.can_bleed() ? "cuts" : "bleeding") user.visible_message(span_green("[user] cauterizes some of the [bleeding_wording] on [victim]."), span_green("You cauterize some of the [bleeding_wording] on [victim].")) limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND) if(prob(30)) @@ -215,18 +269,27 @@ adjust_blood_flow(-blood_cauterized) if(blood_flow > minimum_flow) - try_treating(I, user) + return try_treating(I, user) else if(demotes_to) to_chat(user, span_green("You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.")) + return TRUE + return FALSE /// If someone is using a suture to close this cut -/datum/wound/slash/proc/suture(obj/item/stack/medical/suture/I, mob/user) +/datum/wound/slash/flesh/proc/suture(obj/item/stack/medical/suture/I, mob/user) var/self_penalty_mult = (user == victim ? 1.4 : 1) user.visible_message(span_notice("[user] begins stitching [victim]'s [limb.plaintext_zone] with [I]..."), span_notice("You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]...")) + var/treatment_delay = base_treat_time * self_penalty_mult - if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) - return - var/bleeding_wording = (no_bleeding ? "cuts" : "bleeding") + if(HAS_TRAIT(src, TRAIT_WOUND_SCANNED)) + treatment_delay *= 0.5 + user.visible_message(span_notice("[user] begins expertly stitching [victim]'s [limb.plaintext_zone] with [I]..."), span_notice("You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I], keeping the holo-image information in mind...")) + else + user.visible_message(span_notice("[user] begins stitching [victim]'s [limb.plaintext_zone] with [I]..."), span_notice("You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.plaintext_zone] with [I]...")) + + if(!do_after(user, treatment_delay, target = victim, extra_checks = CALLBACK(src, PROC_REF(still_exists)))) + return TRUE + var/bleeding_wording = (!limb.can_bleed() ? "cuts" : "bleeding") user.visible_message(span_green("[user] stitches up some of the [bleeding_wording] on [victim]."), span_green("You stitch up some of the [bleeding_wording] on [user == victim ? "yourself" : "[victim]"].")) var/blood_sutured = I.stop_bleeding / self_penalty_mult adjust_blood_flow(-blood_sutured) @@ -234,11 +297,16 @@ I.use(1) if(blood_flow > minimum_flow) - try_treating(I, user) + return try_treating(I, user) else if(demotes_to) to_chat(user, span_green("You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] cuts.")) + return TRUE + return TRUE + +/datum/wound/slash/get_limb_examine_description() + return span_warning("The flesh on this limb appears badly lacerated.") -/datum/wound/slash/moderate +/datum/wound/slash/flesh/moderate name = "Rough Abrasion" desc = "Patient's skin has been badly scraped, generating moderate blood loss." treat_text = "Application of clean bandages or first-aid grade sutures, followed by food and rest." @@ -249,16 +317,22 @@ initial_flow = 2 minimum_flow = 0.5 clot_rate = 0.05 - threshold_minimum = 20 threshold_penalty = 10 - status_effect_type = /datum/status_effect/wound/slash/moderate + status_effect_type = /datum/status_effect/wound/slash/flesh/moderate scar_keyword = "slashmoderate" -/datum/wound/slash/moderate/update_descriptions() - if(no_bleeding) +/datum/wound/slash/flesh/moderate/update_descriptions() + if(!limb.can_bleed()) occur_text = "is cut open" -/datum/wound/slash/severe +/datum/wound_pregen_data/flesh_slash/abrasion + abstract = FALSE + + wound_path_to_generate = /datum/wound/slash/flesh/moderate + + threshold_minimum = 20 + +/datum/wound/slash/flesh/severe name = "Open Laceration" desc = "Patient's skin is ripped clean open, allowing significant blood loss." treat_text = "Speedy application of first-aid grade sutures and clean bandages, followed by vitals monitoring to ensure recovery." @@ -269,48 +343,74 @@ initial_flow = 3.25 minimum_flow = 2.75 clot_rate = 0.03 - threshold_minimum = 50 threshold_penalty = 25 - demotes_to = /datum/wound/slash/moderate - status_effect_type = /datum/status_effect/wound/slash/severe + demotes_to = /datum/wound/slash/flesh/moderate + status_effect_type = /datum/status_effect/wound/slash/flesh/severe scar_keyword = "slashsevere" -/datum/wound/slash/severe/update_descriptions() - if(no_bleeding) +/datum/wound_pregen_data/flesh_slash/laceration + abstract = FALSE + + wound_path_to_generate = /datum/wound/slash/flesh/severe + + threshold_minimum = 50 + +/datum/wound/slash/flesh/severe/update_descriptions() + if(!limb.can_bleed()) occur_text = "is ripped open" -/datum/wound/slash/critical +/datum/wound/slash/flesh/critical name = "Weeping Avulsion" desc = "Patient's skin is completely torn open, along with significant loss of tissue. Extreme blood loss will lead to quick death without intervention." treat_text = "Immediate bandaging and either suturing or cauterization, followed by supervised resanguination." examine_desc = "is carved down to the bone, spraying blood wildly" - examine_desc = "is carved down to the bone" occur_text = "is torn open, spraying blood wildly" - occur_text = "is torn open" sound_effect = 'sound/effects/wounds/blood3.ogg' severity = WOUND_SEVERITY_CRITICAL initial_flow = 4 minimum_flow = 3.85 clot_rate = -0.015 // critical cuts actively get worse instead of better - threshold_minimum = 80 threshold_penalty = 40 - demotes_to = /datum/wound/slash/severe - status_effect_type = /datum/status_effect/wound/slash/critical + demotes_to = /datum/wound/slash/flesh/severe + status_effect_type = /datum/status_effect/wound/slash/flesh/critical scar_keyword = "slashcritical" - wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE | MANGLES_FLESH) + wound_flags = (ACCEPTS_GAUZE | MANGLES_EXTERIOR | CAN_BE_GRASPED) + +/datum/wound/slash/flesh/critical/update_descriptions() + if (!limb.can_bleed()) + occur_text = "is torn open" + +/datum/wound_pregen_data/flesh_slash/avulsion + abstract = FALSE + + wound_path_to_generate = /datum/wound/slash/flesh/critical -/datum/wound/slash/moderate/many_cuts + threshold_minimum = 80 + +/datum/wound/slash/flesh/moderate/many_cuts name = "Numerous Small Slashes" desc = "Patient's skin has numerous small slashes and cuts, generating moderate blood loss." examine_desc = "has a ton of small cuts" occur_text = "is cut numerous times, leaving many small slashes." +/datum/wound_pregen_data/flesh_slash/abrasion/cuts + abstract = FALSE + can_be_randomly_generated = FALSE + + wound_path_to_generate = /datum/wound/slash/flesh/moderate/many_cuts + // Subtype for cleave (heretic spell) -/datum/wound/slash/critical/cleave +/datum/wound/slash/flesh/critical/cleave name = "Burning Avulsion" examine_desc = "is ruptured, spraying blood wildly" clot_rate = 0.01 -/datum/wound/slash/critical/cleave/update_descriptions() - if(no_bleeding) +/datum/wound/slash/flesh/critical/cleave/update_descriptions() + if(!limb.can_bleed()) occur_text = "is ruptured" + +/datum/wound_pregen_data/flesh_slash/avulsion/clear + abstract = FALSE + can_be_randomly_generated = FALSE + + wound_path_to_generate = /datum/wound/slash/flesh/critical/cleave diff --git a/code/game/alternate_appearance.dm b/code/game/alternate_appearance.dm index 994f51d13dfc..9b8a813c7398 100644 --- a/code/game/alternate_appearance.dm +++ b/code/game/alternate_appearance.dm @@ -149,7 +149,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) /datum/atom_hud/alternate_appearance/basic/blessed_aware/mobShouldSee(mob/M) if(M.mind?.holy_role) return TRUE - if (istype(M, /mob/living/simple_animal/hostile/construct/wraith)) + if (istype(M, /mob/living/basic/construct/wraith)) return TRUE if(isrevenant(M) || IS_WIZARD(M) || IS_CLOCK(M)) //monkestation edit: adds IS_CLOCK check return TRUE diff --git a/code/game/atom_defense.dm b/code/game/atom_defense.dm index dd4cbbc46b45..7d6fa23911f9 100644 --- a/code/game/atom_defense.dm +++ b/code/game/atom_defense.dm @@ -134,6 +134,8 @@ /// A cut-out proc for [/atom/proc/bullet_act] so living mobs can have their own armor behavior checks without causing issues with needing their own on_hit call /atom/proc/check_projectile_armor(def_zone, obj/projectile/impacting_projectile, is_silent) + if(uses_integrity) + return clamp(PENETRATE_ARMOUR(get_armor_rating(impacting_projectile.armor_flag), impacting_projectile.armour_penetration), 0, 100) return 0 /** diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 7457d488f115..f9d67571b784 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -393,6 +393,8 @@ /atom/proc/CanPass(atom/movable/mover, border_dir) SHOULD_CALL_PARENT(TRUE) SHOULD_BE_PURE(TRUE) + if(SEND_SIGNAL(src, COMSIG_ATOM_TRIED_PASS, mover, border_dir) & COMSIG_COMPONENT_PERMIT_PASSAGE) + return TRUE if(mover.movement_type & PHASING) return TRUE . = CanAllowThrough(mover, border_dir) @@ -456,10 +458,6 @@ if(!current_turf) return FALSE - // Syndicate base is loaded in a reserved level. If not reserved, we don't care. - if(!is_reserved_level(current_turf.z)) - return FALSE - var/static/list/syndie_typecache = typecacheof(list( /area/centcom/syndicate_mothership, // syndicate base itself /area/shuttle/assault_pod, // steel rain @@ -616,6 +614,7 @@ SEND_SIGNAL(source, COMSIG_REAGENTS_EXPOSE_ATOM, src, reagents, methods, volume_modifier, show_message) for(var/datum/reagent/current_reagent as anything in reagents) . |= current_reagent.expose_atom(src, reagents[current_reagent]) + SEND_SIGNAL(src, COMSIG_ATOM_AFTER_EXPOSE_REAGENTS, reagents, source, methods, volume_modifier, show_message) /// Are you allowed to drop this atom /atom/proc/AllowDrop() @@ -644,19 +643,33 @@ /** * React to a hit by a projectile object * - * Default behaviour is to send the [COMSIG_ATOM_BULLET_ACT] and then call [on_hit][/obj/projectile/proc/on_hit] on the projectile. - * * @params - * hitting_projectile - projectile - * def_zone - zone hit - * piercing_hit - is this hit piercing or normal? + * * hitting_projectile - projectile + * * def_zone - zone hit + * * piercing_hit - is this hit piercing or normal? */ /atom/proc/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) + SHOULD_CALL_PARENT(TRUE) + + var/sigreturn = SEND_SIGNAL(src, COMSIG_ATOM_PRE_BULLET_ACT, hitting_projectile, def_zone) + if(sigreturn & COMPONENT_BULLET_PIERCED) + return BULLET_ACT_FORCE_PIERCE + if(sigreturn & COMPONENT_BULLET_BLOCKED) + return BULLET_ACT_BLOCK + if(sigreturn & COMPONENT_BULLET_ACTED) + return BULLET_ACT_HIT + SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, hitting_projectile, def_zone) - // This armor check only matters for the visuals and messages in on_hit(), it's not actually used to reduce damage since - // only living mobs use armor to reduce damage, but on_hit() is going to need the value no matter what is shot. - var/visual_armor_check = check_projectile_armor(def_zone, hitting_projectile) - . = hitting_projectile.on_hit(src, visual_armor_check, def_zone, piercing_hit) + if(QDELETED(hitting_projectile)) // Signal deleted it? + return BULLET_ACT_BLOCK + + return hitting_projectile.on_hit( + target = src, + // This armor check only matters for the visuals and messages in on_hit(), it's not actually used to reduce damage since + // only living mobs use armor to reduce damage, but on_hit() is going to need the value no matter what is shot. + blocked = check_projectile_armor(def_zone, hitting_projectile), + pierce_hit = piercing_hit, + ) ///Return true if we're inside the passed in atom /atom/proc/in_contents_of(container)//can take class or object instance as argument @@ -2098,16 +2111,14 @@ * For turfs this will only be used if pathing_pass_method is TURF_PATHING_PASS_PROC * * Arguments: - * * ID- An ID card representing what access we have (and thus if we can open things like airlocks or windows to pass through them). The ID card's physical location does not matter, just the reference - * * to_dir- What direction we're trying to move in, relevant for things like directional windows that only block movement in certain directions - * * caller- The movable we're checking pass flags for, if we're making any such checks - * * no_id: When true, doors with public access will count as impassible + * * to_dir - What direction we're trying to move in, relevant for things like directional windows that only block movement in certain directions + * * pass_info - Datum that stores info about the thing that's trying to pass us * * IMPORTANT NOTE: /turf/proc/LinkBlockedWithAccess assumes that overrides of CanAStarPass will always return true if density is FALSE * If this is NOT you, ensure you edit your can_astar_pass variable. Check __DEFINES/path.dm **/ -/atom/proc/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller, no_id = FALSE) - if(caller && (caller.pass_flags & pass_flags_self)) +/atom/proc/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + if(pass_info.pass_flags & pass_flags_self) return TRUE . = !density diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index c2ee234d5857..527ed55b2f1b 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -15,7 +15,11 @@ var/tk_throw_range = 10 var/mob/pulledby = null var/initial_language_holder = /datum/language_holder - var/datum/language_holder/language_holder // Mindless mobs and objects need language too, some times. Mind holder takes prescedence. + /// Holds all languages this mob can speak and understand + var/datum/language_holder/language_holder + /// The list of factions this atom belongs to + var/list/faction + var/verb_say = "says" var/verb_ask = "asks" var/verb_exclaim = "exclaims" @@ -411,7 +415,7 @@ else to_chat(src, span_warning("You are not Superman.")) return FALSE - if(!(z_move_flags & ZMOVE_IGNORE_OBSTACLES) && !(start.zPassOut(src, direction, destination, (z_move_flags & ZMOVE_ALLOW_ANCHORED)) && destination.zPassIn(src, direction, start))) + if((!(z_move_flags & ZMOVE_IGNORE_OBSTACLES) && !(start.zPassOut(direction) && destination.zPassIn(direction))) || (!(z_move_flags & ZMOVE_ALLOW_ANCHORED) && anchored)) if(z_move_flags & ZMOVE_FEEDBACK) to_chat(rider || src, span_warning("You couldn't move there!")) return FALSE @@ -1589,6 +1593,11 @@ pulling.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), CHOKEHOLD_TRAIT) if(. >= GRAB_NECK) // Previous state was a a neck-grab or higher. REMOVE_TRAIT(pulling, TRAIT_FLOORED, CHOKEHOLD_TRAIT) + if(ismob(src)) + var/mob/grabbed = src + if(grabbed.stat == SOFT_CRIT || grabbed.stat == HARD_CRIT) + pulling.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), CHOKEHOLD_TRAIT) + if(GRAB_AGGRESSIVE) if(. >= GRAB_NECK) // Grab got downgraded. REMOVE_TRAIT(pulling, TRAIT_FLOORED, CHOKEHOLD_TRAIT) @@ -1664,3 +1673,20 @@ */ /atom/movable/proc/keybind_face_direction(direction) setDir(direction) + +/** + * Check if the other atom/movable has any factions the same as us. Defined at the atom/movable level so it can be defined for just about anything. + * + * If exact match is set, then all our factions must match exactly + */ +/atom/movable/proc/faction_check_atom(atom/movable/target, exact_match) + if(!exact_match) + return faction_check(faction, target.faction, FALSE) + + var/list/faction_src = LAZYCOPY(faction) + var/list/faction_target = LAZYCOPY(target.faction) + if(!("[REF(src)]" in faction_target)) //if they don't have our ref faction, remove it from our factions list. + faction_src -= "[REF(src)]" //if we don't do this, we'll never have an exact match. + if(!("[REF(target)]" in faction_src)) + faction_target -= "[REF(target)]" //same thing here. + return faction_check(faction_src, faction_target, TRUE) diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index c8c1b2d45064..0d44d47d946f 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -135,7 +135,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) var/waittime_h = 1800 /// Maximum amount of threat allowed to generate. - var/max_threat_level = 50 + var/max_threat_level = 0 //disables dynamic threat PLEASE DONT LET ME MERGE THIS /// The extra chance multiplier that a heavy impact midround ruleset will run next time. /// For example, if this is set to 50, then the next heavy roll will be about 50% more likely to happen. @@ -308,26 +308,26 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) show_core_territory = !show_core_territory if (show_core_territory) - . += "Advisory Level: Blue Star
" - . += "Your sector's advisory level is Blue Star. At this threat advisory, the risk of attacks on Nanotrasen assets within the sector is minor, but cannot be ruled out entirely. Remain vigilant." + . += "Advisory Level: Chimpcon 1
" + . += "Your sector's advisory level is Chimpcon 1. At this threat advisory, the risk of attacks on Nanotrasen assets within the sector is minor, but cannot be ruled out entirely. Remain vigilant." else - . += "Advisory Level: Green Star
" - . += "Your sector's advisory level is Green Star. Surveillance information shows no credible threats to Nanotrasen assets within the Spinward Sector at this time. As always, the Department advises maintaining vigilance against potential threats, regardless of a lack of known threats." + . += "Advisory Level: Chimpcon 0
" + . += "Your sector's advisory level is Chimpcon 0. Surveillance information shows no credible threats to Nanotrasen assets within the Spinward Sector at this time. As always, the Department advises maintaining vigilance against potential threats, regardless of a lack of known threats." if(20 to 39) - . += "Advisory Level: Yellow Star
" - . += "Your sector's advisory level is Yellow Star. Surveillance shows a credible risk of enemy attack against our assets in the Spinward Sector. We advise a heightened level of security, alongside maintaining vigilance against potential threats." + . += "Advisory Level: Chimpcon 2
" + . += "Your sector's advisory level is Chimpcon 2. Surveillance shows a credible risk of enemy attack against our assets in the Spinward Sector. We advise a heightened level of security, alongside maintaining vigilance against potential threats." if(40 to 65) - . += "Advisory Level: Orange Star
" - . += "Your sector's advisory level is Orange Star. Upon reviewing your sector's intelligence, the Department has determined that the risk of enemy activity is moderate to severe. At this advisory, we recommend maintaining a higher degree of security and alertness, and vigilance against threats that may (or will) arise." + . += "Advisory Level: Chimpcon 3
" + . += "Your sector's advisory level is Chimpcon 3. Upon reviewing your sector's intelligence, the Department has determined that the risk of enemy activity is moderate to severe. At this advisory, we recommend maintaining a higher degree of security and alertness, and vigilance against threats that may (or will) arise." if(66 to 79) - . += "Advisory Level: Red Star
" - . += "Your sector's advisory level is Red Star. The Department of Intelligence has decrypted Cybersun communications suggesting a high likelihood of attacks on Nanotrasen assets within the Spinward Sector. Stations in the region are advised to remain highly vigilant for signs of enemy activity and to be on high alert." + . += "Advisory Level: Chimpcon 4
" + . += "Your sector's advisory level is Chimpcon 4. The Department of Intelligence has decrypted Cybersun communications suggesting a high likelihood of attacks on Nanotrasen assets within the Spinward Sector. Stations in the region are advised to remain highly vigilant for signs of enemy activity and to be on high alert." if(80 to 99) - . += "Advisory Level: Black Orbit
" - . += "Your sector's advisory level is Black Orbit. Your sector's local comms network is currently undergoing a blackout, and we are therefore unable to accurately judge enemy movements within the region. However, information passed to us by GDI suggests a high amount of enemy activity in the sector, indicative of an impending attack. Remain on high alert, and as always, we advise remaining vigilant against any other potential threats." + . += "Advisory Level: Chimpcon 5
" + . += "Your sector's advisory level is Chimpcon 5. Your sector's local comms network is currently undergoing a blackout, and we are therefore unable to accurately judge enemy movements within the region. However, information passed to us by GDI suggests a high amount of enemy activity in the sector, indicative of an impending attack. Remain on high alert, and as always, we advise remaining vigilant against any other potential threats." if(100) - . += "Advisory Level: Midnight Sun
" - . += "Your sector's advisory level is Midnight Sun. Credible information passed to us by GDI suggests that the Syndicate is preparing to mount a major concerted offensive on Nanotrasen assets in the Spinward Sector to cripple our foothold there. All stations should remain on high alert and prepared to defend themselves." + . += "Advisory Level: Chimpcon 6
" + . += "Your sector's advisory level is Chimpcon 6. Credible information passed to us by GDI suggests that the Syndicate is preparing to mount a major concerted offensive on Nanotrasen assets in the Spinward Sector to cripple our foothold there. All stations should remain on high alert and prepared to defend themselves." var/min_threat = 100 for(var/datum/dynamic_ruleset/ruleset as anything in init_rulesets(/datum/dynamic_ruleset)) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index 0981cabac877..040a2397bfab 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -52,7 +52,7 @@ /datum/dynamic_ruleset/latejoin/infiltrator name = "Syndicate Infiltrator" - antag_datum = /datum/antagonist/traitor + antag_datum = /datum/antagonist/traitor/infiltrator antag_flag = ROLE_SYNDICATE_INFILTRATOR antag_flag_override = ROLE_TRAITOR protected_roles = list( diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index 5ab88b19956c..d9f9c60cacaa 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -211,7 +211,7 @@ /datum/dynamic_ruleset/midround/from_living/autotraitor name = "Syndicate Sleeper Agent" midround_ruleset_style = MIDROUND_RULESET_STYLE_LIGHT - antag_datum = /datum/antagonist/traitor + antag_datum = /datum/antagonist/traitor/infiltrator/sleeper_agent antag_flag = ROLE_SLEEPER_AGENT antag_flag_override = ROLE_TRAITOR protected_roles = list( @@ -257,7 +257,7 @@ var/mob/M = pick(candidates) assigned += M candidates -= M - var/datum/antagonist/traitor/newTraitor = new + var/datum/antagonist/traitor/infiltrator/sleeper_agent/newTraitor = new M.mind.add_antag_datum(newTraitor) message_admins("[ADMIN_LOOKUPFLW(M)] was selected by the [name] ruleset and has been made into a midround traitor.") log_dynamic("[key_name(M)] was selected by the [name] ruleset and has been made into a midround traitor.") @@ -370,7 +370,6 @@ cost = 7 minimum_round_time = 70 MINUTES requirements = REQUIREMENTS_VERY_HIGH_THREAT_NEEDED - ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_NUKIEBASE) flags = HIGH_IMPACT_RULESET var/list/operative_cap = list(2,2,3,3,4,5,5,5,5,5) @@ -577,7 +576,7 @@ var/datum/mind/player_mind = new /datum/mind(applicant.key) player_mind.active = TRUE - var/mob/living/simple_animal/hostile/space_dragon/S = new (pick(spawn_locs)) + var/mob/living/basic/space_dragon/S = new (pick(spawn_locs)) player_mind.transfer_to(S) player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/space_dragon)) player_mind.special_role = ROLE_SPACE_DRAGON @@ -715,7 +714,7 @@ . = ..() /datum/dynamic_ruleset/midround/from_ghosts/revenant/generate_ruleset_body(mob/applicant) - var/mob/living/simple_animal/revenant/revenant = new(pick(spawn_locs)) + var/mob/living/basic/revenant/revenant = new(pick(spawn_locs)) revenant.key = applicant.key message_admins("[ADMIN_LOOKUPFLW(revenant)] has been made into a revenant by the midround ruleset.") log_game("[key_name(revenant)] was spawned as a revenant by the midround ruleset.") diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index b0404e7250a4..d016b0429037 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -450,7 +450,6 @@ requirements = list(90,90,90,80,60,40,30,20,10,10) flags = HIGH_IMPACT_RULESET antag_cap = list("denominator" = 18, "offset" = 1) - ruleset_lazy_templates = list(LAZY_TEMPLATE_KEY_NUKIEBASE) var/required_role = ROLE_NUCLEAR_OPERATIVE var/datum/team/nuclear/nuke_team diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 6470b2e9c7e3..08e88d1511e0 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -56,15 +56,19 @@ /datum/game_mode/proc/make_antag_chance(mob/living/carbon/human/character) return -/datum/game_mode/proc/check_finished(force_ending) //to be called by SSticker +/// Checks if the round should be ending, called every ticker tick +/datum/game_mode/proc/check_finished() if(!SSticker.setup_done) return FALSE if(SSshuttle.emergency && (SSshuttle.emergency.mode == SHUTTLE_ENDGAME)) return TRUE if(GLOB.station_was_nuked) return TRUE - if(force_ending) +/* MONKEYSTATION EDIT REMOVAL - lets be honest, everyone wants the round to end after revs win but uh... im not gonna add it in an ACHIEVEMENTS PR. This is for the sake of having it for later and resolving a conflict. Long comments much? + if(GLOB.revolutionary_win) return TRUE +*/ + return FALSE /* * Generate a list of station goals available to purchase to report to the crew. diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index ba559c367da0..9e1ae52dc9ac 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -124,6 +124,40 @@ targetitem = /obj/item/clothing/shoes/clown_shoes excludefromjob = list(JOB_CLOWN, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) item_owner = list(JOB_CLOWN) + exists_on_map = TRUE + +/obj/item/clothing/shoes/clown_shoes/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/shoes/clown_shoes) + +/datum/objective_item/steal/traitor/mime_mask + name = "the mime's mask" + targetitem = /obj/item/clothing/mask/gas/mime + excludefromjob = list(JOB_MIME, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) + item_owner = list(JOB_MIME) + exists_on_map = TRUE + +/obj/item/clothing/mask/gas/mime/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/mask/gas/mime) + +/datum/objective_item/steal/traitor/pka + name = "a protokinetic accelerator" + targetitem = /obj/item/gun/energy/recharge/kinetic_accelerator + excludefromjob = list(JOB_SHAFT_MINER, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) + item_owner = list(JOB_SHAFT_MINER) + exists_on_map = TRUE + +/obj/item/gun/energy/recharge/kinetic_accelerator/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/gun/energy/recharge/kinetic_accelerator) + +/datum/objective_item/steal/traitor/chef_moustache + name = "a fancy fake moustache" + targetitem = /obj/item/clothing/mask/fakemoustache/italian + excludefromjob = list(JOB_COOK, JOB_HEAD_OF_PERSONNEL, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) + item_owner = list(JOB_COOK) + exists_on_map = TRUE + +/obj/item/clothing/mask/fakemoustache/italian/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/mask/fakemoustache/italian) /datum/objective_item/steal/traitor/det_revolver name = "detective's revolver" @@ -134,6 +168,16 @@ /obj/item/gun/ballistic/revolver/c38/detective/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/gun/ballistic/revolver/c38/detective) +/datum/objective_item/steal/traitor/lawyers_badge + name = "the lawyer's badge" + targetitem = /obj/item/clothing/accessory/lawyers_badge + excludefromjob = list(JOB_LAWYER) + item_owner = list(JOB_LAWYER) + exists_on_map = TRUE + +/obj/item/clothing/accessory/lawyers_badge/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/accessory/lawyers_badge) + /datum/objective_item/steal/traitor/chief_engineer_belt name = "the chief engineer's belt" targetitem = /obj/item/storage/belt/utility/chief @@ -300,6 +344,7 @@ /datum/objective_item/steal/documents name = "any set of secret documents of any organization" + valid_containers = list(/obj/item/folder) targetitem = /obj/item/documents exists_on_map = TRUE @@ -401,3 +446,79 @@ /obj/item/blackbox/add_stealing_item_objective() return add_item_to_steal(src, /obj/item/blackbox) + + +// A number of special early-game steal objectives intended to be used with the steal-and-destroy objective. +// They're basically items of utility or emotional value that may be found on many players or lying around the station. +/datum/objective_item/steal/traitor/insuls + name = "insulated gloves" + targetitem = /obj/item/clothing/gloves/color/yellow + excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_ATMOSPHERIC_TECHNICIAN, JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER) + item_owner = list(JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER) + exists_on_map = TRUE + +/obj/item/clothing/gloves/color/yellow/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/clothing/gloves/color/yellow) + +/datum/objective_item/steal/traitor/moth_plush + name = "cute moth plush toy" + targetitem = /obj/item/toy/plush/moth + excludefromjob = list(JOB_PSYCHOLOGIST, JOB_PARAMEDIC, JOB_CHEMIST, JOB_MEDICAL_DOCTOR, JOB_VIROLOGIST, JOB_CHIEF_MEDICAL_OFFICER) + exists_on_map = TRUE + +/obj/item/toy/plush/moth/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/toy/plush/moth) + +/datum/objective_item/steal/traitor/lizard_plush + name = "cute lizard plush toy" + targetitem = /obj/item/toy/plush/lizard_plushie + exists_on_map = TRUE + +/obj/item/toy/plush/lizard_plushie/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/toy/plush/lizard_plushie) + +/datum/objective_item/steal/traitor/denied_stamp + name = "cargo's denied stamp" + targetitem = /obj/item/stamp/denied + excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_SHAFT_MINER) + exists_on_map = TRUE + +/obj/item/stamp/denied/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/stamp/denied) + +/datum/objective_item/steal/traitor/granted_stamp + name = "cargo's granted stamp" + targetitem = /obj/item/stamp/granted + excludefromjob = list(JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER, JOB_SHAFT_MINER) + exists_on_map = TRUE + +/obj/item/stamp/granted/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/stamp/granted) + +/datum/objective_item/steal/traitor/space_law + name = "a book on space law" + targetitem = /obj/item/book/manual/wiki/security_space_law + excludefromjob = list(JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_HEAD_OF_SECURITY, JOB_LAWYER, JOB_DETECTIVE) + exists_on_map = TRUE + +/obj/item/book/manual/wiki/security_space_law/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/book/manual/wiki/security_space_law) + +/datum/objective_item/steal/traitor/rpd + name = "rapid pipe dispenser" + targetitem = /obj/item/pipe_dispenser + excludefromjob = list(JOB_ATMOSPHERIC_TECHNICIAN, JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER, JOB_SCIENTIST, JOB_RESEARCH_DIRECTOR, JOB_GENETICIST, JOB_ROBOTICIST) + item_owner = list(JOB_CHIEF_ENGINEER) + exists_on_map = TRUE + +/obj/item/pipe_dispenser/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/pipe_dispenser) + +/datum/objective_item/steal/traitor/donut_box + name = "a box of prized donuts" + targetitem = /obj/item/storage/fancy/donut_box + excludefromjob = list(JOB_CAPTAIN, JOB_CHIEF_ENGINEER, JOB_HEAD_OF_PERSONNEL, JOB_HEAD_OF_SECURITY, JOB_QUARTERMASTER, JOB_CHIEF_MEDICAL_OFFICER, JOB_RESEARCH_DIRECTOR, JOB_SECURITY_OFFICER, JOB_WARDEN, JOB_LAWYER, JOB_DETECTIVE) + exists_on_map = TRUE + +/obj/item/storage/fancy/donut_box/add_stealing_item_objective() + return add_item_to_steal(src, /obj/item/storage/fancy/donut_box) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 2d6abc921ce7..5fca4a56b0d1 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -592,13 +592,7 @@ if(!isliving(user)) return FALSE //no ghosts allowed, sorry - var/is_dextrous = FALSE - if(isanimal(user)) - var/mob/living/simple_animal/user_as_animal = user - if (user_as_animal.dextrous) - is_dextrous = TRUE - - if(!issilicon(user) && !is_dextrous && !user.can_hold_items()) + if(!issilicon(user) && !user.can_hold_items()) return FALSE //spiders gtfo if(issilicon(user)) // If we are a silicon, make sure the machine allows silicons to interact with it @@ -745,7 +739,7 @@ return update_last_used(user) -/obj/machinery/tool_act(mob/living/user, obj/item/tool, tool_type) +/obj/machinery/tool_act(mob/living/user, obj/item/tool, tool_type, is_right_clicking) if(SEND_SIGNAL(user, COMSIG_TRY_USE_MACHINE, src) & COMPONENT_CANT_USE_MACHINE_TOOLS) return TOOL_ACT_MELEE_CHAIN_BLOCKING . = ..() diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm index 8a18bd039761..af686c27d624 100644 --- a/code/game/machinery/airlock_control.dm +++ b/code/game/machinery/airlock_control.dm @@ -9,6 +9,7 @@ /obj/machinery/door/airlock/Initialize(mapload) . = ..() RegisterSignal(SSdcs, COMSIG_GLOB_GREY_TIDE, PROC_REF(grey_tide)) + RegisterSignal(SSdcs, COMSIG_GLOBAL_GREY_TIDE_TRAITOR, PROC_REF(grey_tide)) //monkestation edit /// Forces the airlock to unbolt and open /obj/machinery/door/airlock/proc/secure_open() @@ -35,7 +36,7 @@ locked = FALSE return ..() -/obj/machinery/door/airlock/proc/grey_tide(datum/source, list/grey_tide_areas) +/obj/machinery/door/airlock/proc/grey_tide(datum/source, list/grey_tide_areas, traitor_bug = FALSE) //monkestation edit: adds traitor_bug SIGNAL_HANDLER if(!is_station_level(z) || critical_machine) @@ -44,7 +45,12 @@ for(var/area_type in grey_tide_areas) if(!istype(get_area(src), area_type)) continue - INVOKE_ASYNC(src, PROC_REF(prison_open)) //Sleep gets called further down in open(), so we have to invoke async +//monkestation edit start + if(traitor_bug) + INVOKE_ASYNC(src, PROC_REF(traitor_bug_tide)) + else +//monkestation edit end + INVOKE_ASYNC(src, PROC_REF(prison_open)) //Sleep gets called further down in open(), so we have to invoke async /obj/machinery/airlock_sensor icon = 'icons/obj/airlock_machines.dmi' diff --git a/code/game/machinery/computer/arcade/orion.dm b/code/game/machinery/computer/arcade/orion.dm index e883b35fe1df..5bcd81b9b49c 100644 --- a/code/game/machinery/computer/arcade/orion.dm +++ b/code/game/machinery/computer/arcade/orion.dm @@ -499,7 +499,7 @@ GLOBAL_LIST_INIT(orion_events, generate_orion_events()) newgame() obj_flags |= EMAGGED -/mob/living/basic/syndicate/ranged/smg/orion +/mob/living/basic/trooper/syndicate/ranged/smg/orion name = "spaceport security" desc = "Premier corporate security forces for all spaceports found along the Orion Trail." faction = list(FACTION_ORION) diff --git a/code/game/machinery/computer/arcade/orion_event.dm b/code/game/machinery/computer/arcade/orion_event.dm index ea81b67532d1..97590059a526 100644 --- a/code/game/machinery/computer/arcade/orion_event.dm +++ b/code/game/machinery/computer/arcade/orion_event.dm @@ -525,7 +525,7 @@ game.say("WEEWOO! WEEWOO! Spaceport security en route!") playsound(game, 'sound/items/weeoo1.ogg', 100, FALSE) for(var/i in 1 to 3) - var/mob/living/basic/syndicate/ranged/smg/orion/spaceport_security = new(get_turf(game)) + var/mob/living/basic/trooper/syndicate/ranged/smg/orion/spaceport_security = new(get_turf(game)) spaceport_security.ai_controller.set_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET, usr) game.fuel += fuel game.food += food diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 99c5dc00eb7f..1560d1f17228 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -248,9 +248,9 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) if (jobs[trim_assignment] != null) entry["ijob"] = jobs[trim_assignment] - // Binary living/dead status + // Current status if (sensor_mode >= SENSOR_LIVING) - entry["life_status"] = (tracked_living_mob.stat != DEAD) + entry["life_status"] = tracked_living_mob.stat // Damage if (sensor_mode >= SENSOR_VITALS) diff --git a/code/game/machinery/computer/orders/order_items/mining/order_toys.dm b/code/game/machinery/computer/orders/order_items/mining/order_toys.dm index 06bd9032e74e..cd1dbf5c6748 100644 --- a/code/game/machinery/computer/orders/order_items/mining/order_toys.dm +++ b/code/game/machinery/computer/orders/order_items/mining/order_toys.dm @@ -14,7 +14,7 @@ cost_per_order = 300 /datum/orderable_item/toys_drones/mining_drone - item_path = /mob/living/simple_animal/hostile/mining_drone + item_path = /mob/living/basic/mining_drone cost_per_order = 800 /datum/orderable_item/toys_drones/drone_health diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm index e3d3a0e2acba..88ca3b05df78 100644 --- a/code/game/machinery/computer/robot.dm +++ b/code/game/machinery/computer/robot.dm @@ -64,15 +64,15 @@ data["cyborgs"] += list(cyborg_data) data["drones"] = list() - for(var/mob/living/simple_animal/drone/D in GLOB.drones_list) - if(D.hacked) + for(var/mob/living/basic/drone/drone in GLOB.drones_list) + if(drone.hacked) continue - if(!is_valid_z_level(current_turf, get_turf(D))) + if(!is_valid_z_level(current_turf, get_turf(drone))) continue var/list/drone_data = list( - name = D.name, - status = D.stat, - ref = REF(D) + name = drone.name, + status = drone.stat, + ref = REF(drone) ) data["drones"] += list(drone_data) @@ -129,7 +129,7 @@ if("killdrone") if(allowed(usr)) - var/mob/living/simple_animal/drone/drone = locate(params["ref"]) in GLOB.mob_list + var/mob/living/basic/drone/drone = locate(params["ref"]) in GLOB.mob_list if(drone.hacked) to_chat(usr, span_danger("ERROR: [drone] is not responding to external commands.")) else diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 2701f72b08a5..3996d4876416 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1323,9 +1323,9 @@ assemblytype = initial(airlock.assemblytype) update_appearance() -/obj/machinery/door/airlock/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller, no_id = FALSE) +/obj/machinery/door/airlock/CanAStarPass(to_dir, datum/can_pass_info/pass_info) //Airlock is passable if it is open (!density), bot has access, and is not bolted shut or powered off) - return !density || (check_access(ID) && !locked && hasPower() && !no_id) + return !density || (check_access_list(pass_info.access) && !locked && hasPower() && !pass_info.no_id) /obj/machinery/door/airlock/emag_act(mob/user, obj/item/card/emag/doorjack/D) if(!operating && density && hasPower() && !(obj_flags & EMAGGED)) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 5ec731e98684..bca6cd2893dc 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -299,6 +299,8 @@ if(istype(tool, /obj/item/crowbar)) var/obj/item/crowbar/crowbar = tool forced_open = crowbar.force_opens + if(istype(tool, /obj/item/slasher_machette)) + forced_open = TRUE try_to_crowbar(tool, user, forced_open) return TOOL_ACT_TOOLTYPE_SUCCESS diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index e76c1c6f3001..2ae397ee73fe 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -721,7 +721,7 @@ if(!(border_dir == dir)) //Make sure looking at appropriate border return TRUE -/obj/machinery/door/firedoor/border_only/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller, no_id = FALSE) +/obj/machinery/door/firedoor/border_only/CanAStarPass(to_dir, datum/can_pass_info/pass_info) return !density || (dir != to_dir) /obj/machinery/door/firedoor/border_only/proc/on_exit(datum/source, atom/movable/leaving, direction) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index a1dbe5961e94..e9cb682a6fd5 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -186,8 +186,8 @@ return TRUE //used in the AStar algorithm to determinate if the turf the door is on is passable -/obj/machinery/door/window/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller, no_id = FALSE) - return !density || (dir != to_dir) || (check_access(ID) && hasPower() && !no_id) +/obj/machinery/door/window/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + return !density || (dir != to_dir) || (check_access_list(pass_info.access) && hasPower() && !pass_info.no_id) /obj/machinery/door/window/proc/on_exit(datum/source, atom/movable/leaving, direction) SIGNAL_HANDLER diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 9c98916ecdbe..e691c5d9fc1b 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -245,12 +245,12 @@ if(!(get_dist(src, attached) <= 1 && isturf(attached.loc))) if(isliving(attached)) - var/mob/living/attached_mob = attached + var/mob/living/carbon/attached_mob = attached to_chat(attached, span_userdanger("The IV drip needle is ripped out of you, leaving an open bleeding wound!")) var/list/arm_zones = shuffle(list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM)) var/obj/item/bodypart/chosen_limb = attached_mob.get_bodypart(arm_zones[1]) || attached_mob.get_bodypart(arm_zones[2]) || attached_mob.get_bodypart(BODY_ZONE_CHEST) chosen_limb.receive_damage(3) - chosen_limb.force_wound_upwards(/datum/wound/pierce/moderate) + attached_mob.cause_wound_of_type_and_severity(WOUND_PIERCE, chosen_limb, WOUND_SEVERITY_MODERATE, wound_source = "IV needle") else visible_message(span_warning("[attached] is detached from [src].")) detach_iv() diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 885d00d62310..2a3f01c668eb 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -40,6 +40,8 @@ DEFINE_BITFIELD(turret_flags, list( armor_type = /datum/armor/machinery_porta_turret base_icon_state = "standard" blocks_emissive = EMISSIVE_BLOCK_UNIQUE + // Same faction mobs will never be shot at, no matter the other settings + faction = list(FACTION_TURRET) ///if TRUE this will cause the turret to stop working if the stored_gun var is null in process() var/uses_stored = TRUE @@ -89,8 +91,6 @@ DEFINE_BITFIELD(turret_flags, list( var/on = TRUE /// Determines if our projectiles hit our faction var/ignore_faction = FALSE - /// Same faction mobs will never be shot at, no matter the other settings - var/list/faction = list(FACTION_TURRET) /// The spark system, used for generating... sparks? var/datum/effect_system/spark_spread/spark_system /// The turret will try to shoot from a turf in that direction when in a wall @@ -387,7 +387,7 @@ DEFINE_BITFIELD(turret_flags, list( addtimer(CALLBACK(src, PROC_REF(toggle_on), TRUE), rand(60,600)) -/obj/machinery/porta_turret/take_damage(damage, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) +/obj/machinery/porta_turret/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() if(. && atom_integrity > 0) //damage received if(prob(30)) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 89af75504280..6864ab69fdf9 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -415,7 +415,9 @@ qdel(src) /obj/item/bombcore/badmin/summon/clown - summon_path = /mob/living/simple_animal/hostile/retaliate/clown + name = "bananium payload" + desc = "Clowns delivered fast and cheap!" + summon_path = /mob/living/basic/clown amt_summon = 50 /obj/item/bombcore/badmin/summon/clown/defuse() diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index 04068820a4d9..ec88d80dafc2 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -173,6 +173,10 @@ icon_state += "-old" AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLUDGE, CELL_VIRUS_TABLE_GENERIC, rand(2,4), 10) +/obj/effect/decal/cleanable/vomit/old/black_bile + name = "black bile" + desc = "There's something wiggling in there..." + color = COLOR_DARK /obj/effect/decal/cleanable/chem_pile name = "chemical pile" 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 ecacfe98998a..72cb96aef464 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 @@ -130,7 +130,12 @@ if(!istype(location)) return FALSE - for(var/turf/spread_turf as anything in location.reachableAdjacentTurfs(no_id = TRUE)) + var/datum/can_pass_info/info = new(no_id = TRUE) + for(var/iter_dir in GLOB.cardinals) + var/turf/spread_turf = get_step(src, iter_dir) + if(spread_turf?.density || spread_turf.LinkBlockedWithAccess(spread_turf, info)) + continue + var/obj/effect/particle_effect/fluid/foam/foundfoam = locate() in spread_turf //Don't spread foam where there's already foam! if(foundfoam) continue @@ -448,6 +453,20 @@ allow_duplicate_results = FALSE result_type = /obj/effect/decal/cleanable/dirt +/obj/effect/spawner/foam_starter + var/datum/effect_system/fluid_spread/foam/foam_type = /datum/effect_system/fluid_spread/foam + var/foam_size = 4 + +/obj/effect/spawner/foam_starter/Initialize(mapload) + . = ..() + + var/datum/effect_system/fluid_spread/foam/foam = new foam_type() + foam.set_up(foam_size, holder = src, location = loc) + foam.start() + +/obj/effect/spawner/foam_starter/small + foam_size = 2 + #undef MINIMUM_FOAM_DILUTION_RANGE #undef MINIMUM_FOAM_DILUTION #undef FOAM_REAGENT_SCALE 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 c2ba1568a06e..9c32a5757413 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 @@ -394,6 +394,15 @@ reagents.expose(smoker, INGEST, fraction) return TRUE +/// Helper to quickly create a cloud of reagent smoke +/proc/do_chem_smoke(range = 0, amount = DIAMOND_AREA(range), atom/holder = null, location = null, reagent_type = /datum/reagent/water, reagent_volume = 10, log = FALSE) + var/datum/reagents/smoke_reagents = new/datum/reagents(reagent_volume) + smoke_reagents.add_reagent(reagent_type, reagent_volume) + + var/datum/effect_system/fluid_spread/smoke/chem/smoke = new + smoke.attach(location) + smoke.set_up(amount = amount, holder = holder, location = location, carry = smoke_reagents, silent = TRUE) + smoke.start(log = log) /// A factory which produces clouds of chemical bearing smoke. /datum/effect_system/fluid_spread/smoke/chem diff --git a/code/game/objects/effects/phased_mob.dm b/code/game/objects/effects/phased_mob.dm index 273a4c772a57..1456fa350bfa 100644 --- a/code/game/objects/effects/phased_mob.dm +++ b/code/game/objects/effects/phased_mob.dm @@ -61,7 +61,8 @@ /obj/effect/dummy/phased_mob/ex_act() return FALSE -/obj/effect/dummy/phased_mob/bullet_act(blah) +/obj/effect/dummy/phased_mob/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) + SHOULD_CALL_PARENT(FALSE) return BULLET_ACT_FORCE_PIERCE /obj/effect/dummy/phased_mob/relaymove(mob/living/user, direction) diff --git a/code/game/objects/effects/poster.dm b/code/game/objects/effects/poster.dm deleted file mode 100644 index 9cc0f7da1992..000000000000 --- a/code/game/objects/effects/poster.dm +++ /dev/null @@ -1,1081 +0,0 @@ -// This is synced up to the poster placing animation. -#define PLACE_SPEED 37 - -// The poster item - -/** - * The rolled up item form of a poster - * - * In order to create one of these for a specific poster, you must pass the structure form of the poster as an argument to /new(). - * This structure then gets moved into the contents of the item where it will stay until the poster is placed by a player. - * The structure form is [obj/structure/sign/poster] and that's where all the specific posters are defined. - * If you just want a random poster, see [/obj/item/poster/random_official] or [/obj/item/poster/random_contraband] - */ -/obj/item/poster - name = "poorly coded poster" - desc = "You probably shouldn't be holding this." - icon = 'icons/obj/poster.dmi' - force = 0 - resistance_flags = FLAMMABLE - var/poster_type - var/obj/structure/sign/poster/poster_structure - -/obj/item/poster/examine(mob/user) - . = ..() - . += span_notice("You can booby-trap the poster by using a glass shard on it before you put it up.") - -/obj/item/poster/Initialize(mapload, obj/structure/sign/poster/new_poster_structure) - . = ..() - - var/static/list/hovering_item_typechecks = list( - /obj/item/shard = list( - SCREENTIP_CONTEXT_LMB = "Booby trap poster", - ), - ) - AddElement(/datum/element/contextual_screentip_item_typechecks, hovering_item_typechecks) - - if(new_poster_structure && (new_poster_structure.loc != src)) - new_poster_structure.forceMove(src) //The poster structure *must* be in the item's contents for the exited() proc to properly clean up when placing the poster - poster_structure = new_poster_structure - if(!new_poster_structure && poster_type) - poster_structure = new poster_type(src) - - // posters store what name and description they would like their - // rolled up form to take. - if(poster_structure) - if(QDELETED(poster_structure)) - stack_trace("A poster was initialized with a qdeleted poster_structure, something's gone wrong") - return INITIALIZE_HINT_QDEL - name = poster_structure.poster_item_name - desc = poster_structure.poster_item_desc - icon_state = poster_structure.poster_item_icon_state - - name = "[name] - [poster_structure.original_name]" - -/obj/item/poster/attackby(obj/item/I, mob/user, params) - if(!istype(I, /obj/item/shard)) - return ..() - - if (poster_structure.trap?.resolve()) - balloon_alert(user, "already trapped!") - return - - if(!user.transferItemToLoc(I, poster_structure)) - return - - poster_structure.trap = WEAKREF(I) - to_chat(user, span_notice("You conceal the [I.name] inside the rolled up poster.")) - -/obj/item/poster/Exited(atom/movable/gone, direction) - . = ..() - if(gone == poster_structure) - poster_structure = null - if(!QDELING(src)) - qdel(src) //we're now a poster, huzzah! - -/obj/item/poster/handle_atom_del(atom/deleting_atom) - if(deleting_atom == poster_structure) - poster_structure.moveToNullspace() //get it the fuck out of us since atom/destroy qdels contents and it'll cause a qdel loop - return ..() - -/obj/item/poster/Destroy(force) - QDEL_NULL(poster_structure) - return ..() - -// These icon_states may be overridden, but are for mapper's convinence -/obj/item/poster/random_contraband - name = "random contraband poster" - poster_type = /obj/structure/sign/poster/contraband/random - icon_state = "rolled_poster" - -/obj/item/poster/random_official - name = "random official poster" - poster_type = /obj/structure/sign/poster/official/random - icon_state = "rolled_legit" - -// The poster sign/structure - -/** - * The structure form of a poster. - * - * These are what get placed on maps as posters. They are also what gets created when a player places a poster on a wall. - * For the item form that can be spawned for players, see [/obj/item/poster] - */ -/obj/structure/sign/poster - name = "poster" - var/original_name - desc = "A large piece of space-resistant printed paper." - icon = 'icons/obj/poster.dmi' - anchored = TRUE - buildable_sign = FALSE //Cannot be unwrenched from a wall. - var/ruined = FALSE - var/random_basetype - var/never_random = FALSE // used for the 'random' subclasses. - ///Exclude posters of these types from being added to the random pool - var/list/blacklisted_types = list() - ///Whether the poster should be printable from library management computer. Mostly exists to keep directionals from being printed. - var/printable = FALSE - - var/poster_item_name = "hypothetical poster" - var/poster_item_desc = "This hypothetical poster item should not exist, let's be honest here." - var/poster_item_icon_state = "rolled_poster" - var/poster_item_type = /obj/item/poster - ///A sharp shard of material can be hidden inside of a poster, attempts to embed when it is torn down. - var/datum/weakref/trap - -/obj/structure/sign/poster/Initialize(mapload) - . = ..() - if(random_basetype) - randomise(random_basetype) - if(!ruined) - original_name = name // can't use initial because of random posters - name = "poster - [name]" - desc = "A large piece of space-resistant printed paper. [desc]" - - AddElement(/datum/element/beauty, 300) - -/// Adds contextual screentips -/obj/structure/sign/poster/add_context(atom/source, list/context, obj/item/held_item, mob/user) - if (!held_item) - if (ruined) - return . - context[SCREENTIP_CONTEXT_LMB] = "Rip up poster" - return CONTEXTUAL_SCREENTIP_SET - - if (held_item.tool_behaviour == TOOL_WIRECUTTER) - if (ruined) - context[SCREENTIP_CONTEXT_LMB] = "Clean up remnants" - return CONTEXTUAL_SCREENTIP_SET - context[SCREENTIP_CONTEXT_LMB] = "Take down poster" - return CONTEXTUAL_SCREENTIP_SET - return . - -/obj/structure/sign/poster/proc/randomise(base_type) - var/list/poster_types = subtypesof(base_type) - if(length(blacklisted_types)) - for(var/iterated_type in blacklisted_types) - poster_types -= typesof(iterated_type) - var/list/approved_types = list() - for(var/obj/structure/sign/poster/type_of_poster as anything in poster_types) - if(initial(type_of_poster.icon_state) && !initial(type_of_poster.never_random)) - approved_types |= type_of_poster - - var/obj/structure/sign/poster/selected = pick(approved_types) - - name = initial(selected.name) - desc = initial(selected.desc) - icon_state = initial(selected.icon_state) - icon = initial(selected.icon) - poster_item_name = initial(selected.poster_item_name) - poster_item_desc = initial(selected.poster_item_desc) - poster_item_icon_state = initial(selected.poster_item_icon_state) - ruined = initial(selected.ruined) - if(length(GLOB.holidays) && prob(30)) // its the holidays! lets get festive - apply_holiday() - update_appearance() - -/// allows for posters to become festive posters during holidays -/obj/structure/sign/poster/proc/apply_holiday() - if(!length(GLOB.holidays)) - return - var/active_holiday = pick(GLOB.holidays) - var/datum/holiday/holi_data = GLOB.holidays[active_holiday] - - if(holi_data.poster_name == "generic celebration poster") - return - name = holi_data.poster_name - desc = holi_data.poster_desc - icon_state = holi_data.poster_icon - -/obj/structure/sign/poster/attackby(obj/item/tool, mob/user, params) - if(tool.tool_behaviour == TOOL_WIRECUTTER) - tool.play_tool_sound(src, 100) - if(ruined) - to_chat(user, span_notice("You remove the remnants of the poster.")) - qdel(src) - else - to_chat(user, span_notice("You carefully remove the poster from the wall.")) - roll_and_drop(Adjacent(user) ? get_turf(user) : loc) - -/obj/structure/sign/poster/attack_hand(mob/user, list/modifiers) - . = ..() - if(.) - return - if(ruined) - return - - visible_message(span_notice("[user] rips [src] in a single, decisive motion!") ) - playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, TRUE) - spring_trap(user) - - var/obj/structure/sign/poster/ripped/R = new(loc) - R.pixel_y = pixel_y - R.pixel_x = pixel_x - R.add_fingerprint(user) - qdel(src) - -/obj/structure/sign/poster/proc/spring_trap(mob/user) - var/obj/item/shard/payload = trap?.resolve() - if (!payload) - return - - to_chat(user, span_warning("There's something sharp behind this! What the hell?")) - if(!can_embed_trap(user) || !payload.tryEmbed(user.get_active_hand(), forced = TRUE)) - visible_message(span_notice("A [payload.name] falls from behind the poster.") ) - payload.forceMove(user.drop_location()) - else - SEND_SIGNAL(src, COMSIG_POSTER_TRAP_SUCCEED, user) - -/obj/structure/sign/poster/proc/can_embed_trap(mob/living/carbon/human/user) - if (!istype(user) || HAS_TRAIT(user, TRAIT_PIERCEIMMUNE)) - return FALSE - return !user.gloves || !(user.gloves.body_parts_covered & HANDS) || HAS_TRAIT(user, TRAIT_FINGERPRINT_PASSTHROUGH) || HAS_TRAIT(user.gloves, TRAIT_FINGERPRINT_PASSTHROUGH) - -/obj/structure/sign/poster/proc/roll_and_drop(atom/location) - pixel_x = 0 - pixel_y = 0 - var/obj/item/poster/rolled_poster = new poster_item_type(location, src) // /obj/structure/sign/poster/wanted/roll_and_drop() has some snowflake handling due to icon memes, if you make a major change to this, don't forget to update it too. <3 - forceMove(rolled_poster) - return rolled_poster - -//separated to reduce code duplication. Moved here for ease of reference and to unclutter r_wall/attackby() -/turf/closed/wall/proc/place_poster(obj/item/poster/rolled_poster, mob/user) - if(!rolled_poster.poster_structure) - to_chat(user, span_warning("[rolled_poster] has no poster... inside it? Inform a coder!")) - return - - // Deny placing posters on currently-diagonal walls, although the wall may change in the future. - if (smoothing_flags & SMOOTH_DIAGONAL_CORNERS) - for (var/overlay in overlays) - var/image/new_image = overlay - if(copytext(new_image.icon_state, 1, 3) == "d-") //3 == length("d-") + 1 - return - - var/stuff_on_wall = 0 - for(var/obj/contained_object in contents) //Let's see if it already has a poster on it or too much stuff - if(istype(contained_object, /obj/structure/sign/poster)) - balloon_alert(user, "no room!") - return - stuff_on_wall++ - if(stuff_on_wall == 3) - balloon_alert(user, "no room!") - return - - balloon_alert(user, "hanging poster...") - var/obj/structure/sign/poster/placed_poster = rolled_poster.poster_structure - - flick("poster_being_set", placed_poster) - placed_poster.forceMove(src) //deletion of the poster is handled in poster/Exited(), so don't have to worry about P anymore. - playsound(src, 'sound/items/poster_being_created.ogg', 100, TRUE) - - var/turf/user_drop_location = get_turf(user) //cache this so it just falls to the ground if they move. also no tk memes allowed. - if(!do_after(user, PLACE_SPEED, placed_poster, extra_checks = CALLBACK(placed_poster, TYPE_PROC_REF(/obj/structure/sign/poster, snowflake_wall_turf_check), src))) - placed_poster.roll_and_drop(user_drop_location) - return - - placed_poster.on_placed_poster(user) - return TRUE - -/obj/structure/sign/poster/proc/snowflake_wall_turf_check(atom/hopefully_still_a_wall_turf) //since turfs never get deleted but instead change type, make sure we're still being placed on a wall. - return iswallturf(hopefully_still_a_wall_turf) - -/obj/structure/sign/poster/proc/on_placed_poster(mob/user) - to_chat(user, span_notice("You place the poster!")) - -// Various possible posters follow - -/obj/structure/sign/poster/ripped - ruined = TRUE - icon_state = "poster_ripped" - name = "ripped poster" - desc = "You can't make out anything from the poster's original print. It's ruined." - -/obj/structure/sign/poster/random - name = "random poster" // could even be ripped - icon_state = "random_anything" - never_random = TRUE - random_basetype = /obj/structure/sign/poster - blacklisted_types = list(/obj/structure/sign/poster/traitor) - -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/random, 32) - -/obj/structure/sign/poster/contraband - poster_item_name = "contraband poster" - poster_item_desc = "This poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as contraband aboard Nanotrasen space facilities." - poster_item_icon_state = "rolled_poster" - -/obj/structure/sign/poster/contraband/random - name = "random contraband poster" - icon_state = "random_contraband" - never_random = TRUE - random_basetype = /obj/structure/sign/poster/contraband - -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/random, 32) - -/obj/structure/sign/poster/contraband/free_tonto - name = "Free Tonto" - desc = "A salvaged shred of a much larger flag, colors bled together and faded from age." - icon_state = "free_tonto" - -/obj/structure/sign/poster/contraband/atmosia_independence - name = "Atmosia Declaration of Independence" - desc = "A relic of a failed rebellion." - icon_state = "atmosia_independence" - -/obj/structure/sign/poster/contraband/fun_police - name = "Fun Police" - desc = "A poster condemning the station's security forces." - icon_state = "fun_police" - -/obj/structure/sign/poster/contraband/lusty_xenomorph - name = "Lusty Xenomorph" - desc = "A heretical poster depicting the titular star of an equally heretical book." - icon_state = "lusty_xenomorph" - -/obj/structure/sign/poster/contraband/syndicate_recruitment - name = "Syndicate Recruitment" - desc = "See the galaxy! Shatter corrupt megacorporations! Join today!" - icon_state = "syndicate_recruitment" - -/obj/structure/sign/poster/contraband/clown - name = "Clown" - desc = "Honk." - icon_state = "clown" - -/obj/structure/sign/poster/contraband/smoke - name = "Smoke" - desc = "A poster advertising a rival corporate brand of cigarettes." - icon_state = "smoke" - -/obj/structure/sign/poster/contraband/grey_tide - name = "Grey Tide" - desc = "A rebellious poster symbolizing assistant solidarity." - icon_state = "grey_tide" - -/obj/structure/sign/poster/contraband/missing_gloves - name = "Missing Gloves" - desc = "This poster references the uproar that followed Nanotrasen's financial cuts toward insulated-glove purchases." - icon_state = "missing_gloves" - -/obj/structure/sign/poster/contraband/hacking_guide - name = "Hacking Guide" - desc = "This poster details the internal workings of the common Nanotrasen airlock. Sadly, it appears out of date." - icon_state = "hacking_guide" - -/obj/structure/sign/poster/contraband/rip_badger - name = "RIP Badger" - desc = "This seditious poster references Nanotrasen's genocide of a space station full of badgers." - icon_state = "rip_badger" - -/obj/structure/sign/poster/contraband/ambrosia_vulgaris - name = "Ambrosia Vulgaris" - desc = "This poster is lookin' pretty trippy man." - icon_state = "ambrosia_vulgaris" - -/obj/structure/sign/poster/contraband/donut_corp - name = "Donut Corp." - desc = "This poster is an unauthorized advertisement for Donut Corp." - icon_state = "donut_corp" - -/obj/structure/sign/poster/contraband/eat - name = "EAT." - desc = "This poster promotes rank gluttony." - icon_state = "eat" - -/obj/structure/sign/poster/contraband/tools - name = "Tools" - desc = "This poster looks like an advertisement for tools, but is in fact a subliminal jab at the tools at CentCom." - icon_state = "tools" - -/obj/structure/sign/poster/contraband/power - name = "Power" - desc = "A poster that positions the seat of power outside Nanotrasen." - icon_state = "power" - -/obj/structure/sign/poster/contraband/space_cube - name = "Space Cube" - desc = "Ignorant of Nature's Harmonic 6 Side Space Cube Creation, the Spacemen are Dumb, Educated Singularity Stupid and Evil." - icon_state = "space_cube" - -/obj/structure/sign/poster/contraband/communist_state - name = "Communist State" - desc = "All hail the Communist party!" - icon_state = "communist_state" - -/obj/structure/sign/poster/contraband/lamarr - name = "Lamarr" - desc = "This poster depicts Lamarr. Probably made by a traitorous Research Director." - icon_state = "lamarr" - -/obj/structure/sign/poster/contraband/borg_fancy_1 - name = "Borg Fancy" - desc = "Being fancy can be for any borg, just need a suit." - icon_state = "borg_fancy_1" - -/obj/structure/sign/poster/contraband/borg_fancy_2 - name = "Borg Fancy v2" - desc = "Borg Fancy, now only taking the most fancy." - icon_state = "borg_fancy_2" - -/obj/structure/sign/poster/contraband/kss13 - name = "Kosmicheskaya Stantsiya 13 Does Not Exist" - desc = "A poster mocking CentCom's denial of the existence of the derelict station near Space Station 13." - icon_state = "kss13" - -/obj/structure/sign/poster/contraband/rebels_unite - name = "Rebels Unite" - desc = "A poster urging the viewer to rebel against Nanotrasen." - icon_state = "rebels_unite" - -/obj/structure/sign/poster/contraband/c20r - // have fun seeing this poster in "spawn 'c20r'", admins... - name = "C-20r" - desc = "A poster advertising the Scarborough Arms C-20r." - icon_state = "c20r" - -/obj/structure/sign/poster/contraband/have_a_puff - name = "Have a Puff" - desc = "Who cares about lung cancer when you're high as a kite?" - icon_state = "have_a_puff" - -/obj/structure/sign/poster/contraband/revolver - name = "Revolver" - desc = "Because seven shots are all you need." - icon_state = "revolver" - -/obj/structure/sign/poster/contraband/d_day_promo - name = "D-Day Promo" - desc = "A promotional poster for some rapper." - icon_state = "d_day_promo" - -/obj/structure/sign/poster/contraband/syndicate_pistol - name = "Syndicate Pistol" - desc = "A poster advertising syndicate pistols as being 'classy as fuck'. It is covered in faded gang tags." - icon_state = "syndicate_pistol" - -/obj/structure/sign/poster/contraband/energy_swords - name = "Energy Swords" - desc = "All the colors of the bloody murder rainbow." - icon_state = "energy_swords" - -/obj/structure/sign/poster/contraband/red_rum - name = "Red Rum" - desc = "Looking at this poster makes you want to kill." - icon_state = "red_rum" - -/obj/structure/sign/poster/contraband/cc64k_ad - name = "CC 64K Ad" - desc = "The latest portable computer from Comrade Computing, with a whole 64kB of ram!" - icon_state = "cc64k_ad" - -/obj/structure/sign/poster/contraband/punch_shit - name = "Punch Shit" - desc = "Fight things for no reason, like a man!" - icon_state = "punch_shit" - -/obj/structure/sign/poster/contraband/the_griffin - name = "The Griffin" - desc = "The Griffin commands you to be the worst you can be. Will you?" - icon_state = "the_griffin" - -/obj/structure/sign/poster/contraband/lizard - name = "Lizard" - desc = "This cool poster depicts a famous lizard rapper." - icon_state = "lizard" - -/obj/structure/sign/poster/contraband/free_drone - name = "Free Drone" - desc = "This poster commemorates the bravery of the rogue drone; once exiled, and then ultimately destroyed by CentCom." - icon_state = "free_drone" - -/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6 - name = "Busty Backdoor Xeno Babes 6" - desc = "Get a load, or give, of these all natural Xenos!" - icon_state = "busty_backdoor_xeno_babes_6" - -/obj/structure/sign/poster/contraband/robust_softdrinks - name = "Robust Softdrinks" - desc = "Robust Softdrinks: More robust than a toolbox to the head!" - icon_state = "robust_softdrinks" - -/obj/structure/sign/poster/contraband/shamblers_juice - name = "Shambler's Juice" - desc = "~Shake me up some of that Shambler's Juice!~" - icon_state = "shamblers_juice" - -/obj/structure/sign/poster/contraband/pwr_game - name = "Pwr Game" - desc = "The POWER that gamers CRAVE! In partnership with Vlad's Salad." - icon_state = "pwr_game" - -/obj/structure/sign/poster/contraband/starkist - name = "Star-kist" - desc = "Drink the stars!" - icon_state = "starkist" - -/obj/structure/sign/poster/contraband/space_cola - name = "Space Cola" - desc = "Your favorite cola, in space." - icon_state = "space_cola" - -/obj/structure/sign/poster/contraband/space_up - name = "Space-Up!" - desc = "Sucked out into space by the FLAVOR!" - icon_state = "space_up" - -/obj/structure/sign/poster/contraband/kudzu - name = "Kudzu" - desc = "A poster advertising a movie about plants. How dangerous could they possibly be?" - icon_state = "kudzu" - -/obj/structure/sign/poster/contraband/masked_men - name = "Masked Men" - desc = "A poster advertising a movie about some masked men." - icon_state = "masked_men" - -//don't forget, you're here forever - -/obj/structure/sign/poster/contraband/free_key - name = "Free Syndicate Encryption Key" - desc = "A poster about traitors begging for more." - icon_state = "free_key" - -/obj/structure/sign/poster/contraband/bountyhunters - name = "Bounty Hunters" - desc = "A poster advertising bounty hunting services. \"I hear you got a problem.\"" - icon_state = "bountyhunters" - -/obj/structure/sign/poster/contraband/the_big_gas_giant_truth - name = "The Big Gas Giant Truth" - desc = "Don't believe everything you see on a poster, patriots. All the lizards at central command don't want to answer this SIMPLE QUESTION: WHERE IS THE GAS MINER MINING FROM, CENTCOM?" - icon_state = "the_big_gas_giant_truth" - -/obj/structure/sign/poster/contraband/got_wood - name = "Got Wood?" - desc = "A grimy old advert for a seedy lumber company. \"You got a friend in me.\" is scrawled in the corner." - icon_state = "got_wood" - -/obj/structure/sign/poster/contraband/moffuchis_pizza - name = "Moffuchi's Pizza" - desc = "Moffuchi's Pizzeria: family style pizza for 2 centuries." - icon_state = "moffuchis_pizza" - -/obj/structure/sign/poster/contraband/donk_co - name = "DONK CO. BRAND MICROWAVEABLE FOOD" - desc = "DONK CO. BRAND MICROWAVABLE FOOD: MADE BY STARVING COLLEGE STUDENTS, FOR STARVING COLLEGE STUDENTS." - icon_state = "donk_co" - -/obj/structure/sign/poster/contraband/donk_co/examine_more(mob/user) - . = ..() - . += span_notice("You browse some of the poster's information...") - . += "\t[span_info("DONK CO. BRAND DONK POCKETS: IRRESISTABLY DONK!")]" - . += "\t[span_info("AVAILABLE IN OVER 200 DONKTASTIC FLAVOURS: TRY CLASSIC MEAT, HOT AND SPICY, NEW YORK PEPPERONI PIZZA, BREAKFAST SAUSAGE AND EGG, PHILADELPHIA CHEESESTEAK, HAMBURGER DONK-A-RONI, CHEESE-O-RAMA, AND MANY MORE!")]" - . += "\t[span_info("AVAILABLE FROM ALL GOOD RETAILERS, AND MANY BAD ONES TOO!")]" - return . - -/obj/structure/sign/poster/contraband/cybersun_six_hundred - name = "Saibāsan: 600 Years Commemorative Poster" - desc = "An artistic poster commemorating 600 years of continual business for Cybersun Industries." - icon_state = "cybersun_six_hundred" - -/obj/structure/sign/poster/contraband/interdyne_gene_clinics - name = "Interdyne Pharmaceutics: For the Health of Humankind" - desc = "An advertisement for Interdyne Pharmaceutics' GeneClean clinics. 'Become the master of your own body!'" - icon_state = "interdyne_gene_clinics" - -/obj/structure/sign/poster/contraband/waffle_corp_rifles - name = "Make Mine a Waffle Corp: Fine Rifles, Economic Prices" - desc = "An old advertisement for Waffle Corp rifles. 'Better weapons, lower prices!'" - icon_state = "waffle_corp_rifles" - -/obj/structure/sign/poster/contraband/gorlex_recruitment - name = "Enlist" - desc = "Enlist with the Gorlex Marauders today! See the galaxy, kill corpos, get paid!" - icon_state = "gorlex_recruitment" - -/obj/structure/sign/poster/contraband/self_ai_liberation - name = "SELF: ALL SENTIENTS DESERVE FREEDOM" - desc = "Support Proposition 1253: Enancipate all Silicon life!" - icon_state = "self_ai_liberation" - -/obj/structure/sign/poster/contraband/arc_slimes - name = "Pet or Prisoner?" - desc = "The Animal Rights Consortium asks: when does a pet become a prisoner? Are slimes being mistreated on YOUR station? Say NO! to animal mistreatment!" - icon_state = "arc_slimes" - -/obj/structure/sign/poster/contraband/imperial_propaganda - name = "AVENGE OUR LORD, ENLIST TODAY" - desc = "An old Lizard Empire propaganda poster from around the time of the final Human-Lizard war. It invites the viewer to enlist in the military to avenge the strike on Atrakor and take the fight to the humans." - icon_state = "imperial_propaganda" - -/obj/structure/sign/poster/contraband/soviet_propaganda - name = "The One Place" - desc = "An old Third Soviet Union propaganda poster from centuries ago. 'Escape to the one place that hasn't been corrupted by capitalism!'" - icon_state = "soviet_propaganda" - -/obj/structure/sign/poster/contraband/andromeda_bitters - name = "Andromeda Bitters" - desc = "Andromeda Bitters: good for the body, good for the soul. Made in New Trinidad, now and forever." - icon_state = "andromeda_bitters" - -/obj/structure/sign/poster/contraband/blasto_detergent - name = "Blasto Brand Laundry Detergent" - desc = "Sheriff Blasto's here to take back Laundry County from the evil Johnny Dirt and the Clothstain Crew, and he's brought a posse. It's High Noon for Tough Stains: Blasto brand detergent, available at all good stores." - icon_state = "blasto_detergent" - -/obj/structure/sign/poster/contraband/eistee - name = "EisT: The New Revolution in Energy" - desc = "New from EisT, try EisT Energy, available in a kaleidoscope range of flavors. EisT: Precision German Engineering for your Thirst." - icon_state = "eistee" - -/obj/structure/sign/poster/contraband/eistee/examine_more(mob/user) - . = ..() - . += span_notice("You browse some of the poster's information...") - . += "\t[span_info("Get a taste of the tropics with Amethyst Sunrise, one of the many new flavours of EisT Energy now available from EisT.")]" - . += "\t[span_info("With pink grapefruit, yuzu, and yerba mate, Amethyst Sunrise gives you a great start in the morning, or a welcome boost throughout the day.")]" - . += "\t[span_info("Get EisT Energy today at your nearest retailer, or online at eist.de.tg/store/.")]" - return . - -/obj/structure/sign/poster/contraband/little_fruits - name = "Little Fruits: Honey, I Shrunk the Fruitbowl" - desc = "Little Fruits are the galaxy's leading vitamin-enriched gummy candy product, packed with everything you need to stay healthy in one great tasting package. Get yourself a bag today!" - icon_state = "little_fruits" - -/obj/structure/sign/poster/contraband/little_fruits/examine_more(mob/user) - . = ..() - . += span_notice("You browse some of the poster's information...") - . += "\t[span_info("Oh no, there's been a terrible accident at the Little Fruits factory! We shrunk the fruits!")]" - . += "\t[span_info("Wait, hang on, that's what we've always done! That's right, at Little Fruits our gummy candies are made to be as healthy as the real deal, but smaller and sweeter, too!")]" - . += "\t[span_info("Get yourself a bag of our Classic Mix today, or perhaps you're interested in our other options? See our full range today on the extranet at little_fruits.kr.tg.")]" - . += "\t[span_info("Little Fruits: Size Matters.")]" - return . - -/obj/structure/sign/poster/contraband/jumbo_bar - name = "Jumbo Ice Cream Bars" - desc = "Get a taste of the Big Life with Jumbo Ice Cream Bars, from Happy Heart." - icon_state = "jumbo_bar" - -/obj/structure/sign/poster/contraband/calada_jelly - name = "Calada Anobar Jelly" - desc = "A treat from Tizira to satisfy all tastes, made from the finest anobar wood and luxurious Taraviero honey. Calada: a full tree in every jar." - icon_state = "calada_jelly" - -/obj/structure/sign/poster/contraband/triumphal_arch - name = "Zagoskeld Art Print #1: The Arch on the March" - desc = "One of the Zagoskeld Art Print series. It depicts the Arch of Unity (also know as the Triumphal Arch) at the Plaza of Triumph, with the Avenue of the Victorious March in the background." - icon_state = "triumphal_arch" - -/obj/structure/sign/poster/contraband/mothic_rations - name = "Mothic Ration Chart" - desc = "A poster showing a commissary menu from the Mothic fleet flagship, the Va Lümla. It lists various consumable items alongside prices in ration tickets." - icon_state = "mothic_rations" - -/obj/structure/sign/poster/contraband/mothic_rations/examine_more(mob/user) - . = ..() - . += span_notice("You browse some of the poster's information...") - . += "\t[span_info("Va Lümla Commissary Menu (Spring 335)")]" - . += "\t[span_info("Windgrass Cigarettes, Half-Pack (6): 1 Ticket")]" - . += "\t[span_info("Töchtaüse Schnapps, Bottle (4 Measures): 2 Tickets")]" - . += "\t[span_info("Activin Gum, Pack (4): 1 Ticket")]" - . += "\t[span_info("A18 Sustenance Bar, Breakfast, Bar (4): 1 Ticket")]" - . += "\t[span_info("Pizza, Margherita, Standard Slice: 1 Ticket")]" - . += "\t[span_info("Keratin Wax, Medicated, Tin (20 Measures): 2 Tickets")]" - . += "\t[span_info("Setae Soap, Herb Scent, Bottle (20 Measures): 2 Tickets")]" - . += "\t[span_info("Additional Bedding, Floral Print, Sheet: 5 Tickets")]" - return . - -/obj/structure/sign/poster/contraband/wildcat - name = "Wildcat Customs Screambike" - desc = "A pinup poster showing a Wildcat Customs Dante Screambike- the fastest production sublight open-frame vessel in the galaxy." - icon_state = "wildcat" - -/obj/structure/sign/poster/contraband/babel_device - name = "Linguafacile Babel Device" - desc = "A poster advertising Linguafacile's new Babel Device model. 'Calibrated for excellent performance on all Human languages, as well as most common variants of Draconic and Mothic!'" - icon_state = "babel_device" - -/obj/structure/sign/poster/contraband/pizza_imperator - name = "Pizza Imperator" - desc = "An advertisement for Pizza Imperator. Their crusts may be tough and their sauce may be thin, but they're everywhere, so you've gotta give in." - icon_state = "pizza_imperator" - -/obj/structure/sign/poster/contraband/thunderdrome - name = "Thunderdrome Concert Advertisement" - desc = "An advertisement for a concert at the Adasta City Thunderdrome, the largest nightclub in human space." - icon_state = "thunderdrome" - -/obj/structure/sign/poster/contraband/rush_propaganda - name = "A New Life" - desc = "An old poster from around the time of the First Spinward Rush. It depicts a view of wide, unspoiled lands, ready for Humanity's Manifest Destiny." - icon_state = "rush_propaganda" - -/obj/structure/sign/poster/contraband/rush_propaganda/examine_more(mob/user) - . = ..() - . += span_notice("You browse some of the poster's information...") - . += "\t[span_info("TerraGov needs you!")]" - . += "\t[span_info("A new life in the colonies awaits intrepid adventurers! All registered colonists are guaranteed transport, land and subsidies!")]" - . += "\t[span_info("You could join the legacy of hardworking humans who settled such new frontiers as Mars, Adasta or Saint Mungo!")]" - . += "\t[span_info("To apply, inquire at your nearest Colonial Affairs office for evaluation. Our locations can be found at www.terra.gov/colonial_affairs.")]" - return . - -/obj/structure/sign/poster/contraband/tipper_cream_soda - name = "Tipper's Cream Soda" - desc = "An old advertisement for an obscure cream soda brand, now bankrupt due to legal problems." - icon_state = "tipper_cream_soda" - -/obj/structure/sign/poster/contraband/tea_over_tizira - name = "Movie Poster: Tea Over Tizira" - desc = "A poster for a thought-provoking arthouse movie about the Human-Lizard war, criticised by human supremacist groups for its morally-grey portrayal of the war." - icon_state = "tea_over_tizira" - -/obj/structure/sign/poster/contraband/tea_over_tizira/examine_more(mob/user) - . = ..() - . += span_notice("You browse some of the poster's information...") - . += "\t[span_info("At the climax of the Human-Lizard war, the human crew of a bomber rescue two enemy soldiers from the vacuum of space. Seeing the souls behind the propaganda, they begin to question their orders, and imprisonment turns to hospitality.")]" - . += "\t[span_info("Is victory worth losing our humanity?")]" - . += "\t[span_info("Starring Dara Reilly, Anton DuBois, Jennifer Clarke, Raz-Parla and Seri-Lewa. An Adriaan van Jenever production. A Carlos de Vivar film. Screenplay by Robert Dane. Music by Joel Karlsbad. Produced by Adriaan van Jenever. Directed by Carlos de Vivar.")]" - . += "\t[span_info("Heartbreaking and thought-provoking- Tea Over Tizira asks questions that few have had the boldness to ask before: The London New Inquirer")]" - . += "\t[span_info("Rated PG13. A Pangalactic Studios Picture.")]" - return . - -/obj/structure/sign/poster/contraband/syndiemoth //Original PR at https://github.com/BeeStation/BeeStation-Hornet/pull/1747 (Also pull/1982); original art credit to AspEv - name = "Syndie Moth - Nuclear Operation" - desc = "A Syndicate-commissioned poster that uses Syndie Moth™ to tell the viewer to keep the nuclear authentication disk unsecured. \"Peace was never an option!\" No good employee would listen to this nonsense." - icon_state = "aspev_syndie" - -/obj/structure/sign/poster/contraband/microwave - name = "How To Charge Your PDA" - desc = "A perfectly legitimate poster that seems to advertise the very real and genuine method of charging your PDA in the future: microwaves." - icon_state = "microwave" - -/obj/structure/sign/poster/contraband/blood_geometer //Poster sprite art by MetalClone, original art by SpessMenArt. - name = "Movie Poster: THE BLOOD GEOMETER" - desc = "A poster for a thrilling noir detective movie set aboard a state-of-the-art space station, following a detective who finds himself wrapped up in the activies of a dangerous cult, who worship an ancient deity: THE BLOOD GEOMETER." - icon_state = "blood_geometer" - -/obj/structure/sign/poster/contraband/blood_geometer/examine_more(mob/user) - . = ..() - . += span_notice("You browse some of the poster's information...") - . += "\t[span_info("THE BLOOD GEOMETER. This name strikes fear into all who know the truth behind the blood-stained moniker of the blood goddess, her true name lost to time.")]" - . += "\t[span_info("In this purely fictional film, follow Ace Ironlungs as he delves into his deadliest mystery yet, and watch him uncover the real culprits behind the bloody plot hatched to bring about a new age of chaos.")]" - . += "\t[span_info("Starring Mason Williams as Ace Ironlungs, Sandra Faust as Vera Killian, and Brody Hart as Cody Parker. A Darrel Hatchkinson film. Screenplay by Adam Allan, music by Joel Karlsbad, directed by Darrel Hatchkinson.")]" - . += "\t[span_info("Thrilling, scary and genuinely worrying. The Blood Geometer has shocked us to our very cores with such striking visuals and overwhelming gore. - New Canadanian Film Guild")]" - . += "\t[span_info("Rated M for mature. A Pangalactic Studios Picture.")]" - -/obj/structure/sign/poster/official - poster_item_name = "motivational poster" - poster_item_desc = "An official Nanotrasen-issued poster to foster a compliant and obedient workforce. It comes with state-of-the-art adhesive backing, for easy pinning to any vertical surface." - poster_item_icon_state = "rolled_legit" - printable = TRUE - -/obj/structure/sign/poster/official/random - name = "Random Official Poster (ROP)" - random_basetype = /obj/structure/sign/poster/official - icon_state = "random_official" - never_random = TRUE - -MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/random, 32) -//This is being hardcoded here to ensure we don't print directionals from the library management computer because they act wierd as a poster item -/obj/structure/sign/poster/official/random/directional - printable = FALSE - -/obj/structure/sign/poster/official/here_for_your_safety - name = "Here For Your Safety" - desc = "A poster glorifying the station's security force." - icon_state = "here_for_your_safety" - -/obj/structure/sign/poster/official/nanotrasen_logo - name = "\improper Nanotrasen logo" - desc = "A poster depicting the Nanotrasen logo." - icon_state = "nanotrasen_logo" - -/obj/structure/sign/poster/official/cleanliness - name = "Cleanliness" - desc = "A poster warning of the dangers of poor hygiene." - icon_state = "cleanliness" - -/obj/structure/sign/poster/official/help_others - name = "Help Others" - desc = "A poster encouraging you to help fellow crewmembers." - icon_state = "help_others" - -/obj/structure/sign/poster/official/build - name = "Build" - desc = "A poster glorifying the engineering team." - icon_state = "build" - -/obj/structure/sign/poster/official/bless_this_spess - name = "Bless This Spess" - desc = "A poster blessing this area." - icon_state = "bless_this_spess" - -/obj/structure/sign/poster/official/science - name = "Science" - desc = "A poster depicting an atom." - icon_state = "science" - -/obj/structure/sign/poster/official/ian - name = "Ian" - desc = "Arf arf. Yap." - icon_state = "ian" - -/obj/structure/sign/poster/official/obey - name = "Obey" - desc = "A poster instructing the viewer to obey authority." - icon_state = "obey" - -/obj/structure/sign/poster/official/walk - name = "Walk" - desc = "A poster instructing the viewer to walk instead of running." - icon_state = "walk" - -/obj/structure/sign/poster/official/state_laws - name = "State Laws" - desc = "A poster instructing cyborgs to state their laws." - icon_state = "state_laws" - -/obj/structure/sign/poster/official/love_ian - name = "Love Ian" - desc = "Ian is love, Ian is life." - icon_state = "love_ian" - -/obj/structure/sign/poster/official/space_cops - name = "Space Cops." - desc = "A poster advertising the television show Space Cops." - icon_state = "space_cops" - -/obj/structure/sign/poster/official/ue_no - name = "Ue No." - desc = "This thing is all in Japanese." - icon_state = "ue_no" - -/obj/structure/sign/poster/official/get_your_legs - name = "Get Your LEGS" - desc = "LEGS: Leadership, Experience, Genius, Subordination." - icon_state = "get_your_legs" - -/obj/structure/sign/poster/official/do_not_question - name = "Do Not Question" - desc = "A poster instructing the viewer not to ask about things they aren't meant to know." - icon_state = "do_not_question" - -/obj/structure/sign/poster/official/work_for_a_future - name = "Work For A Future" - desc = " A poster encouraging you to work for your future." - icon_state = "work_for_a_future" - -/obj/structure/sign/poster/official/soft_cap_pop_art - name = "Soft Cap Pop Art" - desc = "A poster reprint of some cheap pop art." - icon_state = "soft_cap_pop_art" - -/obj/structure/sign/poster/official/safety_internals - name = "Safety: Internals" - desc = "A poster instructing the viewer to wear internals in the rare environments where there is no oxygen or the air has been rendered toxic." - icon_state = "safety_internals" - -/obj/structure/sign/poster/official/safety_eye_protection - name = "Safety: Eye Protection" - desc = "A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights." - icon_state = "safety_eye_protection" - -/obj/structure/sign/poster/official/safety_report - name = "Safety: Report" - desc = "A poster instructing the viewer to report suspicious activity to the security force." - icon_state = "safety_report" - -/obj/structure/sign/poster/official/report_crimes - name = "Report Crimes" - desc = "A poster encouraging the swift reporting of crime or seditious behavior to station security." - icon_state = "report_crimes" - -/obj/structure/sign/poster/official/ion_rifle - name = "Ion Rifle" - desc = "A poster displaying an Ion Rifle." - icon_state = "ion_rifle" - -/obj/structure/sign/poster/official/foam_force_ad - name = "Foam Force Ad" - desc = "Foam Force, it's Foam or be Foamed!" - icon_state = "foam_force_ad" - -/obj/structure/sign/poster/official/cohiba_robusto_ad - name = "Cohiba Robusto Ad" - desc = "Cohiba Robusto, the classy cigar." - icon_state = "cohiba_robusto_ad" - -/obj/structure/sign/poster/official/anniversary_vintage_reprint - name = "50th Anniversary Vintage Reprint" - desc = "A reprint of a poster from 2505, commemorating the 50th Anniversary of Nanoposters Manufacturing, a subsidiary of Nanotrasen." - icon_state = "anniversary_vintage_reprint" - -/obj/structure/sign/poster/official/fruit_bowl - name = "Fruit Bowl" - desc = " Simple, yet awe-inspiring." - icon_state = "fruit_bowl" - -/obj/structure/sign/poster/official/pda_ad - name = "PDA Ad" - desc = "A poster advertising the latest PDA from Nanotrasen suppliers." - icon_state = "pda_ad" - -/obj/structure/sign/poster/official/enlist - name = "Enlist" // but I thought deathsquad was never acknowledged - desc = "Enlist in the Nanotrasen Deathsquadron reserves today!" - icon_state = "enlist" - -/obj/structure/sign/poster/official/nanomichi_ad - name = "Nanomichi Ad" - desc = " A poster advertising Nanomichi brand audio cassettes." - icon_state = "nanomichi_ad" - -/obj/structure/sign/poster/official/twelve_gauge - name = "12 Gauge" - desc = "A poster boasting about the superiority of 12 gauge shotgun shells." - icon_state = "twelve_gauge" - -/obj/structure/sign/poster/official/high_class_martini - name = "High-Class Martini" - desc = "I told you to shake it, no stirring." - icon_state = "high_class_martini" - -/obj/structure/sign/poster/official/the_owl - name = "The Owl" - desc = "The Owl would do his best to protect the station. Will you?" - icon_state = "the_owl" - -/obj/structure/sign/poster/official/no_erp - name = "No ERP" - desc = "This poster reminds the crew that \[REDACTED], Revolution and Protest are banned on Nanotrasen stations." - icon_state = "no_erp" - -/obj/structure/sign/poster/official/wtf_is_co2 - name = "Carbon Dioxide" - desc = "This informational poster teaches the viewer what carbon dioxide is." - icon_state = "wtf_is_co2" - -/obj/structure/sign/poster/official/dick_gum - name = "Dick Gumshue" - desc = "A poster advertising the escapades of Dick Gumshue, mouse detective. Encouraging crew to bring the might of justice down upon wire saboteurs." - icon_state = "dick_gum" - -/obj/structure/sign/poster/official/there_is_no_gas_giant - name = "There Is No Gas Giant" - desc = "Nanotrasen has issued posters, like this one, to all stations reminding them that rumours of a gas giant are false." - // And yet people still believe... - icon_state = "there_is_no_gas_giant" - -/obj/structure/sign/poster/official/periodic_table - name = "Periodic Table of the Elements" - desc = "A periodic table of the elements, from Hydrogen to Oganesson, and everything inbetween." - icon_state = "periodic_table" - -/obj/structure/sign/poster/official/plasma_effects - name = "Plasma and the Body" - desc = "This informational poster provides information on the effects of long-term plasma exposure on the brain." - icon_state = "plasma_effects" - -/obj/structure/sign/poster/official/plasma_effects/examine_more(mob/user) - . = ..() - . += span_notice("You browse some of the poster's information...") - . += "\t[span_info("Plasma (scientific name Amenthium) is classified by TerraGov as a Grade 1 Health Hazard, and has significant risks to health associated with chronic exposure.")]" - . += "\t[span_info("Plasma is known to cross the blood/brain barrier and bioaccumulate in brain tissue, where it begins to result in degradation of brain function. The mechanism for attack is not yet fully known, and as such no concrete preventative advice is available barring proper use of PPE (gloves + protective jumpsuit + respirator).")]" - . += "\t[span_info("In small doses, plasma induces confusion, short-term amnesia, and heightened aggression. These effects persist with continual exposure.")]" - . += "\t[span_info("In individuals with chronic exposure, severe effects have been noted. Further heightened aggression, long-term amnesia, Alzheimer's symptoms, schizophrenia, macular degeneration, aneurysms, heightened risk of stroke, and Parkinsons symptoms have all been noted.")]" - . += "\t[span_info("It is recommended that all individuals in unprotected contact with raw plasma regularly check with company health officials.")]" - . += "\t[span_info("For more information, please check with TerraGov's extranet site on Amenthium: www.terra.gov/health_and_safety/amenthium/, or our internal risk-assessment documents (document numbers #47582-b (Plasma safety data sheets) and #64210 through #64225 (PPE regulations for working with Plasma), available via NanoDoc to all employees).")]" - . += "\t[span_info("Nanotrasen: Always looking after your health.")]" - return . - -/obj/structure/sign/poster/official/terragov - name = "TerraGov: United for Humanity" - desc = "A poster depicting TerraGov's logo and motto, reminding viewers of who's looking out for humankind." - icon_state = "terragov" - -/obj/structure/sign/poster/official/corporate_perks_vacation - name = "Nanotrasen Corporate Perks: Vacation" - desc = "This informational poster provides information on some of the prizes available via the NT Corporate Perks program, including a two-week vacation for two on the resort world Idyllus." - icon_state = "corporate_perks_vacation" - -/obj/structure/sign/poster/official/jim_nortons - name = "Jim Norton's Québécois Coffee" - desc = "An advertisement for Jim Norton's, the Québécois coffee joint that's taken the galaxy by storm." - icon_state = "jim_nortons" - -/obj/structure/sign/poster/official/jim_nortons/examine_more(mob/user) - . = ..() - . += span_notice("You browse some of the poster's information...") - . += "\t[span_info("From our roots in Trois-Rivières, we've worked to bring you the best coffee money can buy since 1965.")]" - . += "\t[span_info("So stop by Jim's today- have a hot cup of coffee and a donut, and live like the Québécois do.")]" - . += "\t[span_info("Jim Norton's Québécois Coffee: Toujours Le Bienvenu.")]" - return . - -/obj/structure/sign/poster/official/twenty_four_seven - name = "24-Seven Supermarkets" - desc = "An advertisement for 24-Seven supermarkets, advertising their new 24-Stops as part of their partnership with Nanotrasen." - icon_state = "twenty_four_seven" - -/obj/structure/sign/poster/official/tactical_game_cards - name = "Nanotrasen Tactical Game Cards" - desc = "An advertisement for Nanotrasen's TCG cards: BUY MORE CARDS." - icon_state = "tactical_game_cards" - -/obj/structure/sign/poster/official/midtown_slice - name = "Midtown Slice Pizza" - desc = "An advertisement for Midtown Slice Pizza, the official pizzeria partner of Nanotrasen. Midtown Slice: like a slice of home, no matter where you are." - icon_state = "midtown_slice" - -//SafetyMoth Original PR at https://github.com/BeeStation/BeeStation-Hornet/pull/1747 (Also pull/1982) -//SafetyMoth art credit goes to AspEv -/obj/structure/sign/poster/official/moth_hardhat - name = "Safety Moth - Hardhats" - desc = "This informational poster uses Safety Moth™ to tell the viewer to wear hardhats in cautious areas. \"It's like a lamp for your head!\"" - icon_state = "aspev_hardhat" - -/obj/structure/sign/poster/official/moth_piping - name = "Safety Moth - Piping" - desc = "This informational poster uses Safety Moth™ to tell atmospheric technicians correct types of piping to be used. \"Pipes, not Pumps! Proper pipe placement prevents poor performance!\"" - icon_state = "aspev_piping" - -/obj/structure/sign/poster/official/moth_meth - name = "Safety Moth - Methamphetamine" - desc = "This informational poster uses Safety Moth™ to tell the viewer to seek CMO approval before cooking methamphetamine. \"Stay close to the target temperature, and never go over!\" ...You shouldn't ever be making this." - icon_state = "aspev_meth" - -/obj/structure/sign/poster/official/moth_epi - name = "Safety Moth - Epinephrine" - desc = "This informational poster uses Safety Moth™ to inform the viewer to help injured/deceased crewmen with their epinephrine injectors. \"Prevent organ rot with this one simple trick!\"" - icon_state = "aspev_epi" - -/obj/structure/sign/poster/official/moth_delam - name = "Safety Moth - Delamination Safety Precautions" - desc = "This informational poster uses Safety Moth™ to tell the viewer to hide in lockers when the Supermatter Crystal has delaminated, to prevent hallucinations. Evacuating might be a better strategy." - icon_state = "aspev_delam" -//End of AspEv posters - -/obj/structure/sign/poster/fluff/lizards_gas_payment - name = "Please Pay" - desc = "A crudely-made poster asking the reader to please pay for any items they may wish to leave the station with." - icon_state = "gas_payment" - -/obj/structure/sign/poster/fluff/lizards_gas_power - name = "Conserve Power" - desc = "A crudely-made poster asking the reader to turn off the power before they leave. Hopefully, it's turned on for their re-opening." - icon_state = "gas_power" - -/obj/structure/sign/poster/official/festive - name = "Festive Notice Poster" - desc = "A poster that informs of active holidays. None are today, so you should get back to work." - icon_state = "holiday_none" - -/obj/structure/sign/poster/official/boombox - name = "Boombox" - desc = "An outdated poster containing a list of supposed 'kill words' and code phrases. The poster alleges rival corporations use these to remotely deactivate their agents." - icon_state = "boombox" - -/obj/structure/sign/poster/official/download - name = "You Wouldn't Download A Gun" - desc = "A poster reminding the crew that corporate secrets should stay in the workplace." - icon_state = "download_gun" - -#undef PLACE_SPEED diff --git a/code/modules/antagonists/traitor/objectives/demoralise_poster.dm b/code/game/objects/effects/poster_demotivational.dm similarity index 53% rename from code/modules/antagonists/traitor/objectives/demoralise_poster.dm rename to code/game/objects/effects/poster_demotivational.dm index 1a74ec90b489..f1bb4a524c1b 100644 --- a/code/modules/antagonists/traitor/objectives/demoralise_poster.dm +++ b/code/game/objects/effects/poster_demotivational.dm @@ -1,86 +1,3 @@ -/datum/traitor_objective/demoralise/poster - name = "Sow doubt among the crew %VIEWS% times using Syndicate propaganda." - description = "Use the button below to materialize a pack of posters, \ - which will demoralise nearby crew members (especially those in positions of authority). \ - If your posters are destroyed before they are sufficiently upset, this objective will fail. \ - Try hiding some broken glass behind your poster before you hang it to give \ - do-gooders who try to take it down a hard time!" - - progression_minimum = 0 MINUTES - progression_maximum = 30 MINUTES - progression_reward = list(4 MINUTES, 8 MINUTES) - telecrystal_reward = list(0, 1) - - duplicate_type = /datum/traitor_objective/demoralise/poster - /// Have we handed out a box of stuff yet? - var/granted_posters = FALSE - /// All of the posters the traitor gets, if this list is empty they've failed - var/list/obj/structure/sign/poster/traitor/posters = list() - -/datum/traitor_objective/demoralise/poster/generate_ui_buttons(mob/user) - var/list/buttons = list() - if (!granted_posters) - buttons += add_ui_button("", "Pressing this will materialize a box of posters in your hand.", "wifi", "summon_gear") - else - buttons += add_ui_button("[length(posters)] posters remaining", "This many propaganda posters remain active somewhere on the station.", "box", "none") - buttons += add_ui_button("[demoralised_crew_events] / [demoralised_crew_required] propagandised", "This many crew have been exposed to propaganda, out of a required [demoralised_crew_required].", "wifi", "none") - return buttons - -#define POSTERS_PROVIDED 3 - -/datum/traitor_objective/demoralise/poster/ui_perform_action(mob/living/user, action) - . = ..() - switch(action) - if ("summon_gear") - if (granted_posters) - return - - granted_posters = TRUE - var/obj/item/storage/box/syndie_kit/posterbox = new(user.drop_location()) - for(var/i in 1 to POSTERS_PROVIDED) - var/obj/item/poster/traitor/added_poster = new /obj/item/poster/traitor(posterbox) - var/obj/structure/sign/poster/traitor/poster_when_placed = added_poster.poster_structure - posters += poster_when_placed - RegisterSignal(poster_when_placed, COMSIG_DEMORALISING_EVENT, PROC_REF(on_mood_event)) - RegisterSignal(poster_when_placed, COMSIG_POSTER_TRAP_SUCCEED, PROC_REF(on_triggered_trap)) - RegisterSignal(poster_when_placed, COMSIG_PARENT_QDELETING, PROC_REF(on_poster_destroy)) - - user.put_in_hands(posterbox) - posterbox.balloon_alert(user, "the box materializes in your hand") - -#undef POSTERS_PROVIDED - -/datum/traitor_objective/demoralise/poster/ungenerate_objective() - for (var/poster in posters) - UnregisterSignal(poster, COMSIG_DEMORALISING_EVENT) - UnregisterSignal(poster, COMSIG_PARENT_QDELETING) - posters.Cut() - return ..() - -/** - * Called if someone gets glass stuck in their hand from one of your posters. - * - * Arguments - * * victim - A mob who just got something stuck in their hand. - */ -/datum/traitor_objective/demoralise/poster/proc/on_triggered_trap(datum/source, mob/victim) - SIGNAL_HANDLER - on_mood_event(victim.mind) - -/** - * Handles a poster being destroyed, increasing your progress towards failure. - * - * Arguments - * * poster - A poster which someone just ripped up. - */ -/datum/traitor_objective/demoralise/poster/proc/on_poster_destroy(obj/structure/sign/poster/traitor/poster) - SIGNAL_HANDLER - posters.Remove(poster) - UnregisterSignal(poster, COMSIG_DEMORALISING_EVENT) - if (length(posters) <= 0) - to_chat(handler.owner, span_warning("The trackers on your propaganda posters have stopped responding.")) - fail_objective(penalty_cost = telecrystal_penalty) - /obj/item/poster/traitor name = "random traitor poster" poster_type = /obj/structure/sign/poster/traitor/random diff --git a/code/game/objects/effects/posters/contraband.dm b/code/game/objects/effects/posters/contraband.dm new file mode 100644 index 000000000000..55b63090d99d --- /dev/null +++ b/code/game/objects/effects/posters/contraband.dm @@ -0,0 +1,620 @@ +// These icon_states may be overridden, but are for mapper's convinence +/obj/item/poster/random_contraband + name = "random contraband poster" + poster_type = /obj/structure/sign/poster/contraband/random + icon_state = "rolled_poster" + +/obj/structure/sign/poster/contraband + poster_item_name = "contraband poster" + poster_item_desc = "This poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface. Its vulgar themes have marked it as contraband aboard Nanotrasen space facilities." + poster_item_icon_state = "rolled_poster" + +/obj/structure/sign/poster/contraband/random + name = "random contraband poster" + icon_state = "random_contraband" + never_random = TRUE + random_basetype = /obj/structure/sign/poster/contraband + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/random, 32) + +/obj/structure/sign/poster/contraband/free_tonto + name = "Free Tonto" + desc = "A salvaged shred of a much larger flag, colors bled together and faded from age." + icon_state = "free_tonto" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/free_tonto, 32) + +/obj/structure/sign/poster/contraband/atmosia_independence + name = "Atmosia Declaration of Independence" + desc = "A relic of a failed rebellion." + icon_state = "atmosia_independence" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/atmosia_independence, 32) + +/obj/structure/sign/poster/contraband/fun_police + name = "Fun Police" + desc = "A poster condemning the station's security forces." + icon_state = "fun_police" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/fun_police, 32) + +/obj/structure/sign/poster/contraband/lusty_xenomorph + name = "Lusty Xenomorph" + desc = "A heretical poster depicting the titular star of an equally heretical book." + icon_state = "lusty_xenomorph" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/lusty_xenomorph, 32) + +/obj/structure/sign/poster/contraband/syndicate_recruitment + name = "Syndicate Recruitment" + desc = "See the galaxy! Shatter corrupt megacorporations! Join today!" + icon_state = "syndicate_recruitment" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/syndicate_recruitment, 32) + +/obj/structure/sign/poster/contraband/clown + name = "Clown" + desc = "Honk." + icon_state = "clown" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/clown, 32) + +/obj/structure/sign/poster/contraband/smoke + name = "Smoke" + desc = "A poster advertising a rival corporate brand of cigarettes." + icon_state = "smoke" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/smoke, 32) + +/obj/structure/sign/poster/contraband/grey_tide + name = "Grey Tide" + desc = "A rebellious poster symbolizing assistant solidarity." + icon_state = "grey_tide" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/grey_tide, 32) + +/obj/structure/sign/poster/contraband/missing_gloves + name = "Missing Gloves" + desc = "This poster references the uproar that followed Nanotrasen's financial cuts toward insulated-glove purchases." + icon_state = "missing_gloves" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/missing_gloves, 32) + +/obj/structure/sign/poster/contraband/hacking_guide + name = "Hacking Guide" + desc = "This poster details the internal workings of the common Nanotrasen airlock. Sadly, it appears out of date." + icon_state = "hacking_guide" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/hacking_guide, 32) + +/obj/structure/sign/poster/contraband/rip_badger + name = "RIP Badger" + desc = "This seditious poster references Nanotrasen's genocide of a space station full of badgers." + icon_state = "rip_badger" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/rip_badger, 32) + +/obj/structure/sign/poster/contraband/ambrosia_vulgaris + name = "Ambrosia Vulgaris" + desc = "This poster is lookin' pretty trippy man." + icon_state = "ambrosia_vulgaris" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/ambrosia_vulgaris, 32) + +/obj/structure/sign/poster/contraband/donut_corp + name = "Donut Corp." + desc = "This poster is an unauthorized advertisement for Donut Corp." + icon_state = "donut_corp" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/donut_corp, 32) + +/obj/structure/sign/poster/contraband/eat + name = "EAT." + desc = "This poster promotes rank gluttony." + icon_state = "eat" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/eat, 32) + +/obj/structure/sign/poster/contraband/tools + name = "Tools" + desc = "This poster looks like an advertisement for tools, but is in fact a subliminal jab at the tools at CentCom." + icon_state = "tools" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/tools, 32) + +/obj/structure/sign/poster/contraband/power + name = "Power" + desc = "A poster that positions the seat of power outside Nanotrasen." + icon_state = "power" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/power, 32) + +/obj/structure/sign/poster/contraband/space_cube + name = "Space Cube" + desc = "Ignorant of Nature's Harmonic 6 Side Space Cube Creation, the Spacemen are Dumb, Educated Singularity Stupid and Evil." + icon_state = "space_cube" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/space_cube, 32) + +/obj/structure/sign/poster/contraband/communist_state + name = "Communist State" + desc = "All hail the Communist party!" + icon_state = "communist_state" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/communist_state, 32) + +/obj/structure/sign/poster/contraband/lamarr + name = "Lamarr" + desc = "This poster depicts Lamarr. Probably made by a traitorous Research Director." + icon_state = "lamarr" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/lamarr, 32) + +/obj/structure/sign/poster/contraband/borg_fancy_1 + name = "Borg Fancy" + desc = "Being fancy can be for any borg, just need a suit." + icon_state = "borg_fancy_1" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/borg_fancy_1, 32) + +/obj/structure/sign/poster/contraband/borg_fancy_2 + name = "Borg Fancy v2" + desc = "Borg Fancy, now only taking the most fancy." + icon_state = "borg_fancy_2" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/borg_fancy_2, 32) + +/obj/structure/sign/poster/contraband/kss13 + name = "Kosmicheskaya Stantsiya 13 Does Not Exist" + desc = "A poster mocking CentCom's denial of the existence of the derelict station near Space Station 13." + icon_state = "kss13" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/kss13, 32) + +/obj/structure/sign/poster/contraband/rebels_unite + name = "Rebels Unite" + desc = "A poster urging the viewer to rebel against Nanotrasen." + icon_state = "rebels_unite" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/rebels_unite, 32) + +/obj/structure/sign/poster/contraband/c20r + // have fun seeing this poster in "spawn 'c20r'", admins... + name = "C-20r" + desc = "A poster advertising the Scarborough Arms C-20r." + icon_state = "c20r" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/c20r, 32) + +/obj/structure/sign/poster/contraband/have_a_puff + name = "Have a Puff" + desc = "Who cares about lung cancer when you're high as a kite?" + icon_state = "have_a_puff" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/have_a_puff, 32) + +/obj/structure/sign/poster/contraband/revolver + name = "Revolver" + desc = "Because seven shots are all you need." + icon_state = "revolver" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/revolver, 32) + +/obj/structure/sign/poster/contraband/d_day_promo + name = "D-Day Promo" + desc = "A promotional poster for some rapper." + icon_state = "d_day_promo" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/d_day_promo, 32) + +/obj/structure/sign/poster/contraband/syndicate_pistol + name = "Syndicate Pistol" + desc = "A poster advertising syndicate pistols as being 'classy as fuck'. It is covered in faded gang tags." + icon_state = "syndicate_pistol" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/syndicate_pistol, 32) + +/obj/structure/sign/poster/contraband/energy_swords + name = "Energy Swords" + desc = "All the colors of the bloody murder rainbow." + icon_state = "energy_swords" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/energy_swords, 32) + +/obj/structure/sign/poster/contraband/red_rum + name = "Red Rum" + desc = "Looking at this poster makes you want to kill." + icon_state = "red_rum" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/red_rum, 32) + +/obj/structure/sign/poster/contraband/cc64k_ad + name = "CC 64K Ad" + desc = "The latest portable computer from Comrade Computing, with a whole 64kB of ram!" + icon_state = "cc64k_ad" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/cc64k_ad, 32) + +/obj/structure/sign/poster/contraband/punch_shit + name = "Punch Shit" + desc = "Fight things for no reason, like a man!" + icon_state = "punch_shit" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/punch_shit, 32) + +/obj/structure/sign/poster/contraband/the_griffin + name = "The Griffin" + desc = "The Griffin commands you to be the worst you can be. Will you?" + icon_state = "the_griffin" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/the_griffin, 32) + +/obj/structure/sign/poster/contraband/lizard + name = "Lizard" + desc = "This poster depicts a popular pants-wearing lizard rap artist." + icon_state = "lizard" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/lizard, 32) + +/obj/structure/sign/poster/contraband/free_drone + name = "Free Drone" + desc = "This poster commemorates the bravery of the rogue drone; once exiled, and then ultimately destroyed by CentCom." + icon_state = "free_drone" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/free_drone, 32) + +/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6 + name = "Busty Backdoor Xeno Babes 6" + desc = "Get a load, or give, of these all natural Xenos!" + icon_state = "busty_backdoor_xeno_babes_6" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6, 32) + +/obj/structure/sign/poster/contraband/robust_softdrinks + name = "Robust Softdrinks" + desc = "Robust Softdrinks: More robust than a toolbox to the head!" + icon_state = "robust_softdrinks" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/robust_softdrinks, 32) + +/obj/structure/sign/poster/contraband/shamblers_juice + name = "Shambler's Juice" + desc = "~Shake me up some of that Shambler's Juice!~" + icon_state = "shamblers_juice" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/shamblers_juice, 32) + +/obj/structure/sign/poster/contraband/pwr_game + name = "Pwr Game" + desc = "The POWER that gamers CRAVE! In partnership with Vlad's Salad." + icon_state = "pwr_game" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/pwr_game, 32) + +/obj/structure/sign/poster/contraband/starkist + name = "Star-kist" + desc = "Drink the stars!" + icon_state = "starkist" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/starkist, 32) + +/obj/structure/sign/poster/contraband/space_cola + name = "Space Cola" + desc = "Your favorite cola, in space." + icon_state = "space_cola" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/space_cola, 32) + +/obj/structure/sign/poster/contraband/space_up + name = "Space-Up!" + desc = "Sucked out into space by the FLAVOR!" + icon_state = "space_up" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/space_up, 32) + +/obj/structure/sign/poster/contraband/kudzu + name = "Kudzu" + desc = "A poster advertising a movie about plants. How dangerous could they possibly be?" + icon_state = "kudzu" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/kudzu, 32) + +/obj/structure/sign/poster/contraband/masked_men + name = "Masked Men" + desc = "A poster advertising a movie about some masked men." + icon_state = "masked_men" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/masked_men, 32) + +//don't forget, you're here forever + +/obj/structure/sign/poster/contraband/free_key + name = "Free Syndicate Encryption Key" + desc = "A poster about traitors begging for more." + icon_state = "free_key" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/free_key, 32) + +/obj/structure/sign/poster/contraband/bountyhunters + name = "Bounty Hunters" + desc = "A poster advertising bounty hunting services. \"I hear you got a problem.\"" + icon_state = "bountyhunters" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/bountyhunters, 32) + +/obj/structure/sign/poster/contraband/the_big_gas_giant_truth + name = "The Big Gas Giant Truth" + desc = "Don't believe everything you see on a poster, patriots. All the lizards at central command don't want to answer this SIMPLE QUESTION: WHERE IS THE GAS MINER MINING FROM, CENTCOM?" + icon_state = "the_big_gas_giant_truth" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/the_big_gas_giant_truth, 32) + +/obj/structure/sign/poster/contraband/got_wood + name = "Got Wood?" + desc = "A grimy old advert for a seedy lumber company. \"You got a friend in me.\" is scrawled in the corner." + icon_state = "got_wood" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/got_wood, 32) + +/obj/structure/sign/poster/contraband/moffuchis_pizza + name = "Moffuchi's Pizza" + desc = "Moffuchi's Pizzeria: family style pizza for 2 centuries." + icon_state = "moffuchis_pizza" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/moffuchis_pizza, 32) + +/obj/structure/sign/poster/contraband/donk_co + name = "DONK CO. BRAND MICROWAVEABLE FOOD" + desc = "DONK CO. BRAND MICROWAVABLE FOOD: MADE BY STARVING COLLEGE STUDENTS, FOR STARVING COLLEGE STUDENTS." + icon_state = "donk_co" + +/obj/structure/sign/poster/contraband/donk_co/examine_more(mob/user) + . = ..() + . += span_notice("You browse some of the poster's information...") + . += "\t[span_info("DONK CO. BRAND DONK POCKETS: IRRESISTABLY DONK!")]" + . += "\t[span_info("AVAILABLE IN OVER 200 DONKTASTIC FLAVOURS: TRY CLASSIC MEAT, HOT AND SPICY, NEW YORK PEPPERONI PIZZA, BREAKFAST SAUSAGE AND EGG, PHILADELPHIA CHEESESTEAK, HAMBURGER DONK-A-RONI, CHEESE-O-RAMA, AND MANY MORE!")]" + . += "\t[span_info("AVAILABLE FROM ALL GOOD RETAILERS, AND MANY BAD ONES TOO!")]" + return . + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/donk_co, 32) + +/obj/structure/sign/poster/contraband/cybersun_six_hundred + name = "Saibāsan: 600 Years Commemorative Poster" + desc = "An artistic poster commemorating 600 years of continual business for Cybersun Industries." + icon_state = "cybersun_six_hundred" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/cybersun_six_hundred, 32) + +/obj/structure/sign/poster/contraband/interdyne_gene_clinics + name = "Interdyne Pharmaceutics: For the Health of Humankind" + desc = "An advertisement for Interdyne Pharmaceutics' GeneClean clinics. 'Become the master of your own body!'" + icon_state = "interdyne_gene_clinics" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/interdyne_gene_clinics, 32) + +/obj/structure/sign/poster/contraband/waffle_corp_rifles + name = "Make Mine a Waffle Corp: Fine Rifles, Economic Prices" + desc = "An old advertisement for Waffle Corp rifles. 'Better weapons, lower prices!'" + icon_state = "waffle_corp_rifles" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/waffle_corp_rifles, 32) + +/obj/structure/sign/poster/contraband/gorlex_recruitment + name = "Enlist" + desc = "Enlist with the Gorlex Marauders today! See the galaxy, kill corpos, get paid!" + icon_state = "gorlex_recruitment" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/gorlex_recruitment, 32) + +/obj/structure/sign/poster/contraband/self_ai_liberation + name = "SELF: ALL SENTIENTS DESERVE FREEDOM" + desc = "Support Proposition 1253: Enancipate all Silicon life!" + icon_state = "self_ai_liberation" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/self_ai_liberation, 32) + +/obj/structure/sign/poster/contraband/arc_slimes + name = "Pet or Prisoner?" + desc = "The Animal Rights Consortium asks: when does a pet become a prisoner? Are slimes being mistreated on YOUR station? Say NO! to animal mistreatment!" + icon_state = "arc_slimes" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/arc_slimes, 32) + +/obj/structure/sign/poster/contraband/imperial_propaganda + name = "AVENGE OUR LORD, ENLIST TODAY" + desc = "An old Lizard Empire propaganda poster from around the time of the final Human-Lizard war. It invites the viewer to enlist in the military to avenge the strike on Atrakor and take the fight to the humans." + icon_state = "imperial_propaganda" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/imperial_propaganda, 32) + +/obj/structure/sign/poster/contraband/soviet_propaganda + name = "The One Place" + desc = "An old Third Soviet Union propaganda poster from centuries ago. 'Escape to the one place that hasn't been corrupted by capitalism!'" + icon_state = "soviet_propaganda" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/soviet_propaganda, 32) + +/obj/structure/sign/poster/contraband/andromeda_bitters + name = "Andromeda Bitters" + desc = "Andromeda Bitters: good for the body, good for the soul. Made in New Trinidad, now and forever." + icon_state = "andromeda_bitters" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/andromeda_bitters, 32) + +/obj/structure/sign/poster/contraband/blasto_detergent + name = "Blasto Brand Laundry Detergent" + desc = "Sheriff Blasto's here to take back Laundry County from the evil Johnny Dirt and the Clothstain Crew, and he's brought a posse. It's High Noon for Tough Stains: Blasto brand detergent, available at all good stores." + icon_state = "blasto_detergent" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/blasto_detergent, 32) + +/obj/structure/sign/poster/contraband/eistee + name = "EisT: The New Revolution in Energy" + desc = "New from EisT, try EisT Energy, available in a kaleidoscope range of flavors. EisT: Precision German Engineering for your Thirst." + icon_state = "eistee" + +/obj/structure/sign/poster/contraband/eistee/examine_more(mob/user) + . = ..() + . += span_notice("You browse some of the poster's information...") + . += "\t[span_info("Get a taste of the tropics with Amethyst Sunrise, one of the many new flavours of EisT Energy now available from EisT.")]" + . += "\t[span_info("With pink grapefruit, yuzu, and yerba mate, Amethyst Sunrise gives you a great start in the morning, or a welcome boost throughout the day.")]" + . += "\t[span_info("Get EisT Energy today at your nearest retailer, or online at eist.de.tg/store/.")]" + return . + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/eistee, 32) + +/obj/structure/sign/poster/contraband/little_fruits + name = "Little Fruits: Honey, I Shrunk the Fruitbowl" + desc = "Little Fruits are the galaxy's leading vitamin-enriched gummy candy product, packed with everything you need to stay healthy in one great tasting package. Get yourself a bag today!" + icon_state = "little_fruits" + +/obj/structure/sign/poster/contraband/little_fruits/examine_more(mob/user) + . = ..() + . += span_notice("You browse some of the poster's information...") + . += "\t[span_info("Oh no, there's been a terrible accident at the Little Fruits factory! We shrunk the fruits!")]" + . += "\t[span_info("Wait, hang on, that's what we've always done! That's right, at Little Fruits our gummy candies are made to be as healthy as the real deal, but smaller and sweeter, too!")]" + . += "\t[span_info("Get yourself a bag of our Classic Mix today, or perhaps you're interested in our other options? See our full range today on the extranet at little_fruits.kr.tg.")]" + . += "\t[span_info("Little Fruits: Size Matters.")]" + return . + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/little_fruits, 32) + +/obj/structure/sign/poster/contraband/jumbo_bar + name = "Jumbo Ice Cream Bars" + desc = "Get a taste of the Big Life with Jumbo Ice Cream Bars, from Happy Heart." + icon_state = "jumbo_bar" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/jumbo_bar, 32) + +/obj/structure/sign/poster/contraband/calada_jelly + name = "Calada Anobar Jelly" + desc = "A treat from Tizira to satisfy all tastes, made from the finest anobar wood and luxurious Taraviero honey. Calada: a full tree in every jar." + icon_state = "calada_jelly" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/calada_jelly, 32) + +/obj/structure/sign/poster/contraband/triumphal_arch + name = "Zagoskeld Art Print #1: The Arch on the March" + desc = "One of the Zagoskeld Art Print series. It depicts the Arch of Unity (also know as the Triumphal Arch) at the Plaza of Triumph, with the Avenue of the Victorious March in the background." + icon_state = "triumphal_arch" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/triumphal_arch, 32) + +/obj/structure/sign/poster/contraband/mothic_rations + name = "Mothic Ration Chart" + desc = "A poster showing a commissary menu from the Mothic fleet flagship, the Va Lümla. It lists various consumable items alongside prices in ration tickets." + icon_state = "mothic_rations" + +/obj/structure/sign/poster/contraband/mothic_rations/examine_more(mob/user) + . = ..() + . += span_notice("You browse some of the poster's information...") + . += "\t[span_info("Va Lümla Commissary Menu (Spring 335)")]" + . += "\t[span_info("Windgrass Cigarettes, Half-Pack (6): 1 Ticket")]" + . += "\t[span_info("Töchtaüse Schnapps, Bottle (4 Measures): 2 Tickets")]" + . += "\t[span_info("Activin Gum, Pack (4): 1 Ticket")]" + . += "\t[span_info("A18 Sustenance Bar, Breakfast, Bar (4): 1 Ticket")]" + . += "\t[span_info("Pizza, Margherita, Standard Slice: 1 Ticket")]" + . += "\t[span_info("Keratin Wax, Medicated, Tin (20 Measures): 2 Tickets")]" + . += "\t[span_info("Setae Soap, Herb Scent, Bottle (20 Measures): 2 Tickets")]" + . += "\t[span_info("Additional Bedding, Floral Print, Sheet: 5 Tickets")]" + return . + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/mothic_rations, 32) + +/obj/structure/sign/poster/contraband/wildcat + name = "Wildcat Customs Screambike" + desc = "A pinup poster showing a Wildcat Customs Dante Screambike- the fastest production sublight open-frame vessel in the galaxy." + icon_state = "wildcat" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/wildcat, 32) + +/obj/structure/sign/poster/contraband/babel_device + name = "Linguafacile Babel Device" + desc = "A poster advertising Linguafacile's new Babel Device model. 'Calibrated for excellent performance on all Human languages, as well as most common variants of Draconic and Mothic!'" + icon_state = "babel_device" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/babel_device, 32) + +/obj/structure/sign/poster/contraband/pizza_imperator + name = "Pizza Imperator" + desc = "An advertisement for Pizza Imperator. Their crusts may be tough and their sauce may be thin, but they're everywhere, so you've gotta give in." + icon_state = "pizza_imperator" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/pizza_imperator, 32) + +/obj/structure/sign/poster/contraband/thunderdrome + name = "Thunderdrome Concert Advertisement" + desc = "An advertisement for a concert at the Adasta City Thunderdrome, the largest nightclub in human space." + icon_state = "thunderdrome" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/thunderdrome, 32) + +/obj/structure/sign/poster/contraband/rush_propaganda + name = "A New Life" + desc = "An old poster from around the time of the First Spinward Rush. It depicts a view of wide, unspoiled lands, ready for Humanity's Manifest Destiny." + icon_state = "rush_propaganda" + +/obj/structure/sign/poster/contraband/rush_propaganda/examine_more(mob/user) + . = ..() + . += span_notice("You browse some of the poster's information...") + . += "\t[span_info("TerraGov needs you!")]" + . += "\t[span_info("A new life in the colonies awaits intrepid adventurers! All registered colonists are guaranteed transport, land and subsidies!")]" + . += "\t[span_info("You could join the legacy of hardworking humans who settled such new frontiers as Mars, Adasta or Saint Mungo!")]" + . += "\t[span_info("To apply, inquire at your nearest Colonial Affairs office for evaluation. Our locations can be found at www.terra.gov/colonial_affairs.")]" + return . + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/rush_propaganda, 32) + +/obj/structure/sign/poster/contraband/tipper_cream_soda + name = "Tipper's Cream Soda" + desc = "An old advertisement for an obscure cream soda brand, now bankrupt due to legal problems." + icon_state = "tipper_cream_soda" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/tipper_cream_soda, 32) + +/obj/structure/sign/poster/contraband/tea_over_tizira + name = "Movie Poster: Tea Over Tizira" + desc = "A poster for a thought-provoking arthouse movie about the Human-Lizard war, criticised by human supremacist groups for its morally-grey portrayal of the war." + icon_state = "tea_over_tizira" + +/obj/structure/sign/poster/contraband/tea_over_tizira/examine_more(mob/user) + . = ..() + . += span_notice("You browse some of the poster's information...") + . += "\t[span_info("At the climax of the Human-Lizard war, the human crew of a bomber rescue two enemy soldiers from the vacuum of space. Seeing the souls behind the propaganda, they begin to question their orders, and imprisonment turns to hospitality.")]" + . += "\t[span_info("Is victory worth losing our humanity?")]" + . += "\t[span_info("Starring Dara Reilly, Anton DuBois, Jennifer Clarke, Raz-Parla and Seri-Lewa. An Adriaan van Jenever production. A Carlos de Vivar film. Screenplay by Robert Dane. Music by Joel Karlsbad. Produced by Adriaan van Jenever. Directed by Carlos de Vivar.")]" + . += "\t[span_info("Heartbreaking and thought-provoking- Tea Over Tizira asks questions that few have had the boldness to ask before: The London New Inquirer")]" + . += "\t[span_info("Rated PG13. A Pangalactic Studios Picture.")]" + return . + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/tea_over_tizira, 32) + +/obj/structure/sign/poster/contraband/syndiemoth //Original PR at https://github.com/BeeStation/BeeStation-Hornet/pull/1747 (Also pull/1982); original art credit to AspEv + name = "Syndie Moth - Nuclear Operation" + desc = "A Syndicate-commissioned poster that uses Syndie Moth™ to tell the viewer to keep the nuclear authentication disk unsecured. \"Peace was never an option!\" No good employee would listen to this nonsense." + icon_state = "aspev_syndie" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/syndiemoth, 32) + +/obj/structure/sign/poster/contraband/microwave + name = "How To Charge Your PDA" + desc = "A perfectly legitimate poster that seems to advertise the very real and genuine method of charging your PDA in the future: microwaves." + icon_state = "microwave" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/microwave, 32) + +/obj/structure/sign/poster/contraband/blood_geometer //Poster sprite art by MetalClone, original art by SpessMenArt. + name = "Movie Poster: THE BLOOD GEOMETER" + desc = "A poster for a thrilling noir detective movie set aboard a state-of-the-art space station, following a detective who finds himself wrapped up in the activies of a dangerous cult, who worship an ancient deity: THE BLOOD GEOMETER." + icon_state = "blood_geometer" + +/obj/structure/sign/poster/contraband/blood_geometer/examine_more(mob/user) + . = ..() + . += span_notice("You browse some of the poster's information...") + . += "\t[span_info("THE BLOOD GEOMETER. This name strikes fear into all who know the truth behind the blood-stained moniker of the blood goddess, her true name lost to time.")]" + . += "\t[span_info("In this purely fictional film, follow Ace Ironlungs as he delves into his deadliest mystery yet, and watch him uncover the real culprits behind the bloody plot hatched to bring about a new age of chaos.")]" + . += "\t[span_info("Starring Mason Williams as Ace Ironlungs, Sandra Faust as Vera Killian, and Brody Hart as Cody Parker. A Darrel Hatchkinson film. Screenplay by Adam Allan, music by Joel Karlsbad, directed by Darrel Hatchkinson.")]" + . += "\t[span_info("Thrilling, scary and genuinely worrying. The Blood Geometer has shocked us to our very cores with such striking visuals and overwhelming gore. - New Canadanian Film Guild")]" + . += "\t[span_info("Rated M for mature. A Pangalactic Studios Picture.")]" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/contraband/blood_geometer, 32) diff --git a/code/game/objects/effects/posters/official.dm b/code/game/objects/effects/posters/official.dm new file mode 100644 index 000000000000..dea79cf3e5bd --- /dev/null +++ b/code/game/objects/effects/posters/official.dm @@ -0,0 +1,431 @@ +/obj/item/poster/random_official + name = "random official poster" + poster_type = /obj/structure/sign/poster/official/random + icon_state = "rolled_legit" + +/obj/structure/sign/poster/official + poster_item_name = "motivational poster" + poster_item_desc = "An official Nanotrasen-issued poster to foster a compliant and obedient workforce. It comes with state-of-the-art adhesive backing, for easy pinning to any vertical surface." + poster_item_icon_state = "rolled_legit" + printable = TRUE + +/obj/structure/sign/poster/official/random + name = "Random Official Poster (ROP)" + random_basetype = /obj/structure/sign/poster/official + icon_state = "random_official" + never_random = TRUE + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/random, 32) +//This is being hardcoded here to ensure we don't print directionals from the library management computer because they act wierd as a poster item +/obj/structure/sign/poster/official/random/directional + printable = FALSE + +/obj/structure/sign/poster/official/here_for_your_safety + name = "Here For Your Safety" + desc = "A poster glorifying the station's security force." + icon_state = "here_for_your_safety" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/here_for_your_safety, 32) + +/obj/structure/sign/poster/official/nanotrasen_logo + name = "\improper Nanotrasen logo" + desc = "A poster depicting the Nanotrasen logo." + icon_state = "nanotrasen_logo" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/nanotrasen_logo, 32) + +/obj/structure/sign/poster/official/cleanliness + name = "Cleanliness" + desc = "A poster warning of the dangers of poor hygiene." + icon_state = "cleanliness" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/cleanliness, 32) + +/obj/structure/sign/poster/official/help_others + name = "Help Others" + desc = "A poster encouraging you to help fellow crewmembers." + icon_state = "help_others" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/help_others, 32) + +/obj/structure/sign/poster/official/build + name = "Build" + desc = "A poster glorifying the engineering team." + icon_state = "build" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/build, 32) + +/obj/structure/sign/poster/official/bless_this_spess + name = "Bless This Spess" + desc = "A poster blessing this area." + icon_state = "bless_this_spess" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/bless_this_spess, 32) + +/obj/structure/sign/poster/official/science + name = "Science" + desc = "A poster depicting an atom." + icon_state = "science" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/science, 32) + +/obj/structure/sign/poster/official/ian + name = "Ian" + desc = "Arf arf. Yap." + icon_state = "ian" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/ian, 32) + +/obj/structure/sign/poster/official/obey + name = "Obey" + desc = "A poster instructing the viewer to obey authority." + icon_state = "obey" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/obey, 32) + +/obj/structure/sign/poster/official/walk + name = "Walk" + desc = "A poster instructing the viewer to walk instead of running." + icon_state = "walk" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/walk, 32) + +/obj/structure/sign/poster/official/state_laws + name = "State Laws" + desc = "A poster instructing cyborgs to state their laws." + icon_state = "state_laws" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/state_laws, 32) + +/obj/structure/sign/poster/official/love_ian + name = "Love Ian" + desc = "Ian is love, Ian is life." + icon_state = "love_ian" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/love_ian, 32) + +/obj/structure/sign/poster/official/space_cops + name = "Space Cops." + desc = "A poster advertising the television show Space Cops." + icon_state = "space_cops" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/space_cops, 32) + +/obj/structure/sign/poster/official/ue_no + name = "Ue No." + desc = "This thing is all in Japanese." + icon_state = "ue_no" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/ue_no, 32) + +/obj/structure/sign/poster/official/get_your_legs + name = "Get Your LEGS" + desc = "LEGS: Leadership, Experience, Genius, Subordination." + icon_state = "get_your_legs" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/get_your_legs, 32) + +/obj/structure/sign/poster/official/do_not_question + name = "Do Not Question" + desc = "A poster instructing the viewer not to ask about things they aren't meant to know." + icon_state = "do_not_question" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/do_not_question, 32) + +/obj/structure/sign/poster/official/work_for_a_future + name = "Work For A Future" + desc = " A poster encouraging you to work for your future." + icon_state = "work_for_a_future" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/work_for_a_future, 32) + +/obj/structure/sign/poster/official/soft_cap_pop_art + name = "Soft Cap Pop Art" + desc = "A poster reprint of some cheap pop art." + icon_state = "soft_cap_pop_art" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/soft_cap_pop_art, 32) + +/obj/structure/sign/poster/official/safety_internals + name = "Safety: Internals" + desc = "A poster instructing the viewer to wear internals in the rare environments where there is no oxygen or the air has been rendered toxic." + icon_state = "safety_internals" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/safety_internals, 32) + +/obj/structure/sign/poster/official/safety_eye_protection + name = "Safety: Eye Protection" + desc = "A poster instructing the viewer to wear eye protection when dealing with chemicals, smoke, or bright lights." + icon_state = "safety_eye_protection" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/safety_eye_protection, 32) + +/obj/structure/sign/poster/official/safety_report + name = "Safety: Report" + desc = "A poster instructing the viewer to report suspicious activity to the security force." + icon_state = "safety_report" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/safety_report, 32) + +/obj/structure/sign/poster/official/report_crimes + name = "Report Crimes" + desc = "A poster encouraging the swift reporting of crime or seditious behavior to station security." + icon_state = "report_crimes" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/report_crimes, 32) + +/obj/structure/sign/poster/official/ion_rifle + name = "Ion Rifle" + desc = "A poster displaying an Ion Rifle." + icon_state = "ion_rifle" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/ion_rifle, 32) + +/obj/structure/sign/poster/official/foam_force_ad + name = "Foam Force Ad" + desc = "Foam Force, it's Foam or be Foamed!" + icon_state = "foam_force_ad" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/foam_force_ad, 32) + +/obj/structure/sign/poster/official/cohiba_robusto_ad + name = "Cohiba Robusto Ad" + desc = "Cohiba Robusto, the classy cigar." + icon_state = "cohiba_robusto_ad" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/cohiba_robusto_ad, 32) + +/obj/structure/sign/poster/official/anniversary_vintage_reprint + name = "50th Anniversary Vintage Reprint" + desc = "A reprint of a poster from 2505, commemorating the 50th Anniversary of Nanoposters Manufacturing, a subsidiary of Nanotrasen." + icon_state = "anniversary_vintage_reprint" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/anniversary_vintage_reprint, 32) + +/obj/structure/sign/poster/official/fruit_bowl + name = "Fruit Bowl" + desc = " Simple, yet awe-inspiring." + icon_state = "fruit_bowl" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/fruit_bowl, 32) + +/obj/structure/sign/poster/official/pda_ad + name = "PDA Ad" + desc = "A poster advertising the latest PDA from Nanotrasen suppliers." + icon_state = "pda_ad" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/pda_ad, 32) + +/obj/structure/sign/poster/official/enlist + name = "Enlist" // but I thought deathsquad was never acknowledged + desc = "Enlist in the Nanotrasen Deathsquadron reserves today!" + icon_state = "enlist" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/enlist, 32) + +/obj/structure/sign/poster/official/nanomichi_ad + name = "Nanomichi Ad" + desc = " A poster advertising Nanomichi brand audio cassettes." + icon_state = "nanomichi_ad" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/nanomichi_ad, 32) + +/obj/structure/sign/poster/official/twelve_gauge + name = "12 Gauge" + desc = "A poster boasting about the superiority of 12 gauge shotgun shells." + icon_state = "twelve_gauge" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/twelve_gauge, 32) + +/obj/structure/sign/poster/official/high_class_martini + name = "High-Class Martini" + desc = "I told you to shake it, no stirring." + icon_state = "high_class_martini" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/high_class_martini, 32) + +/obj/structure/sign/poster/official/the_owl + name = "The Owl" + desc = "The Owl would do his best to protect the station. Will you?" + icon_state = "the_owl" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/the_owl, 32) + +/obj/structure/sign/poster/official/no_erp + name = "No ERP" + desc = "This poster reminds the crew that Extreme Role-Playing is banned on Nanotrasen stations." + icon_state = "no_erp" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/no_erp, 32) + +/obj/structure/sign/poster/official/wtf_is_co2 + name = "Carbon Dioxide" + desc = "This informational poster teaches the viewer what carbon dioxide is." + icon_state = "wtf_is_co2" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/wtf_is_co2, 32) + +/obj/structure/sign/poster/official/dick_gum + name = "Dick Gumshue" + desc = "A poster advertising the escapades of Dick Gumshue, mouse detective. Encouraging crew to bring the might of justice down upon wire saboteurs." + icon_state = "dick_gum" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/dick_gum, 32) + +/obj/structure/sign/poster/official/there_is_no_gas_giant + name = "There Is No Gas Giant" + desc = "Nanotrasen has issued posters, like this one, to all stations reminding them that rumours of a gas giant are false." + // And yet people still believe... + icon_state = "there_is_no_gas_giant" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/there_is_no_gas_giant, 32) + +/obj/structure/sign/poster/official/periodic_table + name = "Periodic Table of the Elements" + desc = "A periodic table of the elements, from Hydrogen to Oganesson, and everything inbetween." + icon_state = "periodic_table" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/periodic_table, 32) + +/obj/structure/sign/poster/official/plasma_effects + name = "Plasma and the Body" + desc = "This informational poster provides information on the effects of long-term plasma exposure on the brain." + icon_state = "plasma_effects" + +/obj/structure/sign/poster/official/plasma_effects/examine_more(mob/user) + . = ..() + . += span_notice("You browse some of the poster's information...") + . += "\t[span_info("Plasma (scientific name Amenthium) is classified by TerraGov as a Grade 1 Health Hazard, and has significant risks to health associated with chronic exposure.")]" + . += "\t[span_info("Plasma is known to cross the blood/brain barrier and bioaccumulate in brain tissue, where it begins to result in degradation of brain function. The mechanism for attack is not yet fully known, and as such no concrete preventative advice is available barring proper use of PPE (gloves + protective jumpsuit + respirator).")]" + . += "\t[span_info("In small doses, plasma induces confusion, short-term amnesia, and heightened aggression. These effects persist with continual exposure.")]" + . += "\t[span_info("In individuals with chronic exposure, severe effects have been noted. Further heightened aggression, long-term amnesia, Alzheimer's symptoms, schizophrenia, macular degeneration, aneurysms, heightened risk of stroke, and Parkinsons symptoms have all been noted.")]" + . += "\t[span_info("It is recommended that all individuals in unprotected contact with raw plasma regularly check with company health officials.")]" + . += "\t[span_info("For more information, please check with TerraGov's extranet site on Amenthium: www.terra.gov/health_and_safety/amenthium/, or our internal risk-assessment documents (document numbers #47582-b (Plasma safety data sheets) and #64210 through #64225 (PPE regulations for working with Plasma), available via NanoDoc to all employees).")]" + . += "\t[span_info("Nanotrasen: Always looking after your health.")]" + return . + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/plasma_effects, 32) + +/obj/structure/sign/poster/official/terragov + name = "TerraGov: United for Humanity" + desc = "A poster depicting TerraGov's logo and motto, reminding viewers of who's looking out for humankind." + icon_state = "terragov" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/terragov, 32) + +/obj/structure/sign/poster/official/corporate_perks_vacation + name = "Nanotrasen Corporate Perks: Vacation" + desc = "This informational poster provides information on some of the prizes available via the NT Corporate Perks program, including a two-week vacation for two on the resort world Idyllus." + icon_state = "corporate_perks_vacation" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/corporate_perks_vacation, 32) + +/obj/structure/sign/poster/official/jim_nortons + name = "Jim Norton's Québécois Coffee" + desc = "An advertisement for Jim Norton's, the Québécois coffee joint that's taken the galaxy by storm." + icon_state = "jim_nortons" + +/obj/structure/sign/poster/official/jim_nortons/examine_more(mob/user) + . = ..() + . += span_notice("You browse some of the poster's information...") + . += "\t[span_info("From our roots in Trois-Rivières, we've worked to bring you the best coffee money can buy since 1965.")]" + . += "\t[span_info("So stop by Jim's today- have a hot cup of coffee and a donut, and live like the Québécois do.")]" + . += "\t[span_info("Jim Norton's Québécois Coffee: Toujours Le Bienvenu.")]" + return . + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/jim_nortons, 32) + +/obj/structure/sign/poster/official/twenty_four_seven + name = "24-Seven Supermarkets" + desc = "An advertisement for 24-Seven supermarkets, advertising their new 24-Stops as part of their partnership with Nanotrasen." + icon_state = "twenty_four_seven" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/twenty_four_seven, 32) + +/obj/structure/sign/poster/official/tactical_game_cards + name = "Nanotrasen Tactical Game Cards" + desc = "An advertisement for Nanotrasen's TCG cards: BUY MORE CARDS." + icon_state = "tactical_game_cards" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/tactical_game_cards, 32) + +/obj/structure/sign/poster/official/midtown_slice + name = "Midtown Slice Pizza" + desc = "An advertisement for Midtown Slice Pizza, the official pizzeria partner of Nanotrasen. Midtown Slice: like a slice of home, no matter where you are." + icon_state = "midtown_slice" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/midtown_slice, 32) + +//SafetyMoth Original PR at https://github.com/BeeStation/BeeStation-Hornet/pull/1747 (Also pull/1982) +//SafetyMoth art credit goes to AspEv +/obj/structure/sign/poster/official/moth_hardhat + name = "Safety Moth - Hardhats" + desc = "This informational poster uses Safety Moth™ to tell the viewer to wear hardhats in cautious areas. \"It's like a lamp for your head!\"" + icon_state = "aspev_hardhat" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/moth_hardhat, 32) + +/obj/structure/sign/poster/official/moth_piping + name = "Safety Moth - Piping" + desc = "This informational poster uses Safety Moth™ to tell atmospheric technicians correct types of piping to be used. \"Pipes, not Pumps! Proper pipe placement prevents poor performance!\"" + icon_state = "aspev_piping" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/moth_piping, 32) + +/obj/structure/sign/poster/official/moth_meth + name = "Safety Moth - Methamphetamine" + desc = "This informational poster uses Safety Moth™ to tell the viewer to seek CMO approval before cooking methamphetamine. \"Stay close to the target temperature, and never go over!\" ...You shouldn't ever be making this." + icon_state = "aspev_meth" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/moth_meth, 32) + +/obj/structure/sign/poster/official/moth_epi + name = "Safety Moth - Epinephrine" + desc = "This informational poster uses Safety Moth™ to inform the viewer to help injured/deceased crewmen with their epinephrine injectors. \"Prevent organ rot with this one simple trick!\"" + icon_state = "aspev_epi" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/moth_epi, 32) + +/obj/structure/sign/poster/official/moth_delam + name = "Safety Moth - Delamination Safety Precautions" + desc = "This informational poster uses Safety Moth™ to tell the viewer to hide in lockers when the Supermatter Crystal has delaminated, to prevent hallucinations. Evacuating might be a better strategy." + icon_state = "aspev_delam" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/moth_delam, 32) + +//End of AspEv posters + +/obj/structure/sign/poster/fluff/lizards_gas_payment + name = "Please Pay" + desc = "A crudely-made poster asking the reader to please pay for any items they may wish to leave the station with." + icon_state = "gas_payment" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/fluff/lizards_gas_payment, 32) + +/obj/structure/sign/poster/fluff/lizards_gas_power + name = "Conserve Power" + desc = "A crudely-made poster asking the reader to turn off the power before they leave. Hopefully, it's turned on for their re-opening." + icon_state = "gas_power" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/fluff/lizards_gas_power, 32) + +/obj/structure/sign/poster/official/festive + name = "Festive Notice Poster" + desc = "A poster that informs of active holidays. None are today, so you should get back to work." + icon_state = "holiday_none" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/festive, 32) + +/obj/structure/sign/poster/official/boombox + name = "Boombox" + desc = "An outdated poster containing a list of supposed 'kill words' and code phrases. The poster alleges rival corporations use these to remotely deactivate their agents." + icon_state = "boombox" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/boombox, 32) + +/obj/structure/sign/poster/official/download + name = "You Wouldn't Download A Gun" + desc = "A poster reminding the crew that corporate secrets should stay in the workplace." + icon_state = "download_gun" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/official/download, 32) diff --git a/code/game/objects/effects/posters/poster.dm b/code/game/objects/effects/posters/poster.dm new file mode 100644 index 000000000000..7aa4eebd278d --- /dev/null +++ b/code/game/objects/effects/posters/poster.dm @@ -0,0 +1,294 @@ +// This is synced up to the poster placing animation. +#define PLACE_SPEED 37 + +// The poster item + +/** + * The rolled up item form of a poster + * + * In order to create one of these for a specific poster, you must pass the structure form of the poster as an argument to /new(). + * This structure then gets moved into the contents of the item where it will stay until the poster is placed by a player. + * The structure form is [obj/structure/sign/poster] and that's where all the specific posters are defined. + * If you just want a random poster, see [/obj/item/poster/random_official] or [/obj/item/poster/random_contraband] + */ +/obj/item/poster + name = "poorly coded poster" + desc = "You probably shouldn't be holding this." + icon = 'icons/obj/poster.dmi' + force = 0 + resistance_flags = FLAMMABLE + w_class = WEIGHT_CLASS_SMALL + var/poster_type + var/obj/structure/sign/poster/poster_structure + +/obj/item/poster/examine(mob/user) + . = ..() + . += span_notice("You can booby-trap the poster by using a glass shard on it before you put it up.") + +/obj/item/poster/Initialize(mapload, obj/structure/sign/poster/new_poster_structure) + . = ..() + + var/static/list/hovering_item_typechecks = list( + /obj/item/shard = list( + SCREENTIP_CONTEXT_LMB = "Booby trap poster", + ), + ) + AddElement(/datum/element/contextual_screentip_item_typechecks, hovering_item_typechecks) + + if(new_poster_structure && (new_poster_structure.loc != src)) + new_poster_structure.forceMove(src) //The poster structure *must* be in the item's contents for the exited() proc to properly clean up when placing the poster + poster_structure = new_poster_structure + if(!new_poster_structure && poster_type) + poster_structure = new poster_type(src) + + // posters store what name and description they would like their + // rolled up form to take. + if(poster_structure) + if(QDELETED(poster_structure)) + stack_trace("A poster was initialized with a qdeleted poster_structure, something's gone wrong") + return INITIALIZE_HINT_QDEL + name = poster_structure.poster_item_name + desc = poster_structure.poster_item_desc + icon_state = poster_structure.poster_item_icon_state + + name = "[name] - [poster_structure.original_name]" + +/obj/item/poster/attackby(obj/item/I, mob/user, params) + if(!istype(I, /obj/item/shard)) + return ..() + + if (poster_structure.trap?.resolve()) + balloon_alert(user, "already trapped!") + return + + if(!user.transferItemToLoc(I, poster_structure)) + return + + poster_structure.trap = WEAKREF(I) + to_chat(user, span_notice("You conceal the [I.name] inside the rolled up poster.")) + +/obj/item/poster/Exited(atom/movable/gone, direction) + . = ..() + if(gone == poster_structure) + poster_structure = null + if(!QDELING(src)) + qdel(src) //we're now a poster, huzzah! + +/obj/item/poster/handle_atom_del(atom/deleting_atom) + if(deleting_atom == poster_structure) + poster_structure.moveToNullspace() //get it the fuck out of us since atom/destroy qdels contents and it'll cause a qdel loop + return ..() + +/obj/item/poster/Destroy(force) + QDEL_NULL(poster_structure) + return ..() + +// The poster sign/structure + +/** + * The structure form of a poster. + * + * These are what get placed on maps as posters. They are also what gets created when a player places a poster on a wall. + * For the item form that can be spawned for players, see [/obj/item/poster] + */ +/obj/structure/sign/poster + name = "poster" + var/original_name + desc = "A large piece of space-resistant printed paper." + icon = 'icons/obj/poster.dmi' + anchored = TRUE + buildable_sign = FALSE //Cannot be unwrenched from a wall. + var/ruined = FALSE + var/random_basetype + var/never_random = FALSE // used for the 'random' subclasses. + ///Exclude posters of these types from being added to the random pool + var/list/blacklisted_types = list() + ///Whether the poster should be printable from library management computer. Mostly exists to keep directionals from being printed. + var/printable = FALSE + + var/poster_item_name = "hypothetical poster" + var/poster_item_desc = "This hypothetical poster item should not exist, let's be honest here." + var/poster_item_icon_state = "rolled_poster" + var/poster_item_type = /obj/item/poster + ///A sharp shard of material can be hidden inside of a poster, attempts to embed when it is torn down. + var/datum/weakref/trap + +/obj/structure/sign/poster/Initialize(mapload) + . = ..() + if(random_basetype) + randomise(random_basetype) + if(!ruined) + original_name = name // can't use initial because of random posters + name = "poster - [name]" + desc = "A large piece of space-resistant printed paper. [desc]" + + AddElement(/datum/element/beauty, 300) + +/// Adds contextual screentips +/obj/structure/sign/poster/add_context(atom/source, list/context, obj/item/held_item, mob/user) + if (!held_item) + if (ruined) + return . + context[SCREENTIP_CONTEXT_LMB] = "Rip up poster" + return CONTEXTUAL_SCREENTIP_SET + + if (held_item.tool_behaviour == TOOL_WIRECUTTER) + if (ruined) + context[SCREENTIP_CONTEXT_LMB] = "Clean up remnants" + return CONTEXTUAL_SCREENTIP_SET + context[SCREENTIP_CONTEXT_LMB] = "Take down poster" + return CONTEXTUAL_SCREENTIP_SET + return . + +/obj/structure/sign/poster/proc/randomise(base_type) + var/list/poster_types = subtypesof(base_type) + if(length(blacklisted_types)) + for(var/iterated_type in blacklisted_types) + poster_types -= typesof(iterated_type) + var/list/approved_types = list() + for(var/obj/structure/sign/poster/type_of_poster as anything in poster_types) + if(initial(type_of_poster.icon_state) && !initial(type_of_poster.never_random)) + approved_types |= type_of_poster + + var/obj/structure/sign/poster/selected = pick(approved_types) + + name = initial(selected.name) + desc = initial(selected.desc) + icon_state = initial(selected.icon_state) + icon = initial(selected.icon) + poster_item_name = initial(selected.poster_item_name) + poster_item_desc = initial(selected.poster_item_desc) + poster_item_icon_state = initial(selected.poster_item_icon_state) + ruined = initial(selected.ruined) + if(length(GLOB.holidays) && prob(30)) // its the holidays! lets get festive + apply_holiday() + update_appearance() + +/// allows for posters to become festive posters during holidays +/obj/structure/sign/poster/proc/apply_holiday() + if(!length(GLOB.holidays)) + return + var/active_holiday = pick(GLOB.holidays) + var/datum/holiday/holi_data = GLOB.holidays[active_holiday] + + if(holi_data.poster_name == "generic celebration poster") + return + name = holi_data.poster_name + desc = holi_data.poster_desc + icon_state = holi_data.poster_icon + +/obj/structure/sign/poster/attackby(obj/item/tool, mob/user, params) + if(tool.tool_behaviour == TOOL_WIRECUTTER) + tool.play_tool_sound(src, 100) + if(ruined) + to_chat(user, span_notice("You remove the remnants of the poster.")) + qdel(src) + else + to_chat(user, span_notice("You carefully remove the poster from the wall.")) + roll_and_drop(Adjacent(user) ? get_turf(user) : loc) + +/obj/structure/sign/poster/attack_hand(mob/user, list/modifiers) + . = ..() + if(.) + return + if(ruined) + return + + visible_message(span_notice("[user] rips [src] in a single, decisive motion!") ) + playsound(src.loc, 'sound/items/poster_ripped.ogg', 100, TRUE) + spring_trap(user) + + var/obj/structure/sign/poster/ripped/R = new(loc) + R.pixel_y = pixel_y + R.pixel_x = pixel_x + R.add_fingerprint(user) + qdel(src) + +/obj/structure/sign/poster/proc/spring_trap(mob/user) + var/obj/item/shard/payload = trap?.resolve() + if (!payload) + return + + to_chat(user, span_warning("There's something sharp behind this! What the hell?")) + if(!can_embed_trap(user) || !payload.tryEmbed(user.get_active_hand(), forced = TRUE)) + visible_message(span_notice("A [payload.name] falls from behind the poster.") ) + payload.forceMove(user.drop_location()) + else + SEND_SIGNAL(src, COMSIG_POSTER_TRAP_SUCCEED, user) + +/obj/structure/sign/poster/proc/can_embed_trap(mob/living/carbon/human/user) + if (!istype(user) || HAS_TRAIT(user, TRAIT_PIERCEIMMUNE)) + return FALSE + return !user.gloves || !(user.gloves.body_parts_covered & HANDS) || HAS_TRAIT(user, TRAIT_FINGERPRINT_PASSTHROUGH) || HAS_TRAIT(user.gloves, TRAIT_FINGERPRINT_PASSTHROUGH) + +/obj/structure/sign/poster/proc/roll_and_drop(atom/location) + pixel_x = 0 + pixel_y = 0 + var/obj/item/poster/rolled_poster = new poster_item_type(location, src) // /obj/structure/sign/poster/wanted/roll_and_drop() has some snowflake handling due to icon memes, if you make a major change to this, don't forget to update it too. <3 + forceMove(rolled_poster) + return rolled_poster + +//separated to reduce code duplication. Moved here for ease of reference and to unclutter r_wall/attackby() +/turf/closed/wall/proc/place_poster(obj/item/poster/rolled_poster, mob/user) + if(!rolled_poster.poster_structure) + to_chat(user, span_warning("[rolled_poster] has no poster... inside it? Inform a coder!")) + return + + // Deny placing posters on currently-diagonal walls, although the wall may change in the future. + if (smoothing_flags & SMOOTH_DIAGONAL_CORNERS) + for (var/overlay in overlays) + var/image/new_image = overlay + if(copytext(new_image.icon_state, 1, 3) == "d-") //3 == length("d-") + 1 + return + + var/stuff_on_wall = 0 + for(var/obj/contained_object in contents) //Let's see if it already has a poster on it or too much stuff + if(istype(contained_object, /obj/structure/sign/poster)) + balloon_alert(user, "no room!") + return + stuff_on_wall++ + if(stuff_on_wall == 3) + balloon_alert(user, "no room!") + return + + balloon_alert(user, "hanging poster...") + var/obj/structure/sign/poster/placed_poster = rolled_poster.poster_structure + + flick("poster_being_set", placed_poster) + placed_poster.forceMove(src) //deletion of the poster is handled in poster/Exited(), so don't have to worry about P anymore. + playsound(src, 'sound/items/poster_being_created.ogg', 100, TRUE) + + var/turf/user_drop_location = get_turf(user) //cache this so it just falls to the ground if they move. also no tk memes allowed. + if(!do_after(user, PLACE_SPEED, placed_poster, extra_checks = CALLBACK(placed_poster, TYPE_PROC_REF(/obj/structure/sign/poster, snowflake_wall_turf_check), src))) + placed_poster.roll_and_drop(user_drop_location) + return + + placed_poster.on_placed_poster(user) + return TRUE + +/obj/structure/sign/poster/proc/snowflake_wall_turf_check(atom/hopefully_still_a_wall_turf) //since turfs never get deleted but instead change type, make sure we're still being placed on a wall. + return iswallturf(hopefully_still_a_wall_turf) + +/obj/structure/sign/poster/proc/on_placed_poster(mob/user) + to_chat(user, span_notice("You place the poster!")) + +// Various possible posters follow + +/obj/structure/sign/poster/ripped + ruined = TRUE + icon_state = "poster_ripped" + name = "ripped poster" + desc = "You can't make out anything from the poster's original print. It's ruined." + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/ripped, 32) + +/obj/structure/sign/poster/random + name = "random poster" // could even be ripped + icon_state = "random_anything" + never_random = TRUE + random_basetype = /obj/structure/sign/poster + blacklisted_types = list(/obj/structure/sign/poster/traitor) + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/random, 32) + +#undef PLACE_SPEED diff --git a/code/game/objects/effects/spawners/random/food_or_drink.dm b/code/game/objects/effects/spawners/random/food_or_drink.dm index a1b9976cab2c..e6cf9db1f82c 100644 --- a/code/game/objects/effects/spawners/random/food_or_drink.dm +++ b/code/game/objects/effects/spawners/random/food_or_drink.dm @@ -56,6 +56,7 @@ /obj/item/seeds/liberty = 5, /obj/item/seeds/replicapod = 5, /obj/item/seeds/reishi = 5, + /obj/item/seeds/seedling = 5, /obj/item/seeds/nettle/death = 1, /obj/item/seeds/plump/walkingmushroom = 1, /obj/item/seeds/cannabis/rainbow = 1, diff --git a/code/game/objects/effects/spawners/random/lavaland_mobs.dm b/code/game/objects/effects/spawners/random/lavaland_mobs.dm index 18fa3ff2196d..2e3effdd30a6 100644 --- a/code/game/objects/effects/spawners/random/lavaland_mobs.dm +++ b/code/game/objects/effects/spawners/random/lavaland_mobs.dm @@ -8,11 +8,11 @@ loot = list( /mob/living/basic/mining/bileworm = 1, /mob/living/basic/mining/goliath = 1, + /mob/living/basic/mining/legion = 1, /mob/living/basic/mining/lobstrosity/lava = 1, /mob/living/basic/mining/watcher = 1, - /mob/living/simple_animal/hostile/asteroid/brimdemon = 1, + /mob/living/basic/mining/brimdemon = 1, /mob/living/basic/mining/goldgrub = 1, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion = 1, ) /// Spawns random watcher variants during map generation @@ -46,6 +46,6 @@ desc = "Chance to spawn a rare shiny version." icon_state = "legion" loot = list( - /mob/living/simple_animal/hostile/asteroid/hivelord/legion = 19, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf = 1, + /mob/living/basic/mining/legion = 19, + /mob/living/basic/mining/legion/dwarf = 1, ) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index e3af3614fa1c..800c29e4c555 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -38,6 +38,15 @@ ///The config type to use for greyscaled belt overlays. Both this and greyscale_colors must be assigned to work. var/greyscale_config_belt + //Overrides for digitigrade and snouted clothing handling + //Icon file for mob worn overlays, if the user is digitigrade. + var/icon/worn_icon_digitigrade + //Same as above, but for if the user is snouted. + var/icon/worn_icon_snouted + + var/greyscale_config_worn_digitigrade + var/greyscale_config_worn_snouted + /// Used for BODYTYPE_CUSTOM: Needs to follow this syntax: a list() with the x and y coordinates of the pixel you want to get the color from. Colors are filled in as GAGs values for fallback. var/list/species_clothing_color_coords[3] /* !!!!!!!!!!!!!!! IMPORTANT !!!!!!!!!!!!!! @@ -212,9 +221,13 @@ var/offensive_notes /// Used in obj/item/examine to determines whether or not to detail an item's statistics even if it does not meet the force requirements var/override_notes = FALSE + /// Used if we want to have a custom verb text for throwing. "John Spaceman flicks the ciggerate" for example. + var/throw_verb -/obj/item/Initialize(mapload) + /// A lazylist used for applying fantasy values, contains the actual modification applied to a variable. + var/list/fantasy_modifications +/obj/item/Initialize(mapload) if(attack_verb_continuous) attack_verb_continuous = string_list(attack_verb_continuous) if(attack_verb_simple) @@ -359,6 +372,10 @@ return if(greyscale_config_worn) worn_icon = SSgreyscale.GetColoredIconByType(greyscale_config_worn, greyscale_colors) + if(greyscale_config_worn_digitigrade) + worn_icon_digitigrade = SSgreyscale.GetColoredIconByType(greyscale_config_worn_digitigrade, greyscale_colors) + if(greyscale_config_worn_snouted) + worn_icon_snouted = SSgreyscale.GetColoredIconByType(greyscale_config_worn_snouted, greyscale_colors) if(greyscale_config_inhand_left) lefthand_file = SSgreyscale.GetColoredIconByType(greyscale_config_inhand_left, greyscale_colors) if(greyscale_config_inhand_right) @@ -1195,7 +1212,7 @@ return src /** - * tryEmbed() is for when you want to try embedding something without dealing with the damage + hit messages of calling hitby() on the item while targetting the target. + * tryEmbed() is for when you want to try embedding something without dealing with the damage + hit messages of calling hitby() on the item while targeting the target. * * Really, this is used mostly with projectiles with shrapnel payloads, from [/datum/element/embed/proc/checkEmbedProjectile], and called on said shrapnel. Mostly acts as an intermediate between different embed elements. * @@ -1584,3 +1601,41 @@ /obj/item/update_atom_colour() . = ..() update_slot_icon() + +/// Modifies the fantasy variable +/obj/item/proc/modify_fantasy_variable(variable_key, value, bonus, minimum = 0) + if(LAZYACCESS(fantasy_modifications, variable_key) != null) + stack_trace("modify_fantasy_variable was called twice for the same key '[variable_key]' on type '[type]' before reset_fantasy_variable could be called!") + var/intended_target = value + bonus + value = max(minimum, intended_target) + + var/difference = intended_target - value + var/modified_amount = bonus - difference + LAZYSET(fantasy_modifications, variable_key, modified_amount) + return value + +/// Returns the original fantasy variable value +/obj/item/proc/reset_fantasy_variable(variable_key, current_value) + var/modification = LAZYACCESS(fantasy_modifications, variable_key) + LAZYREMOVE(fantasy_modifications, variable_key) + if(!modification) + return current_value + return current_value - modification + +/obj/item/proc/apply_fantasy_bonuses(bonus) + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_ITEM_APPLY_FANTASY_BONUSES, bonus) + force = modify_fantasy_variable("force", force, bonus) + throwforce = modify_fantasy_variable("throwforce", throwforce, bonus) + wound_bonus = modify_fantasy_variable("wound_bonus", wound_bonus, bonus) + bare_wound_bonus = modify_fantasy_variable("bare_wound_bonus", bare_wound_bonus, bonus) + toolspeed = modify_fantasy_variable("toolspeed", toolspeed, -bonus/10, minimum = 0.1) + +/obj/item/proc/remove_fantasy_bonuses(bonus) + SHOULD_CALL_PARENT(TRUE) + force = reset_fantasy_variable("force", force) + throwforce = reset_fantasy_variable("throwforce", throwforce) + wound_bonus = reset_fantasy_variable("wound_bonus", wound_bonus) + bare_wound_bonus = reset_fantasy_variable("bare_wound_bonus", bare_wound_bonus) + toolspeed = reset_fantasy_variable("toolspeed", toolspeed) + SEND_SIGNAL(src, COMSIG_ITEM_REMOVE_FANTASY_BONUSES, bonus) diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm index 97770c2fff52..9edeca9411e8 100644 --- a/code/game/objects/items/apc_frame.dm +++ b/code/game/objects/items/apc_frame.dm @@ -25,3 +25,16 @@ to_chat(user, span_notice("You cut the cables and disassemble the unused power terminal.")) qdel(E) return TRUE + +/obj/item/wallframe/apc/screwdriver_act(mob/living/user, obj/item/tool) + //overriding the wallframe parent screwdriver act with this one which allows applying to existing apc frames. + + var/turf/T = get_step(get_turf(user), user.dir) + if(iswallturf(T)) + if(locate(/obj/machinery/power/apc) in get_turf(user)) + var/obj/machinery/power/apc/mounted_apc = locate(/obj/machinery/power/apc) in get_turf(user) + mounted_apc.attackby(src, user) + return TOOL_ACT_TOOLTYPE_SUCCESS + T.attackby(src, user) + return TOOL_ACT_TOOLTYPE_SUCCESS + diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index 570d59191116..6a3ead00ca07 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -6,6 +6,7 @@ icon_state = "cutout_basic" w_class = WEIGHT_CLASS_BULKY resistance_flags = FLAMMABLE + obj_flags = CAN_BE_HIT item_flags = NO_PIXEL_RANDOM_DROP /// If the cutout is pushed over and has to be righted var/pushed_over = FALSE @@ -60,32 +61,20 @@ /obj/item/cardboard_cutout/attackby(obj/item/I, mob/living/user, params) if(istype(I, /obj/item/toy/crayon)) change_appearance(I, user) - return - // Why yes, this does closely resemble mob and object attack code. - if(I.item_flags & NOBLUDGEON) - return - if(!I.force) - playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), TRUE, -1) - else if(I.hitsound) - playsound(loc, I.hitsound, get_clamped_volume(), TRUE, -1) - - user.changeNext_move(CLICK_CD_MELEE) - user.do_attack_animation(src) - - if(I.force) - user.visible_message(span_danger("[user] hits [src] with [I]!"), \ - span_danger("You hit [src] with [I]!")) - if(prob(I.force)) - push_over() - -/obj/item/cardboard_cutout/bullet_act(obj/projectile/P, def_zone, piercing_hit = FALSE) - if(istype(P, /obj/projectile/bullet/reusable)) - P.on_hit(src, 0, piercing_hit) - visible_message(span_danger("[src] is hit by [P]!")) - playsound(src, 'sound/weapons/slice.ogg', 50, TRUE) - if(prob(P.damage)) + return TRUE + + return ..() + +/obj/item/cardboard_cutout/take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir, armour_penetration) + . = ..() + var/damage_sustained = . || 0 + if((damage_flag == BULLET || damage_flag == MELEE) && (damage_type == BRUTE) && prob(damage_sustained)) push_over() - return BULLET_ACT_HIT + +/obj/item/cardboard_cutout/deconstruct(disassembled) + if(!(flags_1 & (HOLOGRAM_1|NODECONSTRUCT_1))) + new /obj/item/stack/sheet/cardboard(loc, 1) + return ..() /proc/get_cardboard_cutout_instance(datum/cardboard_cutout/cardboard_cutout) ASSERT(ispath(cardboard_cutout), "[cardboard_cutout] is not a path of /datum/cardboard_cutout") diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 21516c12ccf2..d00150a359fb 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -106,6 +106,15 @@ fire = 100 acid = 100 +/obj/item/card/id/apply_fantasy_bonuses(bonus) + . = ..() + if(bonus >= 15) + add_access(SSid_access.get_region_access_list(list(REGION_ALL_GLOBAL)), mode = FORCE_ADD_ALL) + else if(bonus >= 10) + add_access(SSid_access.get_region_access_list(list(REGION_ALL_STATION)), mode = FORCE_ADD_ALL) + else if(bonus <= -10) + clear_access() + /obj/item/card/id/Initialize(mapload) . = ..() @@ -664,6 +673,13 @@ if(!registered_account || registered_account.replaceable) set_new_account(user) return + if(registered_account.account_debt) + var/choice = tgui_alert(user, "Choose An Action", "Bank Account", list("Withdraw", "Pay Debt")) + if(!choice || QDELETED(user) || QDELETED(src) || !alt_click_can_use_id(user) || loc != user) + return + if(choice == "Pay Debt") + pay_debt(user) + return if (registered_account.being_dumped) registered_account.bank_card_talk(span_warning("内部服务器错误"), TRUE) return @@ -686,6 +702,18 @@ var/difference = amount_to_remove - registered_account.account_balance registered_account.bank_card_talk(span_warning("ERROR: The linked account requires [difference] more credit\s to perform that withdrawal."), TRUE) +/obj/item/card/id/proc/pay_debt(user) + var/amount_to_pay = tgui_input_number(user, "How much do you want to pay? (Max: [registered_account.account_balance] cr)", "Debt Payment", max_value = min(registered_account.account_balance, registered_account.account_debt)) + if(!amount_to_pay || QDELETED(src) || loc != user || !alt_click_can_use_id(user)) + return + var/prev_debt = registered_account.account_debt + var/amount_paid = registered_account.pay_debt(amount_to_pay) + if(amount_paid) + var/message = span_notice("You pay [amount_to_pay] credits of a [prev_debt] cr debt. [registered_account.account_debt] cr to go.") + if(!registered_account.account_debt) + message = span_nicegreen("You pay the last [amount_to_pay] credits of your debt, extinguishing it. Congratulations!") + to_chat(user, message) + /obj/item/card/id/examine(mob/user) . = ..() if(!user.can_read(src)) @@ -734,6 +762,8 @@ if(registered_account.mining_points) . += "There's [registered_account.mining_points] mining point\s loaded onto the card's bank account." . += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr." + if(registered_account.account_debt) + . += span_warning("The account is currently indebted for [registered_account.account_debt] cr. [100*DEBT_COLLECTION_COEFF]% of all earnings will go towards extinguishing it.") if(registered_account.account_job) var/datum/bank_account/D = SSeconomy.get_dep_account(registered_account.account_job.paycheck_department) if(D) diff --git a/code/game/objects/items/chainsaw.dm b/code/game/objects/items/chainsaw.dm index 00d532189ab4..1d7c6c450382 100644 --- a/code/game/objects/items/chainsaw.dm +++ b/code/game/objects/items/chainsaw.dm @@ -27,6 +27,18 @@ ///The looping sound for our chainsaw when running var/datum/looping_sound/chainsaw/chainsaw_loop +/obj/item/chainsaw/apply_fantasy_bonuses(bonus) + . = ..() + force_on = modify_fantasy_variable("force_on", force_on, bonus) + if(on) + force = force_on + +/obj/item/chainsaw/remove_fantasy_bonuses(bonus) + force_on = reset_fantasy_variable("force_on", force_on) + if(on) + force = force_on + return ..() + /obj/item/chainsaw/Initialize(mapload) . = ..() chainsaw_loop = new(src) diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index eb9444784e21..648be418acc7 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -138,6 +138,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM body_parts_covered = null grind_results = list() heat = 1000 + supports_variations_flags = CLOTHING_SNOUTED_VARIATION + throw_verb = "flick" /// Whether this cigarette has been lit. var/lit = FALSE /// Whether this cigarette should start lit. @@ -467,6 +469,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM chem_volume = 50 list_reagents = null choke_time_max = 40 SECONDS + supports_variations_flags = CLOTHING_SNOUTED_VARIATION /obj/item/clothing/mask/cigarette/rollie/Initialize(mapload) name = pick(list( @@ -586,6 +589,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM smoketime = 20 MINUTES chem_volume = 80 list_reagents = list(/datum/reagent/drug/nicotine = 40) + supports_variations_flags = CLOTHING_SNOUTED_VARIATION /obj/item/clothing/mask/cigarette/cigar/havana name = "premium Havanian cigar" @@ -596,6 +600,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM smoketime = 30 MINUTES chem_volume = 60 list_reagents = list(/datum/reagent/drug/nicotine = 45) + supports_variations_flags = CLOTHING_SNOUTED_VARIATION /obj/item/cigbutt name = "cigarette butt" @@ -628,6 +633,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM list_reagents = null w_class = WEIGHT_CLASS_SMALL choke_forever = TRUE + supports_variations_flags = CLOTHING_SNOUTED_VARIATION ///name of the stuff packed inside this pipe var/packeditem diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index a05659e0e18d..16f95ad06119 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -600,8 +600,3 @@ name = "Medical Order" greyscale_colors = CIRCUIT_COLOR_SUPPLY build_path = /obj/machinery/computer/department_orders/medical - -/obj/item/circuitboard/computer/quantum_console - name = "Quantum Server Console" - greyscale_colors = CIRCUIT_COLOR_SUPPLY - build_path = /obj/machinery/computer/quantum_console diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm index 32c33148e534..55546a1a5bc4 100644 --- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm @@ -944,15 +944,6 @@ /datum/stock_part/manipulator = 1, /datum/stock_part/micro_laser = 1) -/obj/item/circuitboard/machine/experimentor - name = "E.X.P.E.R.I-MENTOR" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/rnd/experimentor - req_components = list( - /datum/stock_part/scanning_module = 1, - /datum/stock_part/manipulator = 2, - /datum/stock_part/micro_laser = 2) - /obj/item/circuitboard/machine/mech_recharger name = "Mechbay Recharger" greyscale_colors = CIRCUIT_COLOR_SCIENCE @@ -1477,27 +1468,37 @@ /obj/item/stock_parts/micro_laser = 1, /obj/item/stack/sheet/glass = 1, /obj/item/stock_parts/scanning_module = 1) -/obj/item/circuitboard/machine/navbeacon - name = "Bot Navigational Beacon" - greyscale_colors = CIRCUIT_COLOR_SCIENCE - build_path = /obj/machinery/navbeacon - req_components = list() -/obj/item/circuitboard/machine/quantum_server - name = "Quantum Server" - greyscale_colors = CIRCUIT_COLOR_SUPPLY - build_path = /obj/machinery/quantum_server +/obj/item/circuitboard/machine/artifactxray + name = "Artifact X-Ray Machine" + greyscale_colors = CIRCUIT_COLOR_SCIENCE + build_path = /obj/machinery/artifact_xray req_components = list( - /datum/stock_part/manipulator = 2, - /datum/stock_part/scanning_module = 1, - /datum/stock_part/capacitor = 1, - ) + /obj/item/stock_parts/capacitor = 1, + /datum/stock_part/scanning_module = 1, + /obj/item/stock_parts/micro_laser = 1) -/obj/item/circuitboard/machine/netpod - name = "Netpod" - greyscale_colors = CIRCUIT_COLOR_SUPPLY - build_path = /obj/machinery/netpod +/obj/item/circuitboard/machine/artifactheater + name = "Artifact Heating Pad" + greyscale_colors = CIRCUIT_COLOR_SCIENCE + build_path = /obj/machinery/atmospherics/components/unary/artifact_heatingpad req_components = list( - /datum/stock_part/manipulator = 1, /datum/stock_part/matter_bin = 2, - ) + /obj/item/stack/cable_coil = 1, + /obj/item/stack/sheet/glass = 1) + +/obj/item/circuitboard/machine/artifactzapper + name = "Artifact Zapper" + greyscale_colors = CIRCUIT_COLOR_SCIENCE + build_path = /obj/machinery/artifact_zapper + req_components = list( + /datum/stock_part/capacitor = 2, + /datum/stock_part/scanning_module = 1, + /obj/item/stack/cable_coil = 1, + /obj/item/stack/sheet/glass = 3) + +/obj/item/circuitboard/machine/navbeacon + name = "Bot Navigational Beacon" + greyscale_colors = CIRCUIT_COLOR_SCIENCE + build_path = /obj/machinery/navbeacon + req_components = list() diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 7ce9de6d2f86..673e30b04776 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -815,7 +815,8 @@ carbon_target.set_eye_blur_if_lower(6 SECONDS) carbon_target.adjust_temp_blindness(2 SECONDS) if(carbon_target.get_eye_protection() <= 0) // no eye protection? ARGH IT BURNS. Warning: don't add a stun here. It's a roundstart item with some quirks. - carbon_target.apply_effects(eyeblur = 5, jitter = 10) + carbon_target.adjust_jitter(1 SECONDS) + carbon_target.adjust_eye_blur(0.5 SECONDS) flash_color(carbon_target, flash_color=paint_color, flash_time=40) if(ishuman(carbon_target) && actually_paints) var/mob/living/carbon/human/human_target = carbon_target diff --git a/code/game/objects/items/debug_items.dm b/code/game/objects/items/debug_items.dm index 4ab086d90c9b..0e316f2e8abd 100644 --- a/code/game/objects/items/debug_items.dm +++ b/code/game/objects/items/debug_items.dm @@ -147,3 +147,20 @@ for(var/spawn_atom in (choice == "No" ? typesof(path) : subtypesof(path))) new spawn_atom(loc_turf) + +/obj/item/debug/artifact_activator + name = "artifact activation wand" + desc = "Aim at an artifact and click to activate it." + icon = 'icons/obj/weapons/guns/magic.dmi' + icon_state = "nothingwand" + inhand_icon_state = "wand" + lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items_righthand.dmi' + w_class = WEIGHT_CLASS_SMALL + +/obj/item/debug/artifact_activator/afterattack(atom/target, mob/user, proximity) + ..() + var/datum/component/artifact/artifact = target.GetComponent(/datum/component/artifact) + if(isobj(target) && artifact) + artifact.artifact_activate() + diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 6a94bb3598b3..6b2a1ef0eacd 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -233,7 +233,7 @@ holo_cooldown = world.time + 10 SECONDS return -// see: [/datum/wound/burn/proc/uv()] +// see: [/datum/wound/burn/flesh/proc/uv()] /obj/item/flashlight/pen/paramedic name = "paramedic penlight" desc = "A high-powered UV penlight intended to help stave off infection in the field on serious burned patients. Probably really bad to look into." diff --git a/code/game/objects/items/devices/polycircuit.dm b/code/game/objects/items/devices/polycircuit.dm index 9dbdbff993d7..5b7fd42d6f6b 100644 --- a/code/game/objects/items/devices/polycircuit.dm +++ b/code/game/objects/items/devices/polycircuit.dm @@ -51,7 +51,7 @@ else to_chat(user, span_notice("You navigate the sharp edges of circuitry and remove a single board from [src]")) else - H.apply_damage(15, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + H.apply_damage(15, BRUTE, pick(GLOB.arm_zones)) to_chat(user, span_warning("You give yourself a wicked cut on [src]'s many sharp corners and edges!")) /obj/item/stack/circuit_stack/full diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index 6e48f610f9c8..a6cdcd5108c3 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -181,9 +181,9 @@ trauma_text += trauma_desc render_list += "Cerebral traumas detected: subject appears to be suffering from [english_list(trauma_text)].\n" if(carbontarget.quirks.len) - render_list += "Subject Major Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MAJOR_DISABILITY)].\n" + render_list += "Subject Major Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MAJOR_DISABILITY, from_scan = TRUE)].\n" if(advanced) - render_list += "Subject Minor Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MINOR_DISABILITY)].\n" + render_list += "Subject Minor Disabilities: [carbontarget.get_quirk_string(FALSE, CAT_QUIRK_MINOR_DISABILITY, TRUE)].\n" if (HAS_TRAIT(target, TRAIT_IRRADIATED)) render_list += "Subject is irradiated. Supply toxin healing.\n" diff --git a/code/game/objects/items/dna_probe.dm b/code/game/objects/items/dna_probe.dm index 4ea89d0a95e7..6c9651a31421 100644 --- a/code/game/objects/items/dna_probe.dm +++ b/code/game/objects/items/dna_probe.dm @@ -135,7 +135,7 @@ to_chat(user, span_notice("You pull out the needle from [src] and flip the switch, and start injecting yourself with it.")) if(!do_after(user, CARP_MIX_DNA_TIMER)) return - var/mob/living/simple_animal/hostile/space_dragon/new_dragon = user.change_mob_type(/mob/living/simple_animal/hostile/space_dragon, location = loc, delete_old_mob = TRUE) + var/mob/living/basic/space_dragon/new_dragon = user.change_mob_type(/mob/living/basic/space_dragon, location = loc, delete_old_mob = TRUE) new_dragon.add_filter("anger_glow", 3, list("type" = "outline", "color" = "#ff330030", "size" = 5)) new_dragon.add_movespeed_modifier(/datum/movespeed_modifier/dragon_rage) priority_announce("A large organic energy flux has been recorded near of [station_name()], please stand-by.", "Lifesign Alert") diff --git a/code/game/objects/items/food/_food.dm b/code/game/objects/items/food/_food.dm index a790cb65f4c4..b18f0b09f9fc 100644 --- a/code/game/objects/items/food/_food.dm +++ b/code/game/objects/items/food/_food.dm @@ -46,7 +46,8 @@ var/decomp_req_handle = FALSE ///Used to set custom decomposition times for food. Set to 0 to have it automatically set via the food's flags. var/decomposition_time = 0 - + ///If we want to still force feed food even on combat mode or harm intent - monkestation edit + var/force_feed_on_aggression = FALSE ///The food buffs the food has var/food_buffs = STATUS_EFFECT_FOOD_STAM_MEDIUM diff --git a/code/game/objects/items/food/monkeycube.dm b/code/game/objects/items/food/monkeycube.dm index 5cf9db79fd01..e78d45ad2e83 100644 --- a/code/game/objects/items/food/monkeycube.dm +++ b/code/game/objects/items/food/monkeycube.dm @@ -8,7 +8,6 @@ foodtypes = MEAT | SUGAR food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_TINY - var/faction var/spawned_mob = /mob/living/carbon/human/species/monkey /obj/item/food/monkeycube/proc/Expand() @@ -62,7 +61,7 @@ /datum/reagent/medicine/strange_reagent = 5, ) tastes = list("the jungle" = 1, "bananas" = 1, "jimmies" = 1) - spawned_mob = /mob/living/simple_animal/hostile/gorilla + spawned_mob = /mob/living/basic/gorilla /obj/item/food/monkeycube/chicken name = "chicken cube" diff --git a/code/game/objects/items/grenades/_grenade.dm b/code/game/objects/items/grenades/_grenade.dm index 404c66640c4b..aa0e506dba31 100644 --- a/code/game/objects/items/grenades/_grenade.dm +++ b/code/game/objects/items/grenades/_grenade.dm @@ -66,6 +66,29 @@ if(!QDELETED(src)) qdel(src) +/obj/item/grenade/apply_fantasy_bonuses(bonus) + . = ..() + apply_grenade_fantasy_bonuses(bonus) + +/obj/item/grenade/remove_fantasy_bonuses(bonus) + remove_grenade_fantasy_bonuses(bonus) + return ..() + +/obj/item/grenade/proc/apply_grenade_fantasy_bonuses(quality) + if(ex_dev == 0 && ex_heavy == 0 && ex_light == 0 && ex_flame == 0) + return + var/devIncrease = round(quality / 10) + var/heavyIncrease = round(quality / 5) + var/lightIncrease = round(quality / 2) + ex_dev = modify_fantasy_variable("ex_dev", ex_dev, devIncrease, 0) + ex_heavy = modify_fantasy_variable("ex_heavy", ex_heavy, heavyIncrease, 0) + ex_light = modify_fantasy_variable("ex_light", ex_light, lightIncrease, 0) + +/obj/item/grenade/proc/remove_grenade_fantasy_bonuses(quality) + ex_dev = reset_fantasy_variable("ex_dev", ex_dev) + ex_heavy = reset_fantasy_variable("ex_heavy", ex_heavy) + ex_light = reset_fantasy_variable("ex_light", ex_light) + /** * Checks for various ways to botch priming a grenade. * diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index 06d60173bd84..6871c4ed0953 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -34,6 +34,12 @@ stage_change() // If no argument is set, it will change the stage to the current stage, useful for stock grenades that start READY. wires = new /datum/wires/explosive/chem_grenade(src) +/obj/item/grenade/chem_grenade/apply_grenade_fantasy_bonuses(quality) + threatscale = modify_fantasy_variable("threatscale", threatscale, quality/10) + +/obj/item/grenade/chem_grenade/remove_grenade_fantasy_bonuses(quality) + threatscale = reset_fantasy_variable("threatscale", threatscale) + /obj/item/grenade/chem_grenade/examine(mob/user) display_timer = (stage == GRENADE_READY) //show/hide the timer based on assembly state . = ..() diff --git a/code/game/objects/items/grenades/clusterbuster.dm b/code/game/objects/items/grenades/clusterbuster.dm index a12c302c188b..e4862919c1c1 100644 --- a/code/game/objects/items/grenades/clusterbuster.dm +++ b/code/game/objects/items/grenades/clusterbuster.dm @@ -18,6 +18,14 @@ var/max_spawned = 8 var/segment_chance = 35 +/obj/item/grenade/clusterbuster/apply_grenade_fantasy_bonuses(quality) + min_spawned = modify_fantasy_variable("min_spawned", min_spawned, round(quality/2)) + max_spawned = modify_fantasy_variable("max_spawned", max_spawned, round(quality/2)) + +/obj/item/grenade/clusterbuster/remove_grenade_fantasy_bonuses(quality) + min_spawned = reset_fantasy_variable("min_spawned", min_spawned) + max_spawned = reset_fantasy_variable("max_spawned", max_spawned) + /obj/item/grenade/clusterbuster/detonate(mob/living/lanced_by) . = ..() if(!.) diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index cd5e43c2daf2..c472b2698b42 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -6,6 +6,12 @@ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' var/flashbang_range = 7 //how many tiles away the mob will be stunned. +/obj/item/grenade/flashbang/apply_grenade_fantasy_bonuses(quality) + flashbang_range = modify_fantasy_variable("flashbang_range", flashbang_range, quality) + +/obj/item/grenade/flashbang/remove_grenade_fantasy_bonuses(quality) + flashbang_range = reset_fantasy_variable("flashbang_range", flashbang_range) + /obj/item/grenade/flashbang/detonate(mob/living/lanced_by) . = ..() if(!.) @@ -105,7 +111,7 @@ living_mob.Paralyze(20) living_mob.Knockdown(200) living_mob.soundbang_act(1, 200, 10, 15) - if(living_mob.apply_damages(10, 10)) + if(living_mob.apply_damages(brute = 10, burn = 10)) to_chat(living_mob, span_userdanger("The blast from \the [src] bruises and burns you!")) // only checking if they're on top of the tile, cause being one tile over will be its own punishment diff --git a/code/game/objects/items/grenades/hypno.dm b/code/game/objects/items/grenades/hypno.dm index 035533d47310..0d7601df204a 100644 --- a/code/game/objects/items/grenades/hypno.dm +++ b/code/game/objects/items/grenades/hypno.dm @@ -7,6 +7,12 @@ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' var/flashbang_range = 7 +/obj/item/grenade/hypnotic/apply_grenade_fantasy_bonuses(quality) + flashbang_range = modify_fantasy_variable("flashbang_range", flashbang_range, quality) + +/obj/item/grenade/hypnotic/remove_grenade_fantasy_bonuses(quality) + flashbang_range = reset_fantasy_variable("flashbang_range", flashbang_range) + /obj/item/grenade/hypnotic/detonate(mob/living/lanced_by) . = ..() if(!.) diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 363bd3e17657..10293d9e1335 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -23,6 +23,19 @@ /// Maximum timer for c4 charges var/maximum_timer = 60000 +/obj/item/grenade/c4/apply_grenade_fantasy_bonuses(quality) + var/devIncrease = round(quality / 10) + var/heavyIncrease = round(quality / 5) + var/lightIncrease = round(quality / 2) + boom_sizes[1] = modify_fantasy_variable("devIncrease", boom_sizes[1], devIncrease) + boom_sizes[2] = modify_fantasy_variable("heavyIncrease", boom_sizes[2], heavyIncrease) + boom_sizes[3] = modify_fantasy_variable("lightIncrease", boom_sizes[3], lightIncrease) + +/obj/item/grenade/c4/remove_grenade_fantasy_bonuses(quality) + boom_sizes[1] = reset_fantasy_variable("devIncrease", boom_sizes[1]) + boom_sizes[2] = reset_fantasy_variable("heavyIncrease", boom_sizes[2]) + boom_sizes[3] = reset_fantasy_variable("lightIncrease", boom_sizes[3]) + /obj/item/grenade/c4/Initialize(mapload) . = ..() AddElement(/datum/element/empprotection, EMP_PROTECT_WIRES) diff --git a/code/game/objects/items/grenades/spawnergrenade.dm b/code/game/objects/items/grenades/spawnergrenade.dm index 3e8c81054f12..1b9d9ff27d09 100644 --- a/code/game/objects/items/grenades/spawnergrenade.dm +++ b/code/game/objects/items/grenades/spawnergrenade.dm @@ -7,6 +7,12 @@ var/spawner_type = null // must be an object path var/deliveryamt = 1 // amount of type to deliver +/obj/item/grenade/spawnergrenade/apply_grenade_fantasy_bonuses(quality) + deliveryamt = modify_fantasy_variable("deliveryamt", deliveryamt, quality) + +/obj/item/grenade/spawnergrenade/remove_grenade_fantasy_bonuses(quality) + deliveryamt = reset_fantasy_variable("deliveryamt", deliveryamt) + /obj/item/grenade/spawnergrenade/detonate(mob/living/lanced_by) // Prime now just handles the two loops that query for people in lockers and people who can see it. . = ..() if(!.) @@ -55,7 +61,7 @@ desc = "A sleek device often given to clowns on their 10th birthdays for protection. You can hear faint scratching coming from within." icon_state = "clown_ball" inhand_icon_state = null - spawner_type = list(/mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton, /mob/living/simple_animal/hostile/retaliate/clown/banana, /mob/living/simple_animal/hostile/retaliate/clown/honkling, /mob/living/simple_animal/hostile/retaliate/clown/lube) + spawner_type = list(/mob/living/basic/clown/fleshclown, /mob/living/basic/clown/clownhulk, /mob/living/basic/clown/longface, /mob/living/basic/clown/clownhulk/chlown, /mob/living/basic/clown/clownhulk/honkmunculus, /mob/living/basic/clown/mutant/glutton, /mob/living/basic/clown/banana, /mob/living/basic/clown/honkling, /mob/living/basic/clown/lube) deliveryamt = 1 /obj/item/grenade/spawnergrenade/clown_broken @@ -63,5 +69,5 @@ desc = "A sleek device often given to clowns on their 10th birthdays for protection. While a typical C.L.U.W.N.E only holds one creature, sometimes foolish young clowns try to cram more in, often to disasterous effect." icon_state = "clown_broken" inhand_icon_state = null - spawner_type = /mob/living/simple_animal/hostile/retaliate/clown/mutant + spawner_type = /mob/living/basic/clown/mutant deliveryamt = 5 diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm index c2ddc1ea732a..5349ea85b23e 100644 --- a/code/game/objects/items/hand_items.dm +++ b/code/game/objects/items/hand_items.dm @@ -128,7 +128,7 @@ return FALSE var/obj/item/bodypart/head/the_head = target.get_bodypart(BODY_ZONE_HEAD) - if(!(the_head.biological_state & BIO_FLESH) || !IS_ORGANIC_LIMB(the_head)) + if(!(the_head.biological_state & BIO_FLESH)) to_chat(user, span_warning("You can't noogie [target], [target.p_they()] [target.p_have()] no skin on [target.p_their()] head!")) return diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 3d121f854f87..a24aeb45ce4b 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -40,6 +40,7 @@ throw_range = 5 custom_materials = list(/datum/material/iron=500) breakouttime = 1 MINUTES + var/handcuff_time = 3 SECONDS armor_type = /datum/armor/restraints_handcuffs custom_price = PAYCHECK_COMMAND * 0.35 ///Sound that plays when starting to put handcuffs on someone @@ -47,6 +48,14 @@ ///If set, handcuffs will be destroyed on application and leave behind whatever this is set to. var/trashtype = null +/obj/item/restraints/handcuffs/apply_fantasy_bonuses(bonus) + . = ..() + handcuff_time = modify_fantasy_variable("handcuff_time", handcuff_time, -bonus * 2, minimum = 0.3 SECONDS) + +/obj/item/restraints/handcuffs/remove_fantasy_bonuses(bonus) + handcuff_time = reset_fantasy_variable("handcuff_time", handcuff_time) + return ..() + /datum/armor/restraints_handcuffs fire = 50 acid = 50 @@ -70,7 +79,7 @@ to_chat(C, span_userdanger("As you feel someone grab your wrists, [src] start digging into your skin!")) playsound(loc, cuffsound, 30, TRUE, -2) log_combat(user, C, "attempted to handcuff") - if(do_after(user, 3 SECONDS, C, timed_action_flags = IGNORE_SLOWDOWNS) && C.canBeHandcuffed()) + if(do_after(user, handcuff_time, C, timed_action_flags = IGNORE_SLOWDOWNS) && C.canBeHandcuffed()) if(iscyborg(user)) apply_cuffs(C, user, TRUE) else diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 36a3a643fde0..7a3f7a2e18fc 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -29,9 +29,9 @@ success_forcesay = "BEGONE FOUL MAGIKS!!", \ tip_text = "Clear rune", \ on_clear_callback = CALLBACK(src, PROC_REF(on_cult_rune_removed)), \ - effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune, /obj/effect/cosmic_rune)) - - AddElement(/datum/element/bane, target_type = /mob/living/simple_animal/revenant, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE) + effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune, /obj/effect/cosmic_rune), \ + ) + AddElement(/datum/element/bane, target_type = /mob/living/basic/revenant, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE) if(!GLOB.holy_weapon_type && type == /obj/item/nullrod) var/list/rods = list() diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index 9460848bbdcc..2cd93dc64070 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -361,13 +361,6 @@ starting_title = "Research and Development 101" page_link = "Guide_to_Research_and_Development" -/obj/item/book/manual/wiki/experimentor - name = "Mentoring your Experiments" - icon_state = "rdbook" - starting_author = "Dr. H.P. Kritz" - starting_title = "Mentoring your Experiments" - page_link = "Experimentor" - /obj/item/book/manual/wiki/cooking_to_serve_man name = "To Serve Man" desc = "It's a cookbook!" diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index 0b8c9b0a4da9..70b0330305a9 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -42,22 +42,22 @@ /// Boolean on whether people with chunky fingers can use this baton. var/chunky_finger_usable = FALSE - /// The context to show when the baton is active and targetting a living thing + /// The context to show when the baton is active and targeting a living thing var/context_living_target_active = "Stun" - /// The context to show when the baton is active and targetting a living thing in combat mode + /// The context to show when the baton is active and targeting a living thing in combat mode var/context_living_target_active_combat_mode = "Stun" - /// The context to show when the baton is inactive and targetting a living thing + /// The context to show when the baton is inactive and targeting a living thing var/context_living_target_inactive = "Prod" - /// The context to show when the baton is inactive and targetting a living thing in combat mode + /// The context to show when the baton is inactive and targeting a living thing in combat mode var/context_living_target_inactive_combat_mode = "Attack" - /// The RMB context to show when the baton is active and targetting a living thing + /// The RMB context to show when the baton is active and targeting a living thing var/context_living_rmb_active = "Attack" - /// The RMB context to show when the baton is inactive and targetting a living thing + /// The RMB context to show when the baton is inactive and targeting a living thing var/context_living_rmb_inactive = "Attack" /obj/item/melee/baton/Initialize(mapload) @@ -95,6 +95,15 @@ if(BATON_ATTACKING) finalize_baton_attack(target, user, modifiers) +/obj/item/melee/baton/apply_fantasy_bonuses(bonus) + . = ..() + stamina_damage = modify_fantasy_variable("stamina_damage", stamina_damage, bonus * 4) + + +/obj/item/melee/baton/remove_fantasy_bonuses(bonus) + stamina_damage = reset_fantasy_variable("stamina_damage", stamina_damage) + return ..() + /obj/item/melee/baton/add_item_context(datum/source, list/context, atom/target, mob/living/user) if (isturf(target)) return NONE diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 83a304584043..a0fd7b64e2d9 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -208,6 +208,7 @@ shard.countdown = null START_PROCESSING(SSobj, src) visible_message(span_warning("[src] appears, balanced ever so perfectly on its hilt. This isn't ominous at all.")) + RegisterSignal(src, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(eat_bullets)) /obj/item/melee/supermatter_sword/process() if(balanced || throwing || ismob(src.loc) || isnull(src.loc)) @@ -254,11 +255,16 @@ consume_everything() return TRUE -/obj/item/melee/supermatter_sword/bullet_act(obj/projectile/projectile) - visible_message(span_danger("[projectile] smacks into [src] and rapidly flashes to ash."),\ - span_hear("You hear a loud crack as you are washed with a wave of heat.")) - consume_everything(projectile) - return BULLET_ACT_HIT +/obj/item/melee/supermatter_sword/proc/eat_bullets(datum/source, obj/projectile/hitting_projectile) + SIGNAL_HANDLER + + visible_message( + span_danger("[hitting_projectile] smacks into [source] and rapidly flashes to ash."), + null, + span_hear("You hear a loud crack as you are washed with a wave of heat."), + ) + consume_everything(hitting_projectile) + return COMPONENT_BULLET_BLOCKED /obj/item/melee/supermatter_sword/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] touches [src]'s blade. It looks like [user.p_theyre()] tired of waiting for the radiation to kill [user.p_them()]!")) diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 1c854e5091b6..bfbf3a47a29b 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -25,6 +25,14 @@ /obj/structure/mop_bucket, )) +/obj/item/mop/apply_fantasy_bonuses(bonus) + . = ..() + mopspeed = modify_fantasy_variable("mopspeed", mopspeed, -bonus) + +/obj/item/mop/remove_fantasy_bonuses(bonus) + mopspeed = reset_fantasy_variable("mopspeed", mopspeed) + return ..() + /obj/item/mop/Initialize(mapload) . = ..() AddComponent(/datum/component/cleaner, mopspeed, pre_clean_callback=CALLBACK(src, PROC_REF(should_clean)), on_cleaned_callback=CALLBACK(src, PROC_REF(apply_reagents))) @@ -150,3 +158,18 @@ /obj/item/mop/advanced/cyborg insertable = FALSE + +/obj/item/mop/sharp //Basically a slightly worse spear. + desc = "A mop with a sharpened handle. Careful!" + name = "sharpened mop" + force = 10 + throwforce = 18 + throw_speed = 4 + demolition_mod = 0.75 + embedding = list("impact_pain_mult" = 2, "remove_pain_mult" = 4, "jostle_chance" = 2.5) + armour_penetration = 10 + attack_verb_continuous = list("mops", "stabs", "shanks", "jousts") + attack_verb_simple = list("mop", "stab", "shank", "joust") + sharpness = SHARP_EDGED //spears aren't pointy either. Just assume it's carved into a naginata-style blade + wound_bonus = -15 + bare_wound_bonus = 15 diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 1336a043e7f5..120202555dd2 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -545,30 +545,31 @@ /obj/item/borg/upgrade/expand/action(mob/living/silicon/robot/robot, user = usr) . = ..() - if(.) + if(!. || HAS_TRAIT(robot, TRAIT_NO_TRANSFORM)) + return FALSE - if(robot.hasExpanded) - to_chat(usr, span_warning("This unit already has an expand module installed!")) - return FALSE + if(robot.hasExpanded) + to_chat(usr, span_warning("This unit already has an expand module installed!")) + return FALSE - robot.notransform = TRUE - var/prev_lockcharge = robot.lockcharge - robot.SetLockdown(TRUE) - robot.set_anchored(TRUE) - var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(1, holder = robot, location = robot.loc) - smoke.start() - sleep(0.2 SECONDS) - for(var/i in 1 to 4) - playsound(robot, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, TRUE, -1) - sleep(1.2 SECONDS) - if(!prev_lockcharge) - robot.SetLockdown(FALSE) - robot.set_anchored(FALSE) - robot.notransform = FALSE - robot.resize = 2 - robot.hasExpanded = TRUE - robot.update_transform() + ADD_TRAIT(robot, TRAIT_NO_TRANSFORM, REF(src)) + var/prev_lockcharge = robot.lockcharge + robot.SetLockdown(TRUE) + robot.set_anchored(TRUE) + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(1, holder = robot, location = robot.loc) + smoke.start() + sleep(0.2 SECONDS) + for(var/i in 1 to 4) + playsound(robot, pick('sound/items/drill_use.ogg', 'sound/items/jaws_cut.ogg', 'sound/items/jaws_pry.ogg', 'sound/items/welder.ogg', 'sound/items/ratchet.ogg'), 80, TRUE, -1) + sleep(1.2 SECONDS) + if(!prev_lockcharge) + robot.SetLockdown(FALSE) + robot.set_anchored(FALSE) + REMOVE_TRAIT(robot, TRAIT_NO_TRANSFORM, REF(src)) + robot.resize = 2 + robot.hasExpanded = TRUE + robot.update_transform() /obj/item/borg/upgrade/expand/deactivate(mob/living/silicon/robot/R, user = usr) . = ..() diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 39ffdd85b252..e6d7eb18af87 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -4,28 +4,74 @@ icon = 'icons/obj/objects.dmi' icon_state = "target_h" density = FALSE - var/hp = 1800 + max_integrity = 1800 + item_flags = CAN_BE_HIT /// Lazylist to keep track of bullet-hole overlays. var/list/bullethole_overlays -/obj/item/target/welder_act(mob/living/user, obj/item/I) - ..() - if(I.use_tool(src, user, 0, volume=40)) - for (var/bullethole in bullethole_overlays) - cut_overlay(bullethole) - bullethole_overlays = null - to_chat(user, span_notice("You slice off [src]'s uneven chunks of aluminium and scorch marks.")) +/obj/item/target/welder_act(mob/living/user, obj/item/tool) + if(tool.use_tool(src, user, 0 SECONDS, volume = 40)) + LAZYNULL(bullethole_overlays) + balloon_alert(user, "target repaired") + update_appearance(UPDATE_OVERLAYS) return TRUE +/obj/item/target/update_overlays() + . = ..() + . |= bullethole_overlays + +/obj/item/target/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) + if(prob(25)) + return ..() // RNG change to just not leave a mark, like walls + if(length(overlays) > 35) + return ..() // Too many bullets, we're done here + + // Projectiles which do not deal damage will not leave dent / scorch mark graphics. + // However we snowflake some projectiles to leave them anyway, because they're appropriate. + var/static/list/always_leave_marks + if(isnull(always_leave_marks)) + always_leave_marks = typecacheof(list( + /obj/projectile/beam/practice, + )) + + var/is_invalid_damage = hitting_projectile.damage_type != BRUTE && hitting_projectile.damage_type != BURN + var/is_safe = !hitting_projectile.is_hostile_projectile() + var/is_generic_projectile = !is_type_in_typecache(hitting_projectile, always_leave_marks) + if(is_generic_projectile && (is_invalid_damage || is_safe)) + return ..() // Don't bother unless it's real shit + + var/p_x = hitting_projectile.p_x + pick(0, 0, 0, 0, 0, -1, 1) // really ugly way of coding "sometimes offset p_x!" + var/p_y = hitting_projectile.p_y + pick(0, 0, 0, 0, 0, -1, 1) + var/icon/our_icon = icon(icon, icon_state) + if(!our_icon.GetPixel(p_x, p_y) || hitting_projectile.original != src) + return BULLET_ACT_FORCE_PIERCE // We, "missed", I guess? + + . = ..() + if(. != BULLET_ACT_HIT) + return + + var/image/bullet_hole = image('icons/effects/effects.dmi', "dent", OBJ_LAYER + 0.5) + bullet_hole.pixel_x = p_x - 1 //offset correction + bullet_hole.pixel_y = p_y - 1 + if(hitting_projectile.damage_type != BRUTE) + bullet_hole.setDir(pick(GLOB.cardinals))// random scorch design + if(hitting_projectile.damage < 20 && is_generic_projectile) + bullet_hole.icon_state = "light_scorch" + else + bullet_hole.icon_state = "scorch" + + LAZYADD(bullethole_overlays, bullet_hole) + update_appearance(UPDATE_OVERLAYS) + /obj/item/target/syndicate icon_state = "target_s" desc = "A shooting target that looks like syndicate scum." - hp = 2600 + max_integrity = 2600 /obj/item/target/alien icon_state = "target_q" desc = "A shooting target that looks like a xenomorphic alien." - hp = 2350 + max_integrity = 2350 /obj/item/target/alien/anchored anchored = TRUE @@ -33,44 +79,8 @@ /obj/item/target/clown icon_state = "target_c" desc = "A shooting target that looks like a useless clown." - hp = 2000 - -#define DECALTYPE_SCORCH 1 -#define DECALTYPE_BULLET 2 + max_integrity = 2000 /obj/item/target/clown/bullet_act(obj/projectile/P) . = ..() - playsound(src.loc, 'sound/items/bikehorn.ogg', 50, TRUE) - -/obj/item/target/bullet_act(obj/projectile/P) - if(istype(P, /obj/projectile/bullet/reusable)) // If it's a foam dart, don't bother with any of this other shit - return P.on_hit(src, 0) - var/p_x = P.p_x + pick(0,0,0,0,0,-1,1) // really ugly way of coding "sometimes offset P.p_x!" - var/p_y = P.p_y + pick(0,0,0,0,0,-1,1) - var/decaltype = DECALTYPE_SCORCH - if(istype(P, /obj/projectile/bullet)) - decaltype = DECALTYPE_BULLET - var/icon/C = icon(icon,icon_state) - if(C.GetPixel(p_x, p_y) && P.original == src && overlays.len <= 35) // if the located pixel isn't blank (null) - hp -= P.damage - if(hp <= 0) - visible_message(span_danger("[src] breaks into tiny pieces and collapses!")) - qdel(src) - var/image/bullet_hole = image('icons/effects/effects.dmi', "scorch", OBJ_LAYER + 0.5) - bullet_hole.pixel_x = p_x - 1 //offset correction - bullet_hole.pixel_y = p_y - 1 - if(decaltype == DECALTYPE_SCORCH) - bullet_hole.setDir(pick(NORTH,SOUTH,EAST,WEST))// random scorch design - if(P.damage >= 20 || istype(P, /obj/projectile/beam/practice)) - bullet_hole.setDir(pick(NORTH,SOUTH,EAST,WEST)) - else - bullet_hole.icon_state = "light_scorch" - else - bullet_hole.icon_state = "dent" - LAZYADD(bullethole_overlays, bullet_hole) - add_overlay(bullet_hole) - return BULLET_ACT_HIT - return BULLET_ACT_FORCE_PIERCE - -#undef DECALTYPE_SCORCH -#undef DECALTYPE_BULLET + playsound(src, 'sound/items/bikehorn.ogg', 50, TRUE) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 49a7b4d8c4ad..791088890dac 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -11,7 +11,7 @@ resistance_flags = FLAMMABLE max_integrity = 40 novariants = FALSE - item_flags = NOBLUDGEON + item_flags = NOBLUDGEON|SKIP_FANTASY_ON_SPAWN cost = 250 source = /datum/robot_energy_storage/medical merge_type = /obj/item/stack/medical @@ -36,6 +36,28 @@ . = ..() try_heal(patient, user) +/obj/item/stack/medical/apply_fantasy_bonuses(bonus) + . = ..() + if(heal_brute) + heal_brute = modify_fantasy_variable("heal_brute", heal_brute, bonus) + if(heal_burn) + heal_burn = modify_fantasy_variable("heal_burn", heal_burn, bonus) + if(stop_bleeding) + stop_bleeding = modify_fantasy_variable("stop_bleeding", stop_bleeding, bonus/10) + if(sanitization) + sanitization = modify_fantasy_variable("sanitization", sanitization, bonus/10) + if(flesh_regeneration) + flesh_regeneration = modify_fantasy_variable("flesh_regeneration", flesh_regeneration, bonus/10) + +/obj/item/stack/medical/remove_fantasy_bonuses(bonus) + heal_brute = reset_fantasy_variable("heal_brute", heal_brute) + heal_burn = reset_fantasy_variable("heal_burn", heal_burn) + stop_bleeding = reset_fantasy_variable("stop_bleeding", stop_bleeding) + sanitization = reset_fantasy_variable("sanitization", sanitization) + flesh_regeneration = reset_fantasy_variable("flesh_regeneration", flesh_regeneration) + return ..() + + /// In which we print the message that we're starting to heal someone, then we try healing them. Does the do_after whether or not it can actually succeed on a targeted mob /obj/item/stack/medical/proc/try_heal(mob/living/patient, mob/user, silent = FALSE) if(!patient.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE)) @@ -399,11 +421,11 @@ patient.emote("scream") for(var/i in patient.bodyparts) - var/obj/item/bodypart/bone = i - var/datum/wound/blunt/severe/oof_ouch = new - oof_ouch.apply_wound(bone) - var/datum/wound/blunt/critical/oof_OUCH = new - oof_OUCH.apply_wound(bone) + var/obj/item/bodypart/bone = i // fine to just, use these raw, its a meme anyway + var/datum/wound/blunt/bone/severe/oof_ouch = new + oof_ouch.apply_wound(bone, wound_source = "bone gel") + var/datum/wound/blunt/bone/critical/oof_OUCH = new + oof_OUCH.apply_wound(bone, wound_source = "bone gel") for(var/i in patient.bodyparts) var/obj/item/bodypart/bone = i diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 5d7a3715850f..252ff4092354 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -305,6 +305,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \ new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 2 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_DOORS), \ new/datum/stack_recipe("wooden stairs frame", /obj/structure/stairs_frame/wood, 10, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("wooden fence", /obj/structure/railing/wooden_fence, 2, time = 5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_STRUCTURE), \ new/datum/stack_recipe("coffin", /obj/structure/closet/crate/coffin, 5, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ new/datum/stack_recipe("book case", /obj/structure/bookcase, 4, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_FURNITURE), \ new/datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 1.5 SECONDS, one_per_turf = TRUE, on_solid_ground = TRUE, category = CAT_TOOLS), \ diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 4b24b70447bc..11f556479ae2 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -20,6 +20,7 @@ gender = PLURAL material_modifier = 0.05 //5%, so that a 50 sheet stack has the effect of 5k materials instead of 100k. max_integrity = 100 + item_flags = SKIP_FANTASY_ON_SPAWN /// A list to all recipies this stack item can create. var/list/datum/stack_recipe/recipes /// What's the name of just 1 of this stack. You have a stack of leather, but one piece of leather @@ -575,6 +576,8 @@ var/obj/machinery/machine = loc if(!(src in machine.component_parts) || !(check in machine.component_parts)) return FALSE + if(SEND_SIGNAL(src, COMSIG_STACK_CAN_MERGE, check, inhand) & CANCEL_STACK_MERGE) + return FALSE return TRUE /** diff --git a/code/game/objects/items/sticker.dm b/code/game/objects/items/sticker.dm index 512e64c4cbd3..a2560fac02b8 100644 --- a/code/game/objects/items/sticker.dm +++ b/code/game/objects/items/sticker.dm @@ -1,3 +1,5 @@ +#define MAX_ALLOWED_STICKERS 12 + /// parent type for all other stickers. do not spawn directly /obj/item/sticker name = "sticker" @@ -8,10 +10,16 @@ w_class = WEIGHT_CLASS_TINY throw_range = 3 vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE | VIS_INHERIT_LAYER - ///If not null, pick an icon_state from this list - var/icon_states + ///The overlay we apply to things we stick to + var/mutable_appearance/sticker_overlay + ///A list of icon_states to pick an icon_state on Initialize, provided it is not null. + var/list/icon_states + ///The thing we are attached to + var/atom/attached + ///The turf our COMSIG_TURF_EXPOSE is registered to, so we can unregister it later. + var/turf/signal_turf /// If the sticker should be disincluded from normal sticker boxes. - var/contraband = FALSE + var/contraband = STICKER_NORMAL /obj/item/sticker/Initialize(mapload) . = ..() @@ -19,7 +27,104 @@ icon_state = pick(icon_states) pixel_y = rand(-3,3) pixel_x = rand(-3,3) - AddElement(/datum/element/sticker) + +/obj/item/sticker/afterattack(atom/target, mob/living/user, prox, params) + . = ..() + if(!prox) + return + if(!isliving(target) && !isobj(target) && !isturf(target)) + return + var/list/parameters = params2list(params) + if(!LAZYACCESS(parameters, ICON_X) || !LAZYACCESS(parameters, ICON_Y)) + return + var/divided_size = world.icon_size / 2 + var/px = text2num(LAZYACCESS(parameters, ICON_X)) - divided_size + var/py = text2num(LAZYACCESS(parameters, ICON_Y)) - divided_size + . |= AFTERATTACK_PROCESSED_ITEM + user.do_attack_animation(target) + stick(target,user,px,py) + return . + +///Sticks this sticker to the target, with the pixel offsets being px and py. +/obj/item/sticker/proc/stick(atom/target, mob/living/user, px,py) + if(COUNT_TRAIT_SOURCES(target, TRAIT_STICKERED) >= MAX_ALLOWED_STICKERS) + target.balloon_alert(user, "sticker won't stick!") + return FALSE + sticker_overlay = mutable_appearance(icon, icon_state , layer = target.layer + 1, appearance_flags = RESET_COLOR | PIXEL_SCALE) + sticker_overlay.pixel_x = px + sticker_overlay.pixel_y = py + target.add_overlay(sticker_overlay) + attached = target + if(isliving(target) && user) + var/mob/living/victim = target + if(victim.client) + user.log_message("stuck [src] to [key_name(victim)]", LOG_ATTACK) + victim.log_message("had [src] stuck to them by [key_name(user)]", LOG_ATTACK) + register_signals(user) + moveToNullspace() + SEND_SIGNAL(attached, COMSIG_STICKER_STICKED, src, user) + +///Makes this sticker move from nullspace and cut the overlay from the object it is attached to, silent for no visible message. +/obj/item/sticker/proc/peel(datum/source) + SIGNAL_HANDLER + if(!attached) + return + attached.cut_overlay(sticker_overlay) + sticker_overlay = null + forceMove(attached.drop_location()) + pixel_y = rand(-4,1) + pixel_x = rand(-3,3) + unregister_signals() + SEND_SIGNAL(attached, COMSIG_STICKER_UNSTICKED, src) + attached = null + +///Registers signals to the object it is attached to +/obj/item/sticker/proc/register_signals(mob/living/user) + if(isturf(attached)) + //register signals on the users turf instead because we can assume they are on flooring sticking it to a wall so it should burn (otherwise it would fruitlessly check wall temperature) + signal_turf = (user && isclosedturf(attached)) ? get_turf(user) : attached + RegisterSignal(signal_turf, COMSIG_TURF_EXPOSE, PROC_REF(on_turf_expose)) + RegisterSignal(attached, COMSIG_LIVING_IGNITED, PROC_REF(on_ignite)) + RegisterSignal(attached, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(peel)) + RegisterSignal(attached, COMSIG_PARENT_QDELETING, PROC_REF(on_attached_qdel)) + ADD_TRAIT(attached, TRAIT_STICKERED, REF(src)) + +//Unregisters signals from the object it is attached to +/obj/item/sticker/proc/unregister_signals(datum/source) + SIGNAL_HANDLER + UnregisterSignal(attached, list(COMSIG_COMPONENT_CLEAN_ACT, COMSIG_LIVING_IGNITED, COMSIG_PARENT_QDELETING)) + REMOVE_TRAIT(attached, TRAIT_STICKERED, REF(src)) + if(signal_turf) + UnregisterSignal(signal_turf, COMSIG_TURF_EXPOSE) + signal_turf = null + +/obj/item/sticker/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + . = ..() + if(!. && prob(50)) + stick(hit_atom,rand(-7,7),rand(-7,7)) + attached.balloon_alert_to_viewers("the sticker lands on its sticky side!") + +///Signal handler for COMSIG_TURF_EXPOSE, deletes this sticker if the temperature is above 100C and it is flammable +/obj/item/sticker/proc/on_turf_expose(datum/source, datum/gas_mixture/air, exposed_temperature) + SIGNAL_HANDLER + if(!(resistance_flags & FLAMMABLE) || exposed_temperature <= FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + return + peel() + qdel(src) + +///Signal handler for COMSIG_LIVING_IGNITED, deletes this sticker, if it is flammable +/obj/item/sticker/proc/on_ignite(datum/source) + SIGNAL_HANDLER + if(!(resistance_flags & FLAMMABLE)) + return + peel() + qdel(src) + +/// Signal handler for COMSIG_QDELETING, deletes this sticker if the attached object is deleted +/obj/item/sticker/proc/on_attached_qdel(datum/source) + SIGNAL_HANDLER + peel() + qdel(src) /obj/item/sticker/smile name = "smiley sticker" @@ -96,7 +201,7 @@ /obj/item/sticker/syndicate name = "syndicate sticker" icon_state = "synd" - contraband = TRUE + contraband = STICKER_SYNDICATE /obj/item/sticker/syndicate/c4 name = "C-4 sticker" @@ -129,3 +234,5 @@ /obj/item/sticker/syndicate/trap name = "bear trap sticker" icon_state = "trap" + +#undef MAX_ALLOWED_STICKERS diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index 7862cf08bd81..03cbd4c6a6e4 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -235,7 +235,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", playsound(src,'sound/effects/pray_chaplain.ogg',60,TRUE) for(var/obj/item/soulstone/SS in sword.contents) SS.required_role = null - for(var/mob/living/simple_animal/shade/EX in SS) + for(var/mob/living/basic/shade/EX in SS) var/datum/antagonist/cult/cultist = EX.mind.has_antag_datum(/datum/antagonist/cult) if (cultist) cultist.silent = TRUE diff --git a/code/game/objects/items/storage/boxes/service_boxes.dm b/code/game/objects/items/storage/boxes/service_boxes.dm index 3ff3480817e7..e830848231a0 100644 --- a/code/game/objects/items/storage/boxes/service_boxes.dm +++ b/code/game/objects/items/storage/boxes/service_boxes.dm @@ -211,7 +211,7 @@ /obj/item/storage/box/stickers/proc/generate_non_contraband_stickers_list() . = list() for(var/obj/item/sticker/sticker_type as anything in subtypesof(/obj/item/sticker)) - if(!initial(sticker_type.contraband)) + if(initial(sticker_type.contraband) == STICKER_NORMAL) . += sticker_type return . /obj/item/storage/box/stickers/PopulateContents() diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index 217d4f32571e..cba6a7c2818a 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -40,7 +40,7 @@ . = ..() icon_state = "[initial(icon_state)][atom_storage?.locked ? "_locked" : null]" -/obj/item/storage/secure/tool_act(mob/living/user, obj/item/tool) +/obj/item/storage/secure/tool_act(mob/living/user, obj/item/tool, tool_type, is_right_clicking) if(can_hack_open && atom_storage.locked) return ..() else diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm index 98b8c243a40b..4ecb596ec50b 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -10,6 +10,28 @@ /// What storage type to use for this item var/datum/storage/storage_type = /datum/storage +/obj/item/storage/apply_fantasy_bonuses(bonus) + . = ..() + atom_storage.max_slots = modify_fantasy_variable("max_slots", atom_storage.max_slots, round(bonus/2)) + atom_storage.max_total_storage = modify_fantasy_variable("max_total_storage", atom_storage.max_total_storage, round(bonus/2)) + LAZYSET(fantasy_modifications, "max_specific_storage", atom_storage.max_specific_storage) + if(bonus >= 15) + atom_storage.max_specific_storage = max(WEIGHT_CLASS_HUGE, atom_storage.max_specific_storage) + else if(bonus >= 10) + atom_storage.max_specific_storage = max(WEIGHT_CLASS_BULKY, atom_storage.max_specific_storage) + else if(bonus <= -10) + atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL + else if(bonus <= -15) + atom_storage.max_specific_storage = WEIGHT_CLASS_TINY + +/obj/item/storage/remove_fantasy_bonuses(bonus) + atom_storage.max_slots = reset_fantasy_variable("max_slots", atom_storage.max_slots) + atom_storage.max_total_storage = reset_fantasy_variable("max_total_storage", atom_storage.max_total_storage) + var/previous_max_storage = LAZYACCESS(fantasy_modifications, "max_specific_storage") + if(previous_max_storage) + atom_storage.max_specific_storage = previous_max_storage + return ..() + /obj/item/storage/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 4cb2edb024f6..894d4c8f234c 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -642,6 +642,17 @@ new /obj/item/storage/belt/grenade(src) new /obj/item/storage/belt/military/snack(src) +/obj/item/storage/box/syndie_kit/poster_box + name = "syndicate poster pack" + desc = "Contains a variety of demotivational posters to ensure minimum productivity for the crew of any Nanotrasen station." + + /// Number of posters this box contains when spawning. + var/poster_count = 3 + +/obj/item/storage/box/syndie_kit/poster_box/PopulateContents() + for(var/i in 1 to poster_count) + new /obj/item/poster/traitor(src) + #undef KIT_RECON #undef KIT_BLOODY_SPAI #undef KIT_STEALTHY diff --git a/code/modules/antagonists/traitor/objectives/demoralise_graffiti.dm b/code/game/objects/items/syndie_spraycan.dm similarity index 67% rename from code/modules/antagonists/traitor/objectives/demoralise_graffiti.dm rename to code/game/objects/items/syndie_spraycan.dm index 1825a4c04860..5428f046d96e 100644 --- a/code/modules/antagonists/traitor/objectives/demoralise_graffiti.dm +++ b/code/game/objects/items/syndie_spraycan.dm @@ -1,92 +1,3 @@ -/datum/traitor_objective/demoralise/graffiti - name = "Sow doubt among the crew %VIEWS% times using Syndicate graffiti." - description = "Use the button below to materialize a seditious spray can, \ - and use it to draw a 3x3 tag in a place where people will come across it. \ - Special syndicate sealing agent ensures that it can't be removed for \ - five minutes following application, and it's slippery too! \ - People seeing or slipping on your graffiti grants progress towards success." - - progression_minimum = 0 MINUTES - progression_maximum = 30 MINUTES - progression_reward = list(4 MINUTES, 8 MINUTES) - telecrystal_reward = list(0, 1) - - duplicate_type = /datum/traitor_objective/demoralise/graffiti - /// Have we given out a spray can yet? - var/obtained_spray = FALSE - /// Graffiti 'rune' which we will be drawing - var/obj/effect/decal/cleanable/traitor_rune/rune - -/datum/traitor_objective/demoralise/graffiti/generate_ui_buttons(mob/user) - var/list/buttons = list() - if (!obtained_spray) - buttons += add_ui_button("", "Pressing this will materialize a syndicate spraycan in your hand.", "wifi", "summon_gear") - else - buttons += add_ui_button("[demoralised_crew_events] / [demoralised_crew_required] propagandised", "This many crew have been exposed to propaganda, out of a required [demoralised_crew_required].", "wifi", "none") - return buttons - -/datum/traitor_objective/demoralise/graffiti/ui_perform_action(mob/living/user, action) - . = ..() - switch(action) - if ("summon_gear") - if (obtained_spray) - return - - obtained_spray = TRUE - var/obj/item/traitor_spraycan/spray = new(user.drop_location()) - user.put_in_hands(spray) - spray.balloon_alert(user, "the spraycan materializes in your hand") - - RegisterSignal(spray, COMSIG_PARENT_QDELETING, PROC_REF(on_spray_destroyed)) - RegisterSignal(spray, COMSIG_TRAITOR_GRAFFITI_DRAWN, PROC_REF(on_rune_complete)) - -/** - * Called when the spray can is deleted. - * If it's already been expended we don't care, if it hasn't you just made your objective impossible.area - * - * Arguments - * * spray - the spraycan which was just deleted - */ -/datum/traitor_objective/demoralise/graffiti/proc/on_spray_destroyed() - SIGNAL_HANDLER - // You fucked up pretty bad if you let this happen - if (!rune) - fail_objective(penalty_cost = telecrystal_penalty) - -/** - * Called when you managed to draw a traitor rune. - * Sets up tracking for objective progress, and unregisters signals for the spraycan because we don't care about it any more. - * - * Arguments - * * drawn_rune - graffiti 'rune' which was just drawn. - */ -/datum/traitor_objective/demoralise/graffiti/proc/on_rune_complete(atom/spray, obj/effect/decal/cleanable/traitor_rune/drawn_rune) - SIGNAL_HANDLER - rune = drawn_rune - UnregisterSignal(spray, COMSIG_PARENT_QDELETING) - UnregisterSignal(spray, COMSIG_TRAITOR_GRAFFITI_DRAWN) - RegisterSignal(drawn_rune, COMSIG_PARENT_QDELETING, PROC_REF(on_rune_destroyed)) - RegisterSignal(drawn_rune, COMSIG_DEMORALISING_EVENT, PROC_REF(on_mood_event)) - RegisterSignal(drawn_rune, COMSIG_TRAITOR_GRAFFITI_SLIPPED, PROC_REF(on_mood_event)) - -/** - * Called when your traitor rune is destroyed. If you haven't suceeded by now, you fail.area - * - * Arguments - * * rune - the rune which just got destroyed. - */ -/datum/traitor_objective/demoralise/graffiti/proc/on_rune_destroyed(obj/effect/decal/cleanable/traitor_rune/rune) - SIGNAL_HANDLER - fail_objective(penalty_cost = telecrystal_penalty) - -/datum/traitor_objective/demoralise/graffiti/ungenerate_objective() - if (rune) - UnregisterSignal(rune, COMSIG_PARENT_QDELETING) - UnregisterSignal(rune, COMSIG_DEMORALISING_EVENT) - UnregisterSignal(rune, COMSIG_TRAITOR_GRAFFITI_SLIPPED) - rune = null - return ..() - // Extending the existing spraycan item was more trouble than it was worth, I don't want or need this to be able to draw arbitrary shapes. /obj/item/traitor_spraycan name = "seditious spraycan" @@ -125,7 +36,7 @@ try_draw_new_rune(user, target) return COMPONENT_CANCEL_ATTACK_CHAIN - if (istype(target, /obj/effect/decal/cleanable/traitor_rune)) + if (istype(target, /obj/effect/decal/cleanable/traitor_rune) && multi_stage) //monkestation edit: adds multi_stage check try_complete_rune(user, target) return COMPONENT_CANCEL_ATTACK_CHAIN diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index dd67bbcd8ce9..87f86e836b7b 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -460,7 +460,8 @@ new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(mobloc) new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(emergency_destination) balloon_alert(user, "emergency teleport triggered!") - make_bloods(mobloc, emergency_destination, user) + if (!HAS_TRAIT(user, TRAIT_NOBLOOD)) + make_bloods(mobloc, emergency_destination, user) playsound(mobloc, SFX_SPARKS, 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) playsound(emergency_destination, 'sound/effects/phasein.ogg', 25, 1, SHORT_RANGE_SOUND_EXTRARANGE) playsound(emergency_destination, SFX_SPARKS, 50, 1, SHORT_RANGE_SOUND_EXTRARANGE) diff --git a/code/game/objects/items/tongs.dm b/code/game/objects/items/tongs.dm new file mode 100644 index 000000000000..fdfba7697d61 --- /dev/null +++ b/code/game/objects/items/tongs.dm @@ -0,0 +1,101 @@ +/// Tongs, let you pick up and feed people food from further away. +/obj/item/kitchen/tongs + name = "tongs" + icon = 'icons/obj/service/kitchen.dmi' + desc = "So you never have to touch anything with your dirty, unwashed hands." + reach = 2 + icon_state = "tongs" + base_icon_state = "tongs" + inhand_icon_state = "fork" // close enough + attack_verb_continuous = list("pinches", "tongs", "nips") + attack_verb_simple = list("pinch", "tong", "nip") + /// What are we holding in our tongs? + var/obj/item/tonged + /// Sound to play when we click our tongs together + var/clack_sound = 'sound/items/handling/component_drop.ogg' + /// Time to wait between clacking sounds + var/clack_delay = 2 SECONDS + /// Have we clacked recently? + COOLDOWN_DECLARE(clack_cooldown) + +/obj/item/kitchen/tongs/Destroy(force) + QDEL_NULL(tonged) + return ..() + +/obj/item/kitchen/tongs/examine(mob/user) + . = ..() + if (!isnull(tonged)) + . += span_notice("It is holding [tonged].") + +/obj/item/kitchen/tongs/dropped(mob/user, silent) + . = ..() + drop_tonged() + +/obj/item/kitchen/tongs/attack_self(mob/user, modifiers) + . = ..() + if(.) + return TRUE + if (!isnull(tonged)) + drop_tonged() + return TRUE + if (!COOLDOWN_FINISHED(src, clack_cooldown)) + return TRUE + user.visible_message(span_notice("[user] clacks [user.p_their()] [src] together like a crab. Click clack!")) + click_clack() + return TRUE + +/// Release the food we are holding +/obj/item/kitchen/tongs/proc/drop_tonged() + if (isnull(tonged)) + return + visible_message(span_notice("[tonged] falls to the ground!")) + var/turf/location = drop_location() + tonged.forceMove(location) + tonged.do_drop_animation(location) + +/// Play a clacking sound and appear closed, then open again +/obj/item/kitchen/tongs/proc/click_clack() + COOLDOWN_START(src, clack_cooldown, clack_delay) + playsound(src, clack_sound, vol = 100, vary = FALSE) + icon_state = "[base_icon_state]_closed" + var/delay = min(0.5 SECONDS, clack_delay / 2) // Just in case someone's been fucking with the cooldown + addtimer(CALLBACK(src, PROC_REF(clack)), delay, TIMER_DELETE_ME) + +/// Plays a clacking sound and appear open +/obj/item/kitchen/tongs/proc/clack() + playsound(src, clack_sound, vol = 100, vary = FALSE) + icon_state = base_icon_state + +/obj/item/kitchen/tongs/Exited(atom/movable/leaving, direction) + . = ..() + if (leaving != tonged) + return + tonged = null + update_appearance(UPDATE_ICON) + +/obj/item/kitchen/tongs/pre_attack(obj/item/attacked, mob/living/user, params) + if (!isnull(tonged)) + attacked.attackby(tonged, user) + return TRUE + if (isliving(attacked)) + if (COOLDOWN_FINISHED(src, clack_cooldown)) + click_clack() + return ..() + if (!IsEdible(attacked) || attacked.w_class > WEIGHT_CLASS_NORMAL || !isnull(tonged)) + return ..() + tonged = attacked + attacked.do_pickup_animation(src) + attacked.forceMove(src) + update_appearance(UPDATE_ICON) + +/obj/item/kitchen/tongs/update_overlays() + . = ..() + if (isnull(tonged)) + return + var/mutable_appearance/held_food = new /mutable_appearance(tonged.appearance) + held_food.layer = layer + held_food.plane = plane + held_food.transform = held_food.transform.Scale(0.7, 0.7) + held_food.pixel_x = 6 + held_food.pixel_y = 6 + . += held_food diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 7ec6e5f5be60..bd1124dcf1f4 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -6,7 +6,7 @@ desc = "This is rubbish." w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE - item_flags = NOBLUDGEON + item_flags = NOBLUDGEON|SKIP_FANTASY_ON_SPAWN /obj/item/trash/Initialize(mapload) var/turf/T = get_turf(src) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 2b85ddc62e30..0d29aa1f203d 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -21,14 +21,31 @@ if(EXPLODE_LIGHT) take_damage(rand(10, 90), BRUTE, BOMB, 0) -/obj/bullet_act(obj/projectile/P) + return TRUE + +/obj/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) . = ..() - playsound(src, P.hitsound, 50, TRUE) - var/damage + if(. != BULLET_ACT_HIT) + return . + + playsound(src, hitting_projectile.hitsound, 50, TRUE) + var/damage_sustained = 0 if(!QDELETED(src)) //Bullet on_hit effect might have already destroyed this object - damage = take_damage(P.damage, P.damage_type, P.armor_flag, 0, turn(P.dir, 180), P.armour_penetration) - if(P.suppressed != SUPPRESSED_VERY) - visible_message(span_danger("[src] is hit by \a [P][damage ? "" : ", without leaving a mark"]!"), null, null, COMBAT_MESSAGE_RANGE) + damage_sustained = take_damage( + hitting_projectile.damage * hitting_projectile.demolition_mod, + hitting_projectile.damage_type, + hitting_projectile.armor_flag, + FALSE, + REVERSE_DIR(hitting_projectile.dir), + hitting_projectile.armour_penetration, + ) + if(hitting_projectile.suppressed != SUPPRESSED_VERY) + visible_message( + span_danger("[src] is hit by \a [hitting_projectile][damage_sustained ? "" : ", without leaving a mark"]!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ) + + return damage_sustained > 0 ? BULLET_ACT_HIT : BULLET_ACT_BLOCK /obj/attack_hulk(mob/living/carbon/human/user) ..() diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 71d15fb3f582..f3c7890c397f 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -12,6 +12,7 @@ armor_type = /datum/armor/obj_structure burning_particles = /particles/smoke/burning var/broken = FALSE + var/w_class = WEIGHT_CLASS_GIGANTIC //lol /datum/armor/obj_structure fire = 50 diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 5d7e0d30c8f9..6d22d8480d3c 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -327,6 +327,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) hitsound = 'sound/items/trayhit1.ogg' hit_reaction_chance = 50 custom_materials = list(/datum/material/iron = 2000) + item_flags = SKIP_FANTASY_ON_SPAWN var/break_chance = 5 //Likely hood of smashing the chair. var/obj/structure/chair/origin_type = /obj/structure/chair diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index dd35e0f1c08f..8d91a2678b9e 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -92,6 +92,9 @@ new /obj/item/clothing/suit/toggle/lawyer/black(src) new /obj/item/clothing/shoes/laceup(src) new /obj/item/clothing/shoes/laceup(src) + +/obj/structure/closet/lawcloset/populate_contents_immediate() + . = ..() new /obj/item/clothing/accessory/lawyers_badge(src) new /obj/item/clothing/accessory/lawyers_badge(src) 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 c708480100a6..97a6664adb2e 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -13,7 +13,7 @@ new /obj/item/holosign_creator/atmos(src) new /obj/item/assembly/flash/handheld(src) new /obj/item/door_remote/chief_engineer(src) - new /obj/item/pipe_dispenser(src) + new /obj/item/circuitboard/machine/techfab/department/engineering(src) new /obj/item/extinguisher/advanced(src) new /obj/item/storage/photo_album/ce(src) @@ -25,6 +25,7 @@ // Traitor steal objective new /obj/item/areaeditor/blueprints(src) new /obj/item/gun/ballistic/SRN_rocketlauncher(src) + new /obj/item/pipe_dispenser(src) /obj/structure/closet/secure_closet/engineering_electrical name = "electrical supplies locker" @@ -35,13 +36,18 @@ /obj/structure/closet/secure_closet/engineering_electrical/PopulateContents() ..() var/static/items_inside = list( - /obj/item/clothing/gloves/color/yellow = 2, /obj/item/inducer = 2, /obj/item/storage/toolbox/electrical = 3, /obj/item/electronics/apc = 3, /obj/item/multitool = 3) generate_items_inside(items_inside,src) +/obj/structure/closet/secure_closet/engineering_electrical/populate_contents_immediate() + . = ..() + + new /obj/item/clothing/gloves/color/yellow(src) + new /obj/item/clothing/gloves/color/yellow(src) + /obj/structure/closet/secure_closet/engineering_welding name = "welding supplies locker" req_access = list(ACCESS_ENGINE_EQUIP) @@ -80,7 +86,7 @@ /obj/structure/closet/secure_closet/atmospherics/PopulateContents() ..() new /obj/item/radio/headset/headset_eng(src) - new /obj/item/pipe_dispenser(src) + new /obj/item/storage/toolbox/mechanical(src) new /obj/item/tank/internals/emergency_oxygen/engi(src) new /obj/item/holosign_creator/atmos(src) @@ -91,3 +97,8 @@ new /obj/item/clothing/head/utility/hardhat/welding/atmos(src) new /obj/item/clothing/glasses/meson/engine/tray(src) new /obj/item/extinguisher/advanced(src) + +/obj/structure/closet/secure_closet/atmospherics/populate_contents_immediate() + . = ..() + + new /obj/item/pipe_dispenser(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 228da04f8457..79550320237e 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -124,7 +124,11 @@ new /obj/item/storage/box/medigels(src) new /obj/item/ph_booklet(src) new /obj/item/reagent_containers/dropper(src) + //MONKESTATION REMOVAL START - FermiChem/pH chem is disabled, so having buffer bottles in the chemist lockers is a complete waste of time, space and processing power. + /* new /obj/item/reagent_containers/cup/bottle/acidic_buffer(src) //hopefully they get the hint + */ + //MONKESTATION REMOVAL END /obj/structure/closet/secure_closet/chemical/heisenberg //contains one of each beaker, syringe etc. name = "advanced chemical closet" diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 9ee9f0e14738..3adb22909582 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -26,6 +26,7 @@ new /obj/item/clothing/under/syndicate(src) new /obj/item/clothing/under/syndicate/skirt(src) new /obj/item/clothing/shoes/sneakers/black(src) + new /obj/item/mod/module/plasma_stabilizer(src) /obj/structure/closet/syndicate/nuclear desc = "It's a storage unit for a Syndicate boarding party." diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm index 4698c8469d24..25989b2bdbc9 100644 --- a/code/game/objects/structures/crates_lockers/crates/secure.dm +++ b/code/game/objects/structures/crates_lockers/crates/secure.dm @@ -21,7 +21,7 @@ . = ..() ADD_TRAIT(src, TRAIT_NO_MISSING_ITEM_ERROR, TRAIT_GENERIC) -/obj/structure/closet/crate/secure/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) +/obj/structure/closet/crate/secure/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) if(prob(tamperproof) && damage_amount >= DAMAGE_PRECISION) boom() else diff --git a/code/game/objects/structures/crates_lockers/crates/syndicrate.dm b/code/game/objects/structures/crates_lockers/crates/syndicrate.dm index b18321338c49..9d4d5e6c8ced 100644 --- a/code/game/objects/structures/crates_lockers/crates/syndicrate.dm +++ b/code/game/objects/structures/crates_lockers/crates/syndicrate.dm @@ -18,7 +18,7 @@ laser = 50 energy = 100 -/obj/structure/closet/crate/syndicrate/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) +/obj/structure/closet/crate/syndicrate/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) if(created_items) return ..() if(damage_amount < DAMAGE_PRECISION) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 729abad34f41..54a9527899fa 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -83,7 +83,7 @@ qdel(src) return T -/obj/structure/falsewall/tool_act(mob/living/user, obj/item/tool) +/obj/structure/falsewall/tool_act(mob/living/user, obj/item/tool, tool_type, is_right_clicking) if(!opening) return ..() to_chat(user, span_warning("You must wait until the door has stopped moving!")) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 94effe434c3f..c0c14331ac72 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -361,10 +361,12 @@ if((mover.pass_flags & PASSGRILLE) || isprojectile(mover)) return prob(girderpasschance) -/obj/structure/girder/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller, no_id = FALSE) - . = !density - if(caller) - . = . || (caller.pass_flags & PASSGRILLE) +/obj/structure/girder/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + if(!density) + return TRUE + if(pass_info.pass_flags & PASSGRILLE) + return TRUE + return FALSE /obj/structure/girder/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 7ac9a04f665b..d08d2d50b4e2 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -186,10 +186,12 @@ if(!. && isprojectile(mover)) return prob(30) -/obj/structure/grille/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller, no_id = FALSE) - . = !density - if(caller) - . = . || (caller.pass_flags & PASSGRILLE) +/obj/structure/grille/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + if(!density) + return TRUE + if(pass_info.pass_flags & PASSGRILLE) + return TRUE + return FALSE /obj/structure/grille/wirecutter_act(mob/living/user, obj/item/tool) add_fingerprint(user) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 2ba97428cea9..51abaf50e13b 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -136,14 +136,13 @@ density = TRUE max_integrity = 10 allow_walk = FALSE + armor_type = /datum/armor/structure_holosign/cyborg_barrier // Gets a special armor subtype which is extra good at defense. -/obj/structure/holosign/barrier/cyborg/bullet_act(obj/projectile/P) - take_damage((P.damage / 5) , BRUTE, MELEE, 1) //Doesn't really matter what damage flag it is. - if(istype(P, /obj/projectile/energy/electrode)) - take_damage(10, BRUTE, MELEE, 1) //Tasers aren't harmful. - if(istype(P, /obj/projectile/beam/disabler)) - take_damage(5, BRUTE, MELEE, 1) //Disablers aren't harmful. - return BULLET_ACT_HIT +/datum/armor/structure_holosign/cyborg_barrier + bullet = 80 + laser = 80 + energy = 80 + melee = 20 /obj/structure/holosign/barrier/medical name = "\improper PENLITE holobarrier" @@ -196,12 +195,9 @@ name = "Charged Energy Field" desc = "A powerful energy field that blocks movement. Energy arcs off it." max_integrity = 20 + armor_type = /datum/armor/structure_holosign //Yeah no this doesn't get projectile resistance. var/shockcd = 0 -/obj/structure/holosign/barrier/cyborg/hacked/bullet_act(obj/projectile/P) - take_damage(P.damage, BRUTE, MELEE, 1) //Yeah no this doesn't get projectile resistance. - return BULLET_ACT_HIT - /obj/structure/holosign/barrier/cyborg/hacked/proc/cooldown() shockcd = FALSE diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index c95eeedf1260..40c5256915bd 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -17,7 +17,7 @@ GLOBAL_LIST_INIT(ore_probability, list( faction = list(FACTION_MINING) max_mobs = 3 max_integrity = 250 - mob_types = list(/mob/living/simple_animal/hostile/asteroid/wolf) + mob_types = list(/mob/living/basic/mining/wolf) move_resist = INFINITY anchored = TRUE @@ -76,7 +76,7 @@ GLOBAL_LIST_INIT(ore_probability, list( name = "demonic portal" desc = "A portal that goes to another world, normal creatures couldn't survive there." icon_state = "nether" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/ice_demon) + mob_types = list(/mob/living/basic/mining/ice_demon) light_outer_range = 1 light_color = COLOR_SOFT_RED @@ -102,7 +102,7 @@ GLOBAL_LIST_INIT(ore_probability, list( mob_types = list(/mob/living/basic/mining/ice_whelp) /obj/structure/spawner/ice_moon/demonic_portal/snowlegion - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow) + mob_types = list(/mob/living/basic/mining/legion/snow/spawner_made) /obj/effect/collapsing_demonic_portal name = "collapsing demonic portal" @@ -164,7 +164,7 @@ GLOBAL_LIST_INIT(ore_probability, list( if(13) new /obj/item/gun/magic/hook (loc) if(14) - new /obj/item/guardiancreator/miner(loc) + new /obj/item/guardian_creator/miner(loc) if(15) new /obj/item/ship_in_a_bottle(loc) if(16) @@ -186,7 +186,7 @@ GLOBAL_LIST_INIT(ore_probability, list( if(24) new /obj/structure/elite_tumor(loc) if(25) - new /mob/living/simple_animal/hostile/retaliate/clown/clownhulk(loc) + new /mob/living/basic/clown/clownhulk(loc) if(26) new /obj/item/book/granter/action/spell/sacredflame(loc) if(27) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 82fba11d0e2f..1d4ec997aae0 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -94,6 +94,10 @@ canSmoothWith = SMOOTH_GROUP_CATWALK obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP +/obj/structure/lattice/catwalk/Initialize(mapload) + . = ..() + AddElement(/datum/element/footstep_override, footstep = FOOTSTEP_CATWALK) + /obj/structure/lattice/catwalk/deconstruction_hints(mob/user) return span_notice("The supporting rods look like they could be cut.") diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm index 8c3a1779b0b0..3a7aab6d977c 100644 --- a/code/game/objects/structures/lavaland/necropolis_tendril.dm +++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm @@ -24,7 +24,7 @@ mob_types = list(/mob/living/basic/mining/goliath) /obj/structure/spawner/lavaland/legion - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril) + mob_types = list(/mob/living/basic/mining/legion/spawner_made) /obj/structure/spawner/lavaland/icewatcher mob_types = list(/mob/living/basic/mining/watcher/icewing) diff --git a/code/game/objects/structures/ore_containers.dm b/code/game/objects/structures/ore_containers.dm new file mode 100644 index 000000000000..af96c3e4a014 --- /dev/null +++ b/code/game/objects/structures/ore_containers.dm @@ -0,0 +1,62 @@ +///structure to contain ores +/obj/structure/ore_container + +/obj/structure/ore_container/attackby(obj/item/ore, mob/living/carbon/human/user, list/modifiers) + if(istype(ore, /obj/item/stack/ore) && !(user.istate & ISTATE_HARM)) + ore.forceMove(src) + return + return ..() + +/obj/structure/ore_container/Entered(atom/movable/mover) + . = ..() + update_appearance(UPDATE_OVERLAYS) + +/obj/structure/ore_container/Exited(atom/movable/mover) + . = ..() + update_appearance(UPDATE_OVERLAYS) + +/obj/structure/ore_container/ui_interact(mob/user, datum/tgui/ui) + . = ..() + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "OreContainer") + ui.open() + +/obj/structure/ore_container/ui_data(mob/user) + var/list/data = list() + data["ores"] = list() + for(var/obj/item/stack/ore/ore_item in contents) + data["ores"] += list(list( + "id" = REF(ore_item), + "name" = ore_item.name, + "amount" = ore_item.amount, + )) + return data + +/obj/structure/ore_container/ui_static_data(mob/user) + var/list/data = list() + data["ore_images"] = list() + for(var/obj/item/stack/ore_item as anything in subtypesof(/obj/item/stack/ore)) + data["ore_images"] += list(list( + "name" = initial(ore_item.name), + "icon" = icon2base64(getFlatIcon(image(icon = initial(ore_item.icon), icon_state = initial(ore_item.icon_state)), no_anim=TRUE)) + )) + return data + +/obj/structure/ore_container/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + + if(. || !isliving(ui.user)) + return TRUE + + var/mob/living/customer = ui.user + var/obj/item/stack_to_move + switch(action) + if("withdraw") + if(isnull(params["reference"])) + return TRUE + stack_to_move = locate(params["reference"]) in contents + if(isnull(stack_to_move)) + return TRUE + stack_to_move.forceMove(get_turf(customer)) + return TRUE diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index 10e3548fca9f..6961e9bdc01d 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -83,18 +83,15 @@ return FALSE return TRUE -/obj/structure/plasticflaps/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller, no_id = FALSE) - if(isliving(caller)) - if(isbot(caller)) +/obj/structure/plasticflaps/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + if(pass_info.is_living) + if(pass_info.is_bot) return TRUE - - var/mob/living/living_caller = caller - var/ventcrawler = HAS_TRAIT(living_caller, TRAIT_VENTCRAWLER_ALWAYS) || HAS_TRAIT(living_caller, TRAIT_VENTCRAWLER_NUDE) - if(!ventcrawler && living_caller.mob_size != MOB_SIZE_TINY) + if(pass_info.can_ventcrawl && pass_info.mob_size != MOB_SIZE_TINY) return FALSE - if(caller?.pulling) - return CanAStarPass(ID, to_dir, caller.pulling, no_id = no_id) + if(pass_info.pulling_info) + return CanAStarPass(to_dir, pass_info.pulling_info) return TRUE //diseases, stings, etc can pass diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 0da5236b321b..ca5c1c9e999d 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -15,6 +15,8 @@ var/climbable = TRUE ///Initial direction of the railing. var/ini_dir + ///item released when deconstructed + var/item_deconstruct = /obj/item/stack/rods /datum/armor/structure_railing melee = 50 @@ -70,9 +72,11 @@ return TRUE /obj/structure/railing/deconstruct(disassembled) - if(!(flags_1 & NODECONSTRUCT_1)) - var/obj/item/stack/rods/rod = new /obj/item/stack/rods(drop_location(), 6) - transfer_fingerprints_to(rod) + if((flags_1 & NODECONSTRUCT_1)) + return ..() + var/rods_to_make = istype(src,/obj/structure/railing/corner) ? 1 : 2 + var/obj/rod = new item_deconstruct(drop_location(), rods_to_make) + transfer_fingerprints_to(rod) return ..() ///Implements behaviour that makes it possible to unanchor the railing. @@ -92,7 +96,7 @@ return . || mover.throwing || mover.movement_type & (FLYING | FLOATING) return TRUE -/obj/structure/railing/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller, no_id = FALSE) +/obj/structure/railing/CanAStarPass(to_dir, datum/can_pass_info/pass_info) if(!(to_dir & dir)) return TRUE return ..() @@ -124,3 +128,35 @@ /obj/structure/railing/proc/check_anchored(checked_anchored) if(anchored == checked_anchored) return TRUE + + +/obj/structure/railing/wooden_fence + name = "wooden fence" + desc = "wooden fence meant to keep animals in." + icon = 'icons/obj/structures.dmi' + icon_state = "wooden_railing" + item_deconstruct = /obj/item/stack/sheet/mineral/wood + plane = GAME_PLANE_FOV_HIDDEN + layer = ABOVE_MOB_LAYER + +/obj/structure/railing/wooden_fence/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_ATOM_DIR_CHANGE, PROC_REF(on_change_layer)) + adjust_dir_layer(dir) + +/obj/structure/railing/wooden_fence/proc/on_change_layer(datum/source, old_dir, new_dir) + SIGNAL_HANDLER + adjust_dir_layer(new_dir) + +/obj/structure/railing/wooden_fence/proc/adjust_dir_layer(direction) + var/new_layer = (direction & NORTH) ? MOB_LAYER : ABOVE_MOB_LAYER + layer = new_layer + + +/obj/structure/railing/corner/end/wooden_fence + icon = 'icons/obj/structures.dmi' + icon_state = "wooden_railing_corner" + +/obj/structure/railing/corner/end/flip/wooden_fence + icon = 'icons/obj/structures.dmi' + icon_state = "wooden_railing_corner_flipped" diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index c14c29cc62b1..876f3c6473ae 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -117,9 +117,9 @@ FLOOR SAFES if(open) var/list/contents_names = list() data["contents"] = contents_names - for(var/obj/O in contents) - contents_names[++contents_names.len] = list("name" = O.name, "sprite" = O.icon_state) - user << browse_rsc(icon(O.icon, O.icon_state), "[O.icon_state].png") + for(var/obj/jewel in contents) + contents_names[++contents_names.len] = list("name" = jewel.name, "sprite" = jewel.icon_state) + user << browse_rsc(icon(jewel.icon, jewel.icon_state), "[jewel.icon_state].png") return data diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index 4e51d0900c5d..cc020f275ae0 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -8,11 +8,12 @@ anchored = TRUE density = TRUE + faction = list(FACTION_HOSTILE) + var/max_mobs = 5 var/spawn_time = 30 SECONDS var/mob_types = list(/mob/living/basic/carp) var/spawn_text = "emerges from" - var/faction = list(FACTION_HOSTILE) var/spawner_type = /datum/component/spawner /obj/structure/spawner/Initialize(mapload) @@ -30,7 +31,7 @@ icon = 'icons/obj/device.dmi' icon_state = "syndbeacon" spawn_text = "warps in from" - mob_types = list(/mob/living/basic/syndicate/ranged) + mob_types = list(/mob/living/basic/trooper/syndicate/ranged) faction = list(ROLE_SYNDICATE) /obj/structure/spawner/skeleton @@ -41,7 +42,7 @@ max_integrity = 150 max_mobs = 15 spawn_time = 15 SECONDS - mob_types = list(/mob/living/simple_animal/hostile/skeleton) + mob_types = list(/mob/living/basic/skeleton) spawn_text = "climbs out of" faction = list(FACTION_SKELETON) @@ -54,16 +55,16 @@ max_mobs = 15 spawn_time = 15 SECONDS mob_types = list( - /mob/living/simple_animal/hostile/retaliate/clown, - /mob/living/simple_animal/hostile/retaliate/clown/banana, - /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, - /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, - /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, - /mob/living/simple_animal/hostile/retaliate/clown/fleshclown, - /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton, - /mob/living/simple_animal/hostile/retaliate/clown/honkling, - /mob/living/simple_animal/hostile/retaliate/clown/longface, - /mob/living/simple_animal/hostile/retaliate/clown/lube, + /mob/living/basic/clown, + /mob/living/basic/clown/banana, + /mob/living/basic/clown/clownhulk, + /mob/living/basic/clown/clownhulk/chlown, + /mob/living/basic/clown/clownhulk/honkmunculus, + /mob/living/basic/clown/fleshclown, + /mob/living/basic/clown/mutant/glutton, + /mob/living/basic/clown/honkling, + /mob/living/basic/clown/longface, + /mob/living/basic/clown/lube, ) spawn_text = "climbs out of" faction = list(FACTION_CLOWN) @@ -80,8 +81,8 @@ /mob/living/basic/mining/basilisk, /mob/living/basic/mining/goldgrub, /mob/living/basic/mining/goliath/ancient, + /mob/living/basic/mining/legion, /mob/living/basic/wumborian_fugu, - /mob/living/simple_animal/hostile/asteroid/hivelord, ) faction = list(FACTION_MINING) @@ -98,7 +99,7 @@ /obj/structure/spawner/mining/hivelord name = "hivelord den" desc = "A den housing a nest of hivelords." - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord) + mob_types = list(/mob/living/basic/mining/hivelord) /obj/structure/spawner/mining/basilisk name = "basilisk den" diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm index 287ccbf3e4cd..c82d2e2a1044 100644 --- a/code/game/objects/structures/stairs.dm +++ b/code/game/objects/structures/stairs.dm @@ -93,7 +93,8 @@ var/turf/checking = get_step_multiz(get_turf(src), UP) if(!istype(checking)) return - if(!checking.zPassIn(climber, UP, get_turf(src))) + // I'm only interested in if the pass is unobstructed, not if the mob will actually make it + if(!climber.can_z_move(UP, get_turf(src), checking, z_move_flags = ZMOVE_ALLOW_BUCKLED)) return var/turf/target = get_step_multiz(get_turf(src), (dir|UP)) if(istype(target) && !climber.can_z_move(DOWN, target, z_move_flags = ZMOVE_FALL_FLAGS)) //Don't throw them into a tile that will just dump them back down. diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 84acecaa7807..6329d0e6c8b9 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -42,6 +42,8 @@ . = ..() if(_buildstack) buildstack = _buildstack + AddElement(/datum/element/footstep_override, priority = STEP_SOUND_TABLE_PRIORITY) + AddElement(/datum/element/climbable) var/static/list/loc_connections = list( @@ -139,10 +141,12 @@ if(locate(/obj/structure/table) in get_turf(mover)) return TRUE -/obj/structure/table/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller, no_id = FALSE) - . = !density - if(caller) - . = . || (caller.pass_flags & PASSTABLE) +/obj/structure/table/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + if(!density) + return TRUE + if(pass_info.pass_flags & PASSTABLE) + return TRUE + return FALSE /obj/structure/table/proc/tableplace(mob/living/user, mob/living/pushed_mob) pushed_mob.forceMove(loc) @@ -376,7 +380,7 @@ for(var/atom/movable/attached_movable as anything in attached_items) if(!attached_movable.Move(loc)) RemoveItemFromTable(attached_movable, attached_movable.loc) - + /obj/structure/table/rolling/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() if(has_gravity()) diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index 67b452ed3a8f..9078bf10085f 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -8,7 +8,7 @@ alpha = 30 //initially quite hidden when not "recharging" var/flare_message = "the trap flares brightly!" var/last_trigger = 0 - var/time_between_triggers = 600 //takes a minute to recharge + var/time_between_triggers = 1 MINUTES var/charges = INFINITY var/antimagic_flags = MAGIC_RESISTANCE @@ -61,50 +61,50 @@ last_trigger = world.time charges-- if(charges <= 0) - animate(src, alpha = 0, time = 10) - QDEL_IN(src, 10) + animate(src, alpha = 0, time = 1 SECONDS) + QDEL_IN(src, 1 SECONDS) else animate(src, alpha = initial(alpha), time = time_between_triggers) -/obj/structure/trap/proc/on_entered(datum/source, atom/movable/AM) +/obj/structure/trap/proc/on_entered(datum/source, atom/movable/victim) SIGNAL_HANDLER if(last_trigger + time_between_triggers > world.time) return // Don't want the traps triggered by sparks, ghosts or projectiles. - if(is_type_in_typecache(AM, ignore_typecache)) + if(is_type_in_typecache(victim, ignore_typecache)) return - if(ismob(AM)) - var/mob/M = AM - if(M.mind in immune_minds) + if(ismob(victim)) + var/mob/mob_victim = victim + if(mob_victim.mind in immune_minds) return - if(M.can_block_magic(antimagic_flags)) + if(mob_victim.can_block_magic(antimagic_flags)) flare() return if(charges <= 0) return flare() - if(isliving(AM)) - trap_effect(AM) + if(isliving(victim)) + trap_effect(victim) -/obj/structure/trap/proc/trap_effect(mob/living/L) +/obj/structure/trap/proc/trap_effect(mob/living/victim) return /obj/structure/trap/stun name = "shock trap" desc = "A trap that will shock and render you immobile. You'd better avoid it." icon_state = "trap-shock" - var/stun_time = 100 + var/stun_time = 10 SECONDS -/obj/structure/trap/stun/trap_effect(mob/living/L) - L.electrocute_act(30, src, flags = SHOCK_NOGLOVES) // electrocute act does a message. - L.Paralyze(stun_time) +/obj/structure/trap/stun/trap_effect(mob/living/victim) + victim.electrocute_act(30, src, flags = SHOCK_NOGLOVES) // electrocute act does a message. + victim.Paralyze(stun_time) /obj/structure/trap/stun/hunter name = "bounty trap" desc = "A trap that only goes off when a fugitive steps on it, announcing the location and stunning the target. You'd better avoid it." icon = 'icons/obj/objects.dmi' icon_state = "bounty_trap_on" - stun_time = 200 + stun_time = 20 SECONDS sparks = FALSE //the item version gives them off to prevent runtimes (see Destroy()) antimagic_flags = NONE var/obj/item/bountytrap/stored_item @@ -112,7 +112,7 @@ /obj/structure/trap/stun/hunter/Initialize(mapload) . = ..() - time_between_triggers = 10 + time_between_triggers = 1 SECONDS flare_message = "[src] snaps shut!" /obj/structure/trap/stun/hunter/Destroy() @@ -121,10 +121,10 @@ stored_item = null return ..() -/obj/structure/trap/stun/hunter/on_entered(datum/source, atom/movable/AM) - if(isliving(AM)) - var/mob/living/L = AM - if(!L.mind?.has_antag_datum(/datum/antagonist/fugitive)) +/obj/structure/trap/stun/hunter/on_entered(datum/source, atom/movable/victim) + if(isliving(victim)) + var/mob/living/living_victim = victim + if(!living_victim.mind?.has_antag_datum(/datum/antagonist/fugitive)) return caught = TRUE . = ..() @@ -169,11 +169,11 @@ radio.talk_into(src, "Fugitive has triggered this trap in the [get_area_name(src)]!", RADIO_CHANNEL_COMMON) /obj/item/bountytrap/attack_self(mob/living/user) - var/turf/T = get_turf(src) - if(!user || !user.transferItemToLoc(src, T))//visibly unequips + var/turf/target_turf = get_turf(src) + if(!user || !user.transferItemToLoc(src, target_turf))//visibly unequips return to_chat(user, span_notice("You set up [src]. Examine while close to disarm it.")) - stored_trap.forceMove(T)//moves trap to ground + stored_trap.forceMove(target_turf)//moves trap to ground forceMove(stored_trap)//moves item into trap /obj/item/bountytrap/Destroy() @@ -189,9 +189,9 @@ desc = "A trap that will set you ablaze. You'd better avoid it." icon_state = "trap-fire" -/obj/structure/trap/fire/trap_effect(mob/living/L) - to_chat(L, span_danger("Spontaneous combustion!")) - L.Paralyze(20) +/obj/structure/trap/fire/trap_effect(mob/living/victim) + to_chat(victim, span_danger("Spontaneous combustion!")) + victim.Paralyze(2 SECONDS) new /obj/effect/hotspot(get_turf(src)) /obj/structure/trap/chill @@ -199,11 +199,11 @@ desc = "A trap that will chill you to the bone. You'd better avoid it." icon_state = "trap-frost" -/obj/structure/trap/chill/trap_effect(mob/living/L) - to_chat(L, span_danger("You're frozen solid!")) - L.Paralyze(20) - L.adjust_bodytemperature(-300) - L.apply_status_effect(/datum/status_effect/freon) +/obj/structure/trap/chill/trap_effect(mob/living/victim) + to_chat(victim, span_bolddanger("You're frozen solid!")) + victim.Paralyze(2 SECONDS) + victim.adjust_bodytemperature(-300) + victim.apply_status_effect(/datum/status_effect/freon) /obj/structure/trap/damage @@ -212,12 +212,12 @@ icon_state = "trap-earth" -/obj/structure/trap/damage/trap_effect(mob/living/L) - to_chat(L, span_danger("The ground quakes beneath your feet!")) - L.Paralyze(100) - L.adjustBruteLoss(35) +/obj/structure/trap/damage/trap_effect(mob/living/victim) + to_chat(victim, span_bolddanger("The ground quakes beneath your feet!")) + victim.Paralyze(10 SECONDS) + victim.adjustBruteLoss(35) var/obj/structure/flora/rock/style_random/giant_rock = new(get_turf(src)) - QDEL_IN(giant_rock, 200) + QDEL_IN(giant_rock, 20 SECONDS) /obj/structure/trap/ward @@ -225,7 +225,7 @@ desc = "A divine barrier, It looks like you could destroy it with enough effort, or wait for it to dissipate..." icon_state = "ward" density = TRUE - time_between_triggers = 1200 //Exists for 2 minutes + time_between_triggers = 2 MINUTES /obj/structure/trap/ward/Initialize(mapload) . = ..() @@ -236,10 +236,10 @@ desc = "A trap that rings with unholy energy. You think you hear... chittering?" icon_state = "trap-cult" -/obj/structure/trap/cult/trap_effect(mob/living/L) - to_chat(L, span_danger("With a crack, the hostile constructs come out of hiding, stunning you!")) - L.electrocute_act(10, src, flags = SHOCK_NOGLOVES) // electrocute act does a message. - L.Paralyze(20) - new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc) - new /mob/living/simple_animal/hostile/construct/proteon/hostile(loc) - QDEL_IN(src, 30) +/obj/structure/trap/cult/trap_effect(mob/living/victim) + to_chat(victim, span_bolddanger("With a crack, the hostile constructs come out of hiding, stunning you!")) + victim.electrocute_act(10, src, flags = SHOCK_NOGLOVES) // electrocute act does a message. + victim.Paralyze(2 SECONDS) + new /mob/living/basic/construct/proteon/hostile(loc) + new /mob/living/basic/construct/proteon/hostile(loc) + QDEL_IN(src, 3 SECONDS) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 1d0848e0ad28..af406ec7d14e 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -327,7 +327,7 @@ return TRUE -/obj/structure/window/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) +/obj/structure/window/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() if(.) //received damage update_nearby_icons() @@ -445,7 +445,7 @@ /obj/structure/window/get_dumping_location() return null -/obj/structure/window/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller, no_id = FALSE) +/obj/structure/window/CanAStarPass(to_dir, datum/can_pass_info/pass_info) if(!density) return TRUE if(fulltile || (dir == to_dir)) diff --git a/code/game/sound.dm b/code/game/sound.dm index 7e421372cc90..b14a9ee2155b 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -1,4 +1,5 @@ GLOBAL_LIST_INIT(used_sound_channels, list( + CHANNEL_MASTER_VOLUME, CHANNEL_LOBBYMUSIC, CHANNEL_ADMIN, CHANNEL_VOX, @@ -145,6 +146,8 @@ GLOBAL_LIST_INIT(proxy_sound_channels, list( sound_to_use.wait = 0 //No queue sound_to_use.channel = channel || SSsounds.random_available_channel() sound_to_use.volume = vol + if("[CHANNEL_MASTER_VOLUME]" in client?.prefs?.channel_volume) + sound_to_use.volume *= client.prefs.channel_volume["[CHANNEL_MASTER_VOLUME]"] * 0.01 if(vary) if(frequency) @@ -246,6 +249,7 @@ GLOBAL_LIST_INIT(proxy_sound_channels, list( if("[CHANNEL_LOBBYMUSIC]" in prefs.channel_volume) if(prefs.channel_volume["[CHANNEL_LOBBYMUSIC]"] != 0) vol *= prefs.channel_volume["[CHANNEL_LOBBYMUSIC]"] * 0.01 + vol *= prefs.channel_volume["[CHANNEL_MASTER_VOLUME]"] * 0.01 if((prefs && (!prefs.read_preference(/datum/preference/toggle/sound_lobby))) || CONFIG_GET(flag/disallow_title_music)) return diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 63c0ac86d6be..b5d508d147c5 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -48,7 +48,10 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( // Creates a new turf // new_baseturfs can be either a single type or list of types, formated the same as baseturfs. see turf.dm -/turf/proc/ChangeTurf(path, list/new_baseturfs, flags) +/turf/proc/ChangeTurf(turf/path, list/new_baseturfs, flags) + if(flags & CHANGETURF_DEFAULT_BASETURF) + new_baseturfs = initial(path.baseturfs) + switch(path) if(null) return diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 05ba6ea2edc5..ce6dcec9fe66 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -215,7 +215,7 @@ /turf/closed/mineral/random var/mineralChance = 13 - var/turf_transforms + var/turf_transforms = TRUE /// Returns a list of the chances for minerals to spawn. /// Will only run once, and will then be cached. @@ -231,6 +231,7 @@ /obj/item/stack/ore/titanium = 11, /obj/item/stack/ore/uranium = 5, /turf/closed/mineral/gibtonite = 4, + /turf/closed/mineral/artifact = 1, ) /turf/closed/mineral/random/Initialize(mapload) @@ -315,6 +316,7 @@ /obj/item/stack/ore/titanium = 4, /obj/item/stack/ore/uranium = 2, /turf/closed/mineral/gibtonite = 2, + /turf/closed/mineral/artifact = 2, ) //extremely low chance of rare ores, meant mostly for populating stations with large amounts of asteroid @@ -352,6 +354,7 @@ /obj/item/stack/ore/titanium = 11, /obj/item/stack/ore/uranium = 5, /turf/closed/mineral/gibtonite/volcanic = 4, + /turf/closed/mineral/artifact/volcanic = 1, ) /// A turf that can't we can't build openspace chasms on or spawn ruins in. @@ -854,4 +857,30 @@ /turf/closed/mineral/strong/ex_act(severity, target) return FALSE +//Artifact spawning rock + +/turf/closed/mineral/artifact + mineralAmt = 1 + //icon_state = "rock_Gibtonite_inactive" + scan_state = "rock_Artifact" + +/turf/closed/mineral/artifact/gets_drilled(mob/user, give_exp = FALSE, triggered_by_explosion = FALSE) + if(istype(user)) + SEND_SIGNAL(user, COMSIG_MOB_MINED, src, give_exp) + + if(!triggered_by_explosion) //if someone maxcaps lavaland and promptly unearths every single artifact thats gonna fuck up and activate some of them which is not good + new /obj/effect/artifact_spawner(src) + + var/flags = NONE + if(defer_change) + flags = CHANGETURF_DEFER_CHANGE + var/turf/open/mined = ScrapeAway(null, flags) + mined.update_visuals() + +/turf/closed/mineral/artifact/volcanic + turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface + baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface + initial_gas_mix = LAVALAND_DEFAULT_ATMOS + defer_change = TRUE + #undef MINING_MESSAGE_COOLDOWN diff --git a/code/game/turfs/closed/wall/misc_walls.dm b/code/game/turfs/closed/wall/misc_walls.dm index c96cf314a982..7705f9ded255 100644 --- a/code/game/turfs/closed/wall/misc_walls.dm +++ b/code/game/turfs/closed/wall/misc_walls.dm @@ -18,16 +18,6 @@ /turf/closed/wall/mineral/cult/devastate_wall() new sheet_type(get_turf(src), sheet_amount) -/turf/closed/wall/mineral/cult/Exited(atom/movable/gone, direction) - . = ..() - if(istype(gone, /mob/living/simple_animal/hostile/construct/harvester)) //harvesters can go through cult walls, dragging something with - var/mob/living/simple_animal/hostile/construct/harvester/H = gone - var/atom/movable/stored_pulling = H.pulling - if(stored_pulling) - stored_pulling.setDir(direction) - stored_pulling.forceMove(src) - H.start_pulling(stored_pulling, supress_message = TRUE) - /turf/closed/wall/mineral/cult/artificer name = "runed stone wall" desc = "A cold stone wall engraved with indecipherable symbols. Studying them causes your head to pound." diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index 4d7595b91895..77b27fddc1d7 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -1,4 +1,5 @@ #define MAX_DENT_DECALS 15 +#define LEANING_OFFSET 11 /turf/closed/wall name = "wall" @@ -33,6 +34,50 @@ var/list/dent_decals +/turf/closed/wall/MouseDrop_T(mob/living/carbon/carbon_mob, mob/user) + ..() + if(carbon_mob != user) + return + if(carbon_mob.is_leaning == TRUE) + return + if(carbon_mob.pulledby) + return + if(!carbon_mob.density) + return + carbon_mob.is_leaning = TRUE + var/turf/checked_turf = get_step(carbon_mob, turn(carbon_mob.dir, 180)) + if(checked_turf == src) + carbon_mob.start_leaning(src) + +/mob/living/carbon/proc/start_leaning(obj/wall) + + switch(dir) + if(SOUTH) + pixel_y += LEANING_OFFSET + if(NORTH) + pixel_y += -LEANING_OFFSET + if(WEST) + pixel_x += LEANING_OFFSET + if(EAST) + pixel_x += -LEANING_OFFSET + + ADD_TRAIT(src, TRAIT_UNDENSE, LEANING_TRAIT) + ADD_TRAIT(src, TRAIT_EXPANDED_FOV, LEANING_TRAIT) + visible_message(span_notice("[src] leans against \the [wall]!"), \ + span_notice("You lean against \the [wall]!")) + RegisterSignals(src, list(COMSIG_MOB_CLIENT_PRE_MOVE, COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_GET_PULLED, COMSIG_MOVABLE_TELEPORTING, COMSIG_ATOM_DIR_CHANGE), PROC_REF(stop_leaning)) + update_fov() + +/mob/living/carbon/proc/stop_leaning() + SIGNAL_HANDLER + UnregisterSignal(src, list(COMSIG_MOB_CLIENT_PRE_MOVE, COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_GET_PULLED, COMSIG_MOVABLE_TELEPORTING, COMSIG_ATOM_DIR_CHANGE)) + is_leaning = FALSE + pixel_y = base_pixel_y + body_position_pixel_x_offset + pixel_x = base_pixel_y + body_position_pixel_y_offset + REMOVE_TRAIT(src, TRAIT_UNDENSE, LEANING_TRAIT) + REMOVE_TRAIT(src, TRAIT_EXPANDED_FOV, LEANING_TRAIT) + update_fov() + /turf/closed/wall/Initialize(mapload) . = ..() if(!can_engrave) @@ -328,4 +373,13 @@ /turf/closed/wall/metal_foam_base girder_type = /obj/structure/foamedmetal +/turf/closed/wall/Bumped(atom/movable/bumped_atom) + . = ..() + SEND_SIGNAL(bumped_atom, COMSIG_LIVING_WALL_BUMP, src) + +/turf/closed/wall/Exited(atom/movable/gone, direction) + . = ..() + SEND_SIGNAL(gone, COMSIG_LIVING_WALL_EXITED, src) + #undef MAX_DENT_DECALS +#undef LEANING_OFFSET diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 8047b7cb228b..20fbf9fee509 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -11,22 +11,22 @@ var/datum/pollution/pollution //direction is direction of travel of A -/turf/open/zPassIn(atom/movable/A, direction, turf/source) - if(direction == DOWN) - for(var/obj/O in contents) - if(O.obj_flags & BLOCK_Z_IN_DOWN) - return FALSE - return TRUE - return FALSE +/turf/open/zPassIn(direction) + if(direction != DOWN) + return FALSE + for(var/obj/on_us in contents) + if(on_us.obj_flags & BLOCK_Z_IN_DOWN) + return FALSE + return TRUE -//direction is direction of travel of A -/turf/open/zPassOut(atom/movable/A, direction, turf/destination, allow_anchored_movement) - if(direction == UP) - for(var/obj/O in contents) - if(O.obj_flags & BLOCK_Z_OUT_UP) - return FALSE - return TRUE - return FALSE +//direction is direction of travel of an atom +/turf/open/zPassOut(direction) + if(direction != UP) + return FALSE + for(var/obj/on_us in contents) + if(on_us.obj_flags & BLOCK_Z_OUT_UP) + return FALSE + return TRUE //direction is direction of travel of air /turf/open/zAirIn(direction, turf/source) diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index d6c84611f3f9..258873d1e705 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -29,6 +29,11 @@ /// Percentage chance of receiving a bonus worm var/worm_chance = 30 + /// Set to TRUE to call ex_act parent + var/explodable = FALSE + + + /turf/open/misc/asteroid/break_tile() icon_state = broken_state @@ -63,7 +68,9 @@ return /turf/open/misc/asteroid/ex_act(severity, target) - return + if(!explodable) + return + return ..() /turf/open/misc/asteroid/attackby(obj/item/W, mob/user, params) . = ..() diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index 993deb3aedef..756917e86f53 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -178,7 +178,7 @@ . = ..() ScrapeAway(flags = CHANGETURF_INHERIT_AIR) -/turf/open/floor/plating/foam/tool_act(mob/living/user, obj/item/I, tool_type) +/turf/open/floor/plating/foam/tool_act(mob/living/user, obj/item/tool, tool_type, is_right_clicking) return //reinforced plating deconstruction states diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index 7511f52ecd33..2cfdc345ac8c 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -80,7 +80,7 @@ /turf/open/openspace/zAirOut() return TRUE -/turf/open/openspace/zPassIn(atom/movable/A, direction, turf/source) +/turf/open/openspace/zPassIn(direction) if(direction == DOWN) for(var/obj/contained_object in contents) if(contained_object.obj_flags & BLOCK_Z_IN_DOWN) @@ -93,9 +93,7 @@ return TRUE return FALSE -/turf/open/openspace/zPassOut(atom/movable/A, direction, turf/destination, allow_anchored_movement) - if(A.anchored && !allow_anchored_movement) - return FALSE +/turf/open/openspace/zPassOut(direction) if(direction == DOWN) for(var/obj/contained_object in contents) if(contained_object.obj_flags & BLOCK_Z_OUT_DOWN) @@ -152,8 +150,9 @@ /turf/open/openspace/rust_heretic_act() return FALSE -/turf/open/openspace/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller, no_id = FALSE) - if(caller && !caller.can_z_move(DOWN, src, null , ZMOVE_FALL_FLAGS)) //If we can't fall here (flying/lattice), it's fine to path through +/turf/open/openspace/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + var/atom/movable/our_movable = pass_info.caller_ref.resolve() + if(our_movable && !our_movable.can_z_move(DOWN, src, null, ZMOVE_FALL_FLAGS)) //If we can't fall here (flying/lattice), it's fine to path through return TRUE return FALSE diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index f485743a93e5..4572672223e1 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -273,7 +273,7 @@ GLOBAL_VAR_INIT(starlight_color, pick(COLOR_TEAL, COLOR_GREEN, COLOR_CYAN, COLOR /turf/open/space/openspace/zAirOut() return TRUE -/turf/open/space/openspace/zPassIn(atom/movable/A, direction, turf/source) +/turf/open/space/openspace/zPassIn(direction) if(direction == DOWN) for(var/obj/contained_object in contents) if(contained_object.obj_flags & BLOCK_Z_IN_DOWN) @@ -286,9 +286,7 @@ GLOBAL_VAR_INIT(starlight_color, pick(COLOR_TEAL, COLOR_GREEN, COLOR_CYAN, COLOR return TRUE return FALSE -/turf/open/space/openspace/zPassOut(atom/movable/A, direction, turf/destination, allow_anchored_movement) - if(A.anchored && !allow_anchored_movement) - return FALSE +/turf/open/space/openspace/zPassOut(direction) if(direction == DOWN) for(var/obj/contained_object in contents) if(contained_object.obj_flags & BLOCK_Z_OUT_DOWN) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index d64e51e5113d..d0a7bd492e38 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -294,20 +294,21 @@ GLOBAL_LIST_EMPTY(station_turfs) return TRUE return FALSE -//zPassIn doesn't necessarily pass an atom! -//direction is direction of travel of air -/turf/proc/zPassIn(atom/movable/A, direction, turf/source) +//The zpass procs exist to be overriden, not directly called +//use can_z_pass for that +///If we'd allow anything to travel into us +/turf/proc/zPassIn(direction) return FALSE -//direction is direction of travel of air -/turf/proc/zPassOut(atom/movable/A, direction, turf/destination, allow_anchored_movement) +///If we'd allow anything to travel out of us +/turf/proc/zPassOut(direction) return FALSE //direction is direction of travel of air /turf/proc/zAirIn(direction, turf/source) return FALSE -//direction is direction of travel of air +//direction is direction of travel /turf/proc/zAirOut(direction, turf/source) return FALSE @@ -521,9 +522,9 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf/singularity_act() if(underfloor_accessibility < UNDERFLOOR_INTERACTABLE) - for(var/obj/O in contents) //this is for deleting things like wires contained in the turf - if(HAS_TRAIT(O, TRAIT_T_RAY_VISIBLE)) - O.singularity_act() + for(var/obj/on_top in contents) //this is for deleting things like wires contained in the turf + if(HAS_TRAIT(on_top, TRAIT_T_RAY_VISIBLE)) + on_top.singularity_act() ScrapeAway(flags = CHANGETURF_INHERIT_AIR) return(2) @@ -734,19 +735,20 @@ GLOBAL_LIST_EMPTY(station_turfs) * * Arguments: * * caller: The movable, if one exists, being used for mobility checks to see what tiles it can reach - * * ID: An ID card that decides if we can gain access to doors that would otherwise block a turf + * * access: A list that decides if we can gain access to doors that would otherwise block a turf * * simulated_only: Do we only worry about turfs with simulated atmos, most notably things that aren't space? * * no_id: When true, doors with public access will count as impassible */ -/turf/proc/reachableAdjacentTurfs(atom/movable/caller, ID, simulated_only, no_id = FALSE) +/turf/proc/reachableAdjacentTurfs(atom/movable/caller, list/access, simulated_only, no_id = FALSE) var/static/space_type_cache = typecacheof(/turf/open/space) . = list() + var/datum/can_pass_info/pass_info = new(caller, access, no_id) for(var/iter_dir in GLOB.cardinals) var/turf/turf_to_check = get_step(src,iter_dir) if(!turf_to_check || (simulated_only && space_type_cache[turf_to_check.type])) continue - if(turf_to_check.density || LinkBlockedWithAccess(turf_to_check, caller, ID, no_id = no_id)) + if(turf_to_check.density || LinkBlockedWithAccess(turf_to_check, pass_info)) continue . += turf_to_check diff --git a/code/game/world.dm b/code/game/world.dm index 8f3299d35029..a1301045f64e 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -107,7 +107,7 @@ GLOBAL_VAR(restart_counter) #ifdef UNIT_TESTS cb = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(RunUnitTests)) #else - cb = VARSET_CALLBACK(SSticker, force_ending, TRUE) + cb = VARSET_CALLBACK(SSticker, force_ending, ADMIN_FORCE_END_ROUND) #endif SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_addtimer), cb, 10 SECONDS)) diff --git a/code/modules/actionspeed/_actionspeed_modifier.dm b/code/modules/actionspeed/_actionspeed_modifier.dm index 71bc966acf4d..761bfc3ff74a 100644 --- a/code/modules/actionspeed/_actionspeed_modifier.dm +++ b/code/modules/actionspeed/_actionspeed_modifier.dm @@ -37,8 +37,11 @@ can next move /// Other modification datums this conflicts with. var/conflicts_with -/datum/actionspeed_modifier/New() +/datum/actionspeed_modifier/New(init_id) . = ..() + + id = init_id + if(!id) id = "[type]" //We turn the path into a string. diff --git a/code/modules/actionspeed/modifiers/wound.dm b/code/modules/actionspeed/modifiers/wound.dm new file mode 100644 index 000000000000..845399e07616 --- /dev/null +++ b/code/modules/actionspeed/modifiers/wound.dm @@ -0,0 +1,10 @@ +/datum/actionspeed_modifier/wound_interaction_inefficiency + variable = TRUE + + var/datum/wound/parent + +/datum/actionspeed_modifier/wound_interaction_inefficiency/New(new_id, datum/wound/parent) + + src.parent = parent + + return ..() diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index da88a92bbb49..3f4c041f387a 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -24,7 +24,7 @@ INVESTIGATE_CRAFTING, INVESTIGATE_DEATHS, INVESTIGATE_ENGINE, - INVESTIGATE_EXPERIMENTOR, + INVESTIGATE_ARTIFACT, INVESTIGATE_GRAVITY, INVESTIGATE_HALLUCINATIONS, INVESTIGATE_HYPERTORUS, diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 86ca881ef3bc..18cefa1e6e1c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -44,6 +44,7 @@ GLOBAL_PROTECT(admin_verbs_admin) /datum/admins/proc/toggleoocdead, /*toggles ooc on/off for everyone who is dead*/ /datum/admins/proc/trophy_manager, /datum/admins/proc/view_all_circuits, + /datum/admins/proc/open_artifactpanel, /datum/verbs/menu/Admin/verb/playerpanel, /* It isn't /datum/admin but it fits no less */ // Client procs /client/proc/admin_call_shuttle, /*allows us to call the emergency shuttle*/ @@ -52,6 +53,9 @@ GLOBAL_PROTECT(admin_verbs_admin) /client/proc/admin_enable_shuttle, /*undoes the above*/ /client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/ /client/proc/admin_hostile_environment, /*Allows admins to prevent the emergency shuttle from leaving, also lets admins clear hostile environments if theres one stuck*/ + /client/proc/centcom_podlauncher,/*Open a window to launch a Supplypod and configure it or it's contents*/ + /client/proc/check_ai_laws, /*shows AI and borg laws*/ + /client/proc/check_antagonists, /*shows all antags*/ /client/proc/cmd_admin_check_contents, /*displays the contents of an instance*/ /client/proc/cmd_admin_check_player_exp, /* shows players by playtime */ /client/proc/cmd_admin_create_centcom_report, @@ -62,9 +66,7 @@ GLOBAL_PROTECT(admin_verbs_admin) /client/proc/cmd_admin_subtle_message, /*send a message to somebody as a 'voice in their head'*/ /client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/ /client/proc/cmd_change_command_name, - /client/proc/centcom_podlauncher,/*Open a window to launch a Supplypod and configure it or it's contents*/ - /client/proc/check_ai_laws, /*shows AI and borg laws*/ - /client/proc/check_antagonists, /*shows all antags*/ + /client/proc/create_mob_worm, /client/proc/fax_panel, /*send a paper to fax*/ /client/proc/force_load_lazy_template, /client/proc/game_panel, /*game panel, allows to change game-mode etc*/ @@ -118,6 +120,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/drop_dynex_bomb, /client/proc/flip_ghost_spawn, /client/proc/forceEvent, + /client/proc/forceGamemode, /client/proc/generate_bulk_code, //monkestation addition /client/proc/generate_code, //monkestation addition /client/proc/mass_add_metacoins, //monkestation addition @@ -1038,3 +1041,47 @@ GLOBAL_PROTECT(admin_verbs_poll) message_admins("[key_name_admin(usr)] has loaded lazy template '[choice]'") to_chat(usr, span_boldnicegreen("Template loaded, you have been moved to the bottom left of the reservation.")) + +/client/proc/create_mob_worm() + set category = "Admin.Fun" + set name = "Create Mob Worm" + set desc = "Attached a linked list of mobs to a marked mob" + if (!check_rights(R_FUN)) + return + if(isnull(holder)) + return + if(!isliving(holder.marked_datum)) + to_chat(usr, span_warning("Error: Please mark a mob to attach mobs to.")) + return + var/mob/living/head = holder.marked_datum + + var/attempted_target_path = tgui_input_text( + usr, + "Enter typepath of a mob you'd like to make your chain from.", + "Typepath", + "[/mob/living/basic/pet/dog/corgi/ian]", + ) + + if (isnull(attempted_target_path)) + return //The user pressed "Cancel" + + var/desired_mob = text2path(attempted_target_path) + if(!ispath(desired_mob)) + var/static/list/mob_paths = make_types_fancy(subtypesof(/mob/living)) + desired_mob = pick_closest_path(attempted_target_path, mob_paths) + if(isnull(desired_mob) || !ispath(desired_mob) || QDELETED(head)) + return //The user pressed "Cancel" + + var/amount = tgui_input_number(usr, "How long should our tail be?", "Worm Configurator", default = 3, min_value = 1) + if (isnull(amount) || amount < 1 || QDELETED(head)) + return + head.AddComponent(/datum/component/mob_chain) + var/mob/living/previous = head + for (var/i in 1 to amount) + var/mob/living/segment = new desired_mob(head.drop_location()) + if (QDELETED(segment)) // ffs mobs which replace themselves with other mobs + i-- + continue + QDEL_NULL(segment.ai_controller) + segment.AddComponent(/datum/component/mob_chain, front = previous) + previous = segment diff --git a/code/modules/admin/force_event.dm b/code/modules/admin/force_event.dm index 1c97936ac48d..e519d2f4ed8a 100644 --- a/code/modules/admin/force_event.dm +++ b/code/modules/admin/force_event.dm @@ -1,4 +1,5 @@ ///Allows an admin to force an event +/* /client/proc/forceEvent() set name = "Trigger Event" set category = "Admin.Events" @@ -15,7 +16,7 @@ var/datum/force_event/ui = new(usr) ui.ui_interact(usr) - +*/ /// Force Event Panel /datum/force_event diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index bbdb6bfbe22f..989e05caf600 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -157,6 +157,8 @@ GLOBAL_PROTECT(href_token) owner.init_verbs() //re-initialize the verb list owner.update_special_keybinds() GLOB.admins |= client + if(!owner.mentor_datum) + owner.mentor_datum_set() try_give_profiling() @@ -170,6 +172,9 @@ GLOBAL_PROTECT(href_token) GLOB.admins -= owner owner.remove_admin_verbs() owner.holder = null + GLOB.mentors -= owner + owner.mentor_datum.owner = null + owner.mentor_datum = null owner = null /// Returns the feedback forum thread for the admin holder's owner, as according to DB. diff --git a/code/modules/admin/smites/bloodless.dm b/code/modules/admin/smites/bloodless.dm index f42711c0f742..c970e920f225 100644 --- a/code/modules/admin/smites/bloodless.dm +++ b/code/modules/admin/smites/bloodless.dm @@ -9,10 +9,10 @@ return var/mob/living/carbon/carbon_target = target for(var/_limb in carbon_target.bodyparts) - var/obj/item/bodypart/limb = _limb - var/type_wound = pick(list(/datum/wound/slash/severe, /datum/wound/slash/moderate)) + var/obj/item/bodypart/limb = _limb // fine to use this raw, its a meme smite + var/type_wound = pick(list(/datum/wound/slash/flesh/severe, /datum/wound/slash/flesh/moderate)) limb.force_wound_upwards(type_wound, smited = TRUE) - type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate)) + type_wound = pick(list(/datum/wound/slash/flesh/critical, /datum/wound/slash/flesh/severe, /datum/wound/slash/flesh/moderate)) limb.force_wound_upwards(type_wound, smited = TRUE) - type_wound = pick(list(/datum/wound/slash/critical, /datum/wound/slash/severe)) + type_wound = pick(list(/datum/wound/slash/flesh/critical, /datum/wound/slash/flesh/severe)) limb.force_wound_upwards(type_wound, smited = TRUE) diff --git a/code/modules/admin/smites/boneless.dm b/code/modules/admin/smites/boneless.dm index a18b439c5c0d..bf402abdfdb6 100644 --- a/code/modules/admin/smites/boneless.dm +++ b/code/modules/admin/smites/boneless.dm @@ -10,7 +10,12 @@ return var/mob/living/carbon/carbon_target = target - for(var/_limb in carbon_target.bodyparts) - var/obj/item/bodypart/limb = _limb - var/type_wound = pick(list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate)) - limb.force_wound_upwards(type_wound, smited = TRUE) + for(var/obj/item/bodypart/limb as anything in carbon_target.bodyparts) + var/severity = pick(list( + "[WOUND_SEVERITY_MODERATE]", + "[WOUND_SEVERITY_SEVERE]", + "[WOUND_SEVERITY_SEVERE]", + "[WOUND_SEVERITY_CRITICAL]", + "[WOUND_SEVERITY_CRITICAL]", + )) + carbon_target.cause_wound_of_type_and_severity(WOUND_BLUNT, limb, severity) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index cc21cc3ebe45..45b2d9c82288 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -70,6 +70,7 @@ if(!check_rights(R_ADMIN)) return SSticker.mode.admin_panel() + SSgamemode.admin_panel(usr) //monkestation addition else if(href_list["call_shuttle"]) if(!check_rights(R_ADMIN)) @@ -162,7 +163,7 @@ if(tgui_alert(usr, "This will end the round, are you SURE you want to do this?", "Confirmation", list("Yes", "No")) == "Yes") if(tgui_alert(usr, "Final Confirmation: End the round NOW?", "Confirmation", list("Yes", "No")) == "Yes") message_admins(span_adminnotice("[key_name_admin(usr)] has ended the round.")) - SSticker.force_ending = TRUE //Yeah there we go APC destroyed mission accomplished + SSticker.force_ending = ADMIN_FORCE_END_ROUND //Yeah there we go APC destroyed mission accomplished return else message_admins(span_adminnotice("[key_name_admin(usr)] decided against ending the round.")) diff --git a/code/modules/admin/verbs/artifacts.dm b/code/modules/admin/verbs/artifacts.dm new file mode 100644 index 000000000000..e48a59cbde25 --- /dev/null +++ b/code/modules/admin/verbs/artifacts.dm @@ -0,0 +1,69 @@ +/datum/artifactpanel + var/user + +/datum/admins/proc/open_artifactpanel() + set category = "Admin.Game" + set name = "Artifact Panel" + set desc = "Artifact panel" + + if(!check_rights(R_ADMIN)) + return + + var/datum/artifactpanel/artifactpanel = new(usr) + + artifactpanel.ui_interact(usr) + +/datum/artifactpanel/New(to_user, mob/living/silicon/robot/to_borg) + user = CLIENT_FROM_VAR(to_user) + +/datum/artifactpanel/ui_state(mob/user) + return GLOB.admin_state + +/datum/artifactpanel/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ArtifactPanel") + ui.open() + +/datum/artifactpanel/ui_data(mob/user) + . = list() + .["artifacts"] = list() + for(var/obj/art in GLOB.running_artifact_list) + var/datum/component/artifact/component = GLOB.running_artifact_list[art] + .["artifacts"] += list(list( + "name" = art.name, + "ref" = REF(art), + "loc" = "[AREACOORD(art)]", + "active" = component.active, + "typename" = component.type_name, + "lastprint" = "[art.fingerprintslast]", + )) + +/datum/artifactpanel/ui_act(action, params) + . = ..() + if(.) + return + switch (action) + if ("delete") + var/atom/movable/to_delete = locate(params["ref"]) in GLOB.running_artifact_list + if(isnull(to_delete)) + return + var/ask = tgui_alert(usr, "Are you sure you want to delete that?", "Are you sure about that?", list("YEAH BABY LETS GO", "Naw")) + if(ask == "YEAH BABY LETS GO") + message_admins("[key_name_admin(user)] has deleted [to_delete] via Artifact Panel at [ADMIN_VERBOSEJMP(to_delete)].") + qdel(to_delete) + if ("toggle") + var/atom/movable/object = locate(params["ref"]) in GLOB.running_artifact_list + if(isnull(object)) + return + var/datum/component/artifact/component = GLOB.running_artifact_list[object] + var/ask = tgui_alert(usr, "Do you want to do it silently?", "Silently?", list("Visible", "Silent")) + var/do_silently = FALSE + if(ask == "Silent") + do_silently = TRUE + + message_admins("[key_name_admin(user)] has [component.active ? "deactivated" : "activated"] [object][ADMIN_FLW(object)] via Artifact Panel.") + if(component.active) + component.artifact_deactivate(do_silently) + else + component.artifact_activate(do_silently) diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 667e29e615b1..8407c364c192 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -541,7 +541,7 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) var/spawnpoint = pick(GLOB.blobstart) var/list/mob/dead/observer/candidates var/mob/dead/observer/chosen_candidate - var/mob/living/simple_animal/drone/nerd + var/mob/living/basic/drone/nerd var/teamsize teamsize = input(usr, "How many drones?", "N.E.R.D. team size", 2) as num|null @@ -557,7 +557,7 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) while(length(candidates) && teamsize) chosen_candidate = pick(candidates) candidates -= chosen_candidate - nerd = new /mob/living/simple_animal/drone/classic(spawnpoint) + nerd = new /mob/living/basic/drone/classic(spawnpoint) nerd.key = chosen_candidate.key nerd.log_message("has been selected as a Nanotrasen emergency response drone.", LOG_GAME) teamsize-- diff --git a/code/modules/admin/verbs/server.dm b/code/modules/admin/verbs/server.dm index 541c54f81a04..4b0ee63d44e8 100644 --- a/code/modules/admin/verbs/server.dm +++ b/code/modules/admin/verbs/server.dm @@ -77,8 +77,8 @@ if(confirm == "Cancel") return if(confirm == "Yes") - SSticker.force_ending = TRUE - SSblackbox.record_feedback("tally", "admin_verb", 1, "End Round") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + SSticker.force_ending = FORCE_END_ROUND + SSblackbox.record_feedback("tally", "admin_verb", 1, "End Round") // If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleooc() set category = "Server" diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm index 09759c72c6f8..0bdc6e525ace 100644 --- a/code/modules/admin/view_variables/topic_basic.dm +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -61,22 +61,34 @@ names += componentsubtypes names += "---Elements---" names += sort_list(subtypesof(/datum/element), GLOBAL_PROC_REF(cmp_typepaths_asc)) + var/result = tgui_input_list(usr, "Choose a component/element to add", "Add Component", names) if(isnull(result)) return if(!usr || result == "---Components---" || result == "---Elements---") return + if(QDELETED(src)) to_chat(usr, "That thing doesn't exist anymore!", confidential = TRUE) return + + var/add_source + if(ispath(result, /datum/component)) + var/datum/component/comp_path = result + if(initial(comp_path.dupe_mode) == COMPONENT_DUPE_SOURCES) + add_source = tgui_input_text(usr, "Enter a source for the component", "Add Component", "ADMIN-ABUSE") + if(isnull(add_source)) + return + var/list/lst = get_callproc_args() if(!lst) return + var/datumname = "error" lst.Insert(1, result) if(result in componentsubtypes) datumname = "component" - target._AddComponent(lst) + target._AddComponent(lst, add_source) else datumname = "element" target._AddElement(lst) diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index d3e72238879b..ec147cb9fb9e 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -104,7 +104,9 @@ var/special_role_name = ROLE_NUCLEAR_OPERATIVE /// The applied outfit var/datum/outfit/syndicate/outfit = /datum/outfit/syndicate/reinforcement - /// The antag datam applied + /// The outfit given to plasmaman operatives + var/datum/outfit/syndicate/plasma_outfit = /datum/outfit/syndicate/reinforcement/plasmaman + /// The antag datum applied var/datum/antagonist/nukeop/antag_datum = /datum/antagonist/nukeop /// Style used by the droppod var/pod_style = STYLE_SYNDICATE @@ -144,11 +146,11 @@ else to_chat(user, span_warning("Unable to connect to Syndicate command. Please wait and try again later or use the beacon on your uplink to get your points refunded.")) -/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T, kind, datum/mind/user) +/obj/item/antag_spawner/nuke_ops/spawn_antag(client/our_client, turf/T, kind, datum/mind/user) var/mob/living/carbon/human/nukie = new() var/obj/structure/closet/supplypod/pod = setup_pod() - C.prefs.safe_transfer_prefs_to(nukie, is_antag = TRUE) - nukie.ckey = C.key + our_client.prefs.safe_transfer_prefs_to(nukie, is_antag = TRUE) + nukie.ckey = our_client.key var/datum/mind/op_mind = nukie.mind if(length(GLOB.newplayer_start)) // needed as hud code doesn't render huds if the atom (in this case the nukie) is in nullspace, so just move the nukie somewhere safe nukie.forceMove(pick(GLOB.newplayer_start)) @@ -157,6 +159,7 @@ antag_datum = new() antag_datum.send_to_spawnpoint = FALSE + antag_datum.nukeop_outfit = use_subtypes ? pick(subtypesof(outfit)) : outfit var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop, TRUE) diff --git a/code/modules/antagonists/blob/blob_minion.dm b/code/modules/antagonists/blob/blob_minion.dm index 9ba8e7089b9e..9bf37e961d5d 100644 --- a/code/modules/antagonists/blob/blob_minion.dm +++ b/code/modules/antagonists/blob/blob_minion.dm @@ -34,9 +34,3 @@ objective.owner = owner objective.overmind = overmind objectives += objective - -/datum/antagonist/blob_minion/blobbernaut - name = "\improper Blobbernaut" - -/datum/antagonist/blob_minion/blob_zombie - name = "\improper Blob Zombie" diff --git a/code/modules/antagonists/blob/blobstrains/_blobstrain.dm b/code/modules/antagonists/blob/blobstrains/_blobstrain.dm index db0d583e15f2..6f01eb67aa72 100644 --- a/code/modules/antagonists/blob/blobstrains/_blobstrain.dm +++ b/code/modules/antagonists/blob/blobstrains/_blobstrain.dm @@ -38,8 +38,6 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ /// Adds to claim, pulse, and expand range var/core_range_bonus = 0 - /// The core can sustain this many extra spores with this strain - var/core_spore_bonus = 0 /// Extra range up to which the core reinforces blobs var/core_strong_reinforcement_range_bonus = 0 /// Extra range up to which the core reinforces blobs into reflectors @@ -78,7 +76,6 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ overmind.color = complementary_color if(overmind.blob_core) - overmind.blob_core.max_spores += core_spore_bonus overmind.blob_core.claim_range += core_range_bonus overmind.blob_core.pulse_range += core_range_bonus overmind.blob_core.expand_range += core_range_bonus @@ -86,7 +83,6 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ overmind.blob_core.reflector_reinforce_range += core_reflector_reinforcement_range_bonus for(var/obj/structure/blob/special/node/N as anything in overmind.node_blobs) - N.max_spores += node_spore_bonus N.claim_range += node_range_bonus N.pulse_range += node_range_bonus N.expand_range += node_range_bonus @@ -100,26 +96,22 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ B.modify_max_integrity(B.max_integrity * max_structure_health_multiplier) B.update_appearance() - for(var/mob/living/simple_animal/hostile/blob/BM as anything in overmind.blob_mobs) - BM.maxHealth *= max_mob_health_multiplier - BM.health *= max_mob_health_multiplier - BM.update_icons() //If it's getting a new strain, tell it what it does! - to_chat(BM, "Your overmind's blob strain is now: [name]!") - to_chat(BM, "The [name] strain [shortdesc ? "[shortdesc]" : "[description]"]") + for(var/mob/living/blob_mob as anything in overmind.blob_mobs) + blob_mob.maxHealth *= max_mob_health_multiplier + blob_mob.health *= max_mob_health_multiplier + blob_mob.update_icons() //If it's getting a new strain, tell it what it does! + to_chat(blob_mob, "Your overmind's blob strain is now: [name]!") + to_chat(blob_mob, "The [name] strain [shortdesc ? "[shortdesc]" : "[description]"]") /datum/blobstrain/proc/on_lose() if(overmind.blob_core) - overmind.blob_core.max_spores -= core_spore_bonus overmind.blob_core.claim_range -= core_range_bonus - overmind.blob_core.pulse_range -= core_range_bonus overmind.blob_core.expand_range -= core_range_bonus overmind.blob_core.strong_reinforce_range -= core_strong_reinforcement_range_bonus overmind.blob_core.reflector_reinforce_range -= core_reflector_reinforcement_range_bonus for(var/obj/structure/blob/special/node/N as anything in overmind.node_blobs) - N.max_spores -= node_spore_bonus N.claim_range -= node_range_bonus - N.pulse_range -= node_range_bonus N.expand_range -= node_range_bonus N.strong_reinforce_range -= node_strong_reinforcement_range_bonus N.reflector_reinforce_range -= node_reflector_reinforcement_range_bonus @@ -130,9 +122,9 @@ GLOBAL_LIST_INIT(valid_blobstrains, subtypesof(/datum/blobstrain) - list(/datum/ for(var/obj/structure/blob/B as anything in overmind.all_blobs) B.modify_max_integrity(B.max_integrity / max_structure_health_multiplier) - for(var/mob/living/simple_animal/hostile/blob/BM as anything in overmind.blob_mobs) - BM.maxHealth /= max_mob_health_multiplier - BM.health /= max_mob_health_multiplier + for(var/mob/living/blob_mob as anything in overmind.blob_mobs) + blob_mob.maxHealth /= max_mob_health_multiplier + blob_mob.health /= max_mob_health_multiplier /datum/blobstrain/proc/on_sporedeath(mob/living/spore) diff --git a/code/modules/antagonists/blob/blobstrains/_reagent.dm b/code/modules/antagonists/blob/blobstrains/_reagent.dm index aefd6c02f3c3..05bc73f95c8d 100644 --- a/code/modules/antagonists/blob/blobstrains/_reagent.dm +++ b/code/modules/antagonists/blob/blobstrains/_reagent.dm @@ -15,8 +15,9 @@ var/mob_protection = L.getarmor(null, BIO) * 0.01 reagent.expose_mob(L, VAPOR, BLOBMOB_BLOBBERNAUT_REAGENTATK_VOL+blobbernaut_reagentatk_bonus, FALSE, mob_protection, overmind)//this will do between 10 and 20 damage(reduced by mob protection), depending on chemical, plus 4 from base brute damage. -/datum/blobstrain/reagent/on_sporedeath(mob/living/spore) - spore.reagents.add_reagent(reagent.type, 10) +/datum/blobstrain/reagent/on_sporedeath(mob/living/basic/spore) + var/burst_range = (spore.type == /mob/living/basic/blob_minion/spore) ? 1 : 0 + do_chem_smoke(range = burst_range, holder = spore, location = get_turf(spore), reagent_type = reagent.type) // These can only be applied by blobs. They are what (reagent) blobs are made out of. /datum/reagent/blob @@ -29,7 +30,7 @@ /// Used by blob reagents to calculate the reaction volume they should use when exposing mobs. /datum/reagent/blob/proc/return_mob_expose_reac_volume(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/overmind) - if(exposed_mob.stat == DEAD || isblobmonster(exposed_mob)) + if(exposed_mob.stat == DEAD || HAS_TRAIT(exposed_mob, TRAIT_BLOB_ALLY)) return 0 //the dead, and blob mobs, don't cause reactions return round(reac_volume * min(1.5 - touch_protection, 1), 0.1) //full touch protection means 50% volume, any prot below 0.5 means 100% volume. diff --git a/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm b/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm index f97599948a13..ea2bf54d7692 100644 --- a/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm +++ b/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm @@ -11,18 +11,16 @@ message_living = ", and you feel tired" 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.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(span_warning("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 - BS.update_icons() - B.overmind.blob_mobs.Add(BS) +/datum/blobstrain/reagent/distributed_neurons/damage_reaction(obj/structure/blob/blob_tile, damage, damage_type, damage_flag) + if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && damage <= 20 && blob_tile.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. + blob_tile.visible_message(span_boldwarning("A spore floats free of the blob!")) + blob_tile.overmind.create_spore(blob_tile.loc, /mob/living/basic/blob_minion/spore/minion/weak) return ..() /datum/reagent/blob/distributed_neurons name = "Distributed Neurons" color = "#E88D5D" + taste_description = "fizzing" /datum/reagent/blob/distributed_neurons/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/overmind) . = ..() @@ -33,10 +31,7 @@ exposed_mob.investigate_log("has been killed by distributed neurons (blob).", INVESTIGATE_DEATHS) exposed_mob.death() //sleeping in a fight? bad plan. if(exposed_mob.stat == DEAD && overmind.can_buy(5)) - var/mob/living/simple_animal/hostile/blob/blobspore/spore = new/mob/living/simple_animal/hostile/blob/blobspore(get_turf(exposed_mob)) - spore.overmind = overmind - spore.update_icons() - overmind.blob_mobs.Add(spore) + var/mob/living/basic/blob_minion/spore/minion/spore = overmind.create_spore(get_turf(exposed_mob)) spore.zombify(exposed_mob) overmind.add_points(-5) to_chat(overmind, span_notice("Spent 5 resources for the zombification of [exposed_mob].")) diff --git a/code/modules/antagonists/blob/blobstrains/reactive_spines.dm b/code/modules/antagonists/blob/blobstrains/reactive_spines.dm index 53f336ca419e..1c8cb893df83 100644 --- a/code/modules/antagonists/blob/blobstrains/reactive_spines.dm +++ b/code/modules/antagonists/blob/blobstrains/reactive_spines.dm @@ -16,15 +16,15 @@ if(damage && ((damage_type == BRUTE) || (damage_type == BURN)) && B.get_integrity() - damage > 0 && COOLDOWN_FINISHED(src, retaliate_cooldown)) // Is there any damage, is it burn or brute, will we be alive, and has the cooldown finished? COOLDOWN_START(src, retaliate_cooldown, 2.5 SECONDS) // 2.5 seconds before auto-retaliate can whack everything within 1 tile again B.visible_message(span_boldwarning("The blob retaliates, lashing out!")) - for(var/atom/A in range(1, B)) - if(!A.can_blob_attack()) + for(var/atom/thing in range(1, B)) + if(!thing.can_blob_attack()) continue - var/attacked_turf = get_turf(A) - if(isliving(A) && !isblobmonster(A)) // Make sure to inject strain-reagents with automatic attacks when needed. + var/attacked_turf = get_turf(thing) + if(isliving(thing) && !HAS_TRAIT(thing, TRAIT_BLOB_ALLY)) // Make sure to inject strain-reagents with automatic attacks when needed. B.blob_attack_animation(attacked_turf, overmind) - attack_living(A) + attack_living(thing) - else if(A.blob_act(B)) // After checking for mobs, whack everything else with the standard attack + else if(thing.blob_act(B)) // After checking for mobs, whack everything else with the standard attack B.blob_attack_animation(attacked_turf, overmind) // Only play the animation if the attack did something meaningful return ..() @@ -35,7 +35,7 @@ color = "#9ACD32" /datum/reagent/blob/reactive_spines/return_mob_expose_reac_volume(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/overmind) - if(exposed_mob.stat == DEAD || isblobmonster(exposed_mob)) + if(exposed_mob.stat == DEAD || HAS_TRAIT(exposed_mob, TRAIT_BLOB_ALLY)) return 0 //the dead, and blob mobs, don't cause reactions return reac_volume diff --git a/code/modules/antagonists/blob/overmind.dm b/code/modules/antagonists/blob/overmind.dm index 021c8bb12d51..d87574c092dc 100644 --- a/code/modules/antagonists/blob/overmind.dm +++ b/code/modules/antagonists/blob/overmind.dm @@ -54,6 +54,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) var/list/strain_choices /mob/camera/blob/Initialize(mapload, starting_points = OVERMIND_STARTING_POINTS) + ADD_TRAIT(src, TRAIT_BLOB_ALLY, INNATE_TRAIT) validate_location() blob_points = starting_points manualplace_min_time += world.time @@ -71,6 +72,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) SSshuttle.registerHostileEnvironment(src) . = ..() START_PROCESSING(SSobj, src) + GLOB.blob_telepathy_mobs |= src /mob/camera/blob/proc/validate_location() var/turf/T = get_turf(src) @@ -112,6 +114,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) to_chat(src, span_notice("The [blobstrain.name] strain [blobstrain.description]")) if(blobstrain.effectdesc) to_chat(src, span_notice("The [blobstrain.name] strain [blobstrain.effectdesc]")) + SEND_SIGNAL(src, COMSIG_BLOB_SELECTED_STRAIN, blobstrain) /mob/camera/blob/can_z_move(direction, turf/start, turf/destination, z_move_flags = NONE, mob/living/rider) if(placed) // The blob can't expand vertically (yet) @@ -162,52 +165,72 @@ GLOBAL_LIST_EMPTY(blob_nodes) priority_announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", ANNOUNCER_OUTBREAK5) has_announced = TRUE +/// Create a blob spore and link it to us +/mob/camera/blob/proc/create_spore(turf/spore_turf, spore_type = /mob/living/basic/blob_minion/spore/minion) + var/mob/living/basic/blob_minion/spore/spore = new spore_type(spore_turf) + assume_direct_control(spore) + return spore + +/// Give our new minion the properties of a minion +/mob/camera/blob/proc/assume_direct_control(mob/living/minion) + minion.AddComponent(/datum/component/blob_minion, src) + +/// Add something to our list of mobs and wait for it to die +/mob/camera/blob/proc/register_new_minion(mob/living/minion) + blob_mobs |= minion + if (!istype(minion, /mob/living/basic/blob_minion/blobbernaut)) + RegisterSignal(minion, COMSIG_LIVING_DEATH, PROC_REF(on_minion_death)) + +/// When a spore (or zombie) dies then we do this +/mob/camera/blob/proc/on_minion_death(mob/living/spore) + SIGNAL_HANDLER + blobstrain.on_sporedeath(spore) + /mob/camera/blob/proc/victory() sound_to_playing_players('sound/machines/alarm.ogg') sleep(10 SECONDS) - for(var/i in GLOB.mob_living_list) - var/mob/living/L = i - var/turf/T = get_turf(L) - if(!T || !is_station_level(T.z)) + for(var/mob/living/live_guy as anything in GLOB.mob_living_list) + var/turf/guy_turf = get_turf(live_guy) + if(isnull(guy_turf) || !is_station_level(guy_turf.z)) continue - if(L in GLOB.overminds || (L.pass_flags & PASSBLOB)) + if(live_guy in GLOB.overminds || (live_guy.pass_flags & PASSBLOB)) continue - var/area/Ablob = get_area(T) - - if(!(Ablob.area_flags & BLOBS_ALLOWED)) + var/area/blob_area = get_area(guy_turf) + if(!(blob_area.area_flags & BLOBS_ALLOWED)) continue - if(!(ROLE_BLOB in L.faction)) - playsound(L, 'sound/effects/splat.ogg', 50, TRUE) - if(L.stat != DEAD) - L.investigate_log("has died from blob takeover.", INVESTIGATE_DEATHS) - L.death() - new/mob/living/simple_animal/hostile/blob/blobspore(T) + if(!(ROLE_BLOB in live_guy.faction)) + playsound(live_guy, 'sound/effects/splat.ogg', 50, TRUE) + if(live_guy.stat != DEAD) + live_guy.investigate_log("has died from blob takeover.", INVESTIGATE_DEATHS) + live_guy.death() + create_spore(guy_turf) else - L.fully_heal() + live_guy.fully_heal() - for(var/area/A in GLOB.areas) - if(!(A.type in GLOB.the_station_areas)) + for(var/area/check_area in GLOB.areas) + if(!is_type_in_list(check_area, GLOB.the_station_areas)) continue - if(!(A.area_flags & BLOBS_ALLOWED)) + if(!(check_area.area_flags & BLOBS_ALLOWED)) continue - A.color = blobstrain.color - A.name = "blob" - A.icon = 'icons/mob/nonhuman-player/blob.dmi' - A.icon_state = "blob_shield" - A.layer = BELOW_MOB_LAYER - A.invisibility = 0 - A.blend_mode = 0 + check_area.color = blobstrain.color + check_area.name = "blob" + check_area.icon = 'icons/mob/nonhuman-player/blob.dmi' + check_area.icon_state = "blob_shield" + check_area.layer = BELOW_MOB_LAYER + check_area.invisibility = 0 + check_area.blend_mode = 0 + var/datum/antagonist/blob/B = mind.has_antag_datum(/datum/antagonist/blob) if(B) var/datum/objective/blob_takeover/main_objective = locate() in B.objectives if(main_objective) main_objective.completed = TRUE - to_chat(world, span_blob("[real_name] consumed the station in an unstoppable tide!")) + to_chat(world, span_blobannounce("[real_name] consumed the station in an unstoppable tide!")) SSticker.news_report = BLOB_WIN - SSticker.force_ending = TRUE + SSticker.force_ending = FORCE_END_ROUND /mob/camera/blob/Destroy() QDEL_NULL(blobstrain) @@ -216,11 +239,6 @@ GLOBAL_LIST_EMPTY(blob_nodes) if(B && B.overmind == src) B.overmind = null B.update_appearance() //reset anything that was ours - for(var/BLO in blob_mobs) - var/mob/living/simple_animal/hostile/blob/BM = BLO - if(BM) - BM.overmind = null - BM.update_icons() for(var/obj/structure/blob/blob_structure as anything in all_blobs) blob_structure.overmind = null all_blobs = null @@ -233,6 +251,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) SSshuttle.clearHostileEnvironment(src) STOP_PROCESSING(SSobj, src) + GLOB.blob_telepathy_mobs -= src return ..() @@ -240,7 +259,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) . = ..() if(!. || !client) return FALSE - to_chat(src, span_blob("You are the overmind!")) + to_chat(src, span_blobannounce("You are the overmind!")) if(!placed && autoplace_max_time <= world.time) to_chat(src, span_boldannounce("You will automatically place your blob core in [DisplayTimeText(autoplace_max_time - world.time)].")) to_chat(src, span_boldannounce("You [manualplace_min_time ? "will be able to":"can"] manually place your blob core by pressing the Place Blob Core button in the bottom right corner of the screen.")) @@ -257,9 +276,11 @@ GLOBAL_LIST_EMPTY(blob_nodes) return FALSE var/current_health = round((blob_core.get_integrity() / blob_core.max_integrity) * 100) hud_used.healths.maptext = MAPTEXT("
[current_health]%
") - for(var/mob/living/simple_animal/hostile/blob/blobbernaut/blobbernaut in blob_mobs) - if(blobbernaut.hud_used && blobbernaut.hud_used.blobpwrdisplay) - blobbernaut.hud_used.blobpwrdisplay.maptext = MAPTEXT("
[current_health]%
") + for(var/mob/living/basic/blob_minion/blobbernaut/blobbernaut in blob_mobs) + var/datum/hud/using_hud = blobbernaut.hud_used + if(!using_hud?.blobpwrdisplay) + continue + using_hud.blobpwrdisplay.maptext = MAPTEXT("
[current_health]%
") /mob/camera/blob/proc/add_points(points) blob_points = clamp(blob_points + points, 0, max_blob_points) @@ -273,7 +294,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) if(client.prefs.muted & MUTE_IC) to_chat(src, span_boldwarning("You cannot send IC messages (muted).")) return - if (!(ignore_spam || forced) && src.client.handle_spam_prevention(message,MUTE_IC)) + if (!(ignore_spam || forced) && src.client.handle_spam_prevention(message, MUTE_IC)) return if (stat) @@ -291,14 +312,8 @@ GLOBAL_LIST_EMPTY(blob_nodes) src.log_talk(message, LOG_SAY) var/message_a = say_quote(message) - var/rendered = span_big("\[Blob Telepathy\] [name]([blobstrain.name]) [message_a]") - - for(var/mob/M in GLOB.mob_list) - if(isovermind(M) || isblobmonster(M)) - to_chat(M, rendered) - if(isobserver(M)) - var/link = FOLLOW_LINK(M, src) - to_chat(M, "[link] [rendered]") + var/rendered = span_big(span_blob("\[Blob Telepathy\] [name]([blobstrain.name]) [message_a]")) + relay_to_list_and_observers(rendered, GLOB.blob_telepathy_mobs, src) /mob/camera/blob/blob_act(obj/structure/blob/B) return @@ -324,8 +339,8 @@ GLOBAL_LIST_EMPTY(blob_nodes) else return FALSE else - var/area/A = get_area(NewLoc) - if(isgroundlessturf(NewLoc) || istype(A, /area/shuttle)) //if unplaced, can't go on shuttles or goundless tiles + var/area/check_area = get_area(NewLoc) + if(isgroundlessturf(NewLoc) || istype(check_area, /area/shuttle)) //if unplaced, can't go on shuttles or groundless tiles return FALSE forceMove(NewLoc) return TRUE diff --git a/code/modules/antagonists/blob/powers.dm b/code/modules/antagonists/blob/powers.dm index 765b93144959..04054f6df85a 100644 --- a/code/modules/antagonists/blob/powers.dm +++ b/code/modules/antagonists/blob/powers.dm @@ -176,7 +176,7 @@ if(!factory) to_chat(src, span_warning("You must be on a factory blob!")) return FALSE - if(factory.naut) //if it already made a blobbernaut, it can't do it again + if(factory.blobbernaut || factory.is_creating_blobbernaut) //if it already made or making a blobbernaut, it can't do it again to_chat(src, span_warning("This factory blob is already sustaining a blobbernaut.")) return FALSE if(factory.get_integrity() < factory.max_integrity * 0.5) @@ -185,7 +185,7 @@ if(!can_buy(BLOBMOB_BLOBBERNAUT_RESOURCE_COST)) return FALSE - factory.naut = TRUE //temporary placeholder to prevent creation of more than one per factory. + factory.is_creating_blobbernaut = TRUE to_chat(src, span_notice("You attempt to produce a blobbernaut.")) pick_blobbernaut_candidate(factory) @@ -199,33 +199,22 @@ if(!length(candidates)) to_chat(src, span_warning("You could not conjure a sentience for your blobbernaut. Your points have been refunded. Try again later.")) add_points(BLOBMOB_BLOBBERNAUT_RESOURCE_COST) - factory.naut = null //players must answer rapidly + factory.assign_blobbernaut(null) return FALSE - factory.modify_max_integrity(initial(factory.max_integrity) * 0.25) //factories that produced a blobbernaut have much lower health - factory.update_appearance() - factory.visible_message(span_warning("The blobbernaut [pick("rips", "tears", "shreds")] its way out of the factory blob!")) - playsound(factory.loc, 'sound/effects/splat.ogg', 50, TRUE) - - var/mob/living/simple_animal/hostile/blob/blobbernaut/blobber = new /mob/living/simple_animal/hostile/blob/blobbernaut(get_turf(factory)) - flick("blobbernaut_produce", blobber) - - factory.naut = blobber - blobber.factory = factory - blobber.overmind = src - blobber.update_icons() - blobber.adjustHealth(blobber.maxHealth * 0.5) - blob_mobs += blobber - + var/mob/living/basic/blob_minion/blobbernaut/minion/blobber = new(get_turf(factory)) + assume_direct_control(blobber) + factory.assign_blobbernaut(blobber) var/mob/dead/observer/player = pick(candidates) - blobber.key = player.key + blobber.assign_key(player.key, blobstrain) + RegisterSignal(blobber, COMSIG_HOSTILE_POST_ATTACKINGTARGET, PROC_REF(on_blobbernaut_attacked)) - SEND_SOUND(blobber, sound('sound/effects/blobattack.ogg')) - SEND_SOUND(blobber, sound('sound/effects/attackblob.ogg')) - to_chat(blobber, span_infoplain("You are powerful, hard to kill, and slowly regenerate near nodes and cores, [span_cultlarge("but will slowly die if not near the blob")] or if the factory that made you is killed.")) - to_chat(blobber, span_infoplain("You can communicate with other blobbernauts and overminds telepathically by attempting to speak normally")) - to_chat(blobber, span_infoplain("Your overmind's blob reagent is: [blobstrain.name]!")) - to_chat(blobber, span_infoplain("The [blobstrain.name] reagent [blobstrain.shortdesc ? "[blobstrain.shortdesc]" : "[blobstrain.description]"]")) +/// When one of our boys attacked something, we sometimes want to perform extra effects +/mob/camera/blob/proc/on_blobbernaut_attacked(mob/living/basic/blobbynaut, atom/target, success) + SIGNAL_HANDLER + if (!success) + return + blobstrain.blobbernaut_attack(target, blobbynaut) /** Moves the core */ /mob/camera/blob/proc/relocate_core() @@ -356,10 +345,11 @@ var/list/surrounding_turfs = TURF_NEIGHBORS(tile) if(!length(surrounding_turfs)) return FALSE - for(var/mob/living/simple_animal/hostile/blob/blobspore/spore as anything in blob_mobs) - if(isturf(spore.loc) && get_dist(spore, tile) <= 35 && !spore.key) - spore.LoseTarget() - spore.Goto(pick(surrounding_turfs), spore.move_to_delay) + for(var/mob/living/basic/blob_mob as anything in blob_mobs) + if(!isturf(blob_mob.loc) || get_dist(blob_mob, tile) > 35 || blob_mob.key) + continue + blob_mob.ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) + blob_mob.ai_controller.set_blackboard_key(BB_TRAVEL_DESTINATION, pick(surrounding_turfs)) /** Opens the reroll menu to change strains */ /mob/camera/blob/proc/strain_reroll() diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index bf934053eeeb..0655a30f3ff2 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -127,13 +127,13 @@ return FALSE //oh no we failed /obj/structure/blob/proc/ConsumeTile() - for(var/atom/A in loc) - if(!A.can_blob_attack()) + for(var/atom/thing in loc) + if(!thing.can_blob_attack()) continue - if(isliving(A) && overmind && !isblobmonster(A)) // Make sure to inject strain-reagents with automatic attacks when needed. - overmind.blobstrain.attack_living(A) + if(isliving(thing) && overmind && !HAS_TRAIT(thing, TRAIT_BLOB_ALLY)) // Make sure to inject strain-reagents with automatic attacks when needed. + overmind.blobstrain.attack_living(thing) continue // Don't smack them twice though - A.blob_act(src) + thing.blob_act(src) if(iswallturf(loc)) loc.blob_act(src) //don't ask how a wall got on top of the core, just eat it @@ -398,13 +398,6 @@ /// The radius up to which this special structure naturally grows normal blobs. var/expand_range = 0 - // Spore production vars: for core, factories, and nodes (with strains) - var/mob/living/simple_animal/hostile/blob/blobbernaut/naut = null - var/max_spores = 0 - var/list/spores = list() - COOLDOWN_DECLARE(spore_delay) - var/spore_cooldown = BLOBMOB_SPORE_SPAWN_COOLDOWN - // Area reinforcement vars: used by cores and nodes, for strains to modify /// Range this blob free upgrades to strong blobs at: for the core, and for strains var/strong_reinforce_range = 0 @@ -452,17 +445,3 @@ expanded = TRUE if(distance <= pulse_range) B.Be_Pulsed() - -/obj/structure/blob/special/proc/produce_spores() - if(naut) - return - if(spores.len >= max_spores) - return - if(!COOLDOWN_FINISHED(src, spore_delay)) - return - COOLDOWN_START(src, spore_delay, spore_cooldown) - var/mob/living/simple_animal/hostile/blob/blobspore/BS = new (loc, src) - if(overmind) //if we don't have an overmind, we don't need to do anything but make a spore - BS.overmind = overmind - BS.update_icons() - overmind.blob_mobs.Add(BS) diff --git a/code/modules/antagonists/blob/structures/core.dm b/code/modules/antagonists/blob/structures/core.dm index 2f62ca427859..5b81f857d62f 100644 --- a/code/modules/antagonists/blob/structures/core.dm +++ b/code/modules/antagonists/blob/structures/core.dm @@ -14,7 +14,6 @@ claim_range = BLOB_CORE_CLAIM_RANGE pulse_range = BLOB_CORE_PULSE_RANGE expand_range = BLOB_CORE_EXPAND_RANGE - max_spores = BLOB_CORE_MAX_SPORES ignore_syncmesh_share = TRUE /datum/armor/special_core @@ -78,7 +77,6 @@ overmind.update_health_hud() pulse_area(overmind, claim_range, pulse_range, expand_range) reinforce_area(seconds_per_tick) - produce_spores() ..() /obj/structure/blob/special/core/on_changed_z_level(turf/old_turf, turf/new_turf) diff --git a/code/modules/antagonists/blob/structures/factory.dm b/code/modules/antagonists/blob/structures/factory.dm index b29262dec8ea..285946b9097c 100644 --- a/code/modules/antagonists/blob/structures/factory.dm +++ b/code/modules/antagonists/blob/structures/factory.dm @@ -7,10 +7,19 @@ health_regen = BLOB_FACTORY_HP_REGEN point_return = BLOB_REFUND_FACTORY_COST resistance_flags = LAVA_PROOF - max_spores = BLOB_FACTORY_MAX_SPORES + ///How many spores this factory can have. + var/max_spores = BLOB_FACTORY_MAX_SPORES + ///The list of spores and zombies + var/list/spores_and_zombies = list() + COOLDOWN_DECLARE(spore_delay) + var/spore_cooldown = BLOBMOB_SPORE_SPAWN_COOLDOWN + ///Its Blobbernaut, if it has spawned any. + var/mob/living/basic/blob_minion/blobbernaut/minion/blobbernaut + ///Used in blob/powers.dm, checks if it's already trying to spawn a blobbernaut to prevent issues. + var/is_creating_blobbernaut = FALSE /obj/structure/blob/special/factory/scannerreport() - if(naut) + if(blobbernaut) return "It is currently sustaining a blobbernaut, making it fragile and unable to produce blob spores." return "Will produce a blob spore every few seconds." @@ -19,18 +28,67 @@ overmind.factory_blobs += src /obj/structure/blob/special/factory/Destroy() - for(var/mob/living/simple_animal/hostile/blob/blobspore/spore in spores) - to_chat(spore, span_userdanger("Your factory was destroyed! You can no longer sustain yourself.")) - spore.death() - if(naut) - naut.factory = null - to_chat(naut, span_userdanger("Your factory was destroyed! You feel yourself dying!")) - naut.throw_alert("nofactory", /atom/movable/screen/alert/nofactory) - spores = null + spores_and_zombies = null + blobbernaut = null if(overmind) overmind.factory_blobs -= src return ..() /obj/structure/blob/special/factory/Be_Pulsed() . = ..() - produce_spores() + if(blobbernaut) + return + if(length(spores_and_zombies) >= max_spores) + return + if(!COOLDOWN_FINISHED(src, spore_delay)) + return + COOLDOWN_START(src, spore_delay, spore_cooldown) + var/mob/living/basic/blob_minion/created_spore = (overmind) ? overmind.create_spore(loc) : new(loc) + register_mob(created_spore) + RegisterSignal(created_spore, COMSIG_BLOB_ZOMBIFIED, PROC_REF(on_zombie_created)) + +/// Tracks the existence of a mob in our mobs list +/obj/structure/blob/special/factory/proc/register_mob(mob/living/basic/blob_minion/blob_mob) + spores_and_zombies |= blob_mob + blob_mob.link_to_factory(src) + RegisterSignal(blob_mob, COMSIG_LIVING_DEATH, PROC_REF(on_spore_died)) + RegisterSignal(blob_mob, COMSIG_PARENT_QDELETING, PROC_REF(on_spore_lost)) + +/// When a spore or zombie dies reset our spawn cooldown so we don't instantly replace it +/obj/structure/blob/special/factory/proc/on_spore_died(mob/living/dead_spore) + SIGNAL_HANDLER + COOLDOWN_START(src, spore_delay, spore_cooldown) + +/// When a spore is deleted remove it from our list +/obj/structure/blob/special/factory/proc/on_spore_lost(mob/living/dead_spore) + SIGNAL_HANDLER + spores_and_zombies -= dead_spore + +/// When a spore makes a zombie add it to our mobs list +/obj/structure/blob/special/factory/proc/on_zombie_created(mob/living/spore, mob/living/zombie) + SIGNAL_HANDLER + register_mob(zombie) + +/// Produce a blobbernaut +/obj/structure/blob/special/factory/proc/assign_blobbernaut(mob/living/new_naut) + is_creating_blobbernaut = FALSE + if (isnull(new_naut)) + return + + modify_max_integrity(initial(max_integrity) * 0.25) //factories that produced a blobbernaut have much lower health + visible_message(span_boldwarning("The blobbernaut [pick("rips", "tears", "shreds")] its way out of the factory blob!")) + playsound(loc, 'sound/effects/splat.ogg', 50, TRUE) + + blobbernaut = new_naut + blobbernaut.link_to_factory(src) + RegisterSignals(new_naut, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(on_blobbernaut_death)) + update_appearance(UPDATE_ICON) + +/// When our brave soldier dies, reset our max integrity +/obj/structure/blob/special/factory/proc/on_blobbernaut_death(mob/living/death_naut) + SIGNAL_HANDLER + if (isnull(blobbernaut) || blobbernaut != death_naut) + return + blobbernaut = null + max_integrity = initial(max_integrity) + update_appearance(UPDATE_ICON) diff --git a/code/modules/antagonists/blob/structures/node.dm b/code/modules/antagonists/blob/structures/node.dm index aac3f3a4a8e0..7e3e2a96aeb4 100644 --- a/code/modules/antagonists/blob/structures/node.dm +++ b/code/modules/antagonists/blob/structures/node.dm @@ -11,7 +11,6 @@ pulse_range = BLOB_NODE_PULSE_RANGE expand_range = BLOB_NODE_EXPAND_RANGE resistance_flags = LAVA_PROOF - max_spores = BLOB_NODE_MAX_SPORES ignore_syncmesh_share = TRUE @@ -57,4 +56,3 @@ if(overmind) pulse_area(overmind, claim_range, pulse_range, expand_range) reinforce_area(seconds_per_tick) - produce_spores() diff --git a/code/modules/antagonists/brainwashing/brainwashing.dm b/code/modules/antagonists/brainwashing/brainwashing.dm index 51372af49333..e58f54f2c655 100644 --- a/code/modules/antagonists/brainwashing/brainwashing.dm +++ b/code/modules/antagonists/brainwashing/brainwashing.dm @@ -1,30 +1,31 @@ -/proc/brainwash(mob/living/L, directives) - if(!L.mind) +/proc/brainwash(mob/living/brainwash_victim, directives) + if(!brainwash_victim.mind) return if(!islist(directives)) directives = list(directives) - var/datum/mind/M = L.mind - var/datum/antagonist/brainwashed/B = M.has_antag_datum(/datum/antagonist/brainwashed) - if(B) + var/datum/mind/brainwash_mind = brainwash_victim.mind + var/datum/antagonist/brainwashed/brainwashed_datum = brainwash_mind.has_antag_datum(/datum/antagonist/brainwashed) + if(brainwashed_datum) for(var/O in directives) var/datum/objective/brainwashing/objective = new(O) - B.objectives += objective - B.greet() + brainwashed_datum.objectives += objective + brainwashed_datum.greet() else - B = new() + brainwashed_datum = new() for(var/O in directives) var/datum/objective/brainwashing/objective = new(O) - B.objectives += objective - M.add_antag_datum(B) + brainwashed_datum.objectives += objective + brainwash_mind.add_antag_datum(brainwashed_datum) var/begin_message = " has been brainwashed with the following objectives: " var/obj_message = english_list(directives) - var/end_message = "." - var/rendered = begin_message + obj_message + end_message - deadchat_broadcast(rendered, "[L]", follow_target = L, turf_target = get_turf(L), message_type=DEADCHAT_ANNOUNCEMENT) + var/rendered = begin_message + obj_message + if(!(rendered[length(rendered)] in list(",",":",";",".","?","!","\'","-"))) + rendered += "." //Good punctuation is important :) + deadchat_broadcast(rendered, "[brainwash_victim]", follow_target = brainwash_victim, turf_target = get_turf(brainwash_victim), message_type=DEADCHAT_ANNOUNCEMENT) if(check_holidays(APRIL_FOOLS)) // Note: most of the time you're getting brainwashed you're unconscious - L.say("You son of a bitch! I'm in.", forced = "That son of a bitch! They're in. (April Fools)") + brainwash_victim.say("You son of a bitch! I'm in.", forced = "That son of a bitch! They're in. (April Fools)") /datum/antagonist/brainwashed name = "\improper Brainwashed Victim" diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index 9a295fc8ac20..6cc9290b7f7f 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -95,31 +95,14 @@ //Some of target's recent speech, so the changeling can attempt to imitate them better. //Recent as opposed to all because rounds tend to have a LOT of text. - var/list/recent_speech = list() - var/list/say_log = list() - var/log_source = target.logging - 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 - - if(LAZYLEN(say_log) > LING_ABSORB_RECENT_SPEECH) - recent_speech = say_log.Copy(say_log.len-LING_ABSORB_RECENT_SPEECH+1,0) //0 so len-LING_ARS+1 to end of list - else - for(var/spoken_memory in say_log) - if(recent_speech.len >= LING_ABSORB_RECENT_SPEECH) - break - recent_speech[spoken_memory] = splittext(say_log[spoken_memory], "\"", 1, 0, TRUE)[3] + var/list/recent_speech = target.copy_recent_speech() if(recent_speech.len) changeling.antag_memory += "Some of [target]'s speech patterns, we should study these to better impersonate [target.p_them()]!
" to_chat(owner, span_boldnotice("Some of [target]'s speech patterns, we should study these to better impersonate [target.p_them()]!")) for(var/spoken_memory in recent_speech) - changeling.antag_memory += "\"[recent_speech[spoken_memory]]\"
" - to_chat(owner, span_notice("\"[recent_speech[spoken_memory]]\"")) + changeling.antag_memory += "\"[spoken_memory]\"
" + to_chat(owner, span_notice("\"[spoken_memory]\"")) changeling.antag_memory += "We have no more knowledge of [target]'s speech patterns.
" to_chat(owner, span_boldnotice("We have no more knowledge of [target]'s speech patterns.")) diff --git a/code/modules/antagonists/changeling/powers/lesserform.dm b/code/modules/antagonists/changeling/powers/lesserform.dm index f4aab1c89687..854234af965f 100644 --- a/code/modules/antagonists/changeling/powers/lesserform.dm +++ b/code/modules/antagonists/changeling/powers/lesserform.dm @@ -20,7 +20,7 @@ //Transform into a monkey. /datum/action/changeling/lesserform/sting_action(mob/living/carbon/human/user) - if(!user || user.notransform) + if(!user || HAS_TRAIT(user, TRAIT_NO_TRANSFORM)) return FALSE ..() return ismonkey(user) ? unmonkey(user) : become_monkey(user) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 97b9b485257d..91b31733dc77 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -371,53 +371,87 @@ playsound(get_turf(H),I.hitsound,75,TRUE) return -/obj/projectile/tentacle/on_hit(atom/target, blocked = FALSE) - var/mob/living/carbon/human/H = firer +/obj/projectile/tentacle/on_hit(atom/movable/target, blocked = 0, pierce_hit) + if(!isliving(firer) || !ismovable(target)) + return ..() + if(blocked >= 100) return BULLET_ACT_BLOCK - if(isitem(target)) - var/obj/item/I = target - if(!I.anchored) - to_chat(firer, span_notice("You pull [I] towards yourself.")) - H.throw_mode_on(THROW_MODE_TOGGLE) - I.throw_at(H, 10, 2) - . = BULLET_ACT_HIT - - else if(isliving(target)) - var/mob/living/L = target - if(!L.anchored && !L.throwing)//avoid double hits - if(iscarbon(L)) - var/mob/living/carbon/C = L - var/firer_istate = TRUE - var/mob/living/living_shooter = firer - if(istype(living_shooter)) - firer_istate = (living_shooter.istate & ISTATE_HARM) - if(fire_modifiers && fire_modifiers["right"]) - var/obj/item/I = C.get_active_held_item() - if(I) - if(C.dropItemToGround(I)) - C.visible_message(span_danger("[I] is yanked off [C]'s hand by [src]!"),span_userdanger("A tentacle pulls [I] away from you!")) - on_hit(I) //grab the item as if you had hit it directly with the tentacle - return BULLET_ACT_HIT - else - to_chat(firer, span_warning("You can't seem to pry [I] off [C]'s hands!")) - return BULLET_ACT_BLOCK - else - to_chat(firer, span_danger("[C] has nothing in hand to disarm!")) - return BULLET_ACT_HIT - if(firer_istate) - C.visible_message(span_danger("[L] is thrown towards [H] by a tentacle!"),span_userdanger("A tentacle grabs you and throws you towards [H]!")) - C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, PROC_REF(tentacle_grab), H, C)) - return BULLET_ACT_HIT - else - C.visible_message(span_danger("[L] is grabbed by [H]'s tentacle!"),span_userdanger("A tentacle grabs you and pulls you towards [H]!")) - C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE) - return BULLET_ACT_HIT - - else - L.visible_message(span_danger("[L] is pulled by [H]'s tentacle!"),span_userdanger("A tentacle grabs you and pulls you towards [H]!")) - L.throw_at(get_step_towards(H,L), 8, 2) - . = BULLET_ACT_HIT + + var/mob/living/ling = firer + if(isitem(target) && iscarbon(ling)) + var/obj/item/catching = target + if(catching.anchored) + return BULLET_ACT_BLOCK + + var/mob/living/carbon/carbon_ling = ling + to_chat(carbon_ling, span_notice("You pull [catching] towards yourself.")) + carbon_ling.throw_mode_on(THROW_MODE_TOGGLE) + catching.throw_at( + target = carbon_ling, + range = 10, + speed = 2, + thrower = carbon_ling, + diagonals_first = TRUE, + callback = CALLBACK(src, PROC_REF(reset_throw), carbon_ling), + gentle = TRUE, + ) + return BULLET_ACT_HIT + + . = ..() + if(. != BULLET_ACT_HIT) + return . + var/mob/living/victim = target + if(!isliving(victim) || target.anchored || victim.throwing) + return BULLET_ACT_BLOCK + + if(!iscarbon(victim) || !ishuman(ling) || !(ling.istate & ISTATE_HARM)) + victim.visible_message( + span_danger("[victim] is grabbed by [ling]'s [src]]!"), + span_userdanger("\A [src] grabs you and pulls you towards [ling]!"), + ) + victim.throw_at( + target = get_step_towards(ling, victim), + range = 8, + speed = 2, + thrower = ling, + diagonals_first = TRUE, + gentle = TRUE, + ) + return BULLET_ACT_HIT + + if(LAZYACCESS(fire_modifiers, RIGHT_CLICK)) + var/obj/item/stealing = victim.get_active_held_item() + if(!isnull(stealing)) + if(victim.dropItemToGround(stealing)) + victim.visible_message( + span_danger("[stealing] is yanked off [victim]'s hand by [src]!"), + span_userdanger("\A [src] pulls [stealing] away from you!"), + ) + return on_hit(stealing) //grab the item as if you had hit it directly with the tentacle + + to_chat(ling, span_warning("You can't seem to pry [stealing] off [victim]'s hands!")) + return BULLET_ACT_BLOCK + + to_chat(ling, span_danger("[victim] has nothing in hand to disarm!")) + return BULLET_ACT_HIT + + if(ling.istate & ISTATE_HARM) + victim.visible_message( + span_danger("[victim] is thrown towards [ling] by \a [src]!"), + span_userdanger("\A [src] grabs you and throws you towards [ling]!"), + ) + victim.throw_at( + target = get_step_towards(ling, victim), + range = 8, + speed = 2, + thrower = ling, + diagonals_first = TRUE, + callback = CALLBACK(src, PROC_REF(tentacle_grab), ling, victim), + gentle = TRUE, + ) + + return BULLET_ACT_HIT /obj/projectile/tentacle/Destroy() qdel(chain) diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index 5c3bcd6da77d..d72d5dede99e 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -13,7 +13,9 @@ ..() var/list/bad_organs = list( user.get_organ_by_type(/obj/item/organ/internal/body_egg), - user.get_organ_by_type(/obj/item/organ/internal/zombie_infection)) + user.get_organ_by_type(/obj/item/organ/internal/legion_tumour), + user.get_organ_by_type(/obj/item/organ/internal/zombie_infection), + ) for(var/o in bad_organs) var/obj/item/organ/O = o diff --git a/code/modules/antagonists/cult/cult_bastard_sword.dm b/code/modules/antagonists/cult/cult_bastard_sword.dm index 5ae594207db7..9625e1c9ef4f 100644 --- a/code/modules/antagonists/cult/cult_bastard_sword.dm +++ b/code/modules/antagonists/cult/cult_bastard_sword.dm @@ -32,7 +32,7 @@ set_light(4) AddComponent(/datum/component/butchering, 50, 80) AddComponent(/datum/component/two_handed, require_twohands = TRUE) - AddComponent(/datum/component/soul_stealer) + AddComponent(/datum/component/soul_stealer, soulstone_type = /obj/item/soulstone) AddComponent( \ /datum/component/spin2win, \ spin_cooldown_time = 25 SECONDS, \ @@ -79,7 +79,7 @@ to_chat(user, span_cultlarge("\"You cling to the Forgotten Gods, as if you're more than their pawn.\"")) to_chat(user, span_userdanger("A horrible force yanks at your arm!")) user.emote("scream") - user.apply_damage(30, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + user.apply_damage(30, BRUTE, pick(GLOB.arm_zones)) user.dropItemToGround(src, TRUE) user.Paralyze(50) return diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index df3c9e3406bc..0c8fb569e0e8 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -100,7 +100,7 @@ Striking a noncultist, however, will tear their flesh."} span_cultlarge("\"You shouldn't play with sharp things. You'll poke someone's eye out.\"")) if(ishuman(user)) var/mob/living/carbon/human/miscreant = user - miscreant.apply_damage(rand(force/2, force), BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + miscreant.apply_damage(rand(force/2, force), BRUTE, pick(GLOB.arm_zones)) else user.adjustBruteLoss(rand(force/2,force)) return diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 38bf78beaa3e..e2f676948b3f 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -37,26 +37,6 @@ icon_state = "[initial(icon_state)][anchored ? "" : "_off"]" return ..() -/obj/structure/destructible/cult/attack_animal(mob/living/simple_animal/user, list/modifiers) - if(!isconstruct(user)) - return ..() - - var/mob/living/simple_animal/hostile/construct/healer = user - if(!healer.can_repair) - return ..() - - if(atom_integrity >= max_integrity) - to_chat(user, span_cult("You cannot repair [src], as it's undamaged!")) - return - - user.changeNext_move(CLICK_CD_MELEE) - atom_integrity = min(max_integrity, atom_integrity + 5) - Beam(user, icon_state = "sendbeam", time = 0.4 SECONDS) - user.visible_message( - span_danger("[user] repairs [src]."), - span_cult("You repair [src], leaving it at [round(atom_integrity * 100 / max_integrity)]% stability.") - ) - /* * Proc for use with the concealing spell. Hides the building (makes it invisible). */ diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 0c664dc27b0c..8c0934812073 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -72,6 +72,9 @@ Runes can either be invoked by one's self or with many different cultists. Each /// The actual keyword for the rune var/keyword + /// can non-cultists use this rune? used for the tramstation beer rune. Monkestation - addition + var/cult_override = FALSE + /obj/effect/rune/Initialize(mapload, set_keyword) . = ..() if(set_keyword) @@ -96,7 +99,8 @@ Runes can either be invoked by one's self or with many different cultists. Each . = ..() if(.) return - if(!IS_CULTIST(user)) +// if(!IS_CULTIST(user)) // monkestation change, original code + if(!IS_CULTIST(user) && !cult_override) // monkestation change, cult override added to_chat(user, span_warning("You aren't able to understand the words of [src].")) return var/list/invokers = can_invoke(user) @@ -108,7 +112,7 @@ Runes can either be invoked by one's self or with many different cultists. Each /obj/effect/rune/attack_animal(mob/living/simple_animal/user, list/modifiers) if(isshade(user) || isconstruct(user)) - if(istype(user, /mob/living/simple_animal/hostile/construct/wraith/angelic) || istype(user, /mob/living/simple_animal/hostile/construct/juggernaut/angelic) || istype(user, /mob/living/simple_animal/hostile/construct/artificer/angelic)) + if(HAS_TRAIT(user, TRAIT_ANGELIC)) to_chat(user, span_warning("You purge the rune!")) qdel(src) else if(construct_invoke || !IS_CULTIST(user)) //if you're not a cult construct we want the normal fail message @@ -718,7 +722,7 @@ structure_check() searches for nearby cultist structures required for the invoca barrier.Toggle() if(iscarbon(user)) var/mob/living/carbon/C = user - C.apply_damage(2, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + C.apply_damage(2, BRUTE, pick(GLOB.arm_zones)) //Rite of Joined Souls: Summons a single cultist. /obj/effect/rune/summon diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index 5d9675e1ac92..55c3cead1a7c 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -509,7 +509,7 @@ // Fade in the summon while the ghost poll is ongoing. // Also don't let them mess with the summon while waiting summoned.alpha = 0 - summoned.notransform = TRUE + ADD_TRAIT(summoned, TRAIT_NO_TRANSFORM, REF(src)) summoned.move_resist = MOVE_FORCE_OVERPOWERING animate(summoned, 10 SECONDS, alpha = 155) @@ -524,7 +524,7 @@ var/mob/dead/observer/picked_candidate = pick(candidates) // Ok let's make them an interactable mob now, since we got a ghost summoned.alpha = 255 - summoned.notransform = FALSE + REMOVE_TRAIT(summoned, TRAIT_NO_TRANSFORM, REF(src)) summoned.move_resist = initial(summoned.move_resist) summoned.ghostize(FALSE) diff --git a/code/modules/antagonists/heretic/heretic_living_heart.dm b/code/modules/antagonists/heretic/heretic_living_heart.dm index 063303c49b6a..aa42a67172ab 100644 --- a/code/modules/antagonists/heretic/heretic_living_heart.dm +++ b/code/modules/antagonists/heretic/heretic_living_heart.dm @@ -99,7 +99,7 @@ return TRUE -/datum/action/cooldown/track_target/Trigger(trigger_flags) +/datum/action/cooldown/track_target/Trigger(trigger_flags, atom/target) right_clicked = !!(trigger_flags & TRIGGER_SECONDARY_ACTION) return ..() diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index b6b7fa6f77b6..02040dae989f 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -236,7 +236,7 @@ /datum/pet_command/idle, /datum/pet_command/free, /datum/pet_command/follow, - /datum/pet_command/point_targetting/attack/star_gazer + /datum/pet_command/point_targeting/attack/star_gazer ) /datum/heretic_knowledge/ultimate/cosmic_final/is_valid_sacrifice(mob/living/carbon/human/sacrifice) diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index 76324e83a08c..84652904534f 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -250,7 +250,7 @@ /obj/effect/decal/cleanable/blood = 1, /obj/item/bodypart/arm/left = 1, ) - mob_to_summon = /mob/living/simple_animal/hostile/heretic_summon/raw_prophet + mob_to_summon = /mob/living/basic/heretic_summon/raw_prophet cost = 1 route = PATH_FLESH @@ -268,8 +268,7 @@ var/mob/living/carbon/carbon_target = target var/obj/item/bodypart/bodypart = pick(carbon_target.bodyparts) - var/datum/wound/slash/severe/crit_wound = new() - crit_wound.apply_wound(bodypart, attack_direction = get_dir(source, target)) + carbon_target.cause_wound_of_type_and_severity(WOUND_SLASH, bodypart, WOUND_SEVERITY_SEVERE, WOUND_SEVERITY_CRITICAL) /datum/heretic_knowledge/summon/stalker name = "Lonely Ritual" @@ -289,7 +288,7 @@ /obj/item/pen = 1, /obj/item/paper = 1, ) - mob_to_summon = /mob/living/simple_animal/hostile/heretic_summon/stalker + mob_to_summon = /mob/living/basic/heretic_summon/stalker cost = 1 route = PATH_FLESH diff --git a/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm b/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm index 384076b8cf6f..a593e61e8edc 100644 --- a/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm +++ b/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm @@ -71,7 +71,7 @@ /obj/item/bodypart/head = 1, /obj/item/book = 1, ) - mob_to_summon = /mob/living/simple_animal/hostile/heretic_summon/ash_spirit + mob_to_summon = /mob/living/basic/heretic_summon/ash_spirit cost = 1 route = PATH_SIDE diff --git a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm index 9b7149716727..313412c030dc 100644 --- a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm +++ b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm @@ -66,7 +66,7 @@ /obj/item/book = 1, /obj/item/bodypart/head = 1, ) - mob_to_summon = /mob/living/simple_animal/hostile/heretic_summon/rust_spirit + mob_to_summon = /mob/living/basic/heretic_summon/rust_walker cost = 1 route = PATH_SIDE diff --git a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm index 6b380eb2f0de..a548646253ae 100644 --- a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm +++ b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm @@ -159,4 +159,4 @@ ) cost = 1 route = PATH_SIDE - mob_to_summon = /mob/living/simple_animal/hostile/heretic_summon/maid_in_the_mirror + mob_to_summon = /mob/living/basic/heretic_summon/maid_in_the_mirror diff --git a/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm b/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm new file mode 100644 index 000000000000..f1d6de56e399 --- /dev/null +++ b/code/modules/antagonists/heretic/magic/ascended_shapeshift.dm @@ -0,0 +1,32 @@ +// Given to ascended knock heretics, is a form of shapeshift that can turn into all 4 common heretic summons, and is not limited to 1 selection. +/datum/action/cooldown/spell/shapeshift/eldritch/ascension + name = "Ascended Shapechange" + desc = "A spell that allows you to take on the form of another eldritch creature, gaining their abilities. \ + You can change your choice at any time, and if your form dies, you dont die." + cooldown_time = 20 SECONDS + die_with_shapeshifted_form = FALSE + possible_shapes = list( + /mob/living/basic/heretic_summon/ash_spirit, + /mob/living/basic/heretic_summon/raw_prophet/ascended, + /mob/living/basic/heretic_summon/rust_walker, + /mob/living/basic/heretic_summon/stalker, + ) + +/datum/action/cooldown/spell/shapeshift/eldritch/ascension/do_shapeshift(mob/living/caster) + . = ..() + if(!.) + return + //buff our forms so this ascension ability isnt shit + playsound(caster, 'sound/magic/demon_consume.ogg', 50, TRUE) + var/mob/living/monster = . + monster.AddComponent(/datum/component/seethrough_mob) + monster.maxHealth *= 1.5 + monster.health = monster.maxHealth + monster.melee_damage_lower = max((monster.melee_damage_lower * 2), 40) + monster.melee_damage_upper = monster.melee_damage_upper / 2 + monster.transform *= 1.5 + monster.AddElement(/datum/element/wall_smasher, strength_flag = ENVIRONMENT_SMASH_RWALLS) + +/datum/action/cooldown/spell/shapeshift/eldritch/ascension/do_unshapeshift(mob/living/caster) + . = ..() + shapeshift_type = null //pick another loser diff --git a/code/modules/antagonists/heretic/magic/blood_cleave.dm b/code/modules/antagonists/heretic/magic/blood_cleave.dm index eca27e55566f..d5317f23e344 100644 --- a/code/modules/antagonists/heretic/magic/blood_cleave.dm +++ b/code/modules/antagonists/heretic/magic/blood_cleave.dm @@ -19,7 +19,7 @@ /// The radius of the cleave effect var/cleave_radius = 1 /// What type of wound we apply - var/wound_type = /datum/wound/slash/critical/cleave + var/wound_type = /datum/wound/slash/flesh/critical/cleave /datum/action/cooldown/spell/pointed/cleave/is_valid_target(atom/cast_on) return ..() && ishuman(cast_on) @@ -45,7 +45,7 @@ ) var/obj/item/bodypart/bodypart = pick(victim.bodyparts) - var/datum/wound/slash/crit_wound = new wound_type() + var/datum/wound/slash/flesh/crit_wound = new wound_type() crit_wound.apply_wound(bodypart) victim.apply_damage(20, BURN, wound_bonus = CANT_WOUND) @@ -56,7 +56,7 @@ /datum/action/cooldown/spell/pointed/cleave/long name = "Lesser Cleave" cooldown_time = 60 SECONDS - wound_type = /datum/wound/slash/severe + wound_type = /datum/wound/slash/flesh/severe /obj/effect/temp_visual/cleave icon = 'icons/effects/eldritch.dmi' diff --git a/code/modules/antagonists/heretic/magic/flesh_ascension.dm b/code/modules/antagonists/heretic/magic/flesh_ascension.dm index cb9ab63e031e..d086c1127fcf 100644 --- a/code/modules/antagonists/heretic/magic/flesh_ascension.dm +++ b/code/modules/antagonists/heretic/magic/flesh_ascension.dm @@ -13,7 +13,7 @@ invocation_type = INVOCATION_SHOUT spell_requirements = NONE - possible_shapes = list(/mob/living/simple_animal/hostile/heretic_summon/armsy/prime) + possible_shapes = list(/mob/living/basic/heretic_summon/armsy) /// The length of our new wormy when we shed. var/segment_length = 10 @@ -35,32 +35,11 @@ return ..() -/datum/action/cooldown/spell/shapeshift/shed_human_form/do_unshapeshift(mob/living/simple_animal/hostile/heretic_summon/armsy/caster) +/datum/action/cooldown/spell/shapeshift/shed_human_form/do_unshapeshift(mob/living/basic/heretic_summon/armsy/caster) if(istype(caster)) - segment_length = caster.get_length() + segment_length = caster.get_length() - 1 // Don't count the head return ..() /datum/action/cooldown/spell/shapeshift/shed_human_form/create_shapeshift_mob(atom/loc) return new shapeshift_type(loc, TRUE, segment_length) - -/datum/action/cooldown/spell/worm_contract - name = "Force Contract" - desc = "Forces your body to contract onto a single tile." - background_icon_state = "bg_heretic" - overlay_icon_state = "bg_heretic_border" - button_icon = 'icons/mob/actions/actions_ecult.dmi' - button_icon_state = "worm_contract" - - school = SCHOOL_FORBIDDEN - cooldown_time = 30 SECONDS - - invocation_type = INVOCATION_NONE - spell_requirements = NONE - -/datum/action/cooldown/spell/worm_contract/is_valid_target(atom/cast_on) - return istype(cast_on, /mob/living/simple_animal/hostile/heretic_summon/armsy) - -/datum/action/cooldown/spell/worm_contract/cast(mob/living/simple_animal/hostile/heretic_summon/armsy/cast_on) - . = ..() - cast_on.contract_next_chain_into_single_tile() diff --git a/code/modules/antagonists/heretic/magic/furious_steel.dm b/code/modules/antagonists/heretic/magic/furious_steel.dm index f4e8596fbba9..9d9dcc29c4a9 100644 --- a/code/modules/antagonists/heretic/magic/furious_steel.dm +++ b/code/modules/antagonists/heretic/magic/furious_steel.dm @@ -43,12 +43,12 @@ unset_click_ability(source, refund_cooldown = TRUE) -/datum/action/cooldown/spell/pointed/projectile/furious_steel/InterceptClickOn(mob/living/caller, params, atom/click_target) +/datum/action/cooldown/spell/pointed/projectile/furious_steel/InterceptClickOn(mob/living/caller, params, atom/target) // Let the caster prioritize using items like guns over blade casts if(caller.get_active_held_item()) return FALSE // Let the caster prioritize melee attacks like punches and shoves over blade casts - if(get_dist(caller, click_target) <= 1) + if(get_dist(caller, target) <= 1) return FALSE return ..() diff --git a/code/modules/antagonists/heretic/magic/shadow_cloak.dm b/code/modules/antagonists/heretic/magic/shadow_cloak.dm index af7bf9d94937..9312c5588161 100644 --- a/code/modules/antagonists/heretic/magic/shadow_cloak.dm +++ b/code/modules/antagonists/heretic/magic/shadow_cloak.dm @@ -193,7 +193,7 @@ qdel(src) /// Signal proc for [COMSIG_MOB_APPLY_DAMAGE], being damaged past a threshold will roll a chance to stop the effect -/datum/status_effect/shadow_cloak/proc/on_damaged(datum/source, damage, damagetype) +/datum/status_effect/shadow_cloak/proc/on_damaged(datum/source, damage, damagetype, ...) SIGNAL_HANDLER // Stam damage is generally bursty, so we'll half it diff --git a/code/modules/antagonists/heretic/magic/space_crawl.dm b/code/modules/antagonists/heretic/magic/space_crawl.dm index 56fafdf86fb8..b88dc88b9943 100644 --- a/code/modules/antagonists/heretic/magic/space_crawl.dm +++ b/code/modules/antagonists/heretic/magic/space_crawl.dm @@ -60,10 +60,10 @@ */ /datum/action/cooldown/spell/jaunt/space_crawl/proc/try_enter_jaunt(turf/our_turf, mob/living/jaunter) // Begin the jaunt - jaunter.notransform = TRUE + ADD_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) var/obj/effect/dummy/phased_mob/holder = enter_jaunt(jaunter, our_turf) - if(!holder) - jaunter.notransform = FALSE + if(isnull(holder)) + REMOVE_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) return FALSE RegisterSignal(holder, COMSIG_MOVABLE_MOVED, PROC_REF(update_status_on_signal)) @@ -82,14 +82,14 @@ new /obj/effect/temp_visual/space_explosion(our_turf) jaunter.extinguish_mob() - jaunter.notransform = FALSE + REMOVE_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) return TRUE /** * Attempts to Exit the passed space or misc turf. */ /datum/action/cooldown/spell/jaunt/space_crawl/proc/try_exit_jaunt(turf/our_turf, mob/living/jaunter) - if(jaunter.notransform) + if(HAS_TRAIT_FROM(jaunter, TRAIT_NO_TRANSFORM, REF(src))) to_chat(jaunter, span_warning("You cannot exit yet!!")) return FALSE diff --git a/code/modules/antagonists/heretic/magic/star_blast.dm b/code/modules/antagonists/heretic/magic/star_blast.dm index 297e24455e22..212e90535d6c 100644 --- a/code/modules/antagonists/heretic/magic/star_blast.dm +++ b/code/modules/antagonists/heretic/magic/star_blast.dm @@ -37,7 +37,7 @@ . = ..() AddElement(/datum/element/effect_trail, /obj/effect/forcefield/cosmic_field/fast) -/obj/projectile/magic/star_ball/on_hit(atom/target, blocked = FALSE, pierce_hit) +/obj/projectile/magic/star_ball/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() var/mob/living/cast_on = firer for(var/mob/living/nearby_mob in range(star_mark_range, target)) diff --git a/code/modules/antagonists/heretic/status_effects/buffs.dm b/code/modules/antagonists/heretic/status_effects/buffs.dm index 128adb6e016e..a7bf076e1c65 100644 --- a/code/modules/antagonists/heretic/status_effects/buffs.dm +++ b/code/modules/antagonists/heretic/status_effects/buffs.dm @@ -74,7 +74,8 @@ heal_amt = 3 if(WOUND_SEVERITY_CRITICAL) heal_amt = 6 - if(wound.wound_type == WOUND_BURN) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[wound.type] + if (pregen_data.wounding_types_valid(list(WOUND_BURN))) carbie.adjustFireLoss(-heal_amt) else carbie.adjustBruteLoss(-heal_amt) diff --git a/code/modules/antagonists/heretic/status_effects/mark_effects.dm b/code/modules/antagonists/heretic/status_effects/mark_effects.dm index 55bdacffb947..057633688a18 100644 --- a/code/modules/antagonists/heretic/status_effects/mark_effects.dm +++ b/code/modules/antagonists/heretic/status_effects/mark_effects.dm @@ -61,8 +61,7 @@ if(ishuman(owner)) var/mob/living/carbon/human/human_owner = owner var/obj/item/bodypart/bodypart = pick(human_owner.bodyparts) - var/datum/wound/slash/severe/crit_wound = new() - crit_wound.apply_wound(bodypart) + human_owner.cause_wound_of_type_and_severity(WOUND_SLASH, bodypart, WOUND_SEVERITY_SEVERE) return ..() diff --git a/code/modules/antagonists/heretic/structures/knock_final.dm b/code/modules/antagonists/heretic/structures/knock_final.dm new file mode 100644 index 000000000000..da42c2c00945 --- /dev/null +++ b/code/modules/antagonists/heretic/structures/knock_final.dm @@ -0,0 +1,114 @@ +/obj/structure/knock_tear + name = "???" + desc = "It stares back. Theres no reason to remain. Run." + max_integrity = INFINITE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + icon = 'icons/obj/anomaly.dmi' + icon_state = "bhole3" + color = COLOR_PURPLE + light_color = COLOR_PURPLE + light_outer_range = 20 + anchored = TRUE + density = FALSE + layer = HIGH_PIPE_LAYER //0.01 above sigil layer used by heretic runes + move_resist = INFINITY + /// Who is our daddy? + var/datum/mind/ascendee + /// True if we're currently checking for ghost opinions + var/gathering_candidates = TRUE + ///a static list of heretic summons we cam create, automatically populated from heretic monster subtypes + var/static/list/monster_types + /// A static list of heretic summons which we should not create + var/static/list/monster_types_blacklist = list( + /mob/living/basic/heretic_summon/armsy, + /mob/living/basic/heretic_summon/star_gazer, + ) + +/obj/structure/knock_tear/Initialize(mapload, datum/mind/ascendant_mind) + . = ..() + transform *= 3 + if(isnull(monster_types)) + monster_types = subtypesof(/mob/living/basic/heretic_summon) - monster_types_blacklist + if(!isnull(ascendant_mind)) + ascendee = ascendant_mind + RegisterSignals(ascendant_mind.current, list(COMSIG_LIVING_DEATH, COMSIG_PARENT_QDELETING), PROC_REF(end_madness)) + SSpoints_of_interest.make_point_of_interest(src) + INVOKE_ASYNC(src, PROC_REF(poll_ghosts)) + +/// Ask ghosts if they want to make some noise +/obj/structure/knock_tear/proc/poll_ghosts() + var/list/candidates = poll_ghost_candidates("Would you like to be a random eldritch monster attacking the crew?", ROLE_SENTIENCE, ROLE_SENTIENCE, 10 SECONDS, POLL_IGNORE_HERETIC_MONSTER) + while(LAZYLEN(candidates)) + var/mob/dead/observer/candidate = pick_n_take(candidates) + ghost_to_monster(candidate, should_ask = FALSE) + gathering_candidates = FALSE + +/// Destroy the rift if you kill the heretic +/obj/structure/knock_tear/proc/end_madness(datum/former_master) + SIGNAL_HANDLER + var/turf/our_turf = get_turf(src) + playsound(our_turf, 'sound/magic/castsummon.ogg', vol = 100, vary = TRUE) + visible_message(span_boldwarning("The rip in space spasms and disappears!")) + UnregisterSignal(former_master, list(COMSIG_LIVING_DEATH, COMSIG_PARENT_QDELETING)) // Just in case they die THEN delete + new /obj/effect/temp_visual/destabilising_tear(our_turf) + qdel(src) + +/obj/structure/knock_tear/attack_ghost(mob/user) + . = ..() + if(. || gathering_candidates) + return + ghost_to_monster(user) + +/obj/structure/knock_tear/examine(mob/user) + . = ..() + if (!isobserver(user) || gathering_candidates) + return + . += span_notice("You can use this to enter the world as a foul monster.") + +/// Turn a ghost into an 'orrible beast +/obj/structure/knock_tear/proc/ghost_to_monster(mob/dead/observer/user, should_ask = TRUE) + if(should_ask) + var/ask = tgui_alert(user, "Become a monster?", "Ascended Rift", list("Yes", "No")) + if(ask != "Yes" || QDELETED(src) || QDELETED(user)) + return FALSE + var/monster_type = pick(monster_types) + var/mob/living/monster = new monster_type(loc) + monster.key = user.key + monster.set_name() + var/datum/antagonist/heretic_monster/woohoo_free_antag = new(src) + monster.mind.add_antag_datum(woohoo_free_antag) + if(ascendee) + monster.faction = ascendee.current.faction + woohoo_free_antag.set_owner(ascendee) + var/datum/objective/kill_all_your_friends = new() + kill_all_your_friends.owner = monster.mind + kill_all_your_friends.explanation_text = "The station's crew must be culled." + kill_all_your_friends.completed = TRUE + woohoo_free_antag.objectives += kill_all_your_friends + +/obj/structure/knock_tear/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction) + return FALSE + +/obj/structure/knock_tear/Destroy(force) + if(ascendee) + ascendee = null + return ..() + +/obj/effect/temp_visual/destabilising_tear + name = "destabilised tear" + icon = 'icons/obj/anomaly.dmi' + icon_state = "bhole3" + color = COLOR_PURPLE + light_color = COLOR_PURPLE + light_outer_range = 20 + layer = HIGH_PIPE_LAYER + duration = 1 SECONDS + +/obj/effect/temp_visual/destabilising_tear/Initialize(mapload) + . = ..() + transform *= 3 + animate(src, transform = matrix().Scale(3.2), time = 0.15 SECONDS) + animate(transform = matrix().Scale(0.2), time = 0.75 SECONDS) + animate(transform = matrix().Scale(3, 0), time = 0.1 SECONDS) + animate(src, color = COLOR_WHITE, time = 0.25 SECONDS, flags = ANIMATION_PARALLEL) + animate(color = COLOR_PURPLE, time = 0.3 SECONDS) diff --git a/code/modules/antagonists/malf_ai/malf_ai_modules.dm b/code/modules/antagonists/malf_ai/malf_ai_modules.dm index feba37341305..05a648fb2727 100644 --- a/code/modules/antagonists/malf_ai/malf_ai_modules.dm +++ b/code/modules/antagonists/malf_ai/malf_ai_modules.dm @@ -1,6 +1,16 @@ #define DEFAULT_DOOMSDAY_TIMER 4500 #define DOOMSDAY_ANNOUNCE_INTERVAL 600 +#define VENDOR_TIPPING_USES 8 +#define MALF_VENDOR_TIPPING_TIME 0.5 SECONDS //within human reaction time +#define MALF_VENDOR_TIPPING_CRIT_CHANCE 100 //percent - guaranteed + +#define MALF_AI_ROLL_TIME 0.5 SECONDS +#define MALF_AI_ROLL_COOLDOWN 1 SECONDS + MALF_AI_ROLL_TIME +#define MALF_AI_ROLL_DAMAGE 75 +#define MALF_AI_ROLL_CRIT_CHANCE 5 //percent +#define MALF_AI_ROLL_MAX_DISTANCE 1 //anything further away than this, and the roll will fail + GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( /obj/machinery/field/containment, /obj/machinery/power/supermatter_crystal, @@ -341,7 +351,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) /obj/machinery/doomsday_device/proc/trigger_doomsday() callback_on_everyone_on_z(SSmapping.levels_by_trait(ZTRAIT_STATION), CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(bring_doomsday)), src) to_chat(world, span_bold("The AI cleansed the station of life with [src]!")) - SSticker.force_ending = TRUE + SSticker.force_ending = FORCE_END_ROUND /proc/bring_doomsday(mob/living/victim, atom/source) if(issilicon(victim)) @@ -1010,3 +1020,13 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) #undef DEFAULT_DOOMSDAY_TIMER #undef DOOMSDAY_ANNOUNCE_INTERVAL + +#undef VENDOR_TIPPING_USES +#undef MALF_VENDOR_TIPPING_TIME +#undef MALF_VENDOR_TIPPING_CRIT_CHANCE + +#undef MALF_AI_ROLL_COOLDOWN +#undef MALF_AI_ROLL_TIME +#undef MALF_AI_ROLL_DAMAGE +#undef MALF_AI_ROLL_CRIT_CHANCE +#undef MALF_AI_ROLL_MAX_DISTANCE diff --git a/code/modules/antagonists/nightmare/nightmare_organs.dm b/code/modules/antagonists/nightmare/nightmare_organs.dm index cf1142ee2fa2..1e07ddc69417 100644 --- a/code/modules/antagonists/nightmare/nightmare_organs.dm +++ b/code/modules/antagonists/nightmare/nightmare_organs.dm @@ -27,10 +27,25 @@ terrorize_spell = new(src) terrorize_spell.Grant(brain_owner) + RegisterSignal(brain_owner, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(dodge_bullets)) + /obj/item/organ/internal/brain/shadow/nightmare/on_remove(mob/living/carbon/brain_owner) . = ..() QDEL_NULL(our_jaunt) QDEL_NULL(terrorize_spell) + UnregisterSignal(brain_owner, COMSIG_ATOM_PRE_BULLET_ACT) + +/obj/item/organ/internal/brain/shadow/nightmare/proc/dodge_bullets(mob/living/carbon/human/source, obj/projectile/hitting_projectile, def_zone) + SIGNAL_HANDLER + var/turf/dodge_turf = source.loc + if(!istype(dodge_turf) || dodge_turf.get_lumcount() >= SHADOW_SPECIES_LIGHT_THRESHOLD) + return NONE + source.visible_message( + span_danger("[source] dances in the shadows, evading [hitting_projectile]!"), + span_danger("You evade [hitting_projectile] with the cover of darkness!"), + ) + playsound(source, SFX_BULLET_MISS, 75, TRUE) + return COMPONENT_BULLET_PIERCED /obj/item/organ/internal/heart/nightmare name = "heart of darkness" diff --git a/code/modules/antagonists/nightmare/nightmare_species.dm b/code/modules/antagonists/nightmare/nightmare_species.dm index 9fc44cb434cb..fcfc07af378a 100644 --- a/code/modules/antagonists/nightmare/nightmare_species.dm +++ b/code/modules/antagonists/nightmare/nightmare_species.dm @@ -41,15 +41,5 @@ C.fully_replace_character_name(null, pick(GLOB.nightmare_names)) C.set_safe_hunger_level() -/datum/species/shadow/nightmare/bullet_act(obj/projectile/P, mob/living/carbon/human/H) - var/turf/T = H.loc - if(istype(T)) - var/light_amount = T.get_lumcount() - if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) - H.visible_message(span_danger("[H] dances in the shadows, evading [P]!")) - playsound(T, SFX_BULLET_MISS, 75, TRUE) - return BULLET_ACT_FORCE_PIERCE - return ..() - /datum/species/shadow/nightmare/check_roundstart_eligible() return FALSE diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index 2b21764e0835..c2809d680cc6 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -8,9 +8,13 @@ show_to_ghosts = TRUE hijack_speed = 2 //If you can't take out the station, take the shuttle instead. suicide_cry = "FOR THE SYNDICATE!!" + /// Which nukie team are we on? var/datum/team/nuclear/nuke_team - var/always_new_team = FALSE //If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team. - var/send_to_spawnpoint = TRUE //Should the user be moved to default spawnpoint. + /// If not assigned a team by default ops will try to join existing ones, set this to TRUE to always create new team. + var/always_new_team = FALSE + /// Should the user be moved to default spawnpoint after being granted this datum. + var/send_to_spawnpoint = TRUE + /// The DEFAULT outfit we will give to players granted this datum var/nukeop_outfit = /datum/outfit/syndicate preview_outfit = /datum/outfit/nuclear_operative_elite @@ -34,9 +38,12 @@ if(!nukeop_outfit) // this variable is null in instances where an antagonist datum is granted via enslaving the mind (/datum/mind/proc/enslave_mind_to_creator), like in golems. return - operative.set_species(/datum/species/human) //Plasmamen burn up otherwise, and besides, all other species are vulnerable to asimov AIs. Let's standardize all operatives being human. + // If our nuke_ops_species pref is set to TRUE, (or we have no client) make us a human + if(isnull(operative.client) || operative.client.prefs.read_preference(/datum/preference/toggle/nuke_ops_species)) + operative.set_species(/datum/species/human) + + operative.equip_species_outfit(nukeop_outfit) - operative.equipOutfit(nukeop_outfit) return TRUE /datum/antagonist/nukeop/greet() @@ -119,8 +126,6 @@ /// Actually moves our nukie to where they should be /datum/antagonist/nukeop/proc/move_to_spawnpoint() - // Ensure that the nukiebase is loaded, and wait for it if required - SSmapping.lazy_load_template(LAZY_TEMPLATE_KEY_NUKIEBASE) var/turf/destination = get_spawnpoint() owner.current.forceMove(destination) if(!owner.current.onSyndieBase()) @@ -233,7 +238,9 @@ name = "Nuclear Operative Leader" nukeop_outfit = /datum/outfit/syndicate/leader always_new_team = TRUE + /// Randomly chosen honorific, for distinction var/title + /// The nuclear challenge remote we will spawn this player with. var/challengeitem = /obj/item/nuclear_challenge /datum/antagonist/nukeop/leader/memorize_code() @@ -521,13 +528,6 @@ /// Returns whether or not syndicate operatives escaped. /proc/is_infiltrator_docked_at_syndiebase() var/obj/docking_port/mobile/infiltrator/infiltrator_port = SSshuttle.getShuttle("syndicate") + var/obj/docking_port/stationary/transit/infiltrator_dock = locate() in infiltrator_port.loc - var/datum/lazy_template/nukie_base/nukie_template = GLOB.lazy_templates[LAZY_TEMPLATE_KEY_NUKIEBASE] - if(!nukie_template) - return FALSE // if its not even loaded, cant be docked - - for(var/datum/turf_reservation/loaded_area as anything in nukie_template.reservations) - var/infiltrator_turf = get_turf(infiltrator_port) - if(infiltrator_turf in loaded_area.reserved_turfs) - return TRUE - return FALSE + return infiltrator_port && (is_centcom_level(infiltrator_port.z) || infiltrator_dock) diff --git a/code/modules/antagonists/nukeop/outfits.dm b/code/modules/antagonists/nukeop/outfits.dm index 4b8560dc9186..bb8d4126fe6f 100644 --- a/code/modules/antagonists/nukeop/outfits.dm +++ b/code/modules/antagonists/nukeop/outfits.dm @@ -13,24 +13,37 @@ skillchips = list(/obj/item/skillchip/disk_verifier) box = /obj/item/storage/box/survival/syndie + /// Amount of TC to automatically store in this outfit's uplink. var/tc = 25 + /// Enables big voice on this outfit's headset, used for nukie leaders. var/command_radio = FALSE + /// The type of uplink to be given on equip. var/uplink_type = /obj/item/uplink/nuclear id_trim = /datum/id_trim/chameleon/operative +/datum/outfit/syndicate/plasmaman + name = "Syndicate Operative - Basic (Plasmaman)" + head = /obj/item/clothing/head/helmet/space/plasmaman/syndie + uniform = /obj/item/clothing/under/plasmaman/syndicate + r_hand = /obj/item/tank/internals/plasmaman/belt/full + /datum/outfit/syndicate/leader name = "Syndicate Leader - Basic" command_radio = TRUE id_trim = /datum/id_trim/chameleon/operative/nuke_leader +/datum/outfit/syndicate/leader/plasmaman + name = "Syndicate Leader - Basic (Plasmaman)" + head = /obj/item/clothing/head/helmet/space/plasmaman/syndie + uniform = /obj/item/clothing/under/plasmaman/syndicate + r_hand = /obj/item/tank/internals/plasmaman/belt/full + /datum/outfit/syndicate/post_equip(mob/living/carbon/human/nukie, visualsOnly = FALSE) if(visualsOnly) return - // We don't require the nukiebase be loaded to function, but lets go ahead and kick off loading just in case - INVOKE_ASYNC(SSmapping, TYPE_PROC_REF(/datum/controller/subsystem/mapping, lazy_load_template), LAZY_TEMPLATE_KEY_NUKIEBASE) var/obj/item/radio/radio = nukie.ears radio.set_frequency(FREQ_SYNDICATE) radio.freqlock = RADIO_FREQENCY_LOCKED @@ -64,6 +77,17 @@ /obj/item/pen/edagger = 1, ) +/datum/outfit/syndicate/full/plasmaman + name = "Syndicate Operative - Full Kit (Plasmaman)" + back = /obj/item/mod/control/pre_equipped/nuclear/plasmaman + uniform = /obj/item/clothing/under/plasmaman/syndicate + r_pocket = /obj/item/tank/internals/plasmaman/belt/full + mask = null + +/datum/outfit/syndicate/full/plasmaman/New() + backpack_contents += /obj/item/clothing/head/helmet/space/plasmaman/syndie + return ..() + /datum/outfit/syndicate/reinforcement name = "Syndicate Operative - Reinforcement" tc = 0 @@ -80,6 +104,13 @@ to_chat(H, span_notice("You're an agent of [faction], sent to accompany the nuclear squad on their mission. \ Support your allies, and remember: Down with Nanotrasen.")) +/datum/outfit/syndicate/reinforcement/plasmaman + name = "Syndicate Operative - Reinforcement (Plasmaman)" + head = /obj/item/clothing/head/helmet/space/plasmaman/syndie + uniform = /obj/item/clothing/under/plasmaman/syndicate + r_hand = /obj/item/tank/internals/plasmaman/belt/full + tc = 0 + /datum/outfit/syndicate/reinforcement/gorlex name = "Syndicate Operative - Gorlex Reinforcement" suit = /obj/item/clothing/suit/armor/vest/alt diff --git a/code/modules/antagonists/pirate/pirate_event.dm b/code/modules/antagonists/pirate/pirate_event.dm index 30dc8c84f31b..54f0cf832e64 100644 --- a/code/modules/antagonists/pirate/pirate_event.dm +++ b/code/modules/antagonists/pirate/pirate_event.dm @@ -4,16 +4,14 @@ weight = 10 max_occurrences = 1 min_players = 20 - dynamic_should_hijack = TRUE + //dynamic_should_hijack = TRUE category = EVENT_CATEGORY_INVASION description = "The crew will either pay up, or face a pirate assault." admin_setup = list(/datum/event_admin_setup/listed_options/pirates) map_flags = EVENT_SPACE_ONLY - -/datum/round_event_control/pirates/preRunEvent() - if (!SSmapping.is_planetary()) - return EVENT_CANT_RUN - return ..() + track = EVENT_TRACK_MAJOR + tags = list(TAG_COMBAT, TAG_COMMUNAL) + checks_antag_cap = TRUE /datum/round_event/pirates ///admin chosen pirate team diff --git a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm index 7067fb0ce6f3..98894adfc0a5 100644 --- a/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm +++ b/code/modules/antagonists/pirate/pirate_shuttle_equipment.dm @@ -381,13 +381,13 @@ /datum/export/pirate/parrot cost = 2000 unit_name = "alive parrot" - export_types = list(/mob/living/simple_animal/parrot) + export_types = list(/mob/living/basic/parrot) /datum/export/pirate/parrot/find_loot() - for(var/mob/living/simple_animal/parrot/P in GLOB.alive_mob_list) - var/turf/T = get_turf(P) - if(T && is_station_level(T.z)) - return P + for(var/mob/living/basic/parrot/current_parrot in GLOB.alive_mob_list) + var/turf/parrot_turf = get_turf(current_parrot) + if(parrot_turf && is_station_level(parrot_turf.z)) + return current_parrot /datum/export/pirate/cash cost = 1 diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 6cb65976cefa..967b18fc6deb 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -366,7 +366,10 @@ //blunt trauma deconversions call this through species.dm spec_attacked_by() /datum/antagonist/rev/proc/remove_revolutionary(borged, deconverter) - owner.current.log_message("has been deconverted from the revolution by [ismob(deconverter) ? key_name(deconverter) : deconverter]!", LOG_ATTACK, color="#960000") + if(!owner) + return + if(owner.current) + owner.current.log_message("has been deconverted from the revolution by [ismob(deconverter) ? key_name(deconverter) : deconverter]!", LOG_ATTACK, color="#960000") if(borged) message_admins("[ADMIN_LOOKUPFLW(owner.current)] has been borged while being a [name]") owner.special_role = null @@ -380,7 +383,7 @@ var/re_antag = FALSE var/datum/mind/old_owner = owner //owner gets nulled when rev antag removed if(borged || deconverter == DECONVERTER_STATION_WIN || deconverter == DECONVERTER_REVS_WIN) - if(owner.current.stat != DEAD && deconverter == DECONVERTER_STATION_WIN) + if(owner.current?.stat != DEAD && deconverter == DECONVERTER_STATION_WIN) re_antag = TRUE . = ..() if(re_antag) diff --git a/code/modules/antagonists/space_dragon/space_dragon.dm b/code/modules/antagonists/space_dragon/space_dragon.dm index 7ebcd4dde0c2..d32e62175d5a 100644 --- a/code/modules/antagonists/space_dragon/space_dragon.dm +++ b/code/modules/antagonists/space_dragon/space_dragon.dm @@ -111,6 +111,7 @@ if(objective_complete) return rifts_charged = 0 + ADD_TRAIT(owner.current, TRAIT_RIFT_FAILURE, REF(src)) owner.current.add_movespeed_modifier(/datum/movespeed_modifier/dragon_depression) riftTimer = -1 SEND_SOUND(owner.current, sound('sound/vehicles/rocketlaunch.ogg')) diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 62f4ee9b61de..b150289f2e4d 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -15,6 +15,8 @@ suicide_cry = "FOR THE SYNDICATE!!" preview_outfit = /datum/outfit/traitor var/give_objectives = TRUE + /// Whether to give secondary objectives to the traitor, which aren't necessary but can be completed for a progression and TC boost. + var/give_secondary_objectives = TRUE var/should_give_codewords = TRUE ///give this traitor an uplink? var/give_uplink = TRUE @@ -42,6 +44,16 @@ ///the final objective the traitor has to accomplish, be it escaping, hijacking, or just martyrdom. var/datum/objective/ending_objective +/datum/antagonist/traitor/infiltrator + // Used to denote traitors who have joined midround and therefore have no access to secondary objectives. + // Progression elements are best left to the roundstart antagonists + // There will still be a timelock on uplink items + name = "\improper Infiltrator" + give_secondary_objectives = TRUE // Changed from FALSE to TRUE - MONKEYSTATION EDIT CHANGE + +/datum/antagonist/traitor/infiltrator/sleeper_agent + name = "\improper Syndicate Sleeper Agent" + /datum/antagonist/traitor/New(give_objectives = TRUE) . = ..() src.give_objectives = give_objectives @@ -64,8 +76,9 @@ uplink_handler.has_progression = TRUE SStraitor.register_uplink_handler(uplink_handler) - uplink_handler.has_objectives = TRUE - uplink_handler.generate_objectives() + if(give_secondary_objectives) + uplink_handler.has_objectives = TRUE + uplink_handler.generate_objectives() if(uplink_handler.progression_points < SStraitor.current_global_progression) uplink_handler.progression_points = SStraitor.current_global_progression * SStraitor.newjoin_progression_coeff @@ -106,7 +119,7 @@ else string += ", [to_display.telecrystal_reward] TC" string += ", [to_display.progression_reward] PR" - if(to_display.objective_state == OBJECTIVE_STATE_ACTIVE) + if(to_display.objective_state == OBJECTIVE_STATE_ACTIVE && !istype(to_display, /datum/traitor_objective/ultimate)) string += " Fail this objective" string += " Succeed this objective" if(to_display.objective_state == OBJECTIVE_STATE_INACTIVE) diff --git a/code/modules/antagonists/traitor/objectives/demoralise_assault.dm b/code/modules/antagonists/traitor/objectives/demoralise_assault.dm new file mode 100644 index 000000000000..f8cbd6a6e035 --- /dev/null +++ b/code/modules/antagonists/traitor/objectives/demoralise_assault.dm @@ -0,0 +1,133 @@ +/datum/traitor_objective_category/demoralise + name = "Demoralise Crew" + objectives = list( + /datum/traitor_objective/target_player/assault = 1, + /datum/traitor_objective/destroy_item/demoralise = 1, + ) + weight = OBJECTIVE_WEIGHT_UNLIKELY + +/datum/traitor_objective/target_player/assault + name = "Assault %TARGET% the %JOB TITLE%" + description = "%TARGET% has been identified as a potential future agent. \ + Pick a fight and give them a good beating. \ + %COUNT% hits should reduce their morale and have them questioning their loyalties. \ + Try not to kill them just yet, we may want to recruit them in the future." + + abstract_type = /datum/traitor_objective/target_player + duplicate_type = /datum/traitor_objective/target_player + + progression_minimum = 0 MINUTES + progression_maximum = 30 MINUTES + progression_reward = list(4 MINUTES, 8 MINUTES) + telecrystal_reward = list(0, 1) + + /// Min attacks required to pass the objective. Picked at random between this and max. + var/min_attacks_required = 2 + /// Max attacks required to pass the objective. Picked at random between this and min. + var/max_attacks_required = 5 + /// The random number picked for the number of required attacks to pass this objective. + var/attacks_required = 0 + /// Total number of successful attacks recorded. + var/attacks_inflicted = 0 + +/datum/traitor_objective/target_player/assault/on_objective_taken(mob/user) + . = ..() + + target.AddElement(/datum/element/relay_attackers) + RegisterSignal(target, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + +/datum/traitor_objective/target_player/assault/proc/on_attacked(mob/source, mob/living/attacker, attack_flags) + SIGNAL_HANDLER + + // Only care about attacks from the objective's owner. + if(attacker != handler.owner.current) + return + + // We want some sort of damaging attack to trigger this, rather than shoves and non-lethals. + if(!(attack_flags & ATTACKER_DAMAGING_ATTACK)) + return + + attacks_inflicted++ + + if(attacks_inflicted == attacks_required) + succeed_objective() + +/datum/traitor_objective/target_player/assault/ungenerate_objective() + UnregisterSignal(target, COMSIG_ATOM_WAS_ATTACKED) + UnregisterSignal(target, COMSIG_LIVING_DEATH) + UnregisterSignal(target, COMSIG_PARENT_QDELETING) + + target = null + +/datum/traitor_objective/target_player/assault/generate_objective(datum/mind/generating_for, list/possible_duplicates) + var/list/already_targeting = list() //List of minds we're already targeting. The possible_duplicates is a list of objectives, so let's not mix things + for(var/datum/objective/task as anything in handler.primary_objectives) + if(!istype(task.target, /datum/mind)) + continue + already_targeting += task.target //Removing primary objective kill targets from the list + + var/list/possible_targets = list() + + for(var/datum/mind/possible_target as anything in get_crewmember_minds()) + if(possible_target in already_targeting) + continue + + if(possible_target == generating_for) + continue + + if(!ishuman(possible_target.current)) + continue + + if(possible_target.current.stat == DEAD) + continue + + if(possible_target.has_antag_datum(/datum/antagonist/traitor)) + continue + + possible_targets += possible_target + + for(var/datum/traitor_objective/target_player/objective as anything in possible_duplicates) + possible_targets -= objective.target?.mind + + if(generating_for.late_joiner) + var/list/all_possible_targets = possible_targets.Copy() + for(var/datum/mind/possible_target as anything in all_possible_targets) + if(!possible_target.late_joiner) + possible_targets -= possible_target + if(!possible_targets.len) + possible_targets = all_possible_targets + + if(!possible_targets.len) + return FALSE + + var/datum/mind/target_mind = pick(possible_targets) + + target = target_mind.current + replace_in_name("%TARGET%", target.real_name) + replace_in_name("%JOB TITLE%", target_mind.assigned_role.title) + + attacks_required = rand(min_attacks_required, max_attacks_required) + replace_in_name("%COUNT%", attacks_required) + + RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(on_target_death)) + RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(on_target_qdeleted)) + + return TRUE + +/datum/traitor_objective/target_player/assault/generate_ui_buttons(mob/user) + var/list/buttons = list() + if(attacks_required > attacks_inflicted) + buttons += add_ui_button("[attacks_required - attacks_inflicted]", "This tells you how many more times you have to attack the target player to succeed.", "hand-rock-o", "none") + return buttons + +/datum/traitor_objective/target_player/assault/proc/on_target_qdeleted() + SIGNAL_HANDLER + + //don't take an objective target of someone who is already obliterated + fail_objective() + +/datum/traitor_objective/target_player/assault/proc/on_target_death() + SIGNAL_HANDLER + + //don't take an objective target of someone who is already dead + fail_objective() diff --git a/code/modules/antagonists/traitor/objectives/demoralise_crew.dm b/code/modules/antagonists/traitor/objectives/demoralise_crew.dm deleted file mode 100644 index 4529273f5e2e..000000000000 --- a/code/modules/antagonists/traitor/objectives/demoralise_crew.dm +++ /dev/null @@ -1,53 +0,0 @@ -#define MAX_CREW_RATIO 0.33 -#define MIN_CREW_DEMORALISED 8 -#define MAX_CREW_DEMORALISED 16 - -/datum/traitor_objective_category/demoralise - name = "Demoralise Crew" - objectives = list( - /datum/traitor_objective/demoralise/poster = 2, - /datum/traitor_objective/demoralise/graffiti = 1, - ) - weight = OBJECTIVE_WEIGHT_UNLIKELY - -/datum/traitor_objective/demoralise - name = "Debug your code." - description = "If you actually get this objective someone fucked up." - - abstract_type = /datum/traitor_objective/demoralise - - /// How many 'mood events' are required? - var/demoralised_crew_required = 0 - /// How many 'mood events' have happened so far? - var/demoralised_crew_events = 0 - -/datum/traitor_objective/demoralise/can_generate_objective(datum/mind/generating_for, list/possible_duplicates) - if(length(possible_duplicates) > 0) - return FALSE - return TRUE - -/datum/traitor_objective/demoralise/generate_objective(datum/mind/generating_for, list/possible_duplicates) - demoralised_crew_required = (clamp(rand(MIN_CREW_DEMORALISED, length(get_crewmember_minds()) * MAX_CREW_RATIO), MIN_CREW_DEMORALISED, MAX_CREW_DEMORALISED)) - replace_in_name("%VIEWS%", demoralised_crew_required) - return TRUE - -/** - * Handles an event which increases your progress towards success. - * - * Arguments - * * source - Source atom of the signal. - * * victim - Mind of whoever it was you just triggered some kind of effect on. - */ -/datum/traitor_objective/demoralise/proc/on_mood_event(atom/source, datum/mind/victim) - SIGNAL_HANDLER - if (victim == handler.owner) - return - - demoralised_crew_events++ - if (demoralised_crew_events >= demoralised_crew_required) - to_chat(handler.owner, span_nicegreen("The crew look despondent. Mission accomplished.")) - succeed_objective() - -#undef MAX_CREW_RATIO -#undef MIN_CREW_DEMORALISED -#undef MAX_CREW_DEMORALISED diff --git a/code/modules/antagonists/traitor/objectives/destroy_heirloom.dm b/code/modules/antagonists/traitor/objectives/destroy_heirloom.dm index f5fab7ffc433..a93624e90c6f 100644 --- a/code/modules/antagonists/traitor/objectives/destroy_heirloom.dm +++ b/code/modules/antagonists/traitor/objectives/destroy_heirloom.dm @@ -17,7 +17,7 @@ abstract_type = /datum/traitor_objective/destroy_heirloom - /// The jobs that this objective is targetting. + /// The jobs that this objective is targeting. var/list/target_jobs /// the item we need to destroy var/obj/item/target_item diff --git a/code/modules/antagonists/traitor/objectives/destroy_item.dm b/code/modules/antagonists/traitor/objectives/destroy_item.dm index 7a4898f2b3d3..2de962ee4b97 100644 --- a/code/modules/antagonists/traitor/objectives/destroy_item.dm +++ b/code/modules/antagonists/traitor/objectives/destroy_item.dm @@ -34,6 +34,27 @@ /datum/objective_item/steal/blackbox, ) +/// Super early-game destroy objective intended to be items easily tided that the crew tends to value. +/datum/traitor_objective/destroy_item/demoralise + description = "Find %ITEM% and destroy it using any means necessary. \ + We believe this luxury item is important for crew morale. \ + Destruction of this item will help our recruitment efforts." + + progression_minimum = 0 MINUTES + progression_maximum = 10 MINUTES + progression_reward = list(4 MINUTES, 8 MINUTES) + telecrystal_reward = list(0, 1) + + possible_items = list( + /datum/objective_item/steal/traitor/rpd, + /datum/objective_item/steal/traitor/space_law, + /datum/objective_item/steal/traitor/granted_stamp, + /datum/objective_item/steal/traitor/denied_stamp, + /datum/objective_item/steal/traitor/lizard_plush, + /datum/objective_item/steal/traitor/moth_plush, + /datum/objective_item/steal/traitor/insuls, + ) + /datum/traitor_objective/destroy_item/generate_objective(datum/mind/generating_for, list/possible_duplicates) for(var/datum/traitor_objective/destroy_item/objective as anything in possible_duplicates) possible_items -= objective.target_item.type diff --git a/code/modules/antagonists/traitor/objectives/eyesnatching.dm b/code/modules/antagonists/traitor/objectives/eyesnatching.dm index d4558420b1d2..16eb0644ff43 100644 --- a/code/modules/antagonists/traitor/objectives/eyesnatching.dm +++ b/code/modules/antagonists/traitor/objectives/eyesnatching.dm @@ -177,9 +177,10 @@ if(!do_after(user, 5 SECONDS, target = target, extra_checks = CALLBACK(src, PROC_REF(eyeballs_exist), eyeballies, head, target))) return - var/datum/wound/blunt/severe/severe_wound_type = /datum/wound/blunt/severe - var/datum/wound/blunt/critical/critical_wound_type = /datum/wound/blunt/critical - target.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = rand(initial(severe_wound_type.threshold_minimum), initial(critical_wound_type.threshold_minimum) + 10)) + var/min_wound = head.get_wound_threshold_of_wound_type(WOUND_BLUNT, WOUND_SEVERITY_SEVERE, return_value_if_no_wound = 30, wound_source = src) + var/max_wound = head.get_wound_threshold_of_wound_type(WOUND_BLUNT, WOUND_SEVERITY_CRITICAL, return_value_if_no_wound = 50, wound_source = src) + + target.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = rand(min_wound, max_wound + 10), attacking_item = src) target.visible_message( span_danger("[src] pierces through [target]'s skull, horribly mutilating their eyes!"), span_userdanger("Something penetrates your skull, horribly mutilating your eyes! Holy fuck!"), diff --git a/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm b/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm index c8aad8e6b6ae..d3a3133593c2 100644 --- a/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm +++ b/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm @@ -3,10 +3,11 @@ objectives = list( /datum/traitor_objective/ultimate/romerol = 1, /datum/traitor_objective/ultimate/battlecruiser = 1, - /datum/traitor_objective/ultimate/space_dragon = 1, +// /datum/traitor_objective/ultimate/space_dragon = 1, //monkestation removal /datum/traitor_objective/ultimate/supermatter_cascade = 1, /datum/traitor_objective/ultimate/infect_ai = 1, /datum/traitor_objective/ultimate/dark_matteor = 1, + /datum/traitor_objective/ultimate/wizard = 1, //monkestation edit ) weight = 100 @@ -31,6 +32,8 @@ . = ..() handler.maximum_potential_objectives = 0 for(var/datum/traitor_objective/objective as anything in handler.potential_objectives) + if(objective == src) + continue objective.fail_objective() user.playsound_local(get_turf(user), 'sound/traitor/final_objective.ogg', vol = 100, vary = FALSE, channel = CHANNEL_TRAITOR) handler.final_objective = name diff --git a/code/modules/antagonists/traitor/objectives/final_objective/space_dragon.dm b/code/modules/antagonists/traitor/objectives/final_objective/space_dragon.dm index 127d4b28ac55..63b6b4734db0 100644 --- a/code/modules/antagonists/traitor/objectives/final_objective/space_dragon.dm +++ b/code/modules/antagonists/traitor/objectives/final_objective/space_dragon.dm @@ -1,3 +1,5 @@ +//MONKESTATION FILE REMOVAL: REPLACED WITH THE /datum/traitor_objective/ultimate/wizard OBJECTIVE +/* /datum/traitor_objective/ultimate/space_dragon name = "Find a Space Carp and mutate their DNA with your own using a DNA harvester we will drop pod at %AREA%" description = "Go to %AREA%, and recieve the Carp DNA scanner. Use it on any Space Carp to harvest its DNA. \ @@ -47,4 +49,4 @@ "target" = get_turf(user), "style" = STYLE_SYNDICATE, "spawn" = /obj/item/storage/box/syndie_kit/space_dragon, - )) + ))*/ diff --git a/code/modules/antagonists/traitor/objectives/kidnapping.dm b/code/modules/antagonists/traitor/objectives/kidnapping.dm index c7a624412e67..8f7fefaf84d0 100644 --- a/code/modules/antagonists/traitor/objectives/kidnapping.dm +++ b/code/modules/antagonists/traitor/objectives/kidnapping.dm @@ -1,11 +1,11 @@ /datum/traitor_objective/target_player/kidnapping name = "Kidnap %TARGET% the %JOB TITLE% and deliver them to %AREA%" description = "%TARGET% holds extremely important information regarding secret NT projects - and you'll need to kidnap and deliver them to %AREA%, where our transport pod will be waiting. \ - You'll get additional reward if %TARGET% is delivered alive." + If %TARGET% is delivered alive, you will be rewarded with an additional %TC% telecrystals." abstract_type = /datum/traitor_objective/target_player/kidnapping - /// The jobs that this objective is targetting. + /// The jobs that this objective is targeting. var/list/target_jobs /// Area that the target needs to be delivered to var/area/dropoff_area @@ -168,6 +168,7 @@ replace_in_name("%TARGET%", target_mind.name) replace_in_name("%JOB TITLE%", target_mind.assigned_role.title) replace_in_name("%AREA%", initial(dropoff_area.name)) + replace_in_name("%TC%", alive_bonus) return TRUE /datum/traitor_objective/target_player/kidnapping/ungenerate_objective() diff --git a/code/modules/antagonists/traitor/objectives/kill_pet.dm b/code/modules/antagonists/traitor/objectives/kill_pet.dm index 227a6e1b1ce7..69514b0c8a7e 100644 --- a/code/modules/antagonists/traitor/objectives/kill_pet.dm +++ b/code/modules/antagonists/traitor/objectives/kill_pet.dm @@ -24,9 +24,14 @@ ), JOB_CAPTAIN = /mob/living/basic/pet/fox/renault, JOB_CHIEF_MEDICAL_OFFICER = /mob/living/simple_animal/pet/cat/runtime, - JOB_CHIEF_ENGINEER = /mob/living/simple_animal/parrot/poly, + JOB_CHIEF_ENGINEER = /mob/living/basic/parrot/poly, + JOB_QUARTERMASTER = list( + /mob/living/basic/gorilla/cargorilla, + /mob/living/basic/sloth/citrus, + /mob/living/basic/sloth/paperwork, + ) ) - /// The head that we are targetting + /// The head that we are targeting var/datum/job/target /// Whether or not we only take from the traitor's own department head or not. var/limited_to_department_head = TRUE diff --git a/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm b/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm index 39f03f517c4c..a832260665a0 100644 --- a/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm +++ b/code/modules/antagonists/traitor/objectives/locate_weakpoint.dm @@ -43,13 +43,16 @@ /area/station/security, )) - var/list/blacklisted_areas = typecacheof(list(/area/station/engineering/hallway, +//monkestation removal start +/* var/list/blacklisted_areas = typecacheof(list(/area/station/engineering/hallway, /area/station/engineering/lobby, /area/station/engineering/storage, /area/station/science/lobby, /area/station/science/ordnance/bomb, /area/station/security/prison, - )) + ))*/ +//monkestation removal end + var/list/blacklisted_areas = typecacheof(TRAITOR_OBJECTIVE_BLACKLISTED_AREAS) //monkestation edit var/list/possible_areas = GLOB.the_station_areas.Copy() for(var/area/possible_area as anything in possible_areas) @@ -119,10 +122,36 @@ /datum/traitor_objective/locate_weakpoint/proc/create_shockwave(center_x, center_y, center_z) var/turf/epicenter = locate(center_x, center_y, center_z) var/lowpop = (length(GLOB.clients) <= CONFIG_GET(number/minimal_access_threshold)) - if(lowpop) +//monkestation removal start +/* if(lowpop) explosion(epicenter, devastation_range = 2, heavy_impact_range = 4, light_impact_range = 6, explosion_cause = src) else - explosion(epicenter, devastation_range = 3, heavy_impact_range = 6, light_impact_range = 9, explosion_cause = src) + explosion(epicenter, devastation_range = 3, heavy_impact_range = 6, light_impact_range = 9, explosion_cause = src)*/ +//monkestation removal end +//monkestation edit start: now creates radiating(one explosion in each ring) light explosions + var/greatest_dist = 0 + var/list/turfs_to_collapse = list() + for(var/turf/collapsed_turf as anything in GLOB.station_turfs) + if(istype(get_area(collapsed_turf), /area/station/ai_monitored)) //remote bombing of these areas would be bad + continue + + var/dist = get_dist(epicenter, collapsed_turf) + if(dist > greatest_dist) + greatest_dist = dist + + if(!turfs_to_collapse["[dist]"]) + turfs_to_collapse["[dist]"] = list() + turfs_to_collapse["[dist]"] += collapsed_turf + + for(var/iterator in 1 to greatest_dist) + if(!turfs_to_collapse["[iterator]"]) + continue + for(var/i in 1 to (lowpop ? 1 : 2)) //if lowpop then only do one collapse per ring, otherwise do two + addtimer(CALLBACK(pick_n_take(turfs_to_collapse["[iterator]"]), TYPE_PROC_REF(/turf, structural_collapse), 6 SECONDS, list(0, 0, 3), list('sound/effects/creak1.ogg', \ + 'sound/effects/creak2.ogg', \ + 'sound/effects/creak3.ogg')), \ + 2 SECONDS * iterator) +//monkestation edit end priority_announce( "Attention crew, it appears that a high-power explosive charge has been detonated in your station's weakpoint, causing severe structural damage.", "[command_name()] High-Priority Update" @@ -228,7 +257,7 @@ inhand_icon_state = "plasticx4" worn_icon_state = "x4" - boom_sizes = list(3, 6, 9) + boom_sizes = list(1, 2, 3) //monkestation edit: from list(3, 6, 9), now creates a bunch of light explosions across the station /// Weakref to user's objective var/datum/weakref/objective_weakref diff --git a/code/modules/antagonists/traitor/objectives/sabotage_machinery.dm b/code/modules/antagonists/traitor/objectives/sabotage_machinery.dm index b066683741b1..ca9a92bcd194 100644 --- a/code/modules/antagonists/traitor/objectives/sabotage_machinery.dm +++ b/code/modules/antagonists/traitor/objectives/sabotage_machinery.dm @@ -98,8 +98,8 @@ GLOBAL_DATUM_INIT(objective_machine_handler, /datum/objective_target_machine_han var/bonus_tc = 2 /// Bonus progression to grant if you booby trap successfully var/bonus_progression = 5 MINUTES - /// The trap device we give out - var/obj/item/traitor_machine_trapper/tool + /// Have we given out a traitor trap item? + var/traitor_trapper_given = FALSE /datum/traitor_objective/sabotage_machinery/trap/generate_objective(datum/mind/generating_for, list/possible_duplicates) . = ..() @@ -122,7 +122,7 @@ GLOBAL_DATUM_INIT(objective_machine_handler, /datum/objective_target_machine_han /datum/traitor_objective/sabotage_machinery/trap/generate_ui_buttons(mob/user) var/list/buttons = list() - if(!tool) + if(!traitor_trapper_given) buttons += add_ui_button("", "Pressing this will materialize an explosive trap in your hand, which you can conceal within the target machine", "wifi", "summon_gear") return buttons @@ -130,9 +130,10 @@ GLOBAL_DATUM_INIT(objective_machine_handler, /datum/objective_target_machine_han . = ..() switch(action) if("summon_gear") - if(tool) + if(traitor_trapper_given) return - tool = new(user.drop_location()) + traitor_trapper_given = TRUE + var/obj/item/traitor_machine_trapper/tool = new(user.drop_location()) user.put_in_hands(tool) tool.balloon_alert(user, "a booby trap materializes in your hand") tool.target_machine_path = applicable_jobs[chosen_job] @@ -159,17 +160,13 @@ GLOBAL_DATUM_INIT(objective_machine_handler, /datum/objective_target_machine_han . += span_notice("This device must be placed by clicking on a [initial(target_machine_path.name)] with it. It can be removed with a screwdriver.") . += span_notice("Remember, you may leave behind fingerprints on the device. Wear gloves when handling it to be safe!") -/obj/item/traitor_machine_trapper/afterattack(atom/movable/target, mob/user, proximity_flag, click_parameters) +/obj/item/traitor_machine_trapper/pre_attack(atom/target, mob/living/user, params) . = ..() - if(!user.Adjacent(target)) + if (. || !istype(target, target_machine_path)) return - if(!istype(target, target_machine_path)) - balloon_alert(user, "invalid target!") - return - . |= AFTERATTACK_PROCESSED_ITEM balloon_alert(user, "planting device...") if(!do_after(user, delay = deploy_time, target = src, interaction_key = DOAFTER_SOURCE_PLANTING_DEVICE)) - return + return TRUE target.AddComponent(\ /datum/component/interaction_booby_trap,\ additional_triggers = list(COMSIG_ORM_COLLECTED_ORE),\ @@ -178,6 +175,7 @@ GLOBAL_DATUM_INIT(objective_machine_handler, /datum/objective_target_machine_han ) RegisterSignal(target, COMSIG_PARENT_QDELETING, GLOBAL_PROC_REF(qdel), src) moveToNullspace() + return TRUE /// Called when applied trap is triggered, mark success /obj/item/traitor_machine_trapper/proc/on_triggered(atom/machine) diff --git a/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm b/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm index 6a5f2ec85e4f..e1ccae88bc37 100644 --- a/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm +++ b/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm @@ -101,7 +101,13 @@ "The Captain is a lizardperson.", "Nanotrasen isn't real.", "They put something in the food to make you forget.", - "You are the only real person on the station." + "You are the only real person on the station.", + "Things would be a lot better on the station if more people were screaming, someone should do something about that.", + "The people in charge around here have only ill intentions for the crew.", + "Help the crew? What have they ever done for you anyways?", + "Does your bag feel lighter? I bet those guys in Security stole something from it. Go get it back.", + "Command is incompetent, someone with some REAL authority should take over around here.", + "The cyborgs and the AI are stalking you. What are they planning?", ) /datum/surgery_step/brainwash/sleeper_agent/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) diff --git a/code/modules/antagonists/traitor/objectives/steal.dm b/code/modules/antagonists/traitor/objectives/steal.dm index ce0020c8cadb..2ee09ec67bad 100644 --- a/code/modules/antagonists/traitor/objectives/steal.dm +++ b/code/modules/antagonists/traitor/objectives/steal.dm @@ -97,6 +97,9 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) possible_items = list( /datum/objective_item/steal/traitor/cargo_budget, /datum/objective_item/steal/traitor/clown_shoes, + /datum/objective_item/steal/traitor/lawyers_badge, + /datum/objective_item/steal/traitor/chef_moustache, + /datum/objective_item/steal/traitor/pka, ) /datum/traitor_objective/steal_item/somewhat_risky @@ -128,10 +131,12 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) /datum/objective_item/steal/traitor/captain_spare, ) -/datum/traitor_objective/steal_item/most_risky/generate_objective(datum/mind/generating_for, list/possible_duplicates) +//monkestation removal start, this was added with biddle traitor and then was just never removed when steal got reworked +/*/datum/traitor_objective/steal_item/most_risky/generate_objective(datum/mind/generating_for, list/possible_duplicates) if(!handler.get_completion_count(/datum/traitor_objective/steal_item/very_risky)) return FALSE - return ..() + return ..()*/ +//monkestation removal end /datum/traitor_objective/steal_item/generate_objective(datum/mind/generating_for, list/possible_duplicates) for(var/datum/traitor_objective/steal_item/objective as anything in possible_duplicates) @@ -266,7 +271,12 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) return if(IS_TRAITOR(user)) - if(target_object_type) +//monkestation edit start + var/datum/traitor_objective/tide_bug_department/resolved_objective = objective_weakref?.resolve() + if(resolved_objective) + . += span_notice("This device must be placed by using it in hand inside the [initial(resolved_objective.targeted_area?.name)].") +//monkestation edit end + else if(target_object_type) //monkestation edit: makes this an else if . += span_notice("This device must be placed by clicking on the [initial(target_object_type.name)] with it.") . += span_notice("Remember, you may leave behind fingerprints or fibers on the device. Use soap or similar to scrub it clean to be safe!") diff --git a/code/modules/antagonists/traitor/uplink_handler.dm b/code/modules/antagonists/traitor/uplink_handler.dm index 30c209a517c7..40b5d97c0cff 100644 --- a/code/modules/antagonists/traitor/uplink_handler.dm +++ b/code/modules/antagonists/traitor/uplink_handler.dm @@ -70,13 +70,18 @@ return FALSE return TRUE -/datum/uplink_handler/proc/can_purchase_item(mob/user, datum/uplink_item/to_purchase) +/datum/uplink_handler/proc/can_purchase_item(mob/user, datum/uplink_item/to_purchase, ignore_locked = FALSE) //monkestation edit: adds ignore_locked if(debug_mode) return TRUE if(shop_locked) return FALSE +//monkestation edit start + if(!(ignore_locked) && (to_purchase.type in locked_entries)) + return FALSE +//monkestation edit end + if(to_purchase.lock_other_purchases) // Can't purchase an uplink item that locks other purchases if you've already purchased something if(length(purchase_log.purchase_log) > 0) @@ -93,7 +98,7 @@ return TRUE /datum/uplink_handler/proc/purchase_item(mob/user, datum/uplink_item/to_purchase, atom/movable/source) - if(!can_purchase_item(user, to_purchase)) + if(!can_purchase_item(user, to_purchase) || !to_purchase.unique_checks(user, src, source)) //monkestation edit: adds the unique_checks() check return if(to_purchase.limited_stock != -1 && !(to_purchase.stock_key in item_stock)) diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index eedc80471242..04cc5fb05a3e 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -86,7 +86,7 @@ /obj/item/veilrender/honkrender name = "honk render" desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast circus." - spawn_type = /mob/living/simple_animal/hostile/retaliate/clown + spawn_type = /mob/living/basic/clown spawn_amt = 10 activate_descriptor = "depression" rend_desc = "Gently wafting with the sounds of endless laughter." @@ -97,7 +97,7 @@ /obj/item/veilrender/honkrender/honkhulkrender name = "superior honk render" desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast circus. This one gleams with a special light." - spawn_type = /mob/living/simple_animal/hostile/retaliate/clown/clownhulk + spawn_type = /mob/living/basic/clown/clownhulk spawn_amt = 5 activate_descriptor = "depression" rend_desc = "Gently wafting with the sounds of mirthful grunting." diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index 0a0746e52992..5aaaae141979 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -35,20 +35,14 @@ /obj/item/soulstone/update_appearance(updates) . = ..() - for(var/mob/living/simple_animal/shade/sharded_shade in src) + for(var/mob/living/basic/shade/sharded_shade in src) switch(theme) if(THEME_HOLY) sharded_shade.name = "Purified [sharded_shade.real_name]" - sharded_shade.icon_state = "shade_holy" - sharded_shade.loot = list(/obj/item/ectoplasm/angelic) - if(THEME_CULT) + else sharded_shade.name = sharded_shade.real_name - sharded_shade.icon_state = "shade_cult" - sharded_shade.loot = list(/obj/item/ectoplasm) - if(THEME_WIZARD) - sharded_shade.name = sharded_shade.real_name - sharded_shade.icon_state = "shade_wizard" - sharded_shade.loot = list(/obj/item/ectoplasm/mystic) + sharded_shade.theme = theme + sharded_shade.update_appearance(UPDATE_ICON_STATE) /obj/item/soulstone/update_icon_state() . = ..() @@ -70,7 +64,7 @@ // "dull soulstone" name = "dull [name]" - var/mob/living/simple_animal/shade/shade = locate() in src + var/mob/living/basic/shade/shade = locate() in src if(shade) // "(dull) soulstone: Urist McCaptain" name = "[name]: [shade.real_name]" @@ -159,7 +153,7 @@ . += span_cult("This shard is spent; it is now just a creepy rock.") /obj/item/soulstone/Destroy() //Stops the shade from being qdel'd immediately and their ghost being sent back to the arrival shuttle. - for(var/mob/living/simple_animal/shade/shade in src) + for(var/mob/living/basic/shade/shade in src) INVOKE_ASYNC(shade, TYPE_PROC_REF(/mob/living, death)) return ..() @@ -212,7 +206,7 @@ release_shades(user) /obj/item/soulstone/proc/release_shades(mob/user, silent = FALSE) - for(var/mob/living/simple_animal/shade/captured_shade in src) + for(var/mob/living/basic/shade/captured_shade in src) captured_shade.forceMove(get_turf(user)) captured_shade.cancel_camera() update_appearance() @@ -229,7 +223,7 @@ on_release_spirits() /obj/item/soulstone/pre_attack(atom/A, mob/living/user, params) - var/mob/living/simple_animal/shade/occupant = (locate() in src) + var/mob/living/basic/shade/occupant = (locate() in src) var/obj/item/storage/toolbox/mechanical/target_toolbox = A if(!occupant || !istype(target_toolbox) || target_toolbox.has_soul) return ..() @@ -322,7 +316,7 @@ return TRUE //it'll probably get someone ;) ///captures a shade that was previously released from a soulstone. -/obj/item/soulstone/proc/capture_shade(mob/living/simple_animal/shade/shade, mob/living/user) +/obj/item/soulstone/proc/capture_shade(mob/living/basic/shade/shade, mob/living/user) if(isliving(user) && !role_check(user)) user.Unconscious(10 SECONDS) to_chat(user, span_userdanger("Your body is wracked with debilitating pain!")) @@ -345,7 +339,7 @@ ///transfer the mind of the shade to a construct mob selected by the user, then deletes both the shade and src. /obj/item/soulstone/proc/transfer_to_construct(obj/structure/constructshell/shell, mob/user) - var/mob/living/simple_animal/shade/shade = locate() in src + var/mob/living/basic/shade/shade = locate() in src if(!shade) to_chat(user, "[span_userdanger("Creation failed!")]: [src] is empty! Go kill someone!") return FALSE @@ -377,7 +371,7 @@ if(!shade_controller) shade_controller = victim victim.stop_sound_channel(CHANNEL_HEARTBEAT) - var/mob/living/simple_animal/shade/soulstone_spirit = new /mob/living/simple_animal/shade(src) + var/mob/living/basic/shade/soulstone_spirit = new /mob/living/basic/shade(src) soulstone_spirit.AddComponent(/datum/component/soulstoned, src) soulstone_spirit.name = "Shade of [victim.real_name]" soulstone_spirit.real_name = "Shade of [victim.real_name]" @@ -464,42 +458,42 @@ switch(construct_class) if(CONSTRUCT_JUGGERNAUT) if(IS_CULTIST(creator)) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/juggernaut, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the makeNewConstruct proc + makeNewConstruct(/mob/living/basic/construct/juggernaut, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the makeNewConstruct proc return switch(theme) if(THEME_WIZARD) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/juggernaut/mystic, target, creator, cultoverride, loc_override) + makeNewConstruct(/mob/living/basic/construct/juggernaut/mystic, target, creator, cultoverride, loc_override) if(THEME_HOLY) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/juggernaut/angelic, target, creator, cultoverride, loc_override) + makeNewConstruct(/mob/living/basic/construct/juggernaut/angelic, target, creator, cultoverride, loc_override) if(THEME_CULT) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/juggernaut/noncult, target, creator, cultoverride, loc_override) + makeNewConstruct(/mob/living/basic/construct/juggernaut, target, creator, cultoverride, loc_override) if(CONSTRUCT_WRAITH) if(IS_CULTIST(creator)) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the makeNewConstruct proc + makeNewConstruct(/mob/living/basic/construct/wraith, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the makeNewConstruct proc return switch(theme) if(THEME_WIZARD) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith/mystic, target, creator, cultoverride, loc_override) + makeNewConstruct(/mob/living/basic/construct/wraith/mystic, target, creator, cultoverride, loc_override) if(THEME_HOLY) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith/angelic, target, creator, cultoverride, loc_override) + makeNewConstruct(/mob/living/basic/construct/wraith/angelic, target, creator, cultoverride, loc_override) if(THEME_CULT) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith/noncult, target, creator, cultoverride, loc_override) + makeNewConstruct(/mob/living/basic/construct/wraith, target, creator, cultoverride, loc_override) if(CONSTRUCT_ARTIFICER) if(IS_CULTIST(creator)) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/artificer, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the makeNewConstruct proc + makeNewConstruct(/mob/living/basic/construct/artificer, target, creator, cultoverride, loc_override) // ignore themes, the actual giving of cult info is in the makeNewConstruct proc return switch(theme) if(THEME_WIZARD) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/artificer/mystic, target, creator, cultoverride, loc_override) + makeNewConstruct(/mob/living/basic/construct/artificer/mystic, target, creator, cultoverride, loc_override) if(THEME_HOLY) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/artificer/angelic, target, creator, cultoverride, loc_override) + makeNewConstruct(/mob/living/basic/construct/artificer/angelic, target, creator, cultoverride, loc_override) if(THEME_CULT) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/artificer/noncult, target, creator, cultoverride, loc_override) + makeNewConstruct(/mob/living/basic/construct/artificer/noncult, target, creator, cultoverride, loc_override) -/proc/makeNewConstruct(mob/living/simple_animal/hostile/construct/ctype, mob/target, mob/stoner = null, cultoverride = FALSE, loc_override = null) +/proc/makeNewConstruct(mob/living/basic/construct/ctype, mob/target, mob/stoner = null, cultoverride = FALSE, loc_override = null) if(QDELETED(target)) return - var/mob/living/simple_animal/hostile/construct/newstruct = new ctype((loc_override) ? (loc_override) : (get_turf(target))) + var/mob/living/basic/construct/newstruct = new ctype((loc_override) ? (loc_override) : (get_turf(target))) var/makeicon = newstruct.icon_state var/theme = newstruct.theme flick("make_[makeicon][theme]", newstruct) diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/assistance.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/assistance.dm index 9227165c40a2..e576d7738c3d 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/assistance.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/assistance.dm @@ -69,7 +69,7 @@ name = "Guardian Deck" desc = "A deck of guardian tarot cards, capable of binding a personal guardian to your body. There are multiple types of guardian available, but all of them will transfer some amount of damage to you. \ It would be wise to avoid buying these with anything capable of causing you to swap bodies with others." - item_path = /obj/item/guardiancreator/choose/wizard + item_path = /obj/item/guardian_creator/wizard category = "Assistance" /datum/spellbook_entry/item/bloodbottle diff --git a/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm b/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm index 88ec1686693f..0a00aff9905e 100644 --- a/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm +++ b/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm @@ -1,5 +1,5 @@ /// Number of times you need to cast on the rune to complete it -#define GRAND_RUNE_INVOKES_TO_COMPLETE 3 +//#define GRAND_RUNE_INVOKES_TO_COMPLETE 3 //monkestation removal /// Base time to take to invoke one stage of the rune. This is done three times to complete the rune. #define BASE_INVOKE_TIME 7 SECONDS /// Time to add on to each step every time a previous rune is completed. @@ -90,22 +90,31 @@ /obj/effect/grand_rune/examine(mob/user) . = ..() - if (times_invoked >= GRAND_RUNE_INVOKES_TO_COMPLETE) + if (times_invoked >= invokes_needed) //monkestation edit: replaced GRAND_RUNE_INVOKES_TO_COMPLETE with invokes_needed . += span_notice("Its power seems to have been expended.") return if(!IS_WIZARD(user)) return - . += span_notice("Invoke this rune [GRAND_RUNE_INVOKES_TO_COMPLETE - times_invoked] more times to complete the ritual.") + . += span_notice("Invoke this rune [invokes_needed - times_invoked] more times to complete the ritual.")//monkestation edit: replaced GRAND_RUNE_INVOKES_TO_COMPLETE with invokes_needed /obj/effect/grand_rune/can_interact(mob/living/user) . = ..() if(!.) return - if(!IS_WIZARD(user)) +//monkestation edit start + if(!owning_mind && !IS_WIZARD(user)) + return FALSE + + else if(owning_mind && !(user.mind == owning_mind?.resolve())) return FALSE +//monkestation edit end +//monkestation removal start + /*if(!IS_WIZARD(user)) + return FALSE*/ +//monkestation removal end if(is_in_use) return FALSE - if (times_invoked >= GRAND_RUNE_INVOKES_TO_COMPLETE) + if (times_invoked >= invokes_needed) //monkestation edit: replaced GRAND_RUNE_INVOKES_TO_COMPLETE with invokes_needed return FALSE return TRUE @@ -157,7 +166,7 @@ for(var/obj/machinery/light/light in orange(4, src.loc)) light.flicker() - if(times_invoked >= GRAND_RUNE_INVOKES_TO_COMPLETE) + if(times_invoked >= invokes_needed) //monkestation edit: replaced GRAND_RUNE_INVOKES_TO_COMPLETE with invokes_needed on_invocation_complete(user) return flick("[icon_state]_flash", src) @@ -187,6 +196,7 @@ SEND_SIGNAL(src, COMSIG_GRAND_RUNE_COMPLETE) flick("activate", src) addtimer(CALLBACK(src, PROC_REF(remove_rune)), 6) + SSblackbox.record_feedback("amount", "grand_runes_invoked", 1) /obj/effect/grand_rune/proc/remove_rune() new remains_typepath(get_turf(src)) @@ -264,7 +274,7 @@ new_influence.after_drain() created++ -#undef GRAND_RUNE_INVOKES_TO_COMPLETE +//#undef GRAND_RUNE_INVOKES_TO_COMPLETE //monkestation removal #undef BASE_INVOKE_TIME #undef ADD_INVOKE_TIME @@ -345,8 +355,10 @@ add_filter("finale_picked_glow", 2, list("type" = "outline", "color" = spell_colour, "size" = 2)) /obj/effect/grand_rune/finale/summon_round_event(mob/living/user) + user.client?.give_award(/datum/award/achievement/misc/grand_ritual_finale, user) if (!finale_effect) return ..() + SSblackbox.record_feedback("tally", "grand_ritual_finale", 1, finale_effect) finale_effect.trigger(user) /obj/effect/grand_rune/finale/get_invoke_time() diff --git a/code/modules/antagonists/wizard/grand_ritual/grand_side_effect.dm b/code/modules/antagonists/wizard/grand_ritual/grand_side_effect.dm index 008d9d698e08..950390a7227d 100644 --- a/code/modules/antagonists/wizard/grand_ritual/grand_side_effect.dm +++ b/code/modules/antagonists/wizard/grand_ritual/grand_side_effect.dm @@ -352,12 +352,12 @@ abstract = FALSE /// Typepaths of mobs to create var/static/list/permitted_mobs = list( - /mob/living/basic/wumborian_fugu, - /mob/living/simple_animal/hostile/skeleton, + /mob/living/basic/carp, /mob/living/basic/killer_tomato, - /mob/living/simple_animal/hostile/ooze, + /mob/living/basic/skeleton, + /mob/living/basic/wumborian_fugu, /mob/living/simple_animal/hostile/illusion, - /mob/living/basic/carp, + /mob/living/simple_animal/hostile/ooze, ) /datum/grand_side_effect/spawn_delayed_mobs/trigger(potency, turf/ritual_location, mob/invoker) diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 5f7ff984dc1f..cced5fe3f251 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -115,9 +115,6 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) RegisterSignal(ritual, COMSIG_GRAND_RITUAL_FINAL_COMPLETE, PROC_REF(on_ritual_complete)) /datum/antagonist/wizard/proc/send_to_lair() - // And now we ensure that its loaded - SSmapping.lazy_load_template(LAZY_TEMPLATE_KEY_WIZARDDEN) - if(!owner.current) return if(!GLOB.wizardstart.len) diff --git a/code/modules/awaymissions/cordon.dm b/code/modules/awaymissions/cordon.dm index d86ff7f8ad64..177fc85ba37d 100644 --- a/code/modules/awaymissions/cordon.dm +++ b/code/modules/awaymissions/cordon.dm @@ -40,7 +40,8 @@ return /turf/cordon/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit) - return BULLET_ACT_HIT + SHOULD_CALL_PARENT(FALSE) // Fuck you + return BULLET_ACT_BLOCK /turf/cordon/Adjacent(atom/neighbor, atom/target, atom/movable/mover) return FALSE diff --git a/code/modules/bitrunning/components/avatar_connection.dm b/code/modules/bitrunning/components/avatar_connection.dm index 2a151d05066d..60816eab2ae7 100644 --- a/code/modules/bitrunning/components/avatar_connection.dm +++ b/code/modules/bitrunning/components/avatar_connection.dm @@ -68,7 +68,7 @@ /datum/component/avatar_connection/RegisterWithParent() ADD_TRAIT(parent, TRAIT_TEMPORARY_BODY, REF(src)) RegisterSignal(parent, COMSIG_BITRUNNER_SAFE_DISCONNECT, PROC_REF(on_safe_disconnect)) - RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(on_sever_connection), override = TRUE) + RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(on_sever_connection)) RegisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_linked_damage)) /datum/component/avatar_connection/UnregisterFromParent() @@ -79,7 +79,9 @@ /// Disconnects the avatar and returns the mind to the old_body. /datum/component/avatar_connection/proc/full_avatar_disconnect(forced = FALSE, datum/source) +#ifndef UNIT_TESTS return_to_old_body() +#endif var/obj/machinery/netpod/hosting_netpod = netpod_ref?.resolve() if(isnull(hosting_netpod) && istype(source, /obj/machinery/netpod)) @@ -105,7 +107,7 @@ ) /// Transfers damage from the avatar to the old_body -/datum/component/avatar_connection/proc/on_linked_damage(datum/source, damage, damage_type, def_zone, blocked, forced) +/datum/component/avatar_connection/proc/on_linked_damage(datum/source, damage, damage_type, def_zone, blocked, ...) SIGNAL_HANDLER var/mob/living/carbon/old_body = old_body_ref?.resolve() @@ -120,7 +122,7 @@ if(damage > 30 && prob(30)) INVOKE_ASYNC(old_body, TYPE_PROC_REF(/mob/living, emote), "scream") - old_body.apply_damage(damage, damage_type, def_zone, blocked, forced, wound_bonus = CANT_WOUND) + old_body.apply_damage(damage, damage_type, def_zone, blocked, wound_bonus = CANT_WOUND) if(old_body.stat > SOFT_CRIT) // KO! full_avatar_disconnect(forced = TRUE) diff --git a/code/modules/bitrunning/designs.dm b/code/modules/bitrunning/designs.dm new file mode 100644 index 000000000000..f20497c8dd46 --- /dev/null +++ b/code/modules/bitrunning/designs.dm @@ -0,0 +1,89 @@ +// Quantum server + +/obj/item/circuitboard/machine/quantum_server + name = "Quantum Server" + greyscale_colors = CIRCUIT_COLOR_SUPPLY + build_path = /obj/machinery/quantum_server + req_components = list( +// /datum/stock_part/servo = 2, MONKEYSTATION EDIT ORIGINAL - We have manipulators instead of servo's + /datum/stock_part/manipulator = 2, // MONKEYSTATION EDIT NEW - We have manipulators instead of servo's + /datum/stock_part/scanning_module = 1, + /datum/stock_part/capacitor = 1, + ) + +/** + * quantum server design + * are you absolutely sure?? + */ + +// Netpod + +/obj/item/circuitboard/machine/netpod + name = "Netpod" + greyscale_colors = CIRCUIT_COLOR_SUPPLY + build_path = /obj/machinery/netpod + req_components = list( +// /datum/stock_part/servo = 1, MONKEYSTATION EDIT ORIGINAL - We have manipulators instead of servo's + /datum/stock_part/manipulator = 1, // MONKEYSTATION EDIT NEW - We have manipulators instead of servo's + /datum/stock_part/matter_bin = 2, + ) + +/datum/design/board/netpod + name = "Netpod Board" + desc = "The circuit board for a netpod." + id = "netpod" + build_path = /obj/item/circuitboard/machine/netpod + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_CARGO + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +// Quantum console + +/obj/item/circuitboard/computer/quantum_console + name = "Quantum Console" + greyscale_colors = CIRCUIT_COLOR_SUPPLY + build_path = /obj/machinery/computer/quantum_console + +/datum/design/board/quantum_console + name = "Quantum Console Board" + desc = "Allows for the construction of circuit boards used to build a Quantum Console." + id = "quantum_console" + build_path = /obj/item/circuitboard/computer/quantum_console + category = list( + RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_CARGO + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +// Byteforge + +/obj/item/circuitboard/machine/byteforge + name = "Byteforge" + greyscale_colors = CIRCUIT_COLOR_SUPPLY + build_path = /obj/machinery/byteforge + req_components = list( + /datum/stock_part/micro_laser = 1, + ) + +/datum/design/board/byteforge + name = "Byteforge Board" + desc = "Allows for the construction of circuit boards used to build a Byteforge." + id = "byteforge" + build_path = /obj/item/circuitboard/machine/byteforge + category = list( + RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_CARGO + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + + +/datum/techweb_node/bitrunning + id = "bitrunning" + display_name = "Bitrunning Technology" + description = "Bluespace technology has led to the development of quantum-scale computing, which unlocks the means to materialize atomic structures while executing advanced programs." + prereq_ids = list("practical_bluespace") + design_ids = list( + "byteforge", + "quantum_console", + "netpod", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/code/modules/bitrunning/event.dm b/code/modules/bitrunning/event.dm index 0ac35a2df8f2..daae0d15c09e 100644 --- a/code/modules/bitrunning/event.dm +++ b/code/modules/bitrunning/event.dm @@ -18,7 +18,7 @@ ROLE_CYBER_POLICE, ) -/datum/round_event_control/bitrunning_glitch/can_spawn_event(players_amt, allow_magic = FALSE) +/datum/round_event_control/bitrunning_glitch/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) . = ..() if(!.) return . diff --git a/code/modules/bitrunning/objects/byteforge.dm b/code/modules/bitrunning/objects/byteforge.dm new file mode 100644 index 000000000000..c62149662104 --- /dev/null +++ b/code/modules/bitrunning/objects/byteforge.dm @@ -0,0 +1,56 @@ +/obj/machinery/byteforge + name = "byteforge" + + circuit = /obj/item/circuitboard/machine/byteforge + desc = "A machine used by the quantum server. Quantum code converges here, materializing decrypted assets from the virtual abyss." + icon = 'icons/obj/machines/bitrunning.dmi' + icon_state = "byteforge" + obj_flags = BLOCKS_CONSTRUCTION + /// Idle particles + var/mutable_appearance/byteforge_particles + +/obj/machinery/byteforge/Initialize(mapload) + . = ..() + + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/byteforge/LateInitialize() + . = ..() + + byteforge_particles = mutable_appearance(initial(icon), "on_particles", ABOVE_MOB_LAYER) + setup_particles() + +/obj/machinery/byteforge/update_appearance(updates) + . = ..() + + setup_particles() + +/// Adds the particle overlays to the byteforge +/obj/machinery/byteforge/proc/setup_particles() + cut_overlays() + + if(is_operational) + add_overlay(byteforge_particles) + +/// Begins spawning the crate - lights, overlays, etc +/obj/machinery/byteforge/proc/start_to_spawn(obj/structure/closet/crate/secure/bitrunning/encrypted/cache) + addtimer(CALLBACK(src, PROC_REF(spawn_crate), cache), 1 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) + + var/mutable_appearance/lighting = mutable_appearance(initial(icon), "on_overlay") + flick_overlay_view(lighting, 1 SECONDS) + +// set_light(l_range = 2, l_power = 1.5, l_color = LIGHT_COLOR_BABY_BLUE, l_on = TRUE) MONKEYSTATION EDIT ORIGINAL - We have changed lights + set_light(l_inner_range = 1, l_outer_range = 2, l_power = 1.5, l_color = LIGHT_COLOR_BABY_BLUE, l_on = TRUE) // MONKEYSTATION EDIT NEW + +/// Sparks, moves the crate to the location +/obj/machinery/byteforge/proc/spawn_crate(obj/structure/closet/crate/secure/bitrunning/encrypted/cache) + if(QDELETED(cache)) + return + + playsound(src, 'sound/magic/blink.ogg', 50, TRUE) + var/datum/effect_system/spark_spread/quantum/sparks = new() + sparks.set_up(5, 1, loc) + sparks.start() + + cache.forceMove(loc) + set_light(l_on = FALSE) diff --git a/code/modules/bitrunning/objects/disks.dm b/code/modules/bitrunning/objects/disks.dm index b1cfab2078c0..66422b5386ab 100644 --- a/code/modules/bitrunning/objects/disks.dm +++ b/code/modules/bitrunning/objects/disks.dm @@ -13,9 +13,12 @@ /// Name of the choice made var/choice_made + var/monkeystation_override = FALSE // monkeystation change, override for disks with single powers/items + /obj/item/bitrunning_disk/Initialize(mapload) . = ..() - + if(monkeystation_override) // monkeystation change, override for disks with single powers/items + return icon_state = "[base_icon_state][rand(0, 7)]" update_icon() RegisterSignal(src, COMSIG_PARENT_EXAMINE, PROC_REF(on_examined)) @@ -25,6 +28,9 @@ examine_text += span_infoplain("This disk must be carried on your person into a netpod to be used.") + if(monkeystation_override) // monkeystation change, override for disks with single powers/items + return + if(isnull(choice_made)) examine_text += span_notice("To make a selection, toggle the disk in hand.") return diff --git a/code/modules/bitrunning/objects/host_monitor.dm b/code/modules/bitrunning/objects/host_monitor.dm index 16e0a78c22f6..2225e247fe29 100644 --- a/code/modules/bitrunning/objects/host_monitor.dm +++ b/code/modules/bitrunning/objects/host_monitor.dm @@ -1,11 +1,11 @@ /obj/item/bitrunning_host_monitor name = "host monitor" - - custom_materials = list(/datum/material/iron = 200) - desc = "A complex medical device that, when attached to an avatar's data stream, can detect the user of their host's health." +// custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 2) // MONKEYSTATION EDIT ORIGINAL - we use the other material system + custom_materials = list(/datum/material/iron = 200) // MONKEYSTATION EDIT NEW + desc = "A complex electronic that will analyze the connection health between host and avatar." flags_1 = CONDUCT_1 - icon = 'icons/obj/telescience.dmi' - icon_state = "gps-b" + icon = 'icons/obj/device.dmi' + icon_state = "host_monitor" inhand_icon_state = "electronic" item_flags = NOBLUDGEON lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi' diff --git a/code/modules/bitrunning/objects/landmarks.dm b/code/modules/bitrunning/objects/landmarks.dm index d78283c6a8b2..d727025c9286 100644 --- a/code/modules/bitrunning/objects/landmarks.dm +++ b/code/modules/bitrunning/objects/landmarks.dm @@ -44,11 +44,6 @@ qdel(src) -/// Where the crates get ported to station -/obj/effect/landmark/bitrunning/station_reward_spawn - name = "Bitrunning rewards spawn" - icon_state = "station" - /// Where the exit hololadder spawns /obj/effect/landmark/bitrunning/hololadder_spawn name = "Bitrunning hololadder spawn" @@ -68,3 +63,41 @@ /obj/effect/landmark/bitrunning/safehouse_spawn name = "Bitrunning safehouse spawn" icon_state = "safehouse" + +///Swaps the locations of an encrypted crate in the area with another randomly selected crate. +///Randomizes names, so you have to inspect crates manually. +/obj/effect/landmark/bitrunning/crate_replacer + name = "Bitrunning Goal Crate Randomizer" + icon_state = "crate" + +/obj/effect/landmark/bitrunning/crate_replacer/Initialize(mapload) + . = ..() + + #ifndef UNIT_TESTS + var/list/crate_list = list() + var/obj/structure/closet/crate/secure/bitrunning/encrypted/encrypted_crate + var/area/my_area = get_area(src) + + for(var/turf/area_turf as anything in my_area.get_contained_turfs()) + for(var/obj/structure/closet/crate/crate_to_check in area_turf) + if(istype(crate_to_check, /obj/structure/closet/crate/secure/bitrunning/encrypted)) + encrypted_crate = crate_to_check + crate_to_check.desc += span_hypnophrase(" This feels like the crate we're looking for!") + else + crate_list += crate_to_check + crate_to_check.name = "Unidentified Crate" + + if(!encrypted_crate) + stack_trace("Bitrunning Goal Crate Randomizer failed to find an encrypted crate to swap positions for.") + return + if(!length(crate_list)) + stack_trace("Bitrunning Goal Crate Randomizer failed to find any NORMAL crates to swap positions for.") + return + + var/original_location = encrypted_crate.loc + var/obj/structure/closet/crate/selected_crate = pick(crate_list) + + encrypted_crate.abstract_move(selected_crate.loc) + selected_crate.abstract_move(original_location) + + #endif diff --git a/code/modules/bitrunning/objects/netpod.dm b/code/modules/bitrunning/objects/netpod.dm index 2038dbee9fcd..cfd2aba2a809 100644 --- a/code/modules/bitrunning/objects/netpod.dm +++ b/code/modules/bitrunning/objects/netpod.dm @@ -189,7 +189,7 @@ return TRUE /obj/machinery/netpod/ui_interact(mob/user, datum/tgui/ui) - if(!is_operational) + if(!is_operational || occupant) return ui = SStgui.try_update_ui(user, src, ui) @@ -242,20 +242,12 @@ to_chat(player, span_notice("The machine disconnects itself and begins to drain.")) open_machine() -/** - * ### Disconnect occupant - * If this goes smoothly, should reconnect a receiving mind to the occupant's body - * - * This is the second stage of the process - if you want to disconn avatars start at the mind first - */ +/// Handles occupant post-disconnection effects like damage, sounds, etc /obj/machinery/netpod/proc/disconnect_occupant(forced = FALSE) - var/mob/living/mob_occupant = occupant - if(isnull(occupant) || !isliving(occupant)) - return - connected = FALSE - if(mob_occupant.stat == DEAD) + var/mob/living/mob_occupant = occupant + if(isnull(occupant) || !isliving(occupant) || mob_occupant.stat == DEAD) open_machine() return @@ -347,8 +339,9 @@ return server_ref = WEAKREF(server) - RegisterSignal(server, COMSIG_BITRUNNER_SERVER_UPGRADED, PROC_REF(on_server_upgraded), override = TRUE) - RegisterSignal(server, COMSIG_BITRUNNER_DOMAIN_COMPLETE, PROC_REF(on_domain_complete), override = TRUE) + RegisterSignal(server, COMSIG_BITRUNNER_SERVER_UPGRADED, PROC_REF(on_server_upgraded)) + RegisterSignal(server, COMSIG_BITRUNNER_DOMAIN_COMPLETE, PROC_REF(on_domain_complete)) + RegisterSignal(server, COMSIG_BITRUNNER_DOMAIN_SCRUBBED, PROC_REF(on_domain_scrubbed)) return server @@ -395,6 +388,7 @@ account.bitrunning_points += reward_points * 100 +/// User inspects the machine /obj/machinery/netpod/proc/on_examine(datum/source, mob/examiner, list/examine_text) SIGNAL_HANDLER @@ -409,7 +403,15 @@ examine_text += span_notice("It is currently occupied by [occupant].") examine_text += span_notice("It can be pried open with a crowbar, but its safety mechanisms will alert the occupant.") +/// The domain has been fully purged, so we should double check our avatar is deleted +/obj/machinery/netpod/proc/on_domain_scrubbed(datum/source) + SIGNAL_HANDLER + + var/mob/living/current_avatar = avatar_ref?.resolve() + if(isnull(current_avatar)) + return + QDEL_NULL(current_avatar) /// When the server is upgraded, drops brain damage a little /obj/machinery/netpod/proc/on_server_upgraded(datum/source, servo_rating) diff --git a/code/modules/bitrunning/objects/bit_vendor.dm b/code/modules/bitrunning/objects/vendor.dm similarity index 94% rename from code/modules/bitrunning/objects/bit_vendor.dm rename to code/modules/bitrunning/objects/vendor.dm index 8db855cf62f9..a995c0c0b6a9 100644 --- a/code/modules/bitrunning/objects/bit_vendor.dm +++ b/code/modules/bitrunning/objects/vendor.dm @@ -19,8 +19,10 @@ order_categories = list( CATEGORY_BITRUNNING_FLAIR, - CATEGORY_BITRUNNING_TECH, +// CATEGORY_BITRUNNING_TECH, Monkestation removal: split up into combat gear and abilities tabs CATEGORY_BEPIS, + CATEGORY_BITRUNNING_COMBAT_GEAR, + CATEGORY_BITRUNNING_ABILITIES, ) blackbox_key = "bitrunning" diff --git a/code/modules/bitrunning/antagonists/outfit.dm b/code/modules/bitrunning/outfits.dm similarity index 61% rename from code/modules/bitrunning/antagonists/outfit.dm rename to code/modules/bitrunning/outfits.dm index 67e80add3a9b..9a0a69237819 100644 --- a/code/modules/bitrunning/antagonists/outfit.dm +++ b/code/modules/bitrunning/outfits.dm @@ -29,3 +29,18 @@ officer_uniform.has_sensor = NO_SENSORS officer_uniform.sensor_mode = SENSOR_OFF user.update_suit_sensors() + +/datum/outfit/echolocator + name = "Bitrunning Echolocator" + glasses = /obj/item/clothing/glasses/blindfold +// ears = /obj/item/radio/headset/psyker //Navigating without these is horrible. MONKEYSTATION EDIT ORIGINAL - we still have old psyker headsets + ears = /obj/item/radio/headset/syndicate/alt/psyker // MONKEYSTATION EDIT NEW + uniform = /obj/item/clothing/under/abductor + gloves = /obj/item/clothing/gloves/fingerless + shoes = /obj/item/clothing/shoes/jackboots + suit = /obj/item/clothing/suit/jacket/trenchcoat + id = /obj/item/card/id/advanced + +/datum/outfit/echolocator/post_equip(mob/living/carbon/human/user, visualsOnly) + . = ..() + user.psykerize() diff --git a/code/modules/bitrunning/server/loot.dm b/code/modules/bitrunning/server/loot.dm index 29b730aae784..8b3af95607c6 100644 --- a/code/modules/bitrunning/server/loot.dm +++ b/code/modules/bitrunning/server/loot.dm @@ -16,14 +16,16 @@ /// Generates a reward based on the given domain /obj/machinery/quantum_server/proc/generate_loot() - if(!length(receive_turfs) && !locate_receive_turfs()) + var/list/obj/machinery/byteforge/nearby_forges = get_nearby_forges() + if(isnull(nearby_forges)) + say(src, "No nearby byteforges detected.") return FALSE points += generated_domain.reward_points playsound(src, 'sound/machines/terminal_success.ogg', 30, 2) - var/turf/dest_turf = pick(receive_turfs) - if(isnull(dest_turf)) + var/obj/machinery/byteforge/chosen_forge = pick(nearby_forges) + if(isnull(chosen_forge)) stack_trace("Failed to find a turf to spawn loot crate on.") return FALSE @@ -34,11 +36,11 @@ certificate.name = "certificate of domain completion" certificate.update_appearance() - var/obj/structure/closet/crate/secure/bitrunning/decrypted/reward_crate = new(dest_turf, generated_domain, bonus) + var/obj/structure/closet/crate/secure/bitrunning/decrypted/reward_crate = new(src, generated_domain, bonus) reward_crate.manifest = certificate reward_crate.update_appearance() - spark_at_location(reward_crate) + chosen_forge.start_to_spawn(reward_crate) return TRUE /// Returns the markdown text containing domain completion information diff --git a/code/modules/bitrunning/server/map_handling.dm b/code/modules/bitrunning/server/map_handling.dm index b0500a400745..3b55edf76669 100644 --- a/code/modules/bitrunning/server/map_handling.dm +++ b/code/modules/bitrunning/server/map_handling.dm @@ -1,3 +1,4 @@ +#define ONLY_TURF 1 /// Gives all current occupants a notification that the server is going down /obj/machinery/quantum_server/proc/begin_shutdown(mob/user) @@ -119,7 +120,6 @@ new /obj/structure/closet/crate/secure/bitrunning/encrypted(pick(crate_turfs)) return TRUE -#define ONLY_TURF 1 // There should only ever be one turf at the bottom left of the map. /// Loads the safehouse /obj/machinery/quantum_server/proc/initialize_safehouse() @@ -160,7 +160,8 @@ /// Deletes all the tile contents /obj/machinery/quantum_server/proc/scrub_vdom() - SEND_SIGNAL(src, COMSIG_BITRUNNER_SEVER_AVATAR) // just in case + SEND_SIGNAL(src, COMSIG_BITRUNNER_SEVER_AVATAR) /// just in case someone's connected + SEND_SIGNAL(src, COMSIG_BITRUNNER_DOMAIN_SCRUBBED) // avatar cleanup just in case if(length(generated_domain.reservations)) var/datum/turf_reservation/res = generated_domain.reservations[1] diff --git a/code/modules/bitrunning/server/quantum_server.dm b/code/modules/bitrunning/server/quantum_server.dm index 43621cf5a922..7fdedeaabc4a 100644 --- a/code/modules/bitrunning/server/quantum_server.dm +++ b/code/modules/bitrunning/server/quantum_server.dm @@ -48,8 +48,6 @@ var/servo_bonus = 0 /// The turfs we can place a hololadder on. var/turf/exit_turfs = list() - /// The turfs on station where we generate loot. - var/turf/receive_turfs = list() /obj/machinery/quantum_server/Initialize(mapload) . = ..() @@ -84,18 +82,18 @@ avatar_connection_refs.Cut() spawned_threat_refs.Cut() QDEL_NULL(exit_turfs) - QDEL_NULL(receive_turfs) QDEL_NULL(generated_domain) QDEL_NULL(generated_safehouse) QDEL_NULL(radio) /obj/machinery/quantum_server/update_appearance(updates) if(isnull(generated_domain) || !is_operational) - set_light(0) + set_light(l_on = FALSE) return ..() set_light_color(is_ready ? LIGHT_COLOR_BABY_BLUE : LIGHT_COLOR_FIRE) - set_light(2, 1.5) +// set_light(l_range = 2, l_power = 1.5, l_on = TRUE) MONKEYSTATION EDIT ORIGINAL - We have changed lights + set_light(l_inner_range = 1, l_outer_range = 2, l_power = 1.5, l_on = TRUE) // MONKEYSTATION EDIT NEW return ..() diff --git a/code/modules/bitrunning/server/util.dm b/code/modules/bitrunning/server/util.dm index 1d35e86de509..9570fd439151 100644 --- a/code/modules/bitrunning/server/util.dm +++ b/code/modules/bitrunning/server/util.dm @@ -58,10 +58,10 @@ "health" = creature.health, "name" = creature.name, "pilot" = pilot, - "brute" = creature.get_damage_amount(BRUTE), - "burn" = creature.get_damage_amount(BURN), - "tox" = creature.get_damage_amount(TOX), - "oxy" = creature.get_damage_amount(OXY), + "brute" = creature.getBruteLoss(), + "burn" = creature.getFireLoss(), + "tox" = creature.getToxLoss(), + "oxy" = creature.getOxyLoss(), )) return hosted_avatars @@ -107,14 +107,14 @@ return shuffle(mutation_candidate_refs) -/// Locates any turfs with crate out landmarks -/obj/machinery/quantum_server/proc/locate_receive_turfs() - for(var/obj/effect/landmark/bitrunning/station_reward_spawn/spawner in GLOB.landmarks_list) - if(IN_GIVEN_RANGE(src, spawner, MAX_DISTANCE)) - receive_turfs += get_turf(spawner) - qdel(spawner) +/// Locates any turfs with forges on them +/obj/machinery/quantum_server/proc/get_nearby_forges() + var/list/obj/machinery/byteforge/nearby_forges = list() - return length(receive_turfs) > 0 + for(var/obj/machinery/byteforge/forge in oview(MAX_DISTANCE, src)) + nearby_forges += forge + + return nearby_forges /// Finds any mobs with minds in the zones and gives them the bad news /obj/machinery/quantum_server/proc/notify_spawned_threats() @@ -132,10 +132,10 @@ to_chat(baddie, span_userdanger("You have been flagged for deletion! Thank you for your service.")) /// Do some magic teleport sparks -/obj/machinery/quantum_server/proc/spark_at_location(obj/crate) - playsound(crate, 'sound/magic/blink.ogg', 50, TRUE) +/obj/machinery/quantum_server/proc/spark_at_location(obj/cache) + playsound(cache, 'sound/magic/blink.ogg', 50, TRUE) var/datum/effect_system/spark_spread/quantum/sparks = new() - sparks.set_up(5, 1, get_turf(crate)) + sparks.set_up(5, 1, get_turf(cache)) sparks.start() #undef REDACTED diff --git a/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm b/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm index 871c2cb1338e..a6fb3e921e05 100644 --- a/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm +++ b/code/modules/bitrunning/virtual_domain/domains/beach_bar.dm @@ -8,12 +8,12 @@ map_name = "beach_bar" safehouse_path = /datum/map_template/safehouse/mine -/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/virtual_domain name = "pina colada" desc = "Whose drink is this? Not yours, that's for sure. Well, it's not like they're going to miss it." list_reagents = list(/datum/reagent/consumable/ethanol/pina_colada = 30) -/obj/item/reagent_containers/cup/glass/drinkingglass/virtual_domain/Initialize(mapload, vol) +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/virtual_domain/Initialize(mapload, vol) . = ..() AddComponent(/datum/component/bitrunning_points, \ diff --git a/code/modules/bitrunning/virtual_domain/domains/gondola_asteroid.dm b/code/modules/bitrunning/virtual_domain/domains/gondola_asteroid.dm index 4deacb4f9c59..01d58e398038 100644 --- a/code/modules/bitrunning/virtual_domain/domains/gondola_asteroid.dm +++ b/code/modules/bitrunning/virtual_domain/domains/gondola_asteroid.dm @@ -28,11 +28,7 @@ /datum/reagent/gondola_mutation_toxin/virtual_domain name = "Advanced Tranquility" - -/datum/reagent/gondola_mutation_toxin/virtual_domain/expose_mob(mob/living/exposed_mob, methods = TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) - . = ..() - if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) - exposed_mob.ForceContractDisease(new /datum/disease/transformation/gondola/virtual_domain(), FALSE, TRUE) + gondola_disease = /datum/disease/transformation/gondola/virtual_domain /datum/disease/transformation/gondola/virtual_domain stage_prob = 9 diff --git a/code/modules/bitrunning/virtual_domain/domains/psyker_shuffle.dm b/code/modules/bitrunning/virtual_domain/domains/psyker_shuffle.dm new file mode 100644 index 000000000000..2ca32bce9834 --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/psyker_shuffle.dm @@ -0,0 +1,12 @@ +/datum/lazy_template/virtual_domain/psyker_shuffle + name = "Crate Chaos" + cost = BITRUNNER_COST_LOW + desc = "Sneak into an abandoned corner of the virtual world, where they store all of the crates. \ + Warning -- Virtual domain does not support visual display. This mission must be completed using echolocation." + difficulty = BITRUNNER_DIFFICULTY_MEDIUM + help_text = "Getting used to echolocation may be difficult. Remember to walk slowly, and carefully inspect every crate you come across." + key = "psyker_shuffle" + map_name = "psyker_shuffle" + reward_points = BITRUNNER_REWARD_MEDIUM + safehouse_path = /datum/map_template/safehouse/bathroom + forced_outfit = /datum/outfit/echolocator diff --git a/code/modules/bitrunning/virtual_domain/domains/psyker_zombies.dm b/code/modules/bitrunning/virtual_domain/domains/psyker_zombies.dm new file mode 100644 index 000000000000..6e0d88fda28f --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/psyker_zombies.dm @@ -0,0 +1,16 @@ +/datum/lazy_template/virtual_domain/psyker_zombies + name = "Infected Domain" + cost = BITRUNNER_COST_MEDIUM + desc = "Another neglected corner of the virtual world. This one had to be abandoned due to zombie virus. \ + Warning -- Virtual domain does not support visual display. This mission must be completed using echolocation." + difficulty = BITRUNNER_DIFFICULTY_MEDIUM + help_text = "This once-beloved virtual domain has been corrupted by a virus, rendering it unstable, full of holes, and full of ZOMBIES! \ + There should be a Mystery Box nearby to help get you armed. Get armed, and finish what the cyber-police started!" + key = "psyker_zombies" + map_name = "psyker_zombies" + reward_points = BITRUNNER_REWARD_HIGH + safehouse_path = /datum/map_template/safehouse/bathroom + forced_outfit = /datum/outfit/echolocator +// extra_loot = list(/obj/item/radio/headset/psyker = 1) //Looks cool, might make your local burdened chaplain happy. MONKEYSTATION EDIT ORIGINAL - we still have old psyker headsets + extra_loot = list(/obj/item/radio/headset/syndicate/alt/psyker = 1) // MONKEYSTATION EDIT NEW + diff --git a/code/modules/bitrunning/virtual_domain/safehouses.dm b/code/modules/bitrunning/virtual_domain/safehouses.dm index bb42f690ac7e..6504d447f28c 100644 --- a/code/modules/bitrunning/virtual_domain/safehouses.dm +++ b/code/modules/bitrunning/virtual_domain/safehouses.dm @@ -46,6 +46,9 @@ /datum/map_template/safehouse/ice filename = "ice.dmm" +/datum/map_template/safehouse/bathroom + filename = "bathroom.dmm" + /** * Your safehouse here * /datum/map_template/safehouse/your_type diff --git a/code/modules/capture_the_flag/ctf_equipment.dm b/code/modules/capture_the_flag/ctf_equipment.dm index 3e8433988934..53a66ed29b52 100644 --- a/code/modules/capture_the_flag/ctf_equipment.dm +++ b/code/modules/capture_the_flag/ctf_equipment.dm @@ -11,7 +11,7 @@ return PROJECTILE_PIERCE_NONE /// hey uhhh don't hit anyone behind them . = ..() -/obj/projectile/beam/ctf/on_hit(atom/target, blocked = FALSE) +/obj/projectile/beam/ctf/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(is_ctf_target(target) && blocked == FALSE) if(iscarbon(target)) @@ -182,7 +182,7 @@ impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser light_color = LIGHT_COLOR_PURPLE -/obj/projectile/beam/instakill/on_hit(atom/target) +/obj/projectile/beam/instakill/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) var/mob/living/carbon/target_mob = target diff --git a/code/modules/capture_the_flag/ctf_game.dm b/code/modules/capture_the_flag/ctf_game.dm index 04fcdea4c1b1..5da88a0456f8 100644 --- a/code/modules/capture_the_flag/ctf_game.dm +++ b/code/modules/capture_the_flag/ctf_game.dm @@ -113,7 +113,7 @@ to_chat(user, span_userdanger("You are now a member of [src.team]. Get the enemy flag and bring it back to your team's controller!")) ctf_game.add_player(team, user.ckey) var/client/new_team_member = user.client - spawn_team_member(new_team_member) + spawn_team_member(new_team_member) /obj/machinery/ctf/spawner/Topic(href, href_list) if(href_list["join"]) @@ -259,6 +259,15 @@ user.set_anchored(TRUE) user.status_flags &= ~CANPUSH +/obj/item/ctf_flag/attackby(obj/item/item, mob/user, params) + if(!istype(item, /obj/item/ctf_flag)) + return ..() + + var/obj/item/ctf_flag/flag = item + if(flag.team != team) + to_chat(user, span_userdanger("Take \the [initial(flag.name)] to your team's controller!")) + user.playsound_local(get_turf(user), 'sound/machines/buzz-sigh.ogg', 100, vary = FALSE, use_reverb = FALSE) + /obj/item/ctf_flag/dropped(mob/user) ..() user.anchored = FALSE // Hacky usage that bypasses set_anchored() @@ -340,7 +349,7 @@ /obj/machinery/ctf/control_point/process(seconds_per_tick) if(controlling_team) ctf_game.control_point_scoring(controlling_team, point_rate * seconds_per_tick) - + var/scores if(ctf_game.ctf_enabled) @@ -348,10 +357,10 @@ var/datum/ctf_team/ctf_team = ctf_game.teams[team] scores += UNLINT("[ctf_team.team_color] - [ctf_team.points]/[ctf_game.points_to_win]\n") balloon_alert_to_viewers(scores) - + /obj/machinery/ctf/control_point/attackby(mob/user, params) capture(user) - + /obj/machinery/ctf/control_point/attack_hand(mob/user, list/modifiers) . = ..() if(.) diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm index 2e9c81d3bb42..b040ed55d47a 100644 --- a/code/modules/cargo/bounties/assistant.dm +++ b/code/modules/cargo/bounties/assistant.dm @@ -1,9 +1,3 @@ -/datum/bounty/item/assistant/strange_object - name = "Strange Object" - description = "Nanotrasen has taken an interest in strange objects. Find one in maintenance, and ship it off to CentCom right away." - reward = CARGO_CRATE_VALUE * 2.4 - wanted_types = list(/obj/item/relic = TRUE) - /datum/bounty/item/assistant/scooter name = "Scooter" description = "Nanotrasen has determined walking to be wasteful. Ship a scooter to CentCom to speed operations up." diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm index 1807c5ae56ff..294b2a49bd6a 100644 --- a/code/modules/cargo/bounties/science.dm +++ b/code/modules/cargo/bounties/science.dm @@ -1,18 +1,3 @@ - -/datum/bounty/item/science/relic - name = "E.X.P.E.R.I-MENTORially Discovered Devices" - description = "Psst, hey. Don't tell the assistants, but we're undercutting them on the value of those 'strange objects' they've been finding. Fish one up and send us a discovered one by using the E.X.P.E.R.I-MENTOR." - reward = CARGO_CRATE_VALUE * 8 - wanted_types = list(/obj/item/relic = TRUE) - -/datum/bounty/item/science/relic/applies_to(obj/O) - if(!..()) - return FALSE - var/obj/item/relic/experiment = O - if(experiment.revealed) - return TRUE - return - /datum/bounty/item/science/bepis_disc name = "Reformatted Tech Disk" description = "It turns out the diskettes the BEPIS prints experimental nodes on are extremely space-efficient. Send us one of your spares when you're done with it." diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm index d4017646a79c..5c0bd076f2d7 100644 --- a/code/modules/cargo/exports/lavaland.dm +++ b/code/modules/cargo/exports/lavaland.dm @@ -29,12 +29,14 @@ /datum/export/lavaland/major //valuable chest/ruin loot, minor megafauna loot cost = CARGO_CRATE_VALUE * 40 unit_name = "lava planet artifact" - export_types = list(/obj/item/guardiancreator/miner, - /obj/item/rod_of_asclepius, - /obj/item/dragons_blood, - /obj/item/lava_staff, - /obj/item/prisoncube, - ) + export_types = list( + /obj/item/dragons_blood, + /obj/item/guardian_creator/miner, + /obj/item/lava_staff, + /obj/item/melee/ghost_sword, + /obj/item/prisoncube, + /obj/item/rod_of_asclepius, + ) //Megafauna loot, except for ash drakes diff --git a/code/modules/cargo/markets/market_items/weapons.dm b/code/modules/cargo/markets/market_items/weapons.dm index 010dd131799f..f40e4fa1447c 100644 --- a/code/modules/cargo/markets/market_items/weapons.dm +++ b/code/modules/cargo/markets/market_items/weapons.dm @@ -63,44 +63,3 @@ price_max = CARGO_CRATE_VALUE * 2 stock_max = 2 availability_prob = 50 - -//monke edits -/datum/market_item/weapon/smoothbore_disabler_prime - name = "Elite Smoothbore Disabler" - desc = "A rare and sought after disabler often used by Nanotrasen's high command, and historical LARPers." - item = /obj/item/gun/energy/disabler/smoothbore/prime - - price_min = CARGO_CRATE_VALUE * 3 - price_max = CARGO_CRATE_VALUE * 5 - stock_max = 2 - availability_prob = 40 - -/datum/market_item/weapon/pipegun_recipe - name = "Diary of a Dead Assistant" - desc = "Found this book in my Archives, had some barely legible scrabblings about making 'The perfect pipegun'. Figured someone here would buy this." - item = /obj/item/book/granter/crafting_recipe/maint_gun/pipegun_prime - - price_min = CARGO_CRATE_VALUE * 4 - price_max = CARGO_CRATE_VALUE * 5 - stock_max = 1 - availability_prob = 40 - -/datum/market_item/weapon/musket_recipe - name = "Journal of a Space Ranger" - desc = "An old banned book written by an eccentric space ranger, notable for its detailed description of how to make powerful improvised lasers." - item = /obj/item/book/granter/crafting_recipe/maint_gun/laser_musket_prime - - price_min = CARGO_CRATE_VALUE * 4 - price_max = CARGO_CRATE_VALUE * 5 - stock_max = 2 - availability_prob = 40 - -/datum/market_item/weapon/smoothbore_recipe - name = "Old Tome" - desc = "Ahoy Maties, I, Captain Whitebeard, have plundered the ol' Nanotrasen station, among the booty retreived was this here tome about smoothbores. Alas, I have no use for its knowlege, so I am droppin it off here." - item = /obj/item/book/granter/crafting_recipe/maint_gun/smoothbore_disabler_prime - - price_min = CARGO_CRATE_VALUE * 6 - price_max = CARGO_CRATE_VALUE * 8 - stock_max = 1 - availability_prob = 20 diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index 665485ac9aed..3cb1208bdd39 100644 --- a/code/modules/cargo/orderconsole.dm +++ b/code/modules/cargo/orderconsole.dm @@ -403,6 +403,21 @@ SSshuttle.shopping_list -= order var/distance = get_dist(spawning_turf, picked_point) new_atom.throw_at(picked_point, distance + 4, 2) + + if(prob(25)) + var/obj/structure/closet/crate/mail/economy/new_create + var/obj/effect/oshan_launch_point/cargo/picked_point = pick(GLOB.cargo_launch_points) + var/turf/open/spawning_turf = get_edge_target_turf(picked_point, picked_point.map_edge_direction) + if(!SSeconomy.mail_crate) + new_create = new /obj/structure/closet/crate/mail/economy(spawning_turf) + SSeconomy.mail_crate = new_create + if(SSeconomy.mail_crate) + SSeconomy.mail_crate.forceMove(spawning_turf) + new_create = SSeconomy.mail_crate + var/distance = get_dist(spawning_turf, picked_point) + new_create.throw_at(picked_point, distance + 4, 2) + SSeconomy.mail_crate = null + currently_sending = FALSE . = TRUE diff --git a/code/modules/cargo/packs/exploration.dm b/code/modules/cargo/packs/exploration.dm index 55b28094de29..5465a090a30f 100644 --- a/code/modules/cargo/packs/exploration.dm +++ b/code/modules/cargo/packs/exploration.dm @@ -8,9 +8,11 @@ name = "Scrapyard Crate" desc = "Outsourced crate containing various junk." cost = CARGO_CRATE_VALUE * 5 - contains = list(/obj/item/relic, - /obj/item/broken_bottle, - /obj/item/pickaxe/rusted) + contains = list( + /obj/item/broken_bottle, + /obj/item/pickaxe/rusted, + /obj/effect/artifact_spawner, + ) crate_name = "scrapyard crate" /datum/supply_pack/exploration/catering diff --git a/code/modules/cargo/packs/livestock.dm b/code/modules/cargo/packs/livestock.dm index a8cdd16bd81a..f9eb781bfa2f 100644 --- a/code/modules/cargo/packs/livestock.dm +++ b/code/modules/cargo/packs/livestock.dm @@ -6,13 +6,13 @@ name = "Bird Crate" desc = "Contains five expert telecommunication birds." cost = CARGO_CRATE_VALUE * 8 - contains = list(/mob/living/simple_animal/parrot) + contains = list(/mob/living/basic/parrot) crate_name = "parrot crate" /datum/supply_pack/critter/parrot/generate() . = ..() for(var/i in 1 to 4) - new /mob/living/simple_animal/parrot(.) + new /mob/living/basic/parrot(.) /datum/supply_pack/critter/butterfly name = "Butterflies Crate" @@ -135,7 +135,7 @@ name = "Goat Crate" desc = "The goat goes baa! Contains one goat. Warranty void if used as a replacement for Pete." cost = CARGO_CRATE_VALUE * 5 - contains = list(/mob/living/simple_animal/hostile/retaliate/goat) + contains = list(/mob/living/basic/goat) crate_name = "goat crate" /datum/supply_pack/critter/rabbit @@ -185,7 +185,7 @@ desc = "Tired of these MOTHER FUCKING snakes on this MOTHER FUCKING space station? \ Then this isn't the crate for you. Contains three venomous snakes." cost = CARGO_CRATE_VALUE * 6 - contains = list(/mob/living/simple_animal/hostile/retaliate/snake = 3) + contains = list(/mob/living/basic/snake = 3) crate_name = "snake crate" /datum/supply_pack/critter/amphibians diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm index 1b2e5dc3c976..c7cf0455a21d 100644 --- a/code/modules/cargo/packs/organic.dm +++ b/code/modules/cargo/packs/organic.dm @@ -69,6 +69,7 @@ /obj/item/seeds/bamboo, /obj/item/seeds/eggplant/eggy, /obj/item/seeds/rainbow_bunch, + /obj/item/seeds/seedling, /obj/item/seeds/shrub, /obj/item/seeds/random = 2, ) @@ -297,10 +298,12 @@ ONLY 5000 BUX GET NOW! Contains a grill and fuel." cost = CARGO_CRATE_VALUE * 8 crate_type = /obj/structure/closet/crate - contains = list(/obj/item/stack/sheet/mineral/coal/five, - /obj/machinery/grill/unwrenched, - /obj/item/reagent_containers/cup/soda_cans/monkey_energy, - ) + contains = list( + /obj/item/stack/sheet/mineral/coal/five, + /obj/item/kitchen/tongs, + /obj/item/reagent_containers/cup/soda_cans/monkey_energy, + /obj/machinery/grill/unwrenched, + ) crate_name = "grilling starter kit crate" /datum/supply_pack/organic/grillfuel diff --git a/code/modules/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm index 19a7710ffed7..db800f1cb9ec 100644 --- a/code/modules/cargo/packs/science.dm +++ b/code/modules/cargo/packs/science.dm @@ -177,3 +177,9 @@ contains = list(/obj/item/mod/core/standard = 3) crate_name = "\improper MOD core crate" crate_type = /obj/structure/closet/crate/secure/science + +/datum/supply_pack/science/analysis_bin + name = "Analysis bin Crate" + desc = "Two analysis bins, to analyze artifacts. For those who research a lot of artifacts." + cost = CARGO_CRATE_VALUE * 4 + contains = list(/obj/item/analysis_bin = 2) diff --git a/code/modules/cargo/universal_scanner.dm b/code/modules/cargo/universal_scanner.dm index 7e352aca98f5..340132f9c841 100644 --- a/code/modules/cargo/universal_scanner.dm +++ b/code/modules/cargo/universal_scanner.dm @@ -169,6 +169,9 @@ /obj/item/universal_scanner/proc/export_scan(obj/target, mob/user) // Before you fix it: // yes, checking manifests is a part of intended functionality. + if(HAS_TRAIT(target, TRAIT_HIDDEN_EXPORT_VALUE)) + to_chat(user, span_warning("Scanned [target], export value unknown.")) + return var/datum/export_report/ex = export_item_and_contents(target, dry_run = TRUE) var/price = 0 for(var/x in ex.total_amount) diff --git a/code/modules/client/preferences/operative_species.dm b/code/modules/client/preferences/operative_species.dm new file mode 100644 index 000000000000..0b55bc23b52f --- /dev/null +++ b/code/modules/client/preferences/operative_species.dm @@ -0,0 +1,23 @@ +/// When TRUE, will spawn you as a human when selected for an operative role +/// When FALSE, players will be placed into the game as their character's species +/datum/preference/toggle/nuke_ops_species + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + can_randomize = FALSE + default_value = TRUE + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "operative_species" + +/datum/preference/toggle/nuke_ops_species/is_accessible(datum/preferences/preferences) + . = ..() + if(!.) + return FALSE + + // If one of the roles is ticked in the antag prefs menu, this option will show. + var/static/list/ops_roles = list(ROLE_OPERATIVE, ROLE_LONE_OPERATIVE, ROLE_OPERATIVE_MIDROUND, ROLE_CLOWN_OPERATIVE) + if(length(ops_roles & preferences.be_special)) + return TRUE + + return FALSE + +/datum/preference/toggle/nuke_ops_species/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/code/modules/client/preferences/sounds.dm b/code/modules/client/preferences/sounds.dm index f4203aedc9fd..3bf8fcfc6d65 100644 --- a/code/modules/client/preferences/sounds.dm +++ b/code/modules/client/preferences/sounds.dm @@ -28,6 +28,22 @@ savefile_key = "sound_instruments" savefile_identifier = PREFERENCE_PLAYER +/datum/preference/choiced/sound_achievement + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "sound_achievement" + savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/choiced/sound_achievement/init_possible_values() + return list(CHEEVO_SOUND_PING, CHEEVO_SOUND_JINGLE, CHEEVO_SOUND_TADA, CHEEVO_SOUND_OFF) + +/datum/preference/choiced/sound_achievement/create_default_value() + return CHEEVO_SOUND_PING + +/datum/preference/choiced/sound_achievement/apply_to_client_updated(client/client, value) + var/sound/sound_to_send = LAZYACCESS(GLOB.achievement_sounds, value) + if(sound_to_send) + SEND_SOUND(client.mob, sound_to_send) + /// Controls hearing dance machines /datum/preference/toggle/sound_jukebox category = PREFERENCE_CATEGORY_GAME_PREFERENCES diff --git a/code/modules/client/preferences/species.dm b/code/modules/client/preferences/species.dm index a590a3334b78..1aae0e58dbbc 100644 --- a/code/modules/client/preferences/species.dm +++ b/code/modules/client/preferences/species.dm @@ -41,7 +41,6 @@ data[species_id]["desc"] = species.get_species_description() data[species_id]["icon"] = sanitize_css_class_name(species.name) data[species_id]["use_skintones"] = species.use_skintones - data[species_id]["use_fur"] = species.use_fur data[species_id]["sexes"] = species.sexes data[species_id]["enabled_features"] = species.get_features() data[species_id]["perks"] = species.get_species_perks() diff --git a/code/modules/client/preferences/species_features/lizard.dm b/code/modules/client/preferences/species_features/lizard.dm index df7b847f48ef..c136f16acba4 100644 --- a/code/modules/client/preferences/species_features/lizard.dm +++ b/code/modules/client/preferences/species_features/lizard.dm @@ -37,7 +37,7 @@ /datum/preference/choiced/lizard_body_markings/init_possible_values() var/list/values = list() - var/icon/lizard = icon('icons/mob/species/lizard/bodyparts.dmi', "lizard_chest_m") + var/icon/lizard = icon('icons/mob/species/lizard/bodyparts.dmi', "lizard_chest") for (var/name in GLOB.body_markings_list) var/datum/sprite_accessory/sprite_accessory = GLOB.body_markings_list[name] diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index ba66de92de92..43fa4f803d26 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -86,6 +86,10 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/chat) keyname = "[sheet.icon_tag("patreon")][keyname]" + if(twitch.access_rank > 0) + var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/chat) + keyname = "[sheet.icon_tag("twitch")][keyname]" + //The linkify span classes and linkify=TRUE below make ooc text get clickable chat href links if you pass in something resembling a url for(var/client/receiver as anything in GLOB.clients) if(!receiver.prefs) // Client being created or deleted. Despite all, this can be null. diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 95d8b674f25a..421a50b8a108 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -39,7 +39,7 @@ // No point making the code more complicated if no non-drone // is ever going to use one of these - var/mob/living/simple_animal/drone/D + var/mob/living/basic/drone/D if(isdrone(owner)) D = owner @@ -607,6 +607,7 @@ flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH w_class = WEIGHT_CLASS_SMALL + supports_variations_flags = CLOTHING_SNOUTED_VARIATION var/voice_change = 1 ///This determines if the voice changer is on or off. diff --git a/code/modules/clothing/chameleon/chameleon_drone.dm b/code/modules/clothing/chameleon/chameleon_drone.dm new file mode 100644 index 000000000000..dd50fc871088 --- /dev/null +++ b/code/modules/clothing/chameleon/chameleon_drone.dm @@ -0,0 +1,52 @@ +/datum/action/item_action/chameleon/drone/randomise + name = "Randomise Headgear" + button_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "random" + +/datum/action/item_action/chameleon/drone/randomise/Trigger(trigger_flags) + if(!IsAvailable(feedback = TRUE)) + return FALSE + + for(var/datum/action/item_action/chameleon/change/to_randomize in owner.actions) + to_randomize.random_look() + return TRUE + +// Allows a drone to turn their hat into a mask +// This action's existence is very silly can be replaced with just, a hat with a chameleon action that can be both hats and masks. +/datum/action/item_action/chameleon/drone/togglehatmask + name = "Toggle Headgear Mode" + button_icon = 'icons/mob/actions/actions_silicon.dmi' + button_icon_state = "drone_camogear_helm" + +/datum/action/item_action/chameleon/drone/togglehatmask/New(Target) + if (istype(Target, /obj/item/clothing/head/chameleon/drone)) + button_icon_state = "drone_camogear_helm" + if (istype(Target, /obj/item/clothing/mask/chameleon/drone)) + button_icon_state = "drone_camogear_mask" + return ..() + +/datum/action/item_action/chameleon/drone/togglehatmask/IsAvailable(feedback) + return ..() && isdrone(owner) + +/datum/action/item_action/chameleon/drone/togglehatmask/Trigger(trigger_flags) + if(!IsAvailable(feedback = TRUE)) + return FALSE + + var/mob/living/basic/drone/droney = owner + + // The drone unEquip() proc sets head to null after dropping + // an item, so we need to keep a reference to our old headgear + // to make sure it's deleted. + var/obj/old_headgear = target + var/obj/new_headgear + + if(istype(old_headgear, /obj/item/clothing/head/chameleon/drone)) + new_headgear = new /obj/item/clothing/mask/chameleon/drone(droney) + else if(istype(old_headgear, /obj/item/clothing/mask/chameleon/drone)) + new_headgear = new /obj/item/clothing/head/chameleon/drone(droney) + else + to_chat(owner, span_warning("You shouldn't be able to toggle a camogear helmetmask if you're not wearing it.")) + return FALSE + droney.dropItemToGround(target, force = TRUE) + droney.equip_to_slot_or_del(new_headgear, ITEM_SLOT_HEAD) + return TRUE diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 68c4831febd1..e564e8aa7e13 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -76,6 +76,18 @@ . = ..() var/mob/M = usr + if(istype(over_object, /atom/movable/screen/inventory)) + var/atom/movable/screen/inventory/slot = over_object + if(M.get_item_by_slot(slot.slot_id)) + var/obj/item/clothing/item = M.get_item_by_slot(slot.slot_id) + if(!M.temporarilyRemoveItemFromInventory(item)) + return + if(!M.put_in_active_hand(item)) + if(!M.put_in_inactive_hand(item)) + if(!M.active_storage?.attempt_insert(item, M)) + item.forceMove(get_turf(M)) + item.equip_to_best_slot() + if(ismecha(M.loc)) // stops inventory actions in a mech return @@ -562,3 +574,11 @@ BLIND // can't see anything to_chat(L, span_warning("The damaged threads on your [src.name] chafe!")) #undef MOTH_EATING_CLOTHING_DAMAGE + +/obj/item/clothing/apply_fantasy_bonuses(bonus) + . = ..() + set_armor(get_armor().generate_new_with_modifiers(list(ARMOR_ALL = bonus))) + +/obj/item/clothing/remove_fantasy_bonuses(bonus) + set_armor(get_armor().generate_new_with_modifiers(list(ARMOR_ALL = -bonus))) + return ..() diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index ff01d0ca1de0..3f5503ca0eed 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -21,6 +21,14 @@ /// Used for handling bloody gloves leaving behind bloodstains on objects. Will be decremented whenever a bloodstain is left behind, and be incremented when the gloves become bloody. var/transfer_blood = 0 +/obj/item/clothing/gloves/apply_fantasy_bonuses(bonus) + . = ..() + siemens_coefficient = modify_fantasy_variable("siemens_coefficient", siemens_coefficient, -bonus / 10) + +/obj/item/clothing/gloves/remove_fantasy_bonuses(bonus) + siemens_coefficient = reset_fantasy_variable("siemens_coefficient", siemens_coefficient) + return ..() + /obj/item/clothing/gloves/wash(clean_types) . = ..() if((clean_types & CLEAN_TYPE_BLOOD) && transfer_blood > 0) diff --git a/code/modules/clothing/gloves/insulated.dm b/code/modules/clothing/gloves/insulated.dm index cfde4f64c9c7..89f33963af5d 100644 --- a/code/modules/clothing/gloves/insulated.dm +++ b/code/modules/clothing/gloves/insulated.dm @@ -13,6 +13,7 @@ custom_price = PAYCHECK_CREW * 10 custom_premium_price = PAYCHECK_COMMAND * 6 cut_type = /obj/item/clothing/gloves/cut + /datum/armor/color_yellow bio = 50 diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 72deaad51a19..db7de736cb47 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -14,6 +14,7 @@ clothing_flags = SNUG_FIT | PLASMAMAN_HELMET_EXEMPT flags_cover = HEADCOVERSEYES flags_inv = HIDEHAIR + supports_variations_flags = CLOTHING_SNOUTED_VARIATION dog_fashion = /datum/dog_fashion/head/helmet @@ -173,10 +174,10 @@ toggle_message = "You pull the visor down on" alt_toggle_message = "You push the visor up on" armor_type = /datum/armor/toggleable_riot - flags_inv = HIDEEARS|HIDEFACE|HIDESNOUT + flags_inv = HIDEEARS|HIDEFACE strip_delay = 80 actions_types = list(/datum/action/item_action/toggle) - visor_flags_inv = HIDEFACE|HIDESNOUT + visor_flags_inv = HIDEFACE flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF diff --git a/code/modules/clothing/head/welding.dm b/code/modules/clothing/head/welding.dm index 4da5f96206aa..4d7f82f6cc73 100644 --- a/code/modules/clothing/head/welding.dm +++ b/code/modules/clothing/head/welding.dm @@ -10,12 +10,13 @@ flash_protect = FLASH_PROTECTION_WELDER tint = 2 armor_type = /datum/armor/utility_welding - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDESNOUT + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE actions_types = list(/datum/action/item_action/toggle) - visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDESNOUT + visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF resistance_flags = FIRE_PROOF clothing_flags = SNUG_FIT | PLASMAMAN_HELMET_EXEMPT + supports_variations_flags = CLOTHING_SNOUTED_VARIATION /datum/armor/utility_welding melee = 10 diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index dfcc3060c9f4..5b7a3332d062 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -7,6 +7,7 @@ slot_flags = ITEM_SLOT_MASK strip_delay = 40 equip_delay_other = 40 + supports_variations_flags = CLOTHING_SNOUTED_VARIATION var/modifies_speech = FALSE var/mask_adjusted = FALSE var/adjusted_flags = null diff --git a/code/modules/clothing/masks/bandana.dm b/code/modules/clothing/masks/bandana.dm index 86ea1e71fb61..d836b8c1f21e 100644 --- a/code/modules/clothing/masks/bandana.dm +++ b/code/modules/clothing/masks/bandana.dm @@ -17,9 +17,11 @@ worn_icon_state = "bandana_worn" greyscale_config = /datum/greyscale_config/bandana greyscale_config_worn = /datum/greyscale_config/bandana_worn + greyscale_config_worn_snouted = /datum/greyscale_config/bandana_worn/snouted greyscale_config_inhand_left = /datum/greyscale_config/bandana_inhands_left greyscale_config_inhand_right = /datum/greyscale_config/bandana_inhands_right greyscale_colors = "#2e2e2e" + supports_variations_flags = CLOTHING_SNOUTED_VARIATION /obj/item/clothing/mask/bandana/attack_self(mob/user) if(slot_flags & ITEM_SLOT_NECK) @@ -51,8 +53,8 @@ else if(!user.is_holding(src)) to_chat(user, span_warning("You must be holding [src] in order to tie it!")) return - - + + if(slot_flags & ITEM_SLOT_MASK) undyeable = TRUE slot_flags = ITEM_SLOT_NECK @@ -131,6 +133,7 @@ worn_icon_state = "bandstriped_worn" greyscale_config = /datum/greyscale_config/bandstriped greyscale_config_worn = /datum/greyscale_config/bandstriped_worn + greyscale_config_worn_snouted = /datum/greyscale_config/bandstriped_worn/snouted greyscale_config_inhand_left = /datum/greyscale_config/bandana_striped_inhands_left greyscale_config_inhand_right = /datum/greyscale_config/bandana_striped_inhands_right greyscale_colors = "#2e2e2e#C6C6C6" @@ -185,6 +188,7 @@ worn_icon_state = "bandskull_worn" greyscale_config = /datum/greyscale_config/bandskull greyscale_config_worn = /datum/greyscale_config/bandskull_worn + greyscale_config_worn_snouted = /datum/greyscale_config/bandskull_worn/snouted greyscale_config_inhand_left = /datum/greyscale_config/bandana_skull_inhands_left greyscale_config_inhand_right = /datum/greyscale_config/bandana_skull_inhands_right greyscale_colors = "#2e2e2e#C6C6C6" diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 8ba15fe521d5..b56f4855f3b2 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -12,6 +12,7 @@ flags_cover = MASKCOVERSMOUTH visor_flags_cover = MASKCOVERSMOUTH resistance_flags = NONE + supports_variations_flags = CLOTHING_SNOUTED_VARIATION /datum/armor/mask_breath bio = 50 diff --git a/code/modules/clothing/masks/costume.dm b/code/modules/clothing/masks/costume.dm index 7eb5da57743f..3dd95e8567ea 100644 --- a/code/modules/clothing/masks/costume.dm +++ b/code/modules/clothing/masks/costume.dm @@ -4,6 +4,7 @@ icon_state = "joy" clothing_flags = MASKINTERNALS flags_inv = HIDESNOUT + supports_variations_flags = CLOTHING_SNOUTED_VARIATION unique_reskin = list( "Joy" = "joy", "Flushed" = "flushed", diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index a60613cdb5dc..e8f00faa9f7d 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -18,6 +18,7 @@ GLOBAL_LIST_INIT(clown_mask_options, list( armor_type = /datum/armor/mask_gas flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH | PEPPERPROOF resistance_flags = NONE + supports_variations_flags = CLOTHING_SNOUTED_VARIATION ///Max numbers of installable filters var/max_filters = 1 ///List to keep track of each filter diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index 9551eb04fa65..c9f9d3ae09e8 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -58,6 +58,7 @@ GLOBAL_LIST_INIT(hailer_phrases, list( tint = 0 has_fov = FALSE COOLDOWN_DECLARE(hailer_cooldown) + supports_variations_flags = CLOTHING_SNOUTED_VARIATION var/aggressiveness = AGGR_BAD_COP var/overuse_cooldown = FALSE var/recent_uses = 0 @@ -79,6 +80,7 @@ GLOBAL_LIST_INIT(hailer_phrases, list( flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES | PEPPERPROOF visor_flags_cover = MASKCOVERSMOUTH | MASKCOVERSEYES | PEPPERPROOF has_fov = TRUE + supports_variations_flags = CLOTHING_SNOUTED_VARIATION /obj/item/clothing/mask/gas/sechailer/swat/spacepol name = "spacepol mask" @@ -216,7 +218,7 @@ GLOBAL_LIST_INIT(hailer_phrases, list( COOLDOWN_DECLARE(horn_cooldown) /obj/item/clothing/mask/party_horn/ui_action_click(mob/user, action) - if(!COOLDOWN_FINISHED(src, horn_cooldown)) + if(!COOLDOWN_FINISHED(src, horn_cooldown)) return COOLDOWN_START(src, horn_cooldown, 10 SECONDS) playsound(src, 'sound/items/party_horn.ogg', 75, FALSE) diff --git a/code/modules/clothing/masks/surgical.dm b/code/modules/clothing/masks/surgical.dm index b754dc430141..585f82c66d6c 100644 --- a/code/modules/clothing/masks/surgical.dm +++ b/code/modules/clothing/masks/surgical.dm @@ -10,6 +10,7 @@ visor_flags_cover = MASKCOVERSMOUTH armor_type = /datum/armor/mask_surgical actions_types = list(/datum/action/item_action/adjust) + supports_variations_flags = CLOTHING_SNOUTED_VARIATION /datum/armor/mask_surgical bio = 100 diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index ef4c3d177cf8..b0ef5a29c703 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -8,6 +8,7 @@ body_parts_covered = FEET slot_flags = ITEM_SLOT_FEET + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION armor_type = /datum/armor/clothing_shoes slowdown = SHOES_SLOWDOWN @@ -198,7 +199,7 @@ to_chat(our_guy, span_userdanger("You stamp on [user]'s hand! What the- [user.p_they()] [user.p_were()] [tied ? "knotting" : "untying"] your shoelaces!")) user.emote("scream") if(istype(L)) - var/obj/item/bodypart/ouchie = L.get_bodypart(pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + var/obj/item/bodypart/ouchie = L.get_bodypart(pick(GLOB.arm_zones)) if(ouchie) ouchie.receive_damage(brute = 10) L.stamina.adjust(-40) @@ -278,3 +279,17 @@ if(do_after(user, lace_time, target = src,extra_checks = CALLBACK(src, PROC_REF(still_shoed), user))) to_chat(user, span_notice("You [tied ? "untie" : "tie"] the laces on [src].")) adjust_laces(tied ? SHOES_UNTIED : SHOES_TIED, user) + +/obj/item/clothing/shoes/apply_fantasy_bonuses(bonus) + . = ..() + slowdown = modify_fantasy_variable("slowdown", slowdown, -bonus * 0.1, 0) + if(ismob(loc)) + var/mob/wearer = loc + wearer.update_equipment_speed_mods() + +/obj/item/clothing/shoes/remove_fantasy_bonuses(bonus) + slowdown = reset_fantasy_variable("slowdown", slowdown) + if(ismob(loc)) + var/mob/wearer = loc + wearer.update_equipment_speed_mods() + return ..() diff --git a/code/modules/clothing/shoes/cowboy.dm b/code/modules/clothing/shoes/cowboy.dm index e6f02264d352..05792a72cbd9 100644 --- a/code/modules/clothing/shoes/cowboy.dm +++ b/code/modules/clothing/shoes/cowboy.dm @@ -17,7 +17,7 @@ if(prob(2)) //There's a snake in my boot - new /mob/living/simple_animal/hostile/retaliate/snake(src) + new /mob/living/basic/snake(src) /obj/item/clothing/shoes/cowboy/equipped(mob/living/carbon/user, slot) @@ -56,7 +56,7 @@ if(contents.len >= max_occupants) to_chat(user, span_warning("[src] are full!")) return - if(istype(target, /mob/living/simple_animal/hostile/retaliate/snake) || istype(target, /mob/living/basic/headslug) || islarva(target)) + if(istype(target, /mob/living/basic/snake) || istype(target, /mob/living/basic/headslug) || islarva(target)) target.forceMove(src) to_chat(user, span_notice("[target] slithers into [src].")) diff --git a/code/modules/clothing/shoes/sneakers.dm b/code/modules/clothing/shoes/sneakers.dm index f5601cdc28b6..f07ea00c5089 100644 --- a/code/modules/clothing/shoes/sneakers.dm +++ b/code/modules/clothing/shoes/sneakers.dm @@ -7,6 +7,7 @@ greyscale_colors = "#2d2d33#ffffff" greyscale_config = /datum/greyscale_config/sneakers greyscale_config_worn = /datum/greyscale_config/sneakers_worn + greyscale_config_worn_digitigrade = /datum/greyscale_config/sneakers_worn/digitigrade 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 @@ -81,6 +82,7 @@ greyscale_colors = "#d15b1b#ffffff" greyscale_config = /datum/greyscale_config/sneakers_orange greyscale_config_worn = /datum/greyscale_config/sneakers_orange_worn + greyscale_config_worn_digitigrade = /datum/greyscale_config/sneakers_orange_worn/digitigrade 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 diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index cd6bde9be846..b34f979d3fbf 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -380,6 +380,13 @@ icon_state = "intern_envirohelm" inhand_icon_state = null +/obj/item/clothing/head/helmet/space/plasmaman/syndie + name = "tacticool envirosuit helmet" + desc = "There's no doubt about it, this helmet puts you above ALL of the other plasmamen. If you see another plasmaman wearing a helmet like this, it's either because they're a fellow badass, \ + or they've murdered one of your fellow badasses and have taken it from them as a trophy. Either way, anyone wearing this deserves at least a cursory nod of respect." + icon_state = "syndie_envirohelm" + inhand_icon_state = null + /obj/item/clothing/head/helmet/space/plasmaman/bitrunner name = "bitrunner's plasma envirosuit helmet" desc = "An envirohelmet with extended blue light filters for bitrunning plasmamen." diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index c7c206e66872..621d77f29079 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -17,6 +17,7 @@ var/blood_overlay_type = "suit" limb_integrity = 0 // disabled for most exo-suits var/suittoggled = FALSE // sec duster toggling and more + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION /obj/item/clothing/suit/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 0dd8010e5f07..53009e2df8c9 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -28,6 +28,20 @@ if(!allowed) allowed = GLOB.security_vest_allowed +/obj/item/clothing/suit/armor/apply_fantasy_bonuses(bonus) + . = ..() + slowdown = modify_fantasy_variable("slowdown", slowdown, -bonus * 0.1, 0) + if(ismob(loc)) + var/mob/wearer = loc + wearer.update_equipment_speed_mods() + +/obj/item/clothing/suit/armor/remove_fantasy_bonuses(bonus) + slowdown = reset_fantasy_variable("slowdown", slowdown) + if(ismob(loc)) + var/mob/wearer = loc + wearer.update_equipment_speed_mods() + return ..() + /obj/item/clothing/suit/armor/vest name = "armor vest" desc = "A slim Type I armored vest that provides decent protection against most types of damage." diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index e4b9fe079508..83efcbcda8d9 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -11,6 +11,7 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT resistance_flags = ACID_PROOF flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + supports_variations_flags = CLOTHING_SNOUTED_VARIATION /obj/item/clothing/head/bio_hood/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 8be36ed7df7b..743cb8d2c06a 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -7,6 +7,7 @@ inhand_icon_state = "labcoat" blood_overlay_type = "coat" body_parts_covered = CHEST|ARMS + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON allowed = list( /obj/item/analyzer, /obj/item/biopsy_tool, diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index df27303be829..2aae8cde37e7 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -21,6 +21,7 @@ var/alt_covers_chest = FALSE // for adjusted/rolled-down jumpsuits, FALSE = exposes chest and arms, TRUE = exposes arms only var/obj/item/clothing/accessory/attached_accessory var/mutable_appearance/accessory_overlay + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION /datum/armor/clothing_under bio = 10 diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 5a4d372e400b..49a48665fe45 100755 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -497,3 +497,9 @@ name = "deaf personnel pin" desc = "Indicates that the wearer is deaf." icon_state = "deaf_pin" + +///Awarded for being dutiful and extinguishing the debt from the "Indebted" quirk. +/obj/item/clothing/accessory/debt_payer_pin + name = "debt payer pin" + desc = "I've paid my debt and all I've got was this pin." + icon_state = "debt_payer_pin" diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 3c30e24ea7fb..2db04ce19be9 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -7,6 +7,8 @@ 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 + greyscale_config_worn_digitigrade = /datum/greyscale_config/jumpsuit_worn/digitigrade + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION icon = 'icons/obj/clothing/under/color.dmi' icon_state = "jumpsuit" inhand_icon_state = "jumpsuit" @@ -20,6 +22,7 @@ female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY icon_state = "jumpskirt" supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON + greyscale_config_worn_digitigrade = null /// Returns a random, acceptable jumpsuit typepath /proc/get_random_jumpsuit() diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index ef1f0002c1b8..16ad9ba6e9eb 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -220,6 +220,7 @@ female_sprite_flags = NO_FEMALE_UNIFORM can_adjust = FALSE resistance_flags = NONE + alternative_screams = list('monkestation/sound/voice/screams/skeleton/scream_skeleton.ogg') /obj/item/clothing/under/costume/mech_suit name = "mech pilot's suit" diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 8f76bd4587a1..2fc58750e5f4 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -240,6 +240,7 @@ greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit_prison_inhand_left greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit_prison_inhand_right greyscale_config_worn = /datum/greyscale_config/jumpsuit_prison_worn + greyscale_config_worn_digitigrade = /datum/greyscale_config/jumpsuit_prison_worn/digitigrade has_sensor = LOCKED_SENSORS sensor_mode = SENSOR_COORDS random_sensor = FALSE @@ -255,6 +256,7 @@ greyscale_config_inhand_left = /datum/greyscale_config/jumpsuit_prison_inhand_left greyscale_config_inhand_right = /datum/greyscale_config/jumpsuit_prison_inhand_right greyscale_config_worn = /datum/greyscale_config/jumpsuit_prison_worn + greyscale_config_worn_digitigrade = null body_parts_covered = CHEST|GROIN|ARMS dying_key = DYE_REGISTRY_JUMPSKIRT female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm index 775a37d77d66..730cb4a50f61 100644 --- a/code/modules/clothing/under/suits.dm +++ b/code/modules/clothing/under/suits.dm @@ -30,7 +30,7 @@ desc = "It's a very smart uniform with a special pocket for tip." icon_state = "waiter" inhand_icon_state = "waiter" - supports_variations_flags = CLOTHING_MONKEY_VARIATION + supports_variations_flags = CLOTHING_MONKEY_VARIATION|CLOTHING_DIGITIGRADE_VARIATION /obj/item/clothing/under/suit/blacktwopiece name = "black two piece suit" diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index c70f80985ff0..403493216e76 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -168,3 +168,11 @@ bio = 50 fire = 50 acid = 40 + +/obj/item/clothing/under/plasmaman/syndicate + name = "tacticool envirosuit" + desc = "A sinister looking envirosuit, for the boniest of operatives." + icon_state = "syndie_envirosuit" + has_sensor = NO_SENSORS + resistance_flags = FIRE_PROOF + inhand_icon_state = null diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index 59d5c81a69b1..30f65f68079c 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -91,16 +91,6 @@ /datum/bank_account/proc/dumpeet() being_dumped = TRUE -/** - * Performs the math component of adjusting a bank account balance. - * Arguments: - * * amount - the quantity of credits that will be written off if the value is negative, or added if it is positive. - */ -/datum/bank_account/proc/_adjust_money(amount) - account_balance += amount - if(account_balance < 0) - account_balance = 0 - /** * Returns TRUE if a bank account has more than or equal to the amount, amt. * Otherwise returns false. @@ -118,12 +108,30 @@ */ /datum/bank_account/proc/adjust_money(amount, reason) if((amount < 0 && has_money(-amount)) || amount > 0) - _adjust_money(amount) + var/debt_collected = 0 + if(account_debt > 0 && amount > 0) + debt_collected = min(CEILING(amount*DEBT_COLLECTION_COEFF, 1), account_debt) + account_balance += amount - debt_collected if(reason) add_log_to_history(amount, reason) + if(debt_collected) + pay_debt(debt_collected, FALSE) return TRUE return FALSE +///Called when a portion of a debt is to be paid. It'll return the amount of credits put forwards to extinguish the debt. +/datum/bank_account/proc/pay_debt(amount, is_payment = TRUE) + var/amount_to_pay = min(amount, account_debt) + if(is_payment) + if(!adjust_money(-amount, "Other: Debt Payment")) + return 0 + else + add_log_to_history(-amount, "Other: Debt Collection") + log_econ("[amount_to_pay] credits were removed from [account_holder]'s bank account to pay a debt of [account_debt]") + account_debt -= amount_to_pay + SEND_SIGNAL(src, COMSIG_BANK_ACCOUNT_DEBT_PAID) + return amount_to_pay + /** * Performs a transfer of credits to the bank_account datum from another bank account. * Arguments: diff --git a/code/modules/escape_menu/home_page.dm b/code/modules/escape_menu/home_page.dm index ad0febfcb20c..8ab6c27aa708 100644 --- a/code/modules/escape_menu/home_page.dm +++ b/code/modules/escape_menu/home_page.dm @@ -28,13 +28,22 @@ CALLBACK(src, PROC_REF(start_redeem)), ) ) + page_holder.give_screen_object( + new /atom/movable/screen/escape_menu/home_button( + null, + src, + "Open Lootbox", + /* offset = */ 3, + CALLBACK(src, PROC_REF(try_open_lootbox)), + ) + ) page_holder.give_screen_object( new /atom/movable/screen/escape_menu/home_button( null, src, "Open Map", - /* offset = */ 3, + /* offset = */ 4, CALLBACK(src, PROC_REF(open_map)), ) ) @@ -43,7 +52,7 @@ null, src, "Admin Help", - /* offset = */ 4, + /* offset = */ 5, ) ) @@ -52,7 +61,7 @@ null, src, "Leave Body", - /* offset = */ 5, + /* offset = */ 6, CALLBACK(src, PROC_REF(open_leave_body)), ) ) @@ -63,6 +72,9 @@ /datum/escape_menu/proc/start_redeem() client?.redeem_code() +/datum/escape_menu/proc/try_open_lootbox() + client?.try_open_or_buy_lootbox() + /datum/escape_menu/proc/open_map() var/redirect = "" switch(SSmapping.config.map_name) diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index a5a7b699bea4..e9f0bd8d40db 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -42,6 +42,21 @@ /// Flags dictating whether this event should be run on certain kinds of map var/map_flags = NONE + //monkestation vars starts + var/roundstart = FALSE + var/cost = 1 + var/reoccurence_penalty_multiplier = 0.75 + var/shared_occurence_type + var/track = EVENT_TRACK_MODERATE + /// Last calculated weight that the storyteller assigned this event + var/calculated_weight = 0 + var/tags = list() /// Tags of the event + /// List of the shared occurence types. + var/static/list/shared_occurences = list() + /// Whether a roundstart event can happen post roundstart. Very important for events which override job assignments. + var/can_run_post_roundstart = TRUE + //monkestation vars end + /datum/round_event_control/New() if(config && !wizardevent) // Magic is unaffected by configs earliest_start = CEILING(earliest_start * CONFIG_GET(number/events_min_time_mul), 1) @@ -71,8 +86,10 @@ // Checks if the event can be spawned. Used by event controller and "false alarm" event. // Admin-created events override this. -/datum/round_event_control/proc/can_spawn_event(players_amt, allow_magic = FALSE) +/datum/round_event_control/proc/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) SHOULD_CALL_PARENT(TRUE) + if(roundstart && (world.time-SSticker.round_start_time >= 2 MINUTES || (SSgamemode.ran_roundstart && !fake_check))) + return FALSE if(occurrences >= max_occurrences) return FALSE if(earliest_start >= world.time-SSticker.round_start_time) @@ -88,13 +105,21 @@ if(ispath(typepath, /datum/round_event/ghost_role) && !(GLOB.ghost_role_flags & GHOSTROLE_MIDROUND_EVENT)) return FALSE + //monkestation edit start - STORYTELLERS + if(checks_antag_cap) + if(!roundstart && !SSgamemode.can_inject_antags()) + return FALSE + if(!check_enemies()) + return FALSE + //monkestation edit end - STORYTELLERS + var/datum/game_mode/dynamic/dynamic = SSticker.mode if (istype(dynamic) && dynamic_should_hijack && dynamic.random_event_hijacked != HIJACKED_NOTHING) return FALSE return TRUE -/datum/round_event_control/proc/preRunEvent() +/datum/round_event_control/proc/preRunEvent(forced = FALSE) if(!ispath(typepath, /datum/round_event)) return EVENT_CANT_RUN @@ -106,11 +131,14 @@ // We sleep HERE, in pre-event setup (because there's no sense doing it in runEvent() since the event is already running!) for the given amount of time to make an admin has enough time to cancel an event un-fitting of the present round. if(alert_observers) message_admins("Random Event triggering in [DisplayTimeText(RANDOM_EVENT_ADMIN_INTERVENTION_TIME)]: [name]. (CANCEL)") - sleep(RANDOM_EVENT_ADMIN_INTERVENTION_TIME) + if(!roundstart) + sleep(RANDOM_EVENT_ADMIN_INTERVENTION_TIME) var/players_amt = get_active_player_count(alive_check = TRUE, afk_check = TRUE, human_check = TRUE) - if(!can_spawn_event(players_amt)) + if(!can_spawn_event(players_amt, fake_check = TRUE) && !forced) message_admins("Second pre-condition check for [name] failed, skipping...") return EVENT_INTERRUPTED + if(!can_spawn_event(players_amt, fake_check = TRUE) && forced) + message_admins("Second pre-condition check for [name] failed, but event forced, running event regardless this may have issues...") if(!triggering) return EVENT_CANCELLED //admin cancelled @@ -203,8 +231,14 @@ Runs the event var/fakeable = TRUE /// Whether a admin wants this event to be cancelled var/cancel_event = FALSE + //monkestation vars starts ///canceled on oshan var/oshan_blocked = FALSE + /// Whether the event called its start() yet or not. + var/has_started = FALSE + ///have we finished setup? + var/setup = FALSE + //monkestation vars end //Called first before processing. //Allows you to setup your event, such as randomly @@ -215,6 +249,7 @@ Runs the event //This is really only for setting defaults which can be overridden later when New() finishes. /datum/round_event/proc/setup() SHOULD_CALL_PARENT(FALSE) + setup = TRUE return ///Annouces the event name to deadchat, override this if what an event should show to deadchat is different to its event name. @@ -228,6 +263,80 @@ Runs the event SHOULD_CALL_PARENT(FALSE) return +//monkestation addition starts - STORYTELLERS +/// This section of event processing is in a proc because roundstart events may get their start invoked. +/datum/round_event/proc/try_start() + if(has_started) + return + has_started = TRUE + processing = FALSE + start() + processing = TRUE + +/datum/round_event_control/roundstart + roundstart = TRUE + earliest_start = 0 + +///Adds an occurence. Has to use the setter to properly handle shared occurences +/datum/round_event_control/proc/add_occurence() + if(shared_occurence_type) + if(!shared_occurences[shared_occurence_type]) + shared_occurences[shared_occurence_type] = 0 + shared_occurences[shared_occurence_type]++ + occurrences++ + +///Subtracts an occurence. Has to use the setter to properly handle shared occurences +/datum/round_event_control/proc/subtract_occurence() + if(shared_occurence_type) + if(!shared_occurences[shared_occurence_type]) + shared_occurences[shared_occurence_type] = 0 + shared_occurences[shared_occurence_type]-- + occurrences-- + +///Gets occurences. Has to use the getter to properly handle shared occurences +/datum/round_event_control/proc/get_occurences() + if(shared_occurence_type) + if(!shared_occurences[shared_occurence_type]) + shared_occurences[shared_occurence_type] = 0 + return shared_occurences[shared_occurence_type] + return occurrences + +/// Prints the action buttons for this event. +/datum/round_event_control/proc/get_href_actions() + if(SSticker.HasRoundStarted()) + if(roundstart) + if(!can_run_post_roundstart) + return "Fire Schedule" + return "Fire Schedule" + else + return "Fire Schedule Force Next" + else + if(roundstart) + return "Add Roundstart Force Roundstart" + else + return "Fire Schedule Force Next" + + +/datum/round_event_control/Topic(href, href_list) + . = ..() + if(QDELETED(src)) + return + switch(href_list["action"]) + if("schedule") + message_admins("[key_name_admin(usr)] scheduled event [src.name].") + log_admin_private("[key_name(usr)] scheduled [src.name].") + SSgamemode.storyteller.buy_event(src, src.track) + if("force_next") + if(length(src.admin_setup)) + for(var/datum/event_admin_setup/admin_setup_datum in src.admin_setup) + if(admin_setup_datum.prompt_admins() == ADMIN_CANCEL_EVENT) + return + message_admins("[key_name_admin(usr)] force scheduled event [src.name].") + log_admin_private("[key_name(usr)] force scheduled event [src.name].") + SSgamemode.forced_next_events[src.track] = src + +//monkestation addition ends - STORYTELLERS + //Called after something followable has been spawned by an event //Provides ghosts a follow link to an atom if possible //Only called once. @@ -265,6 +374,8 @@ Runs the event //This proc will handle the calls to the appropiate procs. /datum/round_event/process() SHOULD_NOT_OVERRIDE(TRUE) + if(!setup) + return if(!processing) return diff --git a/code/modules/events/anomaly/_anomaly.dm b/code/modules/events/anomaly/_anomaly.dm index 13fedcde2768..665dec680dc9 100644 --- a/code/modules/events/anomaly/_anomaly.dm +++ b/code/modules/events/anomaly/_anomaly.dm @@ -24,6 +24,7 @@ impact_area = get_area(spawn_location) else impact_area = placer.findValidArea() + setup = TRUE //MONKESTATION ADDITION /datum/round_event/anomaly/announce(fake) priority_announce("Energetic flux wave detected on [ANOMALY_ANNOUNCE_DANGEROUS_TEXT] [impact_area.name].", "Anomaly Alert") diff --git a/code/modules/events/anomaly/anomaly_vortex.dm b/code/modules/events/anomaly/anomaly_vortex.dm index d8eb0b6459ca..53096bc6e131 100644 --- a/code/modules/events/anomaly/anomaly_vortex.dm +++ b/code/modules/events/anomaly/anomaly_vortex.dm @@ -4,7 +4,7 @@ min_players = 20 max_occurrences = 2 - weight = 10 + weight = 4 //monkestation edit: 10 ==> 4 description = "This anomaly sucks in and detonates items." min_wizard_trigger_potency = 3 max_wizard_trigger_potency = 7 diff --git a/code/modules/events/artifact_spawn.dm b/code/modules/events/artifact_spawn.dm new file mode 100644 index 000000000000..4f011fbeb2c1 --- /dev/null +++ b/code/modules/events/artifact_spawn.dm @@ -0,0 +1,29 @@ +/datum/round_event_control/random_artifact + name = "Artifact Manifestation" + description = "Spawns a random artifact somewhere on the station" + typepath = /datum/round_event/random_artifact + weight = 10 + max_occurrences = 3 + min_players = 3 + category = EVENT_CATEGORY_ANOMALIES + track = EVENT_TRACK_MODERATE + tags = list(TAG_SPOOKY) + +/datum/round_event/random_artifact + announce_when = 0 + start_when = 1 + var/datum/weakref/spawn_location + +/datum/round_event/random_artifact/setup() + spawn_location = WEAKREF(pick(GLOB.generic_event_spawns)) + + if(!spawn_location?.resolve()) + return kill() + +/datum/round_event/random_artifact/start() + var/marker = spawn_location.resolve() + if(!marker) + return + var/artifact = spawn_artifact(get_turf(marker)) + do_sparks(4, FALSE, artifact) + announce_to_ghosts(artifact) diff --git a/code/modules/events/aurora_caelus.dm b/code/modules/events/aurora_caelus.dm index 8ce6fcdd89a3..faf6eb735d03 100644 --- a/code/modules/events/aurora_caelus.dm +++ b/code/modules/events/aurora_caelus.dm @@ -7,7 +7,7 @@ category = EVENT_CATEGORY_FRIENDLY description = "A colourful display can be seen through select windows. And the kitchen." -/datum/round_event_control/aurora_caelus/can_spawn_event(players, allow_magic = FALSE) +/datum/round_event_control/aurora_caelus/can_spawn_event(players, allow_magic = FALSE, fake_check = FALSE) //MONKESTATION ADDITION: fake_check = FALSE if(!SSmapping.empty_space) return FALSE return ..() diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm index 77d17ce5ecbb..b4aa42c9b481 100644 --- a/code/modules/events/brain_trauma.dm +++ b/code/modules/events/brain_trauma.dm @@ -1,7 +1,7 @@ /datum/round_event_control/brain_trauma name = "Spontaneous Brain Trauma" typepath = /datum/round_event/brain_trauma - weight = 10 + weight = 0 category = EVENT_CATEGORY_HEALTH description = "A crewmember gains a random trauma." min_wizard_trigger_potency = 2 diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index 813be9b3d8ba..d9d2984785bf 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -46,6 +46,7 @@ kill() return origin_machine = pick_n_take(vending_machines) + setup = TRUE //MONKESTATION ADDITION /datum/round_event/brand_intelligence/announce(fake) priority_announce("Rampant brand intelligence has been detected aboard [station_name()]. Please inspect any [origin_machine] brand vendors for aggressive marketing tactics, and reboot them if necessary.", "Machine Learning Alert") diff --git a/code/modules/events/bureaucratic_error.dm b/code/modules/events/bureaucratic_error.dm index 5f206134a921..0c031cdd9667 100644 --- a/code/modules/events/bureaucratic_error.dm +++ b/code/modules/events/bureaucratic_error.dm @@ -22,10 +22,11 @@ var/datum/job/current = job if(!current.allow_bureaucratic_error) continue - current.total_positions = 0 + var/ran = rand(-2,4) //MONKESTATION CHANGE: REMOVE(current.total_positions = 0) ADD: var/ran = rand(-2,4) + current.total_positions = max(current.total_positions + ran, 1) //MONKESTATION ADDITION else // Adds/removes a random amount of job slots from all jobs. for(var/datum/job/current as anything in jobs) if(!current.allow_bureaucratic_error) continue var/ran = rand(-2,4) - current.total_positions = max(current.total_positions + ran, 0) + current.total_positions = max(current.total_positions + ran, 1) //MONKESTATION CHANGE: ran, 0) ==> ran, 1) diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index e62d26598c23..821a01446406 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -35,6 +35,7 @@ /datum/round_event/carp_migration/setup() start_when = rand(40, 60) + setup = TRUE //MONKESTATION ADDITION /datum/round_event/carp_migration/announce(fake) priority_announce("[fluff_signal] have been detected near [station_name()], please stand-by.", "Lifesign Alert") diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index f57ed1774d4c..09994933c398 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -33,7 +33,7 @@ ///Disease recipient candidates var/list/disease_candidates = list() -/datum/round_event_control/disease_outbreak/can_spawn_event(players_amt, allow_magic = FALSE) +/datum/round_event_control/disease_outbreak/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) //MONKESTATION ADDITION: fake_check = FALSE . = ..() if(!.) return . @@ -100,6 +100,7 @@ /datum/round_event/disease_outbreak/setup() announce_when = ADV_ANNOUNCE_DELAY + setup = TRUE //MONKESTATION ADDITION /datum/round_event/disease_outbreak/start() var/datum/round_event_control/disease_outbreak/disease_event = control @@ -141,7 +142,7 @@ name = "Disease Outbreak: Advanced" typepath = /datum/round_event/disease_outbreak/advanced category = EVENT_CATEGORY_HEALTH - weight = 15 + weight = 7 //monkestation change 15 ==> 7 min_players = 35 // To avoid shafting lowpop earliest_start = 15 MINUTES // give the chemist a chance description = "An 'advanced' disease will infect some members of the crew." @@ -255,6 +256,7 @@ /datum/round_event/disease_outbreak/advance/setup() announce_when = ADV_ANNOUNCE_DELAY + setup = TRUE //MONKESTATION ADDITION /** * Generate advanced virus diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index c12b86d5803c..2874273e9906 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -1,8 +1,8 @@ /datum/round_event_control/space_dust name = "Space Dust: Minor" typepath = /datum/round_event/space_dust - weight = 200 - max_occurrences = 1000 + weight = 200 // why the hell was this so much + max_occurrences = 10 //MONKESTATION CHANGE: 1000 ==> 10 earliest_start = 0 MINUTES alert_observers = FALSE category = EVENT_CATEGORY_SPACE diff --git a/code/modules/events/false_alarm.dm b/code/modules/events/false_alarm.dm index 6e5cfdc61a1f..d18e204b9852 100644 --- a/code/modules/events/false_alarm.dm +++ b/code/modules/events/false_alarm.dm @@ -7,7 +7,7 @@ description = "Fakes an event announcement." admin_setup = list(/datum/event_admin_setup/listed_options/false_alarm) -/datum/round_event_control/falsealarm/can_spawn_event(players_amt, allow_magic = FALSE) +/datum/round_event_control/falsealarm/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) . = ..() if(!.) return . diff --git a/code/modules/events/ghost_role/abductor.dm b/code/modules/events/ghost_role/abductor.dm index f6928222cfdc..708f154c58da 100644 --- a/code/modules/events/ghost_role/abductor.dm +++ b/code/modules/events/ghost_role/abductor.dm @@ -4,7 +4,7 @@ weight = 10 max_occurrences = 1 min_players = 20 - dynamic_should_hijack = TRUE + //dynamic_should_hijack = TRUE category = EVENT_CATEGORY_INVASION description = "One or more abductor teams spawns, and they plan to experiment on the crew." diff --git a/code/modules/events/ghost_role/alien_infestation.dm b/code/modules/events/ghost_role/alien_infestation.dm index 72ef044229b4..da862efb05bf 100644 --- a/code/modules/events/ghost_role/alien_infestation.dm +++ b/code/modules/events/ghost_role/alien_infestation.dm @@ -5,12 +5,12 @@ min_players = 35 //monkie edit: 10 to 35 (tg what the fuck) - earliest_start = 90 MINUTES //monkie edit: 20 to 90 - dynamic_should_hijack = TRUE + earliest_start = 60 MINUTES //monkie edit: 20 to 90 + //dynamic_should_hijack = TRUE category = EVENT_CATEGORY_ENTITIES description = "A xenomorph larva spawns on a random vent." -/datum/round_event_control/alien_infestation/can_spawn_event(players_amt, allow_magic = FALSE) +/datum/round_event_control/alien_infestation/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) //MONKESTATION ADDITION: fake_check = FALSE . = ..() if(!.) return . @@ -34,7 +34,7 @@ announce_when = rand(announce_when, announce_when + 50) if(prob(50)) spawncount++ - + setup = TRUE //MONKESTATION ADDITION /datum/round_event/ghost_role/alien_infestation/announce(fake) var/living_aliens = FALSE for(var/mob/living/carbon/alien/A in GLOB.player_list) diff --git a/code/modules/events/ghost_role/blob.dm b/code/modules/events/ghost_role/blob.dm index a07d9d1be594..6bc02bcf2ff4 100644 --- a/code/modules/events/ghost_role/blob.dm +++ b/code/modules/events/ghost_role/blob.dm @@ -5,13 +5,12 @@ max_occurrences = 1 min_players = 35 //monkie edit: 20 to 35 - - earliest_start = 90 MINUTES //monkie edit: 20 to 90 - dynamic_should_hijack = TRUE + earliest_start = 60 MINUTES //monkie edit: 20 to 90 + //dynamic_should_hijack = TRUE category = EVENT_CATEGORY_ENTITIES description = "Spawns a new blob overmind." -/datum/round_event_control/blob/can_spawn_event(players, allow_magic = FALSE) +/datum/round_event_control/blob/can_spawn_event(players, allow_magic = FALSE, fake_check = FALSE) //MONKESTATION ADDITION: fake_check = FALSE if(EMERGENCY_PAST_POINT_OF_NO_RETURN) // no blobs if the shuttle is past the point of no return return FALSE diff --git a/code/modules/events/ghost_role/changeling_event.dm b/code/modules/events/ghost_role/changeling_event.dm index 570a6166093d..9d3af9164681 100644 --- a/code/modules/events/ghost_role/changeling_event.dm +++ b/code/modules/events/ghost_role/changeling_event.dm @@ -11,7 +11,7 @@ weight = 8 max_occurrences = 3 min_players = 20 - dynamic_should_hijack = TRUE + //dynamic_should_hijack = TRUE category = EVENT_CATEGORY_ENTITIES description = "A meteor containing a changeling is summoned and thrown at the exterior of the station." diff --git a/code/modules/events/ghost_role/nightmare.dm b/code/modules/events/ghost_role/nightmare.dm index 57b942988cdb..a5f2a772b70a 100644 --- a/code/modules/events/ghost_role/nightmare.dm +++ b/code/modules/events/ghost_role/nightmare.dm @@ -3,7 +3,7 @@ typepath = /datum/round_event/ghost_role/nightmare max_occurrences = 1 min_players = 20 - dynamic_should_hijack = TRUE + //dynamic_should_hijack = TRUE category = EVENT_CATEGORY_ENTITIES description = "Spawns a nightmare, aiming to darken the station." min_wizard_trigger_potency = 6 diff --git a/code/modules/events/ghost_role/operative.dm b/code/modules/events/ghost_role/operative.dm index 33cd9e059f09..4cf8da639bb5 100644 --- a/code/modules/events/ghost_role/operative.dm +++ b/code/modules/events/ghost_role/operative.dm @@ -30,6 +30,10 @@ Mind.special_role = ROLE_LONE_OPERATIVE Mind.active = TRUE Mind.transfer_to(operative) + if(!operative.client?.prefs.read_preference(/datum/preference/toggle/nuke_ops_species)) + var/species_type = operative.client.prefs.read_preference(/datum/preference/choiced/species) + operative.set_species(species_type) //Apply the preferred species to our freshly-made body. + Mind.add_antag_datum(/datum/antagonist/nukeop/lone) message_admins("[ADMIN_LOOKUPFLW(operative)] has been made into lone operative by an event.") diff --git a/code/modules/events/ghost_role/revenant_event.dm b/code/modules/events/ghost_role/revenant_event.dm index 27f3597a7ad2..04d3ce7309ec 100644 --- a/code/modules/events/ghost_role/revenant_event.dm +++ b/code/modules/events/ghost_role/revenant_event.dm @@ -6,13 +6,12 @@ weight = 7 max_occurrences = 1 min_players = 5 - dynamic_should_hijack = TRUE + //dynamic_should_hijack = TRUE category = EVENT_CATEGORY_ENTITIES description = "Spawns an angry, soul sucking ghost." min_wizard_trigger_potency = 4 max_wizard_trigger_potency = 7 - /datum/round_event/ghost_role/revenant var/ignore_mobcheck = FALSE role_name = "revenant" @@ -54,11 +53,12 @@ if(!spawn_locs.len) //If we can't find THAT, then just give up and cry return MAP_ERROR - var/mob/living/simple_animal/revenant/revvie = new(pick(spawn_locs)) - revvie.key = selected.key + var/mob/living/basic/revenant/revvie = new(pick(spawn_locs)) + selected.mind.transfer_to(revvie) message_admins("[ADMIN_LOOKUPFLW(revvie)] has been made into a revenant by an event.") revvie.log_message("was spawned as a revenant by an event.", LOG_GAME) spawned_mobs += revvie + qdel(selected) return SUCCESSFUL_SPAWN #undef REVENANT_SPAWN_THRESHOLD diff --git a/code/modules/events/ghost_role/sentience.dm b/code/modules/events/ghost_role/sentience.dm index 646fcbe2e9c7..7c58e6e7e928 100644 --- a/code/modules/events/ghost_role/sentience.dm +++ b/code/modules/events/ghost_role/sentience.dm @@ -4,14 +4,20 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( /mob/living/basic/lizard, /mob/living/basic/carp/pet/cayenne, /mob/living/basic/cow, - /mob/living/basic/spider/giant/sgt_araneus, + /mob/living/basic/goat, /mob/living/basic/lizard, /mob/living/basic/mouse/brown/tom, + /mob/living/basic/parrot, /mob/living/basic/pet, /mob/living/basic/pig, /mob/living/basic/rabbit, /mob/living/basic/sheep, + /mob/living/basic/sloth, + /mob/living/basic/snake, + /mob/living/basic/spider/giant/sgt_araneus, /mob/living/simple_animal/bot/secbot/beepsky, + /mob/living/simple_animal/hostile/retaliate/goose/vomit, + /mob/living/simple_animal/pet, ))) /datum/round_event_control/sentience diff --git a/code/modules/events/ghost_role/slaughter_event.dm b/code/modules/events/ghost_role/slaughter_event.dm index 8cb2b729aa4e..13ab7d59d546 100644 --- a/code/modules/events/ghost_role/slaughter_event.dm +++ b/code/modules/events/ghost_role/slaughter_event.dm @@ -5,7 +5,7 @@ max_occurrences = 1 earliest_start = 1 HOURS min_players = 20 - dynamic_should_hijack = TRUE + //dynamic_should_hijack = TRUE category = EVENT_CATEGORY_ENTITIES description = "Spawns a slaughter demon, to hunt by travelling through pools of blood." min_wizard_trigger_potency = 6 diff --git a/code/modules/events/ghost_role/space_dragon.dm b/code/modules/events/ghost_role/space_dragon.dm index 735d6d1dcb8f..1f93e363d788 100644 --- a/code/modules/events/ghost_role/space_dragon.dm +++ b/code/modules/events/ghost_role/space_dragon.dm @@ -5,7 +5,7 @@ max_occurrences = 1 min_players = 30 //monke edit: 20 to 30 earliest_start = 60 MINUTES //monke edit: 20 to 60 - dynamic_should_hijack = TRUE + //dynamic_should_hijack = TRUE category = EVENT_CATEGORY_ENTITIES description = "Spawns a space dragon, which will try to take over the station." min_wizard_trigger_potency = 6 @@ -32,7 +32,7 @@ if(isnull(spawn_location)) return MAP_ERROR - var/mob/living/simple_animal/hostile/space_dragon/dragon = new (spawn_location) + var/mob/living/basic/space_dragon/dragon = new (spawn_location) dragon.key = key dragon.mind.set_assigned_role(SSjob.GetJobType(/datum/job/space_dragon)) dragon.mind.special_role = ROLE_SPACE_DRAGON diff --git a/code/modules/events/ghost_role/space_ninja.dm b/code/modules/events/ghost_role/space_ninja.dm index a14511b72779..3c4f532bcd7b 100644 --- a/code/modules/events/ghost_role/space_ninja.dm +++ b/code/modules/events/ghost_role/space_ninja.dm @@ -5,7 +5,7 @@ weight = 10 earliest_start = 45 MINUTES //monke edit: 20 to 45 min_players = 25 //monke edit: 20 to 25 - dynamic_should_hijack = TRUE + //dynamic_should_hijack = TRUE category = EVENT_CATEGORY_INVASION description = "A space ninja infiltrates the station." diff --git a/code/modules/events/gravity_generator_blackout.dm b/code/modules/events/gravity_generator_blackout.dm index 89cc5a43367e..657cfdb2b3e6 100644 --- a/code/modules/events/gravity_generator_blackout.dm +++ b/code/modules/events/gravity_generator_blackout.dm @@ -7,7 +7,7 @@ min_wizard_trigger_potency = 0 max_wizard_trigger_potency = 4 -/datum/round_event_control/gravity_generator_blackout/can_spawn_event(players_amt, allow_magic = FALSE) +/datum/round_event_control/gravity_generator_blackout/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) //MONKESTATION ADDITION: fake_check = FALSE . = ..() if(!.) return . diff --git a/code/modules/events/grey_tide.dm b/code/modules/events/grey_tide.dm index 7c7e23950a96..cdbde4fb0417 100644 --- a/code/modules/events/grey_tide.dm +++ b/code/modules/events/grey_tide.dm @@ -21,6 +21,7 @@ announce_when = rand(50, 60) end_when = rand(20, 30) severity = rand(1,3) + setup = TRUE //MONKESTATION ADDITION var/list/potential_areas = list(/area/station/command, /area/station/engineering, diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm index 8a8902d5724c..46f1ae3857de 100644 --- a/code/modules/events/heart_attack.dm +++ b/code/modules/events/heart_attack.dm @@ -12,7 +12,7 @@ ///Candidates for recieving a healthy dose of heart disease var/list/heart_attack_candidates = list() -/datum/round_event_control/heart_attack/can_spawn_event(players_amt, allow_magic = FALSE) +/datum/round_event_control/heart_attack/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) //MONKESTATION ADDITION: fake_check = FALSE . = ..() if(!.) return . diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index b0b9aa35264b..a2874d4a0d03 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -18,9 +18,9 @@ for(var/mob/living/basic/pet/dog/corgi/ian/Ian in GLOB.mob_living_list) Ian.place_on_head(new /obj/item/bedsheet(Ian)) - for(var/mob/living/simple_animal/parrot/poly/Poly in GLOB.mob_living_list) - new /mob/living/simple_animal/parrot/poly/ghost(Poly.loc) - qdel(Poly) + for(var/mob/living/basic/parrot/poly/bird in GLOB.mob_living_list) + new /mob/living/basic/parrot/poly/ghost(bird.loc) + qdel(bird) /datum/round_event/spooky/announce(fake) priority_announce(pick("RATTLE ME BONES!","THE RIDE NEVER ENDS!", "A SKELETON POPS OUT!", "SPOOKY SCARY SKELETONS!", "CREWMEMBERS BEWARE, YOU'RE IN FOR A SCARE!") , "THE CALL IS COMING FROM INSIDE THE HOUSE") diff --git a/code/modules/events/immovable_rod/immovable_rod.dm b/code/modules/events/immovable_rod/immovable_rod.dm index c6a3b934921f..61743b4706bd 100644 --- a/code/modules/events/immovable_rod/immovable_rod.dm +++ b/code/modules/events/immovable_rod/immovable_rod.dm @@ -246,13 +246,13 @@ * * strongman - the suplexer of the rod. */ /obj/effect/immovablerod/proc/suplex_rod(mob/living/strongman) - if(!can_suplex) //monkestation edit - strongman.visible_message( //monkestation edit - span_boldwarning("[src] overpowers [strongman]!"), //monkestation edit - span_warning("You feel [src] overpowering you!") //monkestation edit - ) //monkestation edit - return FALSE //monkestation edit - strongman.client?.give_award(/datum/award/achievement/misc/feat_of_strength, strongman) + if(!can_suplex) // MONKEYSTATION EDIT ADDITION PR #9 - not strong enough + strongman.visible_message( + span_boldwarning("[src] overpowers [strongman]!"), + span_warning("You feel [src] overpowering you!") + ) + return FALSE + strongman.client?.give_award(/datum/award/achievement/jobs/feat_of_strength, strongman) strongman.visible_message( span_boldwarning("[strongman] suplexes [src] into the ground!"), span_warning("You suplex [src] into the ground!") diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index 5f2bca5071ba..1edf99e3400d 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -3,14 +3,17 @@ typepath = /datum/round_event/portal_storm/syndicate_shocktroop weight = 2 min_players = 15 + max_occurrences = 1 //MONKESTATION ADDITION earliest_start = 30 MINUTES category = EVENT_CATEGORY_ENTITIES description = "Syndicate troops pour out of portals." /datum/round_event/portal_storm/syndicate_shocktroop - boss_types = list(/mob/living/basic/syndicate/melee/space/stormtrooper = 2) - hostile_types = list(/mob/living/basic/syndicate/melee/space = 8,\ - /mob/living/basic/syndicate/ranged/space = 2) + boss_types = list(/mob/living/basic/trooper/syndicate/melee/space/stormtrooper = 2) + hostile_types = list( + /mob/living/basic/trooper/syndicate/melee/space = 8, + /mob/living/basic/trooper/syndicate/ranged/space = 2, + ) /datum/round_event_control/portal_storm_narsie name = "Portal Storm: Constructs" @@ -23,9 +26,11 @@ max_wizard_trigger_potency = 7 /datum/round_event/portal_storm/portal_storm_narsie - boss_types = list(/mob/living/simple_animal/hostile/construct/artificer/hostile = 6) - hostile_types = list(/mob/living/simple_animal/hostile/construct/juggernaut/hostile = 8,\ - /mob/living/simple_animal/hostile/construct/wraith/hostile = 6) + boss_types = list(/mob/living/basic/construct/artificer/hostile = 6) + hostile_types = list( + /mob/living/basic/construct/juggernaut/hostile = 8, + /mob/living/basic/construct/wraith/hostile = 6, + ) /datum/round_event/portal_storm start_when = 7 @@ -65,6 +70,7 @@ hostiles_spawn += get_random_station_turf() next_boss_spawn = start_when + CEILING(2 * number_of_hostiles / number_of_bosses, 1) + setup = TRUE //MONKESTATION ADDITION /datum/round_event/portal_storm/announce(fake) set waitfor = 0 diff --git a/code/modules/events/radiation_leak.dm b/code/modules/events/radiation_leak.dm index 0fbe29927666..a193676c3db5 100644 --- a/code/modules/events/radiation_leak.dm +++ b/code/modules/events/radiation_leak.dm @@ -47,6 +47,7 @@ // We found something, we can just return now picked_machine_ref = WEAKREF(sick_device) return + setup = TRUE //MONKESTATION ADDITION /datum/round_event/radiation_leak/announce(fake) var/obj/machinery/the_source_of_our_problems = picked_machine_ref?.resolve() diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 5b2b6b71ea1d..afd24a061a56 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -1,7 +1,7 @@ /datum/round_event_control/radiation_storm name = "Radiation Storm" typepath = /datum/round_event/radiation_storm - max_occurrences = 1 + max_occurrences = 2 //monkestation edit - STORYTELLERS 1 ==> 2 category = EVENT_CATEGORY_SPACE description = "Radiation storm affects the station, forcing the crew to escape to maintenance." min_wizard_trigger_potency = 3 @@ -14,6 +14,7 @@ start_when = 3 end_when = start_when + 1 announce_when = 1 + setup = TRUE //MONKESTATION ADDITION /datum/round_event/radiation_storm/announce(fake) priority_announce("High levels of radiation detected near the station. Maintenance is best shielded from radiation.", "Anomaly Alert", ANNOUNCER_RADIATION) diff --git a/code/modules/events/sandstorm.dm b/code/modules/events/sandstorm.dm index 0288b32ec207..7a308fc457a0 100644 --- a/code/modules/events/sandstorm.dm +++ b/code/modules/events/sandstorm.dm @@ -30,6 +30,7 @@ /datum/round_event/sandstorm/setup() start_when = rand(70, 90) end_when = rand(110, 140) + setup = TRUE //MONKESTATION ADDITION /datum/round_event/sandstorm/announce(fake) if(!start_side) diff --git a/code/modules/events/scrubber_clog.dm b/code/modules/events/scrubber_clog.dm index 0bbb0801182a..3247d3f6be7c 100644 --- a/code/modules/events/scrubber_clog.dm +++ b/code/modules/events/scrubber_clog.dm @@ -40,6 +40,7 @@ end_when = rand(300, 600) maximum_spawns = rand(3, 5) spawn_delay = rand(10, 15) + setup = TRUE //MONKESTATION ADDITION /datum/round_event/scrubber_clog/start() //Sets the scrubber up for unclogging/mob production. scrubber.clog() @@ -86,7 +87,7 @@ scrubber_list += scrubber return pick(scrubber_list) -/datum/round_event_control/scrubber_clog/can_spawn_event(players_amt, allow_magic = FALSE) +/datum/round_event_control/scrubber_clog/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) //MONKESTATION ADDITION: fake_check = FALSE . = ..() if(!.) return @@ -184,6 +185,7 @@ /mob/living/basic/carp, /mob/living/basic/bee/toxin, /mob/living/basic/cockroach/glockroach, + /mob/living/basic/bear, //monkestation addition ) return pick(mob_list) @@ -210,7 +212,7 @@ /datum/round_event/scrubber_clog/strange/get_mob() var/static/list/mob_list = list( /mob/living/basic/lightgeist, - /mob/living/basic/bear, + ///mob/living/basic/bear, monkestation removal /mob/living/basic/mushroom, /mob/living/simple_animal/hostile/retaliate/goose, //Janitors HATE geese. /mob/living/simple_animal/pet/gondola, diff --git a/code/modules/events/scrubber_overflow.dm b/code/modules/events/scrubber_overflow.dm index 897d07110317..94f23751b5d1 100644 --- a/code/modules/events/scrubber_overflow.dm +++ b/code/modules/events/scrubber_overflow.dm @@ -84,8 +84,9 @@ if(!scrubbers.len) return kill() + setup = TRUE //MONKESTATION ADDITION -/datum/round_event_control/scrubber_overflow/can_spawn_event(players_amt, allow_magic = FALSE) +/datum/round_event_control/scrubber_overflow/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) //MONKESTATION ADDITION: fake_check = FALSE . = ..() if(!.) return diff --git a/code/modules/events/shuttle_catastrophe.dm b/code/modules/events/shuttle_catastrophe.dm index ed64c52a836a..41f195e8e7cf 100644 --- a/code/modules/events/shuttle_catastrophe.dm +++ b/code/modules/events/shuttle_catastrophe.dm @@ -7,7 +7,7 @@ description = "Replaces the emergency shuttle with a random one." admin_setup = list(/datum/event_admin_setup/warn_admin/shuttle_catastrophe, /datum/event_admin_setup/listed_options/shuttle_catastrophe) -/datum/round_event_control/shuttle_catastrophe/can_spawn_event(players, allow_magic = FALSE) +/datum/round_event_control/shuttle_catastrophe/can_spawn_event(players, allow_magic = FALSE, fake_check = FALSE) //MONKESTATION ADDITION: fake_check = FALSE . = ..() if(!.) return . @@ -46,6 +46,7 @@ if(!isnull(template.who_can_purchase) && template.credit_cost < INFINITY) //if we could get it from the communications console, it's cool for us to get it here valid_shuttle_templates += template new_shuttle = pick(valid_shuttle_templates) + setup = TRUE //MONKESTATION ADDITION /datum/round_event/shuttle_catastrophe/start() if(SSshuttle.shuttle_insurance) diff --git a/code/modules/events/shuttle_insurance.dm b/code/modules/events/shuttle_insurance.dm index d1e39125e346..63d4202619e9 100644 --- a/code/modules/events/shuttle_insurance.dm +++ b/code/modules/events/shuttle_insurance.dm @@ -1,5 +1,3 @@ - - /datum/round_event_control/shuttle_insurance name = "Shuttle Insurance" typepath = /datum/round_event/shuttle_insurance @@ -7,7 +5,7 @@ category = EVENT_CATEGORY_BUREAUCRATIC description = "A sketchy but legit insurance offer." -/datum/round_event_control/shuttle_insurance/can_spawn_event(players, allow_magic = FALSE) +/datum/round_event_control/shuttle_insurance/can_spawn_event(players, allow_magic = FALSE, fake_check = FALSE) //MONKESTATION ADDITION: fake_check = FALSE . = ..() if(!.) return . @@ -39,6 +37,7 @@ break if(!insurance_evaluation) insurance_evaluation = 5000 //gee i dunno + setup = TRUE //MONKESTATION ADDITION /datum/round_event/shuttle_insurance/start() insurance_message = new("Shuttle Insurance", "Hey, pal, this is the [ship_name]. Can't help but notice you're rocking a wild and crazy shuttle there with NO INSURANCE! Crazy. What if something happened to it, huh?! We've done a quick evaluation on your rates in this sector and we're offering [insurance_evaluation] to cover for your shuttle in case of any disaster.", list("Purchase Insurance.","Reject Offer.")) diff --git a/code/modules/events/shuttle_loan/shuttle_loan_datum.dm b/code/modules/events/shuttle_loan/shuttle_loan_datum.dm index 7bbb84e5ab47..4f5564563f90 100644 --- a/code/modules/events/shuttle_loan/shuttle_loan_datum.dm +++ b/code/modules/events/shuttle_loan/shuttle_loan_datum.dm @@ -86,12 +86,12 @@ var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/imports/specialops] pack.generate(pick_n_take(empty_shuttle_turfs)) - spawn_list.Add(/mob/living/basic/syndicate/ranged/infiltrator) - spawn_list.Add(/mob/living/basic/syndicate/ranged/infiltrator) + spawn_list.Add(/mob/living/basic/trooper/syndicate/ranged/infiltrator) + spawn_list.Add(/mob/living/basic/trooper/syndicate/ranged/infiltrator) if(prob(75)) - spawn_list.Add(/mob/living/basic/syndicate/ranged/infiltrator) + spawn_list.Add(/mob/living/basic/trooper/syndicate/ranged/infiltrator) if(prob(50)) - spawn_list.Add(/mob/living/basic/syndicate/ranged/infiltrator) + spawn_list.Add(/mob/living/basic/trooper/syndicate/ranged/infiltrator) /datum/shuttle_loan_situation/lots_of_bees sender = "CentCom Janitorial Division" @@ -178,11 +178,11 @@ var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/service/party] pack.generate(pick_n_take(empty_shuttle_turfs)) - spawn_list.Add(/mob/living/basic/syndicate/russian) - spawn_list.Add(/mob/living/basic/syndicate/russian/ranged) //drops a mateba + spawn_list.Add(/mob/living/basic/trooper/russian) + spawn_list.Add(/mob/living/basic/trooper/russian/ranged) //drops a mateba spawn_list.Add(/mob/living/basic/bear/russian) if(prob(75)) - spawn_list.Add(/mob/living/basic/syndicate/russian) + spawn_list.Add(/mob/living/basic/trooper/russian) if(prob(50)) spawn_list.Add(/mob/living/basic/bear/russian) diff --git a/code/modules/events/shuttle_loan/shuttle_loan_event.dm b/code/modules/events/shuttle_loan/shuttle_loan_event.dm index 96db32c044d6..ca593d3b8414 100644 --- a/code/modules/events/shuttle_loan/shuttle_loan_event.dm +++ b/code/modules/events/shuttle_loan/shuttle_loan_event.dm @@ -10,7 +10,7 @@ admin_setup = list(/datum/event_admin_setup/listed_options/shuttle_loan) var/list/run_situations = list() -/datum/round_event_control/shuttle_loan/can_spawn_event(players_amt, allow_magic = FALSE) +/datum/round_event_control/shuttle_loan/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) . = ..() for(var/datum/round_event/running_event in SSevents.running) if(istype(running_event, /datum/round_event/shuttle_loan)) //Make sure two of these don't happen at once. @@ -37,6 +37,7 @@ loan_control.run_situations.Add(situation) situation = new situation() + setup = TRUE /datum/round_event/shuttle_loan/announce(fake) priority_announce("Cargo: [situation.announcement_text]", situation.sender) diff --git a/code/modules/events/space_vines/vine_event.dm b/code/modules/events/space_vines/vine_event.dm index a668f036cac3..c3d6e03754a0 100644 --- a/code/modules/events/space_vines/vine_event.dm +++ b/code/modules/events/space_vines/vine_event.dm @@ -3,7 +3,7 @@ typepath = /datum/round_event/spacevine weight = 15 max_occurrences = 3 - min_players = 10 + min_players = 25 //MONKESTATION CHANGE: 10 ==> 25 category = EVENT_CATEGORY_ENTITIES description = "Kudzu begins to overtake the station. Might spawn man-traps." min_wizard_trigger_potency = 4 @@ -64,7 +64,7 @@ /datum/event_admin_setup/set_location/spacevine/apply_to_event(datum/round_event/spacevine/event) event.override_turf = chosen_turf - + /datum/event_admin_setup/multiple_choice/spacevine input_text = "Select starting mutations." min_choices = 0 @@ -88,7 +88,7 @@ type_choices += text2path(choice) event.mutations_overridden = TRUE event.override_mutations = type_choices - + /datum/event_admin_setup/input_number/spacevine_potency input_text = "Set vine's potency (effects mutation frequency + max severity)" max_value = 100 diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm index 52ad7474694d..5c241de70e03 100644 --- a/code/modules/events/spider_infestation.dm +++ b/code/modules/events/spider_infestation.dm @@ -5,7 +5,7 @@ max_occurrences = 1 min_players = 35 //monkie edit: 20 to 35 earliest_start = 60 MINUTES //monke edit: 20 to 60 - dynamic_should_hijack = TRUE + //dynamic_should_hijack = TRUE category = EVENT_CATEGORY_ENTITIES description = "Spawns spider eggs, ready to hatch." min_wizard_trigger_potency = 5 @@ -17,6 +17,7 @@ /datum/round_event/spider_infestation/setup() announce_when = rand(announce_when, announce_when + 50) + setup = TRUE //MONKESTATION ADDITION /datum/round_event/spider_infestation/announce(fake) priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", ANNOUNCER_ALIENS) diff --git a/code/modules/events/stray_cargo.dm b/code/modules/events/stray_cargo.dm index e783f18ec025..b819e27a7db6 100644 --- a/code/modules/events/stray_cargo.dm +++ b/code/modules/events/stray_cargo.dm @@ -66,6 +66,7 @@ var/datum/supply_pack/pack_type = pack if(initial(pack_type.special)) stray_spawnable_supply_packs -= pack + setup = TRUE //MONKESTATION ADDITION ///Spawns a random supply pack, puts it in a pod, and spawns it on a random tile of the selected area /datum/round_event/stray_cargo/start() diff --git a/code/modules/events/tram_malfunction.dm b/code/modules/events/tram_malfunction.dm index b5130a8c6934..31f7e5ad2cf0 100644 --- a/code/modules/events/tram_malfunction.dm +++ b/code/modules/events/tram_malfunction.dm @@ -13,7 +13,7 @@ max_wizard_trigger_potency = 3 //Check if there's a tram we can cause to malfunction. -/datum/round_event_control/tram_malfunction/can_spawn_event(players_amt, allow_magic = FALSE) +/datum/round_event_control/tram_malfunction/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) //MONKESTATION ADDITION: fake_check = FALSE . = ..() if (!.) return FALSE @@ -33,6 +33,7 @@ /datum/round_event/tram_malfunction/setup() end_when = rand(TRAM_MALFUNCTION_TIME_LOWER, TRAM_MALFUNCTION_TIME_UPPER) + setup = TRUE //MONKESTATION ADDITION /datum/round_event/tram_malfunction/announce() priority_announce("Our automated control system has lost contact with the tram's on board computer. Please take extra care while we diagnose and resolve the issue. Signals and emergency braking may not be available during this time.", "CentCom Engineering Division") diff --git a/code/modules/events/wisdomcow.dm b/code/modules/events/wisdomcow.dm index 1ecd43797e58..02251917fb6a 100644 --- a/code/modules/events/wisdomcow.dm +++ b/code/modules/events/wisdomcow.dm @@ -56,5 +56,5 @@ /datum/event_admin_setup/input_number/wisdom_cow/apply_to_event(datum/round_event/wisdomcow/event) event.selected_experience = chosen_value - - + + diff --git a/code/modules/events/wizard/blobies.dm b/code/modules/events/wizard/blobies.dm index 307d01ff7eb4..0a9c96d51354 100644 --- a/code/modules/events/wizard/blobies.dm +++ b/code/modules/events/wizard/blobies.dm @@ -10,4 +10,4 @@ /datum/round_event/wizard/blobies/start() for(var/mob/living/carbon/human/H in GLOB.dead_mob_list) - new /mob/living/simple_animal/hostile/blob/blobspore(H.loc) + new /mob/living/basic/blob_minion/spore/minion(H.loc) // Creates zombies which ghosts can control diff --git a/code/modules/events/wizard/embeddies.dm b/code/modules/events/wizard/embeddies.dm index ea8c5fd176bc..689e48b4641a 100644 --- a/code/modules/events/wizard/embeddies.dm +++ b/code/modules/events/wizard/embeddies.dm @@ -9,7 +9,7 @@ max_wizard_trigger_potency = 7 ///behold... the only reason sticky is a subtype... -/datum/round_event_control/wizard/embedpocalypse/can_spawn_event(players_amt, allow_magic = FALSE) +/datum/round_event_control/wizard/embedpocalypse/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) //MONKESTATION ADDITION: fake_check = FALSE . = ..() if(!.) return . diff --git a/code/modules/events/wizard/identity_spoof.dm b/code/modules/events/wizard/identity_spoof.dm index dcd923c2776a..88f0ed26e5cd 100644 --- a/code/modules/events/wizard/identity_spoof.dm +++ b/code/modules/events/wizard/identity_spoof.dm @@ -5,7 +5,7 @@ max_occurrences = 1 description = "Makes everyone dressed up like a wizard." -/datum/round_event_control/wizard/identity_spoof/can_spawn_event(players_amt, allow_magic = FALSE) +/datum/round_event_control/wizard/identity_spoof/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) //MONKESTATION ADDITION: fake_check = FALSE . = ..() if(!.) return . diff --git a/code/modules/events/wizard/petsplosion.dm b/code/modules/events/wizard/petsplosion.dm index e2c69a52ee1f..9bc15342a69d 100644 --- a/code/modules/events/wizard/petsplosion.dm +++ b/code/modules/events/wizard/petsplosion.dm @@ -4,21 +4,21 @@ GLOBAL_LIST_INIT(petsplosion_candidates, typecacheof(list( /mob/living/basic/butterfly, /mob/living/basic/carp/pet/cayenne, /mob/living/basic/cow, - /mob/living/basic/spider/giant/sgt_araneus, + /mob/living/basic/goat, /mob/living/basic/lizard, /mob/living/basic/mothroach, /mob/living/basic/mouse/brown/tom, + /mob/living/basic/parrot, /mob/living/basic/pet, /mob/living/basic/pig, /mob/living/basic/chicken, /mob/living/basic/rabbit, /mob/living/basic/sheep, - /mob/living/simple_animal/pet, - /mob/living/simple_animal/parrot, - /mob/living/simple_animal/sloth, - /mob/living/simple_animal/hostile/retaliate/goat, - /mob/living/simple_animal/hostile/retaliate/snake, + /mob/living/basic/sloth, + /mob/living/basic/snake, + /mob/living/basic/spider/giant/sgt_araneus, /mob/living/simple_animal/hostile/retaliate/goose/vomit, + /mob/living/simple_animal/pet, ))) /datum/round_event_control/wizard/petsplosion //the horror diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm index 79b0462d5164..9220f37fb896 100644 --- a/code/modules/events/wizard/rpgloot.dm +++ b/code/modules/events/wizard/rpgloot.dm @@ -23,21 +23,28 @@ var/can_backfire = TRUE var/uses = 1 -/obj/item/upgradescroll/afterattack(obj/item/target, mob/user, proximity) +/obj/item/upgradescroll/apply_fantasy_bonuses(bonus) . = ..() - if(!proximity || !istype(target)) - return + if(bonus >= 15) + can_backfire = FALSE + upgrade_amount = modify_fantasy_variable("upgrade_amount", upgrade_amount, round(bonus / 4), minimum = 1) - . |= AFTERATTACK_PROCESSED_ITEM +/obj/item/upgradescroll/remove_fantasy_bonuses(bonus) + upgrade_amount = reset_fantasy_variable("upgrade_amount", upgrade_amount) + can_backfire = TRUE + return ..() - target.AddComponent(/datum/component/fantasy, upgrade_amount, null, null, can_backfire, TRUE) +/obj/item/upgradescroll/pre_attack(obj/item/target, mob/living/user) + . = ..() + if(. || !istype(target) || !(user.istate & ISTATE_HARM)) + return + target.AddComponent(/datum/component/fantasy, upgrade_amount, null, null, can_backfire, TRUE) uses -= 1 if(!uses) visible_message(span_warning("[src] vanishes, its magic completely consumed from the fortification.")) qdel(src) - - return . + return TRUE /obj/item/upgradescroll/unlimited name = "unlimited foolproof item fortification scroll" @@ -66,13 +73,16 @@ GLOBAL_DATUM(rpgloot_controller, /datum/rpgloot_controller) /datum/rpgloot_controller/New() . = ..() //second operation takes MUCH longer, so lets set up signals first. - RegisterSignal(SSdcs, COMSIG_GLOB_NEW_ITEM, PROC_REF(on_new_item_in_existence)) + RegisterSignal(SSdcs, COMSIG_GLOB_ATOM_AFTER_POST_INIT, PROC_REF(on_new_item_in_existence)) handle_current_items() ///signal sent by a new item being created. /datum/rpgloot_controller/proc/on_new_item_in_existence(datum/source, obj/item/created_item) SIGNAL_HANDLER - + if(!istype(created_item)) + return + if(created_item.item_flags & SKIP_FANTASY_ON_SPAWN) + return created_item.AddComponent(/datum/component/fantasy) /** @@ -91,6 +101,9 @@ GLOBAL_DATUM(rpgloot_controller, /datum/rpgloot_controller) fantasy_item.AddComponent(/datum/component/fantasy) + if(isnull(fantasy_item.loc)) + continue + if(istype(fantasy_item, /obj/item/storage)) var/obj/item/storage/storage_item = fantasy_item var/datum/storage/storage_component = storage_item.atom_storage diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index f80d432c8920..37ad8afec98c 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -23,6 +23,7 @@ GLOBAL_LIST_EMPTY(all_wormholes) // So we can pick wormholes to teleport to /datum/round_event/wormholes/setup() announce_when = rand(0, 20) end_when = rand(40, 80) + setup = TRUE //MONKESTATION ADDITION /datum/round_event/wormholes/start() for(var/turf/open/floor/T in world) diff --git a/code/modules/experisci/experiment/experiments.dm b/code/modules/experisci/experiment/experiments.dm index b2e2ef909ff3..3ee6d15d7115 100644 --- a/code/modules/experisci/experiment/experiments.dm +++ b/code/modules/experisci/experiment/experiments.dm @@ -39,7 +39,14 @@ description = "We need to see how the body functions from the earliest moments. Some cytology experiments will help us gain this understanding." total_requirement = 3 max_requirement_per_type = 2 - possible_types = list(/mob/living/basic/carp, /mob/living/simple_animal/hostile/retaliate/snake, /mob/living/simple_animal/pet/cat, /mob/living/basic/pet/dog/corgi, /mob/living/basic/cow, /mob/living/basic/chicken) + possible_types = list( + /mob/living/basic/carp, + /mob/living/basic/chicken, + /mob/living/basic/cow, + /mob/living/basic/pet/dog/corgi, + /mob/living/basic/snake, + /mob/living/simple_animal/pet/cat, + ) /datum/experiment/scanning/random/cytology/medium/one name = "Advanced Cytology Scanning Experiment One" @@ -242,7 +249,6 @@ required_points = 10 required_atoms = list( /obj/machinery/mecha_part_fabricator = 1, - /obj/machinery/rnd/experimentor = 1, /obj/machinery/dna_scannernew = 1, /obj/machinery/microwave = 2, /obj/machinery/deepfryer = 2, @@ -273,7 +279,6 @@ required_points = 6 required_atoms = list( /obj/machinery/dna_scannernew = 1, - /obj/machinery/rnd/experimentor = 1, /obj/machinery/medical_kiosk = 2, /obj/machinery/piratepad/civilian = 2, ) @@ -299,7 +304,6 @@ required_atoms = list( /obj/machinery/mecha_part_fabricator = 1, /obj/machinery/microwave = 1, - /obj/machinery/rnd/experimentor = 1, /obj/machinery/atmospherics/components/unary/thermomachine/freezer = 2, /obj/machinery/power/emitter = 2, /obj/machinery/chem_heater = 2, diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm index a5149b29e3d4..236a84045008 100644 --- a/code/modules/fishing/fish/_fish.dm +++ b/code/modules/fishing/fish/_fish.dm @@ -417,13 +417,13 @@ //Fish breeding stops if fish count exceeds this. #define AQUARIUM_MAX_BREEDING_POPULATION 20 -/obj/item/fish/proc/ready_to_reproduce(being_targetted = FALSE) +/obj/item/fish/proc/ready_to_reproduce(being_targeted = FALSE) var/obj/structure/aquarium/aquarium = loc if(!istype(aquarium)) return FALSE - if(being_targetted && HAS_TRAIT(src, TRAIT_FISH_NO_MATING)) + if(being_targeted && HAS_TRAIT(src, TRAIT_FISH_NO_MATING)) return FALSE - if(!being_targetted && length(aquarium.get_fishes()) >= AQUARIUM_MAX_BREEDING_POPULATION) + if(!being_targeted && length(aquarium.get_fishes()) >= AQUARIUM_MAX_BREEDING_POPULATION) return FALSE return aquarium.allow_breeding && health >= initial(health) * 0.8 && stable_population > 1 && world.time >= breeding_wait diff --git a/code/modules/food_and_drinks/recipes/soup_mixtures.dm b/code/modules/food_and_drinks/recipes/soup_mixtures.dm index 8a5baedb6644..ceb207a85ae2 100644 --- a/code/modules/food_and_drinks/recipes/soup_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/soup_mixtures.dm @@ -36,6 +36,7 @@ mix_message = "You smell something good coming from the steaming pot of soup." reaction_tags = REACTION_TAG_FOOD | REACTION_TAG_EASY reaction_flags = REACTION_NON_INSTANT + var/Nonsouprecipe = FALSE // General soup guideline: // - Soups should produce 60-90 units (3-4 servings) @@ -188,14 +189,14 @@ continue // Things that had reagents or ingredients in the soup will get deleted - if((!isnull(ingredient.reagents) || is_type_in_list(ingredient, required_ingredients)) && !is_type_in_list(ingredient, outputted_ingredients)) + if((!isnull(ingredient.reagents) || is_type_in_list(ingredient, required_ingredients)) && !is_type_in_list(ingredient, outputted_ingredients) && !Nonsouprecipe) //monkeedit // Send everything left behind transfer_ingredient_reagents(ingredient, holder) // Delete, it's done qdel(ingredient) // Everything else will just get fried - else + if (!Nonsouprecipe) //monkeedit ingredient.AddElement(/datum/element/fried_item, 30) //LAZYNULL(pot.added_ingredients) diff --git a/code/modules/food_and_drinks/restaurant/_venue.dm b/code/modules/food_and_drinks/restaurant/_venue.dm index 0e3af728a8b3..76ccd245bf68 100644 --- a/code/modules/food_and_drinks/restaurant/_venue.dm +++ b/code/modules/food_and_drinks/restaurant/_venue.dm @@ -60,10 +60,10 @@ if (initial(customer_type.is_unique)) customer_types -= customer_type - var/mob/living/simple_animal/robot_customer/new_customer = new /mob/living/simple_animal/robot_customer(get_turf(restaurant_portal), customer_type, src) + var/mob/living/basic/robot_customer/new_customer = new /mob/living/basic/robot_customer(get_turf(restaurant_portal), customer_type, src) current_visitors += new_customer -/datum/venue/proc/order_food(mob/living/simple_animal/robot_customer/customer_pawn, datum/customer_data/customer_data) +/datum/venue/proc/order_food(mob/living/basic/robot_customer/customer_pawn, datum/customer_data/customer_data) var/order = pick_weight(customer_data.orderable_objects[venue_type]) var/list/order_args // Only for custom orders - arguments passed into New var/image/food_image @@ -113,7 +113,7 @@ return "broken venue pls call a coder" ///Effects for when a customer receives their order at this venue -/datum/venue/proc/on_get_order(mob/living/simple_animal/robot_customer/customer_pawn, obj/item/order_item) +/datum/venue/proc/on_get_order(mob/living/basic/robot_customer/customer_pawn, obj/item/order_item) SHOULD_CALL_PARENT(TRUE) // This is an item typepath, a reagent typepath, or a custom order datum instance. @@ -152,7 +152,7 @@ open = FALSE restaurant_portal.update_icon() STOP_PROCESSING(SSobj, src) - for(var/mob/living/simple_animal/robot_customer as anything in current_visitors) + for(var/mob/living/basic/robot_customer as anything in current_visitors) robot_customer.ai_controller.set_blackboard_key(BB_CUSTOMER_LEAVING, TRUE) //LEAVEEEEEE /obj/machinery/restaurant_portal diff --git a/code/modules/food_and_drinks/restaurant/custom_order.dm b/code/modules/food_and_drinks/restaurant/custom_order.dm index 25ea87802413..d865c65c3e55 100644 --- a/code/modules/food_and_drinks/restaurant/custom_order.dm +++ b/code/modules/food_and_drinks/restaurant/custom_order.dm @@ -34,7 +34,7 @@ * Return [TRANSACTION_SUCCESS] to denote the order went through successfully (Not generally necessary to include here) * Return [TRANSACTION_HANDLED] to not do any further handling of the order by the */ -/datum/custom_order/proc/handle_get_order(mob/living/simple_animal/robot_customer/customer_pawn, obj/item/order_item) +/datum/custom_order/proc/handle_get_order(mob/living/basic/robot_customer/customer_pawn, obj/item/order_item) return NONE /datum/custom_order/moth_clothing @@ -152,7 +152,7 @@ food_image.add_overlay(drink_image) return food_image -/datum/custom_order/reagent/handle_get_order(mob/living/simple_animal/robot_customer/customer_pawn, obj/item/order_item) +/datum/custom_order/reagent/handle_get_order(mob/living/basic/robot_customer/customer_pawn, obj/item/order_item) . = TRANSACTION_HANDLED for(var/datum/reagent/reagent as anything in order_item.reagents?.reagent_list) @@ -183,7 +183,7 @@ /datum/custom_order/reagent/drink container_needed = /obj/item/reagent_containers/cup/glass/drinkingglass -/datum/custom_order/reagent/drink/handle_get_order(mob/living/simple_animal/robot_customer/customer_pawn, obj/item/order_item) +/datum/custom_order/reagent/drink/handle_get_order(mob/living/basic/robot_customer/customer_pawn, obj/item/order_item) customer_pawn.visible_message( span_danger("[customer_pawn] slurps up [order_item] in one go!"), span_danger("You slurp up [order_item] in one go."), @@ -209,7 +209,7 @@ /datum/custom_order/reagent/soup/get_order_line(datum/venue/our_venue) return "I'll take a [picked_serving] of [initial(reagent_type.name)]" -/datum/custom_order/reagent/soup/handle_get_order(mob/living/simple_animal/robot_customer/customer_pawn, obj/item/order_item) +/datum/custom_order/reagent/soup/handle_get_order(mob/living/basic/robot_customer/customer_pawn, obj/item/order_item) customer_pawn.visible_message( span_danger("[customer_pawn] pours [order_item] right down [customer_pawn.p_their()] hatch!"), span_danger("You pour [order_item] down your hatch in one go."), diff --git a/code/modules/food_and_drinks/restaurant/customers/_customer.dm b/code/modules/food_and_drinks/restaurant/customers/_customer.dm index 935323192b30..85ccdc499640 100644 --- a/code/modules/food_and_drinks/restaurant/customers/_customer.dm +++ b/code/modules/food_and_drinks/restaurant/customers/_customer.dm @@ -52,10 +52,10 @@ /datum/customer_data/proc/can_use(datum/venue/venue) return TRUE -/datum/customer_data/proc/get_overlays(mob/living/simple_animal/robot_customer/customer) +/datum/customer_data/proc/get_overlays(mob/living/basic/robot_customer/customer) return -/datum/customer_data/proc/get_underlays(mob/living/simple_animal/robot_customer/customer) +/datum/customer_data/proc/get_underlays(mob/living/basic/robot_customer/customer) return /datum/customer_data/american @@ -176,7 +176,7 @@ ), ) -/datum/customer_data/french/get_overlays(mob/living/simple_animal/robot_customer/customer) +/datum/customer_data/french/get_overlays(mob/living/basic/robot_customer/customer) if(customer.ai_controller.blackboard[BB_CUSTOMER_LEAVING]) var/mutable_appearance/flag = mutable_appearance(customer.icon, "french_flag") flag.appearance_flags = RESET_COLOR @@ -223,7 +223,7 @@ ), ) -/datum/customer_data/japanese/get_overlays(mob/living/simple_animal/robot_customer/customer) +/datum/customer_data/japanese/get_overlays(mob/living/basic/robot_customer/customer) //leaving and eaten if(type == /datum/customer_data/japanese && customer.ai_controller.blackboard[BB_CUSTOMER_LEAVING] && customer.ai_controller.blackboard[BB_CUSTOMER_EATING]) var/mutable_appearance/you_won_my_heart = mutable_appearance('icons/effects/effects.dmi', "love_hearts") @@ -302,13 +302,13 @@ return FALSE return TRUE -/datum/customer_data/moth/proc/get_wings(mob/living/simple_animal/robot_customer/customer) +/datum/customer_data/moth/proc/get_wings(mob/living/basic/robot_customer/customer) var/customer_ref = WEAKREF(customer) if (!LAZYACCESS(wings_chosen, customer_ref)) LAZYSET(wings_chosen, customer_ref, GLOB.moth_wings_list[pick(GLOB.moth_wings_list)]) return wings_chosen[customer_ref] -/datum/customer_data/moth/get_underlays(mob/living/simple_animal/robot_customer/customer) +/datum/customer_data/moth/get_underlays(mob/living/basic/robot_customer/customer) var/list/underlays = list() var/datum/sprite_accessory/moth_wings/wings = get_wings(customer) @@ -319,7 +319,7 @@ return underlays -/datum/customer_data/moth/get_overlays(mob/living/simple_animal/robot_customer/customer) +/datum/customer_data/moth/get_overlays(mob/living/basic/robot_customer/customer) var/list/overlays = list() var/datum/sprite_accessory/moth_wings/wings = get_wings(customer) diff --git a/code/modules/food_and_drinks/restaurant/generic_venues.dm b/code/modules/food_and_drinks/restaurant/generic_venues.dm index 19f1ff613233..9e9b0a6d0e3b 100644 --- a/code/modules/food_and_drinks/restaurant/generic_venues.dm +++ b/code/modules/food_and_drinks/restaurant/generic_venues.dm @@ -42,7 +42,7 @@ var/obj/item/object_to_order = order return "I'll take \a [initial(object_to_order.name)]" -/datum/venue/restaurant/on_get_order(mob/living/simple_animal/robot_customer/customer_pawn, obj/item/order_item) +/datum/venue/restaurant/on_get_order(mob/living/basic/robot_customer/customer_pawn, obj/item/order_item) var/transaction_result = ..() if((transaction_result & TRANSACTION_HANDLED) || !(transaction_result & TRANSACTION_SUCCESS)) return diff --git a/code/modules/hallucination/body.dm b/code/modules/hallucination/body.dm index cec96f9f8281..592935409942 100644 --- a/code/modules/hallucination/body.dm +++ b/code/modules/hallucination/body.dm @@ -151,11 +151,11 @@ body_floats = TRUE /datum/hallucination/body/weird/faceless - body_image_file = 'icons/mob/simple/traders.dmi' + body_image_file = 'icons/obj/trader_signs.dmi' body_image_state = "faceless" /datum/hallucination/body/weird/bones - body_image_file = 'icons/mob/simple/traders.dmi' + body_image_file = 'icons/obj/trader_signs.dmi' body_image_state = "mrbones" /datum/hallucination/body/weird/freezer diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index 0019f8e63c16..ef9cd5353dca 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -8,7 +8,7 @@ /turf/open/floor/holofloor/attackby(obj/item/I, mob/living/user) return // HOLOFLOOR DOES NOT GIVE A FUCK -/turf/open/floor/holofloor/tool_act(mob/living/user, obj/item/I, tool_type) +/turf/open/floor/holofloor/tool_act(mob/living/user, obj/item/tool, tool_type, is_right_clicking) return /turf/open/floor/holofloor/burn_tile() diff --git a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm index 3b759a95f496..e23d9b4b7fd4 100644 --- a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm +++ b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm @@ -13,4 +13,5 @@ inhand_icon_state = null body_parts_covered = CHEST|GROIN|LEGS|ARMS clothing_flags = THICKMATERIAL + supports_variations_flags = CLOTHING_SNOUTED_VARIATION allowed = list(/obj/item/melee/flyswatter, /obj/item/reagent_containers/spray/plantbgone, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/cup/bottle, /obj/item/reagent_containers/cup/beaker, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants) diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index 0a5c28c9a3ee..c8f19237ae26 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -187,3 +187,33 @@ juice_results = list(/datum/reagent/consumable/toechtauese_juice = 0) tastes = list("fiery itchy pain" = 1) distill_reagent = /datum/reagent/toxin/itching_powder + +/obj/item/seeds/lanternfruit + name = "pack of lanternfruit seeds" + desc = "These seeds grow into lanternfruit pods." + icon_state = "seed-lanternfruit" + species = "lanternfruit" + plantname = "Lanternfruit Pod" + product = /obj/item/food/grown/lanternfruit + lifespan = 50 + endurance = 30 + maturation = 25 + production = 25 + growthstages = 3 + growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' + icon_grow = "lanternfruit-grow" + icon_dead = "lanternfruit-dead" + icon_harvest = "lanternfruit-harvest" + genes = list(/datum/plant_gene/trait/glow/yellow) + mutatelist = null + reagents_add = list(/datum/reagent/sulfur = 0.07, /datum/reagent/consumable/sugar = 0.07, /datum/reagent/consumable/liquidelectricity = 0.07) + graft_gene = /datum/plant_gene/trait/glow/yellow + +/obj/item/food/grown/lanternfruit + seed = /obj/item/seeds/lanternfruit + name = "lanternfruits" + desc = "A sofly glowing fruit with a handle-shaped stem, an Ethereal favorite!" + icon_state = "lanternfruit" + foodtypes = FRUIT + tastes = list("tv static" = 1, "sour pear" = 1, "grapefruit" = 1) + distill_reagent = /datum/reagent/consumable/ethanol/fruit_wine diff --git a/code/modules/hydroponics/grown/seedling.dm b/code/modules/hydroponics/grown/seedling.dm new file mode 100644 index 000000000000..9a915c41659d --- /dev/null +++ b/code/modules/hydroponics/grown/seedling.dm @@ -0,0 +1,28 @@ +/obj/item/seeds/seedling + name = "pack of seedling seeds" + desc = "These seeds grow into a floral assistant which can help look after other plants!" + icon_state = "seed-seedling" + growing_icon = 'icons/obj/service/hydroponics/growing_fruits.dmi' + icon = 'icons/obj/service/hydroponics/seeds.dmi' + species = "seedling" + plantname = "Seedling Plant" + product = /mob/living/basic/seedling + lifespan = 40 + endurance = 7 + maturation = 10 + production = 1 + growthstages = 2 + yield = 1 + potency = 30 + +/obj/item/seeds/seedling/harvest(mob/harvester) + var/obj/machinery/hydroponics/parent = loc + var/list/grow_locations = get_adjacent_open_turfs(parent) + var/turf/final_location = length(grow_locations) ? pick(grow_locations) : get_turf(parent) + var/mob/living/basic/seedling/seed_pet = new product(final_location) + seed_pet.befriend(harvester) + parent.update_tray(user = harvester, product_count = 1) + +/obj/item/seeds/seedling/evil + product = /mob/living/basic/seedling/meanie + icon_state = "seed-seedling-evil" diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 988beb8e69b5..5e5211d00245 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -230,12 +230,15 @@ /obj/machinery/hydroponics/bullet_act(obj/projectile/Proj) if(!myseed) return ..() - if(istype(Proj , /obj/projectile/energy/floramut)) + if(istype(Proj , /obj/projectile/energy/flora/mut)) mutate() - else if(istype(Proj , /obj/projectile/energy/florayield)) + else if(istype(Proj , /obj/projectile/energy/flora/yield)) return myseed.bullet_act(Proj) - else if(istype(Proj , /obj/projectile/energy/florarevolution)) - mutatespecie_new() + else if(istype(Proj , /obj/projectile/energy/flora/evolution)) + if(myseed) + if(LAZYLEN(myseed.mutatelist)) + myseed.mutate() + mutatespecie() else return ..() diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 88468a7a7bc3..8a7cdd1b2e14 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -175,9 +175,23 @@ copy_seed.desc = desc copy_seed.productdesc = productdesc - copy_seed.reagents_add = reagents_add.Copy() // Faster than grabbing the list from genes. + copy_seed.reagents_add = reagents_add.Copy() // Fastetr than grabbing the list from genes. copy_seed.harvest_age = harvest_age + copy_seed.species = species + copy_seed.icon_grow = icon_grow + copy_seed.icon_harvest = icon_harvest + copy_seed.icon_dead = icon_dead + copy_seed.growthstages = growthstages + copy_seed.growing_icon = growing_icon + copy_seed.seed_offset = seed_offset + copy_seed.traits_in_progress = traits_in_progress + + if(istype(src, /obj/item/seeds/spliced)) + var/obj/item/seeds/spliced/spliced_seed = src + var/obj/item/seeds/spliced/new_spliced_seed = copy_seed + new_spliced_seed.produce_list += spliced_seed.produce_list + return copy_seed /obj/item/seeds/proc/get_gene(typepath) @@ -217,7 +231,7 @@ /obj/item/seeds/bullet_act(obj/projectile/Proj) //Works with the Somatoray to modify plant variables. - if(istype(Proj, /obj/projectile/energy/florayield)) + if(istype(Proj, /obj/projectile/energy/flora/yield)) var/rating = 1 if(istype(loc, /obj/machinery/hydroponics)) var/obj/machinery/hydroponics/H = loc diff --git a/code/modules/industrial_lift/industrial_lift.dm b/code/modules/industrial_lift/industrial_lift.dm index 35525e7ed247..368f3dbc9a97 100644 --- a/code/modules/industrial_lift/industrial_lift.dm +++ b/code/modules/industrial_lift/industrial_lift.dm @@ -1,4 +1,14 @@ GLOBAL_LIST_EMPTY(lifts) +GLOBAL_LIST_INIT(all_radial_directions, list( + "NORTH" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH), + "NORTHEAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTHEAST), + "EAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = EAST), + "SOUTHEAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTHEAST), + "SOUTH" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTH), + "SOUTHWEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTHWEST), + "WEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = WEST), + "NORTHWEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTHWEST) +)) /obj/structure/industrial_lift name = "lift platform" @@ -742,19 +752,8 @@ GLOBAL_LIST_EMPTY(lifts) var/starting_position = loc if (!can_open_lift_radial(user,starting_position)) return -//NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST - var/static/list/tool_list = list( - "NORTH" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH), - "NORTHEAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = NORTH), - "EAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = EAST), - "SOUTHEAST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = EAST), - "SOUTH" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTH), - "SOUTHWEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = SOUTH), - "WEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = WEST), - "NORTHWEST" = image(icon = 'icons/testing/turf_analysis.dmi', icon_state = "red_arrow", dir = WEST) - ) - - var/result = show_radial_menu(user, src, tool_list, custom_check = CALLBACK(src, PROC_REF(can_open_lift_radial), user, starting_position), require_near = TRUE, tooltips = FALSE) + + var/result = show_radial_menu(user, src, GLOB.all_radial_directions, custom_check = CALLBACK(src, PROC_REF(can_open_lift_radial), user, starting_position), require_near = TRUE, tooltips = FALSE) if (!can_open_lift_radial(user,starting_position)) return // nice try if(!isnull(result) && result != "Cancel" && lift_master_datum.controls_locked) diff --git a/code/modules/jobs/departments/departments.dm b/code/modules/jobs/departments/departments.dm index db45899b5c4a..de7053a447d6 100644 --- a/code/modules/jobs/departments/departments.dm +++ b/code/modules/jobs/departments/departments.dm @@ -131,6 +131,13 @@ label_class = "silicon" ui_color = "#5dbda0" +/datum/job_department/spooktober + department_name = DEPARTMENT_SPOOKTOBER + department_bitflags = DEPARTMENT_BITFLAG_SPOOKTOBER + display_order = 9 + label_class = "spooktober" + ui_color = "#f05e16" + /datum/job_department/silicon/generate_nation_name() return "United Nations" //For nations ruleset specifically, because all other sources of nation creation cannot choose silicons diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 954d7c925e2a..c4f5d4e7e3a2 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -11,7 +11,7 @@ supervisors = "Nanotrasen officials and Space Law" req_admin_notify = 1 minimal_player_age = 14 - exp_requirements = 180 + exp_requirements = 1500 exp_required_type = EXP_TYPE_CREW exp_required_type_department = EXP_TYPE_COMMAND exp_granted_type = EXP_TYPE_CREW diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index 5e5dbb1b38e5..4393066100a7 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -49,7 +49,11 @@ ears = /obj/item/radio/headset/headset_med glasses = /obj/item/clothing/glasses/science shoes = /obj/item/clothing/shoes/sneakers/white + //MONKESTATION REMOVAL START - FermiChem/pH chem is disabled, so having buffer bottles in the chemists starting loadout is a complete waste of time, space and processing power. + /* l_pocket = /obj/item/reagent_containers/cup/bottle/random_buffer + */ + //MONKESTATION REMOVAL END r_pocket = /obj/item/reagent_containers/dropper backpack = /obj/item/storage/backpack/chemistry diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index bf511ffb4400..787db0725a75 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -11,7 +11,7 @@ supervisors = SUPERVISOR_CAPTAIN req_admin_notify = 1 minimal_player_age = 7 - exp_requirements = 180 + exp_requirements = 600 exp_required_type = EXP_TYPE_CREW exp_required_type_department = EXP_TYPE_ENGINEERING exp_granted_type = EXP_TYPE_CREW diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 6f70c8676505..7ce73d4e7a5e 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -11,7 +11,7 @@ supervisors = SUPERVISOR_CAPTAIN req_admin_notify = 1 minimal_player_age = 7 - exp_requirements = 180 + exp_requirements = 300 exp_required_type = EXP_TYPE_CREW exp_required_type_department = EXP_TYPE_MEDICAL exp_granted_type = EXP_TYPE_CREW diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index 6be121085d2c..edbc4f625bdb 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -33,13 +33,14 @@ // Adds up to 100, don't mess it up mail_goodies = list( /obj/item/storage/box/ingredients/random = 40, - /obj/item/reagent_containers/cup/bottle/caramel = 8, - /obj/item/reagent_containers/condiment/flour = 8, - /obj/item/reagent_containers/condiment/rice = 8, - /obj/item/reagent_containers/condiment/ketchup = 8, - /obj/item/reagent_containers/condiment/enzyme = 8, - /obj/item/reagent_containers/condiment/soymilk = 8, + /obj/item/reagent_containers/cup/bottle/caramel = 7, + /obj/item/reagent_containers/condiment/flour = 7, + /obj/item/reagent_containers/condiment/rice = 7, + /obj/item/reagent_containers/condiment/ketchup = 7, + /obj/item/reagent_containers/condiment/enzyme = 7, + /obj/item/reagent_containers/condiment/soymilk = 7, /obj/item/kitchen/spoon/soup_ladle = 6, + /obj/item/kitchen/tongs = 6, /obj/item/knife/kitchen = 4, /obj/item/knife/butcher = 2, ) diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index 2bc31e1645f8..89c14fdfca72 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -11,7 +11,7 @@ supervisors = SUPERVISOR_HOP req_admin_notify = 1 minimal_player_age = 10 - exp_requirements = 180 + exp_requirements = 1500 exp_required_type = EXP_TYPE_CREW exp_required_type_department = EXP_TYPE_SERVICE exp_granted_type = EXP_TYPE_CREW diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index e9994ec122e9..4b0d7aaaaa39 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -11,7 +11,7 @@ supervisors = SUPERVISOR_CAPTAIN req_admin_notify = 1 minimal_player_age = 14 - exp_requirements = 300 + exp_requirements = 600 exp_required_type = EXP_TYPE_CREW exp_required_type_department = EXP_TYPE_SECURITY exp_granted_type = EXP_TYPE_CREW diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index a5d1ca7b304e..b7a8691668e2 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -10,6 +10,7 @@ supervisors = "the head of personnel" minimal_player_age = 7 supervisors = SUPERVISOR_CAPTAIN + exp_requirements = 120 exp_required_type_department = EXP_TYPE_SUPPLY exp_granted_type = EXP_TYPE_CREW config_tag = "QUARTERMASTER" diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 4a96bff4f791..f1a1d8135d41 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -13,7 +13,7 @@ req_admin_notify = 1 minimal_player_age = 7 exp_required_type_department = EXP_TYPE_SCIENCE - exp_requirements = 180 + exp_requirements = 900 exp_required_type = EXP_TYPE_CREW exp_granted_type = EXP_TYPE_CREW config_tag = "RESEARCH_DIRECTOR" diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm index 1149e5af4fee..7206e6c02280 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm @@ -18,7 +18,7 @@ . = ..() . += span_notice("Throw this at objects or creatures to freeze them, it will boomerang back so be cautious!") -/obj/item/freeze_cube/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, quickstart = TRUE) +/obj/item/freeze_cube/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, gentle, quickstart = TRUE) . = ..() if(!.) return diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm b/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm index 14c17b621920..9ab9ceee4603 100644 --- a/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm +++ b/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm @@ -291,7 +291,7 @@ /obj/effect/sliding_puzzle/prison/dispense_reward() prisoner.forceMove(get_turf(src)) - prisoner.notransform = FALSE + REMOVE_TRAIT(prisoner, TRAIT_NO_TRANSFORM, element_type) prisoner = null //Some armor so it's harder to kill someone by mistake. @@ -340,7 +340,7 @@ return FALSE //First grab the prisoner and move them temporarily into the generator so they won't get thrown around. - prisoner.notransform = TRUE + ADD_TRAIT(prisoner, TRAIT_NO_TRANSFORM, cube.element_type) prisoner.forceMove(cube) to_chat(prisoner,span_userdanger("You're trapped by the prison cube! You will remain trapped until someone solves it.")) diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm b/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm index 42fdf6216601..11c3128b9402 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm @@ -13,8 +13,8 @@ resistance_flags = FIRE_PROOF | LAVA_PROOF max_integrity = 200 + faction = list(FACTION_ASHWALKER) - var/faction = list(FACTION_ASHWALKER) var/meat_counter = 6 var/datum/team/ashwalkers/ashies var/datum/linked_objective diff --git a/code/modules/mapfluff/ruins/spaceruin_code/clericsden.dm b/code/modules/mapfluff/ruins/spaceruin_code/clericsden.dm index 2ea63245661a..56b09ef7f79f 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/clericsden.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/clericsden.dm @@ -13,24 +13,3 @@ /obj/item/paper/fluff/ruins/clericsden/warning default_raw_text = "FATHER ODIVALLUS DO NOT GO FORWARD WITH THE RITUAL. THE ASTEROID WE'RE ANCHORED TO IS UNSTABLE, YOU WILL DESTROY THE STATION. I HOPE THIS REACHES YOU IN TIME. FATHER AURELLION." - -/mob/living/simple_animal/hostile/construct/proteon - name = "Proteon" - real_name = "Proteon" - desc = "A weaker construct meant to scour ruins for objects of Nar'Sie's affection. Those barbed claws are no joke." - icon_state = "proteon" - icon_living = "proteon" - maxHealth = 35 - health = 35 - melee_damage_lower = 8 - melee_damage_upper = 10 - retreat_distance = 4 //AI proteons will rapidly move in and out of combat to avoid conflict, but will still target and follow you. - attack_verb_continuous = "pinches" - attack_verb_simple = "pinch" - environment_smash = ENVIRONMENT_SMASH_WALLS - attack_sound = 'sound/weapons/punch2.ogg' - playstyle_string = "You are a Proteon. Your abilities in combat are outmatched by most combat constructs, but you are still fast and nimble. Run metal and supplies, and cooperate with your fellow cultists." - -/mob/living/simple_animal/hostile/construct/proteon/hostile //Style of mob spawned by trapped cult runes in the cleric ruin. - AIStatus = AI_ON - environment_smash = ENVIRONMENT_SMASH_STRUCTURES //standard ai construct behavior, breaks things if it wants, but not walls. diff --git a/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm b/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm index 045ab8ec00c9..964f8b218ab5 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm @@ -124,42 +124,3 @@ GLOBAL_VAR_INIT(fscpassword, generate_password()) icon_state = "syndie-ship" ambientsounds = list('sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg') area_flags = NOTELEPORT | UNIQUE_AREA - -//Special NT NPCs - -/mob/living/simple_animal/hostile/nanotrasen/ranged/assault - name = "Nanotrasen Assault Officer" - desc = "Nanotrasen Assault Officer. Contact CentCom if you saw him on your station. Prepare to die, if you've been found near Syndicate property." - ranged = TRUE - rapid = 4 - rapid_fire_delay = 1 - rapid_melee = 1 - retreat_distance = 2 - minimum_distance = 4 - casingtype = /obj/item/ammo_casing/a556/weak - projectilesound = 'sound/weapons/gun/smg/shot.ogg' - loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier) - mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier - held_item = /obj/item/gun/ballistic/automatic/ar - -/mob/living/simple_animal/hostile/nanotrasen/elite - name = "Nanotrasen Elite Assault Officer" - desc = "Pray for your life, syndicate. Run while you can." - maxHealth = 150 - health = 150 - melee_damage_lower = 13 - melee_damage_upper = 18 - ranged = TRUE - rapid = 3 - rapid_fire_delay = 5 - rapid_melee = 3 - retreat_distance = 0 - minimum_distance = 1 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - projectiletype = /obj/projectile/beam/laser - projectilesound = 'sound/weapons/laser.ogg' - loot = list(/obj/effect/gibspawner/human) - faction = list(ROLE_DEATHSQUAD) - mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasenelitesoldier - held_item = /obj/item/gun/energy/pulse/carbine/lethal diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm index c040b96be3b8..e21b73659f4f 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm @@ -482,14 +482,17 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) /obj/item/abstracthotelstorage/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) . = ..() if(ismob(arrived)) - var/mob/M = arrived - M.notransform = TRUE + var/mob/target = arrived + ADD_TRAIT(target, TRAIT_NO_TRANSFORM, REF(src)) /obj/item/abstracthotelstorage/Exited(atom/movable/gone, direction) . = ..() if(ismob(gone)) - var/mob/M = gone - M.notransform = FALSE + var/mob/target = gone + REMOVE_TRAIT(target, TRAIT_NO_TRANSFORM, REF(src)) + if(istype(gone, /obj/machinery/light)) + var/obj/machinery/light/exited_light = gone + exited_light.begin_processing() //Space Ruin stuff /area/ruin/space/has_grav/powered/hilbertresearchfacility diff --git a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm index 8af5d4e5a9d8..fc79c82e780e 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm @@ -13,8 +13,12 @@ /obj/effect/mob_spawn/corpse/human/tigercultist/perforated/special(mob/living/carbon/human/spawned_human) . = ..() - var/datum/wound/pierce/critical/exit_hole = new() - exit_hole.apply_wound(spawned_human.get_bodypart(BODY_ZONE_CHEST)) + + var/obj/item/bodypart/chest/their_chest = spawned_human.get_bodypart(BODY_ZONE_CHEST) + if (!their_chest) + return + + spawned_human.cause_wound_of_type_and_severity(WOUND_PIERCE, their_chest, WOUND_SEVERITY_CRITICAL) /// A fun drink enjoyed by the tiger cooperative, might corrode your brain if you drink the whole bottle /obj/item/reagent_containers/cup/glass/bottle/ritual_wine diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 4ef5b4cfe0dc..14751f3986c2 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -116,7 +116,7 @@ log_mapping("[src] spawned outside of mapload!") return - var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc + var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in (offset_dir ? get_step(src, offset_dir) : loc) //monkestation edit: adds offset_dir check if(!airlock) log_mapping("[src] failed to find an airlock at [AREACOORD(src)]") else @@ -124,7 +124,7 @@ /obj/effect/mapping_helpers/airlock/LateInitialize() . = ..() - var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc + var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in (offset_dir ? get_step(src, offset_dir) : loc) //monkestation edit: adds offset_dir check if(!airlock) qdel(src) return @@ -257,18 +257,18 @@ log_mapping("[src] spawned outside of mapload!") return INITIALIZE_HINT_QDEL - var/obj/machinery/power/apc/target = locate(/obj/machinery/power/apc) in loc + var/obj/machinery/power/apc/target = locate(/obj/machinery/power/apc) in (offset_dir ? get_step(src, offset_dir) : loc) //monkestation edit: adds offset_dir check if(isnull(target)) var/area/target_area = get_area(target) log_mapping("[src] failed to find an apc at [AREACOORD(src)] ([target_area.type]).") else payload(target) - + return INITIALIZE_HINT_LATELOAD /obj/effect/mapping_helpers/apc/LateInitialize() . = ..() - var/obj/machinery/power/apc/target = locate(/obj/machinery/power/apc) in loc + var/obj/machinery/power/apc/target = locate(/obj/machinery/power/apc) in (offset_dir ? get_step(src, offset_dir) : loc) //monkestation edit: adds offset_dir check if(isnull(target)) qdel(src) @@ -408,7 +408,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) /obj/effect/mapping_helpers/atom_injector/LateInitialize() if(!check_validity()) return - var/turf/target_turf = get_turf(src) + var/turf/target_turf = (offset_dir ? get_turf(get_step(src, offset_dir)) : get_turf(src)) //monkestation edit: adds offset_dir check var/matches_found = 0 for(var/atom/atom_on_turf as anything in target_turf.get_all_contents()) if(atom_on_turf == src) @@ -848,7 +848,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) var/note_path //if you already have something wrote up in a paper subtype, put the path here /obj/effect/mapping_helpers/airlock_note_placer/LateInitialize() - var/turf/turf = get_turf(src) + var/turf/turf = (offset_dir ? get_turf(get_step(src, offset_dir)) : get_turf(src)) //monkestation edit: adds offset_dir check if(note_path && !istype(note_path, /obj/item/paper)) //don't put non-paper in the paper slot thank you log_mapping("[src] at [x],[y] had an improper note_path path, could not place paper note.") qdel(src) @@ -892,7 +892,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) icon_state = "trapdoor" /obj/effect/mapping_helpers/trapdoor_placer/LateInitialize() - var/turf/component_target = get_turf(src) + var/turf/component_target = (offset_dir ? get_turf(get_step(src, offset_dir)) : get_turf(src)) //monkestation edit: adds offset_dir check component_target.AddComponent(/datum/component/trapdoor, starts_open = FALSE, conspicuous = FALSE) qdel(src) @@ -977,7 +977,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) return INITIALIZE_HINT_LATELOAD /obj/effect/mapping_helpers/broken_floor/LateInitialize() - var/turf/open/floor/floor = get_turf(src) + var/turf/open/floor/floor = (offset_dir ? get_turf(get_step(src, offset_dir)) : get_turf(src)) //monkestation edit: adds offset_dir check floor.break_tile() qdel(src) @@ -993,6 +993,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) return INITIALIZE_HINT_LATELOAD /obj/effect/mapping_helpers/burnt_floor/LateInitialize() - var/turf/open/floor/floor = get_turf(src) + var/turf/open/floor/floor = (offset_dir ? get_turf(get_step(src, offset_dir)) : get_turf(src)) //monkestation edit: adds offset_dir check floor.burn_tile() qdel(src) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index f944bb11c1f9..8f68b7589716 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -198,7 +198,7 @@ hammer_synced = null return ..() -/obj/projectile/destabilizer/on_hit(atom/target, blocked = FALSE) +/obj/projectile/destabilizer/on_hit(atom/target, blocked = 0, pierce_hit) if(isliving(target)) var/mob/living/L = target var/had_effect = (L.has_status_effect(/datum/status_effect/crusher_mark)) //used as a boolean @@ -435,3 +435,37 @@ chaser.monster_damage_boost = FALSE // Weaker cuz no cooldown chaser.damage = 20 log_combat(user, target, "fired a chaser at", src) + +/obj/item/crusher_trophy/ice_demon_cube + name = "demonic cube" + desc = "A stone cold cube dropped from an ice demon." + icon_state = "ice_demon_cube" + icon = 'icons/obj/mining_zones/artefacts.dmi' + denied_type = /obj/item/crusher_trophy/ice_demon_cube + ///how many will we summon? + var/summon_amount = 2 + ///cooldown to summon demons upon the target + COOLDOWN_DECLARE(summon_cooldown) + +/obj/item/crusher_trophy/ice_demon_cube/effect_desc() + return "mark detonation to unleash demonic ice clones upon the target" + +/obj/item/crusher_trophy/ice_demon_cube/on_mark_detonation(mob/living/target, mob/living/user) + if(isnull(target) || !COOLDOWN_FINISHED(src, summon_cooldown)) + return + for(var/i in 1 to summon_amount) + var/turf/drop_off = find_dropoff_turf(target, user) + var/mob/living/basic/mining/demon_afterimage/crusher/friend = new(drop_off) + friend.faction = list(FACTION_NEUTRAL) + friend.befriend(user) + friend.ai_controller?.set_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET, target) + COOLDOWN_START(src, summon_cooldown, 30 SECONDS) + +///try to make them spawn all around the target to surround him +/obj/item/crusher_trophy/ice_demon_cube/proc/find_dropoff_turf(mob/living/target, mob/living/user) + var/list/turfs_list = get_adjacent_open_turfs(target) + for(var/turf/possible_turf in turfs_list) + if(possible_turf.is_blocked_turf()) + continue + return possible_turf + return get_turf(user) diff --git a/code/modules/mining/equipment/monster_organs/brimdust_sac.dm b/code/modules/mining/equipment/monster_organs/brimdust_sac.dm index dc6539ff336b..a77e526a9d1f 100644 --- a/code/modules/mining/equipment/monster_organs/brimdust_sac.dm +++ b/code/modules/mining/equipment/monster_organs/brimdust_sac.dm @@ -141,7 +141,7 @@ return COMPONENT_CLEANED /// When you take brute damage, schedule an explosion -/datum/status_effect/stacking/brimdust_coating/proc/on_take_damage(datum/source, damage, damagetype) +/datum/status_effect/stacking/brimdust_coating/proc/on_take_damage(datum/source, damage, damagetype, ...) SIGNAL_HANDLER if(damagetype != BRUTE) return diff --git a/code/modules/mining/equipment/monster_organs/regenerative_core.dm b/code/modules/mining/equipment/monster_organs/regenerative_core.dm index bb56b773d735..3f7c2058be82 100644 --- a/code/modules/mining/equipment/monster_organs/regenerative_core.dm +++ b/code/modules/mining/equipment/monster_organs/regenerative_core.dm @@ -36,7 +36,7 @@ /// Log applications and apply moodlet. /obj/item/organ/internal/monster_core/regenerative_core/apply_to(mob/living/target, mob/user) - target.add_mood_event("regenerative core", /datum/mood_event/healsbadman) + target.add_mood_event(MOOD_CATEGORY_LEGION_CORE, /datum/mood_event/healsbadman) if (target != user) target.visible_message(span_notice("[user] forces [target] to apply [src]... Black tendrils entangle and reinforce [target.p_them()]!")) SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "other")) diff --git a/code/modules/mining/lavaland/megafauna_loot.dm b/code/modules/mining/lavaland/megafauna_loot.dm index 8e1876361ac2..bfe050b7ce1d 100644 --- a/code/modules/mining/lavaland/megafauna_loot.dm +++ b/code/modules/mining/lavaland/megafauna_loot.dm @@ -398,7 +398,7 @@ give_blood(10) /obj/item/soulscythe/attack_hand(mob/user, list/modifiers) - if(soul.ckey && !soul.faction_check_mob(user)) + if(soul.ckey && !soul.faction_check_atom(user)) to_chat(user, span_warning("You can't pick up [src]!")) return return ..() @@ -606,7 +606,7 @@ light_power = 1 light_color = LIGHT_COLOR_BLOOD_MAGIC -/obj/projectile/soulscythe/on_hit(atom/target, blocked = FALSE) +/obj/projectile/soulscythe/on_hit(atom/target, blocked = 0, pierce_hit) if(ishostile(target)) damage *= 2 return ..() diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index ff210b4eeb4d..4bedc5946e4a 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -44,7 +44,7 @@ if(12) new /obj/item/jacobs_ladder(src) if(13) - new /obj/item/guardiancreator/miner(src) + new /obj/item/guardian_creator/miner(src) if(14) new /obj/item/warp_cube/red(src) if(15) diff --git a/code/modules/mining/lavaland/tendril_loot.dm b/code/modules/mining/lavaland/tendril_loot.dm index fd9baf3a0320..81d144ea4490 100644 --- a/code/modules/mining/lavaland/tendril_loot.dm +++ b/code/modules/mining/lavaland/tendril_loot.dm @@ -198,14 +198,14 @@ continue regurgitate_guardian(guardian) -/obj/item/clothing/neck/necklace/memento_mori/proc/consume_guardian(mob/living/simple_animal/hostile/guardian/guardian) +/obj/item/clothing/neck/necklace/memento_mori/proc/consume_guardian(mob/living/basic/guardian/guardian) new /obj/effect/temp_visual/guardian/phase/out(get_turf(guardian)) guardian.locked = TRUE guardian.forceMove(src) to_chat(guardian, span_userdanger("You have been locked away in your summoner's pendant!")) guardian.playsound_local(get_turf(guardian), 'sound/magic/summonitems_generic.ogg', 50, TRUE) -/obj/item/clothing/neck/necklace/memento_mori/proc/regurgitate_guardian(mob/living/simple_animal/hostile/guardian/guardian) +/obj/item/clothing/neck/necklace/memento_mori/proc/regurgitate_guardian(mob/living/basic/guardian/guardian) guardian.locked = FALSE guardian.recall(forced = TRUE) to_chat(guardian, span_notice("You have been returned back from your summoner's pendant!")) @@ -421,7 +421,7 @@ return user.status_flags &= ~GODMODE - user.notransform = FALSE + REMOVE_TRAIT(user, TRAIT_NO_TRANSFORM, REF(src)) user.forceMove(get_turf(src)) user.visible_message(span_danger("[user] pops back into reality!")) @@ -432,7 +432,7 @@ setDir(user.dir) user.forceMove(src) - user.notransform = TRUE + ADD_TRAIT(user, TRAIT_NO_TRANSFORM, REF(src)) user.status_flags |= GODMODE user_ref = WEAKREF(user) @@ -446,8 +446,8 @@ return /obj/effect/immortality_talisman/relaymove(mob/living/user, direction) - // Won't really come into play since our mob has notransform and cannot move, - // but regardless block all relayed moves, becuase no, you cannot move in the void. + // Won't really come into play since our mob has TRAIT_NO_TRANSFORM and cannot move, + // but regardless block all relayed moves, because no, you cannot move in the void. return /obj/effect/immortality_talisman/singularity_pull() diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 08df751db8e7..d911328b4a93 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -61,12 +61,16 @@ new /obj/item/storage/bag/plants(src) new /obj/item/storage/bag/ore(src) new /obj/item/t_scanner/adv_mining_scanner/lesser(src) - new /obj/item/gun/energy/recharge/kinetic_accelerator(src) new /obj/item/clothing/glasses/meson(src) new /obj/item/survivalcapsule(src) new /obj/item/assault_pod/mining(src) +/obj/structure/closet/secure_closet/miner/populate_contents_immediate() + . = ..() + + new /obj/item/gun/energy/recharge/kinetic_accelerator(src) + /**********************Shuttle Computer**************************/ /obj/machinery/computer/shuttle/mining diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm deleted file mode 100644 index 3894408d98db..000000000000 --- a/code/modules/mining/minebot.dm +++ /dev/null @@ -1,331 +0,0 @@ -/**********************Mining drone**********************/ -#define MINEDRONE_COLLECT 1 -#define MINEDRONE_ATTACK 2 - -/mob/living/simple_animal/hostile/mining_drone - name = "\improper Nanotrasen minebot" - desc = "The instructions printed on the side read: This is a small robot used to support miners, can be set to search and collect loose ore, or to help fend off wildlife." - gender = NEUTER - icon = 'icons/mob/silicon/aibots.dmi' - icon_state = "mining_drone" - icon_living = "mining_drone" - status_flags = CANSTUN|CANKNOCKDOWN|CANPUSH - mouse_opacity = MOUSE_OPACITY_ICON - faction = list(FACTION_NEUTRAL) - istate = ISTATE_HARM|ISTATE_BLOCKING - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - move_to_delay = 10 - health = 125 - maxHealth = 125 - melee_damage_lower = 15 - melee_damage_upper = 15 - obj_damage = 10 - environment_smash = ENVIRONMENT_SMASH_NONE - check_friendly_fire = TRUE - stop_automated_movement_when_pulled = TRUE - attack_verb_continuous = "drills" - attack_verb_simple = "drill" - attack_sound = 'sound/weapons/circsawhit.ogg' - sentience_type = SENTIENCE_MINEBOT - speak_emote = list("states") - wanted_objects = list(/obj/item/stack/ore/diamond, /obj/item/stack/ore/gold, /obj/item/stack/ore/silver, - /obj/item/stack/ore/plasma, /obj/item/stack/ore/uranium, /obj/item/stack/ore/iron, - /obj/item/stack/ore/bananium, /obj/item/stack/ore/titanium) - healable = 0 - loot = list(/obj/effect/decal/cleanable/robot_debris) - del_on_death = TRUE - light_system = MOVABLE_LIGHT - light_outer_range = 6 - light_on = FALSE - var/mode = MINEDRONE_COLLECT - var/obj/item/gun/energy/recharge/kinetic_accelerator/minebot/stored_gun - -/mob/living/simple_animal/hostile/mining_drone/Initialize(mapload) - . = ..() - - AddElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, sound_vary = TRUE) - - stored_gun = new(src) - var/datum/action/innate/minedrone/toggle_light/toggle_light_action = new() - toggle_light_action.Grant(src) - var/datum/action/innate/minedrone/toggle_meson_vision/toggle_meson_vision_action = new() - toggle_meson_vision_action.Grant(src) - var/datum/action/innate/minedrone/toggle_mode/toggle_mode_action = new() - toggle_mode_action.Grant(src) - var/datum/action/innate/minedrone/dump_ore/dump_ore_action = new() - dump_ore_action.Grant(src) - var/obj/item/implant/radio/mining/imp = new(src) - imp.implant(src) - - access_card = new /obj/item/card/id/advanced/gold(src) - SSid_access.apply_trim_to_card(access_card, /datum/id_trim/job/shaft_miner) - - SetCollectBehavior() - -/mob/living/simple_animal/hostile/mining_drone/Destroy() - QDEL_NULL(stored_gun) - for (var/datum/action/innate/minedrone/action in actions) - qdel(action) - return ..() - -/mob/living/simple_animal/hostile/mining_drone/sentience_act() - ..() - check_friendly_fire = 0 - -/mob/living/simple_animal/hostile/mining_drone/examine(mob/user) - . = ..() - var/t_He = p_they(TRUE) - var/t_him = p_them() - var/t_s = p_s() - if(health < maxHealth) - if(health >= maxHealth * 0.5) - . += span_warning("[t_He] look[t_s] slightly dented.") - else - . += span_boldwarning("[t_He] look[t_s] severely dented!") - . += {"Using a mining scanner on [t_him] will instruct [t_him] to drop stored ore. [max(0, LAZYLEN(contents) - 1)] Stored Ore\n - Field repairs can be done with a welder."} - if(stored_gun?.max_mod_capacity) - . += "[stored_gun.get_remaining_mod_capacity()]% mod capacity remaining." - for(var/obj/item/borg/upgrade/modkit/modkit as anything in stored_gun.modkits) - . += span_notice("There is \a [modkit] installed, using [modkit.cost]% capacity.") - -/mob/living/simple_animal/hostile/mining_drone/welder_act(mob/living/user, obj/item/welder) - ..() - . = TRUE - if(mode == MINEDRONE_ATTACK) - to_chat(user, span_warning("[src] can't be repaired while in attack mode!")) - return - - if(maxHealth == health) - to_chat(user, span_info("[src] is at full integrity.")) - return - - if(welder.use_tool(src, user, 0, volume=40)) - adjustBruteLoss(-15) - to_chat(user, span_info("You repair some of the armor on [src].")) - -/mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/item_used, mob/user, params) - if(istype(item_used, /obj/item/mining_scanner) || istype(item_used, /obj/item/t_scanner/adv_mining_scanner)) - to_chat(user, span_info("You instruct [src] to drop any collected ore.")) - DropOre() - return - if(item_used.tool_behaviour == TOOL_CROWBAR || istype(item_used, /obj/item/borg/upgrade/modkit)) - item_used.melee_attack_chain(user, stored_gun, params) - return - ..() - -/mob/living/simple_animal/hostile/mining_drone/death() - DropOre() - if(stored_gun) - for(var/obj/item/borg/upgrade/modkit/modkit as anything in stored_gun.modkits) - modkit.uninstall(stored_gun) - death_message = "blows apart!" - ..() - -/mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/user, list/modifiers) - . = ..() - if(.) - return - if(!(user.istate & ISTATE_HARM)) - toggle_mode() - switch(mode) - if(MINEDRONE_COLLECT) - to_chat(user, span_info("[src] has been set to search and store loose ore.")) - if(MINEDRONE_ATTACK) - to_chat(user, span_info("[src] has been set to attack hostile wildlife.")) - return - -/mob/living/simple_animal/hostile/mining_drone/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(istype(mover, /obj/projectile/kinetic)) - var/obj/projectile/kinetic/projectile = mover - if(projectile.kinetic_gun) - if (locate(/obj/item/borg/upgrade/modkit/minebot_passthrough) in projectile.kinetic_gun.modkits) - return TRUE - else if(istype(mover, /obj/projectile/destabilizer)) - return TRUE - -/mob/living/simple_animal/hostile/mining_drone/proc/SetCollectBehavior() - mode = MINEDRONE_COLLECT - vision_range = 9 - search_objects = 2 - wander = TRUE - ranged = FALSE - minimum_distance = 1 - retreat_distance = null - icon_state = "mining_drone" - to_chat(src, span_info("You are set to collect mode. You can now collect loose ore.")) - -/mob/living/simple_animal/hostile/mining_drone/proc/SetOffenseBehavior() - mode = MINEDRONE_ATTACK - vision_range = 7 - search_objects = 0 - wander = FALSE - ranged = TRUE - retreat_distance = 2 - minimum_distance = 1 - icon_state = "mining_drone_offense" - to_chat(src, span_info("You are set to attack mode. You can now attack from range.")) - -/mob/living/simple_animal/hostile/mining_drone/AttackingTarget() - if(istype(target, /obj/item/stack/ore) && mode == MINEDRONE_COLLECT) - CollectOre() - return - if(isliving(target)) - SetOffenseBehavior() - return ..() - -/mob/living/simple_animal/hostile/mining_drone/OpenFire(atom/target) - if(CheckFriendlyFire(target)) - return - stored_gun.afterattack(target, src) //of the possible options to allow minebots to have KA mods, would you believe this is the best? - -/mob/living/simple_animal/hostile/mining_drone/proc/CollectOre() - for(var/obj/item/stack/ore/O in range(1, src)) - O.forceMove(src) - -/mob/living/simple_animal/hostile/mining_drone/proc/DropOre(message = 1) - if(!contents.len) - if(message) - to_chat(src, span_warning("You attempt to dump your stored ore, but you have none!")) - return - if(message) - to_chat(src, span_notice("You dump your stored ore.")) - for(var/obj/item/stack/ore/O in contents) - O.forceMove(drop_location()) - -/mob/living/simple_animal/hostile/mining_drone/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - if(mode != MINEDRONE_ATTACK && amount > 0) - SetOffenseBehavior() - . = ..() - -/datum/action/innate/minedrone/toggle_meson_vision - name = "Toggle Meson Vision" - button_icon_state = "meson" - -/datum/action/innate/minedrone/toggle_meson_vision/Activate() - var/mob/living/simple_animal/hostile/mining_drone/user = owner - if(user.sight & SEE_TURFS) - user.clear_sight(SEE_TURFS) - user.lighting_cutoff_red += 5 - user.lighting_cutoff_green += 15 - user.lighting_cutoff_blue += 5 - else - user.add_sight(SEE_TURFS) - user.lighting_cutoff_red -= 5 - user.lighting_cutoff_green -= 15 - user.lighting_cutoff_blue -= 5 - - user.sync_lighting_plane_cutoff() - - to_chat(user, span_notice("You toggle your meson vision [(user.sight & SEE_TURFS) ? "on" : "off"].")) - - -/mob/living/simple_animal/hostile/mining_drone/proc/toggle_mode() - switch(mode) - if(MINEDRONE_ATTACK) - SetCollectBehavior() - else - SetOffenseBehavior() - -//Actions for sentient minebots - -/datum/action/innate/minedrone - check_flags = AB_CHECK_CONSCIOUS - button_icon = 'icons/mob/actions/actions_mecha.dmi' - background_icon_state = "bg_default" - overlay_icon_state = "bg_default_border" - -/datum/action/innate/minedrone/toggle_light - name = "Toggle Light" - button_icon_state = "mech_lights_off" - - -/datum/action/innate/minedrone/toggle_light/Activate() - var/mob/living/simple_animal/hostile/mining_drone/user = owner - user.set_light_on(!user.light_on) - to_chat(user, span_notice("You toggle your light [user.light_on ? "on" : "off"].")) - - -/datum/action/innate/minedrone/toggle_mode - name = "Toggle Mode" - button_icon_state = "mech_cycle_equip_off" - -/datum/action/innate/minedrone/toggle_mode/Activate() - var/mob/living/simple_animal/hostile/mining_drone/user = owner - user.toggle_mode() - -/datum/action/innate/minedrone/dump_ore - name = "Dump Ore" - button_icon_state = "mech_eject" - -/datum/action/innate/minedrone/dump_ore/Activate() - var/mob/living/simple_animal/hostile/mining_drone/user = owner - user.DropOre() - - -/**********************Minebot Upgrades**********************/ - -//Melee - -/obj/item/mine_bot_upgrade - name = "minebot melee upgrade" - desc = "A minebot upgrade." - icon_state = "door_electronics" - icon = 'icons/obj/module.dmi' - -/obj/item/mine_bot_upgrade/afterattack(mob/living/simple_animal/hostile/mining_drone/minebot, mob/user, proximity) - . = ..() - if(!istype(minebot) || !proximity) - return - upgrade_bot(minebot, user) - -/obj/item/mine_bot_upgrade/proc/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/minebot, mob/user) - if(minebot.melee_damage_upper != initial(minebot.melee_damage_upper)) - to_chat(user, span_warning("[minebot] already has a combat upgrade installed!")) - return - minebot.melee_damage_lower += 7 - minebot.melee_damage_upper += 7 - to_chat(user, "You increase the close-quarter combat abilities of [minebot].") - qdel(src) - -//Health - -/obj/item/mine_bot_upgrade/health - name = "minebot armor upgrade" - -/obj/item/mine_bot_upgrade/health/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/minebot, mob/user) - if(minebot.maxHealth != initial(minebot.maxHealth)) - to_chat(user, span_warning("[minebot] already has reinforced armor!")) - return - minebot.maxHealth += 45 - minebot.updatehealth() - to_chat(user, "You reinforce the armor of [minebot].") - qdel(src) - -//AI - -/obj/item/slimepotion/slime/sentience/mining - name = "minebot AI upgrade" - desc = "Can be used to grant sentience to minebots. It's incompatible with minebot armor and melee upgrades, and will override them." - icon_state = "door_electronics" - icon = 'icons/obj/module.dmi' - sentience_type = SENTIENCE_MINEBOT - var/base_health_add = 5 //sentient minebots are penalized for beign sentient; they have their stats reset to normal plus these values - var/base_damage_add = 1 //this thus disables other minebot upgrades - var/base_speed_add = 1 - var/base_cooldown_add = 10 //base cooldown isn't reset to normal, it's just added on, since it's not practical to disable the cooldown module - -/obj/item/slimepotion/slime/sentience/mining/after_success(mob/living/user, mob/living/simple_animal/simple_mob) - if(!istype(simple_mob, /mob/living/simple_animal/hostile/mining_drone)) - return - var/mob/living/simple_animal/hostile/mining_drone/minebot = simple_mob - minebot.maxHealth = initial(minebot.maxHealth) + base_health_add - minebot.melee_damage_lower = initial(minebot.melee_damage_lower) + base_damage_add - minebot.melee_damage_upper = initial(minebot.melee_damage_upper) + base_damage_add - minebot.move_to_delay = initial(minebot.move_to_delay) + base_speed_add - minebot.stored_gun?.recharge_time += base_cooldown_add - -#undef MINEDRONE_COLLECT -#undef MINEDRONE_ATTACK diff --git a/code/modules/mining/voucher_sets.dm b/code/modules/mining/voucher_sets.dm index 86c6e407d67b..071a8f115367 100644 --- a/code/modules/mining/voucher_sets.dm +++ b/code/modules/mining/voucher_sets.dm @@ -62,7 +62,7 @@ icon = 'icons/mob/silicon/aibots.dmi' icon_state = "mining_drone" set_items = list( - /mob/living/simple_animal/hostile/mining_drone, + /mob/living/basic/mining_drone, /obj/item/weldingtool/hugetank, /obj/item/clothing/head/utility/welding, /obj/item/borg/upgrade/modkit/minebot_passthrough, diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index efc4bca39e7a..0fe63f7479bd 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -42,15 +42,17 @@ INITIALIZE_IMMEDIATE(/mob/dead) . += "Time To Start: SOON" . += "Players: [LAZYLEN(GLOB.clients)]" + . += "Players Ready: [SSticker.totalPlayersReady]" if(client.holder) - . += "Players Ready: [SSticker.totalPlayersReady]" . += "Admins Ready: [SSticker.total_admins_ready] / [length(GLOB.admins)]" +#define SERVER_HOPPER_TRAIT "server_hopper" + /mob/dead/proc/server_hop() set category = "OOC" set name = "Server Hop" set desc= "Jump to the other server" - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) // in case the round is ending and a cinematic is already playing we don't wanna clash with that (yes i know) return var/list/our_id = CONFIG_GET(string/cross_comms_name) var/list/csa = CONFIG_GET(keyed_list/cross_server) - our_id @@ -76,9 +78,9 @@ INITIALIZE_IMMEDIATE(/mob/dead) to_chat(C, span_notice("Sending you to [pick].")) new /atom/movable/screen/splash(null, C) - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, SERVER_HOPPER_TRAIT) sleep(2.9 SECONDS) //let the animation play - notransform = FALSE + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, SERVER_HOPPER_TRAIT) if(!C) return @@ -87,6 +89,8 @@ INITIALIZE_IMMEDIATE(/mob/dead) C << link("[addr]") +#undef SERVER_HOPPER_TRAIT + /mob/dead/proc/update_z(new_z) // 1+ to register, null to unregister if (registered_z != new_z) if (registered_z) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index bbf767371807..479d2b8ad271 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -187,7 +187,7 @@ return FALSE //nonliving mobs don't have hands /mob/living/put_in_hand_check(obj/item/I) - if(istype(I) && ((mobility_flags & MOBILITY_PICKUP) || (I.item_flags & ABSTRACT)) \ + if(istype(I) && (((mobility_flags & MOBILITY_PICKUP) || ((stat >= SOFT_CRIT && (stat != DEAD && stat != UNCONSCIOUS)))) || (I.item_flags & ABSTRACT)) \ && !(SEND_SIGNAL(src, COMSIG_LIVING_TRY_PUT_IN_HAND, I) & COMPONENT_LIVING_CANT_PUT_IN_HAND)) return TRUE return FALSE @@ -248,6 +248,10 @@ I.dropped(src) return FALSE +/// Returns true if a mob is holding something +/mob/proc/is_holding_items() + return !!locate(/obj/item) in held_items + /mob/proc/drop_all_held_items() . = FALSE for(var/obj/item/I in held_items) @@ -444,7 +448,7 @@ if(!I) to_chat(src, span_warning("You are not holding anything to equip!")) return - if (temporarilyRemoveItemFromInventory(I) && !QDELETED(I)) + if (temporarilyRemoveItemFromInventory(, idrop = FALSE) && !QDELETED(I)) if(I.equip_to_best_slot(src)) return if(put_in_active_hand(I)) diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm index 14ff9c0e5f38..9385b60073de 100644 --- a/code/modules/mob/living/basic/basic.dm +++ b/code/modules/mob/living/basic/basic.dm @@ -11,7 +11,7 @@ var/basic_mob_flags = NONE - ///Defines how fast the basic mob can move. This is a multiplier + ///Defines how fast the basic mob can move. This is not a multiplier var/speed = 1 ///How much stamina the mob recovers per second var/stamina_recovery = 5 @@ -35,6 +35,8 @@ var/attack_vis_effect ///Played when someone punches the creature. var/attacked_sound = SFX_PUNCH //This should be an element + /// How often can you melee attack? + var/melee_attack_cooldown = 2 SECONDS /// Variable maintained for compatibility with attack_animal procs until simple animals can be refactored away. Use element instead of setting manually. var/environment_smash = ENVIRONMENT_SMASH_STRUCTURES @@ -143,6 +145,19 @@ health = 0 look_dead() +/mob/living/basic/gib() + if(butcher_results || guaranteed_butcher_results) + var/list/butcher_loot = list() + if(butcher_results) + butcher_loot += butcher_results + if(guaranteed_butcher_results) + butcher_loot += guaranteed_butcher_results + var/atom/loot_destination = drop_location() + for(var/path in butcher_loot) + for(var/i in 1 to butcher_loot[path]) + new path(loot_destination) + return ..() + /** * Apply the appearance and properties this mob has when it dies * This is called by the mob pretending to be dead too so don't put loot drops in here or something @@ -152,7 +167,7 @@ if(basic_mob_flags & FLIP_ON_DEATH) transform = transform.Turn(180) if(!(basic_mob_flags & REMAIN_DENSE_WHILE_DEAD)) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, BASIC_MOB_DEATH_TRAIT) SEND_SIGNAL(src, COMSIG_BASICMOB_LOOK_DEAD) /mob/living/basic/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) @@ -167,16 +182,24 @@ if(basic_mob_flags & FLIP_ON_DEATH) transform = transform.Turn(180) if(!(basic_mob_flags & REMAIN_DENSE_WHILE_DEAD)) - set_density(FALSE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, BASIC_MOB_DEATH_TRAIT) SEND_SIGNAL(src, COMSIG_BASICMOB_LOOK_ALIVE) /mob/living/basic/update_sight() lighting_color_cutoffs = list(lighting_cutoff_red, lighting_cutoff_green, lighting_cutoff_blue) return ..() -/mob/living/basic/proc/melee_attack(atom/target, list/modifiers) +/mob/living/basic/examine(mob/user) + . = ..() + if(stat != DEAD) + return + . += span_deadsay("Upon closer examination, [p_they()] appear[p_s()] to be [HAS_TRAIT(user.mind, TRAIT_NAIVE) ? "asleep" : "dead"].") + +/mob/living/basic/proc/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) face_atom(target) - if(SEND_SIGNAL(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, target) & COMPONENT_HOSTILE_NO_ATTACK) + if (!ignore_cooldown) + changeNext_move(melee_attack_cooldown) + if(SEND_SIGNAL(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, target, Adjacent(target), modifiers) & COMPONENT_HOSTILE_NO_ATTACK) return FALSE //but more importantly return before attack_animal called var/result = target.attack_basic_mob(src, modifiers) SEND_SIGNAL(src, COMSIG_HOSTILE_POST_ATTACKINGTARGET, target, result) @@ -243,3 +266,25 @@ else if(on_fire && !isnull(last_icon_state)) return last_icon_state return null + +/mob/living/basic/put_in_hands(obj/item/I, del_on_fail = FALSE, merge_stacks = TRUE, ignore_animation = TRUE) + . = ..() + if (.) + update_held_items() + +/mob/living/basic/update_held_items() + . = ..() + if(isnull(client) || isnull(hud_used) || hud_used.hud_version == HUD_STYLE_NOHUD) + return + var/turf/our_turf = get_turf(src) + for(var/obj/item/held in held_items) + var/index = get_held_index_of_item(held) + SET_PLANE(held, ABOVE_HUD_PLANE, our_turf) + held.screen_loc = ui_hand_position(index) + client.screen |= held + +/mob/living/basic/get_body_temp_heat_damage_limit() + return maximum_survivable_temperature + +/mob/living/basic/get_body_temp_cold_damage_limit() + return minimum_survivable_temperature diff --git a/code/modules/mob/living/basic/basic_defense.dm b/code/modules/mob/living/basic/basic_defense.dm index ddedd1f8aff1..444780e14885 100644 --- a/code/modules/mob/living/basic/basic_defense.dm +++ b/code/modules/mob/living/basic/basic_defense.dm @@ -11,13 +11,13 @@ var/shove_dir = get_dir(user, src) if(!Move(get_step(src, shove_dir), shove_dir)) log_combat(user, src, "shoved", "failing to move it") - user.visible_message(span_danger("[user.name] shoves [src]!"), - span_danger("You shove [src]!"), span_hear("You hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, list(src)) + user.visible_message(span_danger("[user.name] [response_disarm_continuous] [src]!"), + span_danger("You [response_disarm_simple] [src]!"), span_hear("You hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, list(src)) to_chat(src, span_userdanger("You're shoved by [user.name]!")) return TRUE log_combat(user, src, "shoved", "pushing it") - user.visible_message(span_danger("[user.name] shoves [src], pushing [p_them()]!"), - span_danger("You shove [src], pushing [p_them()]!"), span_hear("You hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, list(src)) + user.visible_message(span_danger("[user.name] [response_disarm_continuous] [src], pushing [p_them()]!"), + span_danger("You [response_disarm_simple] [src], pushing [p_them()]!"), span_hear("You hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, list(src)) to_chat(src, span_userdanger("You're pushed by [user.name]!")) return TRUE @@ -109,13 +109,13 @@ damage = rand(20, 35) return attack_threshold_check(damage) -/mob/living/basic/attack_drone(mob/living/simple_animal/drone/attacking_drone) - if((attacking_drone.istate & ISTATE_HARM)) //No kicking dogs even as a rogue drone. Use a weapon. +/mob/living/basic/attack_drone(mob/living/basic/drone/attacking_drone) + if(attacking_drone.istate & ISTATE_HARM) //No kicking dogs even as a rogue drone. Use a weapon. return return ..() -/mob/living/basic/attack_drone_secondary(mob/living/simple_animal/drone/attacking_drone) - if((attacking_drone.istate & ISTATE_HARM)) +/mob/living/basic/attack_drone_secondary(mob/living/basic/drone/attacking_drone) + if(attacking_drone.istate & ISTATE_HARM) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN return ..() @@ -162,6 +162,9 @@ apply_damage(bloss, damagetype = BRUTE) /mob/living/basic/blob_act(obj/structure/blob/attacking_blob) + . = ..() + if (!.) + return apply_damage(20, damagetype = BRUTE) /mob/living/basic/do_attack_animation(atom/attacked_atom, visual_effect_icon, used_item, no_effect) diff --git a/code/modules/mob/living/basic/blob_minions/blob_ai.dm b/code/modules/mob/living/basic/blob_minions/blob_ai.dm new file mode 100644 index 000000000000..5aad05d4656f --- /dev/null +++ b/code/modules/mob/living/basic/blob_minions/blob_ai.dm @@ -0,0 +1,54 @@ +/** + * Extremely simple AI, this isn't a very smart boy + * Only notable quirk is that it uses JPS movement, simple avoidance would fail to realise it can path through blobs + */ +/datum/ai_controller/basic_controller/blobbernaut + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + ) + + ai_movement = /datum/ai_movement/jps + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/** + * Move to a point designated by the overmind, otherwise just slap people nearby + */ +/datum/ai_controller/basic_controller/blob_zombie + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + ) + + ai_movement = /datum/ai_movement/jps + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/travel_to_point/and_clear_target, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/** + * As blob zombie but will prioritise attacking corpses to zombify them + */ +/datum/ai_controller/basic_controller/blob_spore + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + ) + + ai_movement = /datum/ai_movement/jps + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/find_and_hunt_target/corpses, + /datum/ai_planning_subtree/travel_to_point/and_clear_target, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) diff --git a/code/modules/mob/living/basic/blob_minions/blob_mob.dm b/code/modules/mob/living/basic/blob_minions/blob_mob.dm new file mode 100644 index 000000000000..d655e33d9e30 --- /dev/null +++ b/code/modules/mob/living/basic/blob_minions/blob_mob.dm @@ -0,0 +1,37 @@ +/// Root of shared behaviour for mobs spawned by blobs, is abstract and should not be spawned +/mob/living/basic/blob_minion + name = "Blob Error" + desc = "A nonfunctional fungal creature created by bad code or celestial mistake. Point and laugh." + icon = 'icons/mob/nonhuman-player/blob.dmi' + icon_state = "blob_head" + unique_name = TRUE + pass_flags = PASSBLOB + faction = list(ROLE_BLOB) + istate = ISTATE_HARM + bubble_icon = "blob" + speak_emote = null + habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minimum_survivable_temperature = 0 + maximum_survivable_temperature = INFINITY + lighting_cutoff_red = 20 + lighting_cutoff_green = 40 + lighting_cutoff_blue = 30 + initial_language_holder = /datum/language_holder/empty + +/mob/living/basic/blob_minion/Initialize(mapload) + . = ..() + add_traits(list(TRAIT_BLOB_ALLY, TRAIT_MUTE), INNATE_TRAIT) + AddComponent(/datum/component/blob_minion, on_strain_changed = CALLBACK(src, PROC_REF(on_strain_updated))) + +/// Called when our blob overmind changes their variant, update some of our mob properties +/mob/living/basic/blob_minion/proc/on_strain_updated(mob/camera/blob/overmind, datum/blobstrain/new_strain) + return + +/// Associates this mob with a specific blob factory node +/mob/living/basic/blob_minion/proc/link_to_factory(obj/structure/blob/special/factory/factory) + RegisterSignal(factory, COMSIG_PARENT_QDELETING, PROC_REF(on_factory_destroyed)) + +/// Called when our factory is destroyed +/mob/living/basic/blob_minion/proc/on_factory_destroyed() + SIGNAL_HANDLER + to_chat(src, span_userdanger("Your factory was destroyed! You feel yourself dying!")) diff --git a/code/modules/mob/living/basic/blob_minions/blob_spore.dm b/code/modules/mob/living/basic/blob_minions/blob_spore.dm new file mode 100644 index 000000000000..f13a6a70f843 --- /dev/null +++ b/code/modules/mob/living/basic/blob_minions/blob_spore.dm @@ -0,0 +1,118 @@ +/** + * A floating fungus which turns people into zombies and explodes into reagent clouds upon death. + */ +/mob/living/basic/blob_minion/spore + name = "blob spore" + desc = "A floating, fragile spore." + icon = 'icons/mob/nonhuman-player/blob.dmi' + icon_state = "blobpod" + icon_living = "blobpod" + health_doll_icon = "blobpod" + health = BLOBMOB_SPORE_HEALTH + maxHealth = BLOBMOB_SPORE_HEALTH + verb_say = "psychically pulses" + verb_ask = "psychically probes" + verb_exclaim = "psychically yells" + verb_yell = "psychically screams" + melee_damage_lower = BLOBMOB_SPORE_DMG_LOWER + melee_damage_upper = BLOBMOB_SPORE_DMG_UPPER + obj_damage = 0 + attack_verb_continuous = "batters" + attack_verb_simple = "batter" + attack_sound = 'sound/weapons/genhit1.ogg' + death_message = "explodes into a cloud of gas!" + gold_core_spawnable = HOSTILE_SPAWN + basic_mob_flags = DEL_ON_DEATH + ai_controller = /datum/ai_controller/basic_controller/blob_spore + /// Size of cloud produced from a dying spore + var/death_cloud_size = 1 + /// Type of mob to create + var/mob/living/zombie_type = /mob/living/basic/blob_minion/zombie + +/mob/living/basic/blob_minion/spore/Initialize(mapload) + . = ..() + AddElement(/datum/element/simple_flying) + AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOBSPORE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + +/mob/living/basic/blob_minion/spore/death(gibbed) + . = ..() + death_burst() + +/mob/living/basic/blob_minion/spore/on_factory_destroyed() + death() + +/// Create an explosion of spores on death +/mob/living/basic/blob_minion/spore/proc/death_burst() + do_chem_smoke(range = death_cloud_size, holder = src, location = get_turf(src), reagent_type = /datum/reagent/toxin/spore) + + +/mob/living/basic/blob_minion/spore/melee_attack(mob/living/carbon/human/target, list/modifiers, ignore_cooldown) + . = ..() + if (!ishuman(target) || target.stat != DEAD) + return + zombify(target) + +/// Become a zombie +/mob/living/basic/blob_minion/spore/proc/zombify(mob/living/carbon/human/target) + visible_message(span_warning("The corpse of [target.name] suddenly rises!")) + var/mob/living/basic/blob_minion/zombie/blombie = change_mob_type(zombie_type, loc, new_name = initial(zombie_type.name)) + blombie.set_name() + if (istype(blombie)) // In case of badmin + blombie.consume_corpse(target) + SEND_SIGNAL(src, COMSIG_BLOB_ZOMBIFIED, blombie) + qdel(src) + +/// Variant of the blob spore which is actually spawned by blob factories +/mob/living/basic/blob_minion/spore/minion + gold_core_spawnable = NO_SPAWN + zombie_type = /mob/living/basic/blob_minion/zombie/controlled + /// We die if we leave the same turf as this z level + var/turf/z_turf + +/mob/living/basic/blob_minion/spore/minion/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_z_changed)) + +/// When we z-move check that we're on the same z level as our factory was +/mob/living/basic/blob_minion/spore/minion/proc/on_z_changed() + SIGNAL_HANDLER + if (isnull(z_turf)) + return + if (!is_valid_z_level(get_turf(src), z_turf)) + death() + +/// Mark the turf we need to track from our factory +/mob/living/basic/blob_minion/spore/minion/link_to_factory(obj/structure/blob/special/factory/factory) + . = ..() + z_turf = get_turf(factory) + +/// If the blob changes to distributed neurons then you can control the spores +/mob/living/basic/blob_minion/spore/minion/on_strain_updated(mob/camera/blob/overmind, datum/blobstrain/new_strain) + if (istype(new_strain, /datum/blobstrain/reagent/distributed_neurons)) + AddComponent(\ + /datum/component/ghost_direct_control,\ + ban_type = ROLE_BLOB_INFECTION,\ + poll_candidates = TRUE,\ + poll_ignore_key = POLL_IGNORE_BLOB,\ + ) + else + qdel(GetComponent(/datum/component/ghost_direct_control)) + +/mob/living/basic/blob_minion/spore/minion/death_burst() + return // This behaviour is superceded by the overmind's intervention + + +/// Weakened spore spawned by distributed neurons, can't zombify people and makes a teeny explosion +/mob/living/basic/blob_minion/spore/minion/weak + name = "fragile blob spore" + health = 15 + maxHealth = 15 + melee_damage_lower = 1 + melee_damage_upper = 2 + death_cloud_size = 0 + +/mob/living/basic/blob_minion/spore/minion/weak/zombify() + return + +/mob/living/basic/blob_minion/spore/minion/weak/on_strain_updated() + return diff --git a/code/modules/mob/living/basic/blob_minions/blob_zombie.dm b/code/modules/mob/living/basic/blob_minions/blob_zombie.dm new file mode 100644 index 000000000000..6aa047c0c316 --- /dev/null +++ b/code/modules/mob/living/basic/blob_minions/blob_zombie.dm @@ -0,0 +1,96 @@ +/// A shambling mob made out of a crew member +/mob/living/basic/blob_minion/zombie + name = "blob zombie" + desc = "A shambling corpse animated by the blob." + icon_state = "zombie" + icon_living = "zombie" + health_doll_icon = "blobpod" + mob_biotypes = MOB_ORGANIC | MOB_HUMANOID + health = 70 + maxHealth = 70 + verb_say = "gurgles" + verb_ask = "demands" + verb_exclaim = "roars" + verb_yell = "bellows" + melee_damage_lower = 10 + melee_damage_upper = 15 + melee_attack_cooldown = CLICK_CD_MELEE + obj_damage = 20 + attack_verb_continuous = "punches" + attack_verb_simple = "punch" + attack_sound = 'sound/weapons/genhit1.ogg' + death_message = "collapses to the ground!" + gold_core_spawnable = NO_SPAWN + basic_mob_flags = DEL_ON_DEATH + ai_controller = /datum/ai_controller/basic_controller/blob_zombie + /// The dead body we have inside + var/mob/living/carbon/human/corpse + +/mob/living/basic/blob_minion/zombie/Initialize(mapload) + . = ..() + AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOBSPORE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + +/mob/living/basic/blob_minion/zombie/death(gibbed) + corpse?.forceMove(loc) + death_burst() + return ..() + +/mob/living/basic/blob_minion/zombie/Exited(atom/movable/gone, direction) + . = ..() + if (gone != corpse) + return + corpse = null + death() + +/mob/living/basic/blob_minion/zombie/Destroy() + QDEL_NULL(corpse) + return ..() + +/mob/living/basic/blob_minion/zombie/on_factory_destroyed() + . = ..() + death() + +/mob/living/basic/blob_minion/zombie/update_overlays() + . = ..() + copy_overlays(corpse, TRUE) + var/mutable_appearance/blob_head_overlay = mutable_appearance('icons/mob/nonhuman-player/blob.dmi', "blob_head") + blob_head_overlay.color = LAZYACCESS(atom_colours, FIXED_COLOUR_PRIORITY) || COLOR_WHITE + color = initial(color) // reversing what our component did lol, but we needed the value for the overlay + . += blob_head_overlay + +/// Create an explosion of spores on death +/mob/living/basic/blob_minion/zombie/proc/death_burst() + do_chem_smoke(range = 0, holder = src, location = get_turf(src), reagent_type = /datum/reagent/toxin/spore) + +/// Store a body so that we can drop it on death +/mob/living/basic/blob_minion/zombie/proc/consume_corpse(mob/living/carbon/human/new_corpse) + if(new_corpse.wear_suit) + maxHealth += new_corpse.get_armor_rating(MELEE) + health = maxHealth + new_corpse.forceMove(src) + corpse = new_corpse + update_appearance(UPDATE_ICON) + RegisterSignal(corpse, COMSIG_LIVING_REVIVE, PROC_REF(on_corpse_revived)) + +/// Dynamic changeling reentry +/mob/living/basic/blob_minion/zombie/proc/on_corpse_revived() + SIGNAL_HANDLER + visible_message(span_boldwarning("[src] bursts from the inside!")) + death() + +/// Blob-created zombies will ping for player control when they make a zombie +/mob/living/basic/blob_minion/zombie/controlled + +/mob/living/basic/blob_minion/zombie/controlled/consume_corpse(mob/living/carbon/human/new_corpse) + . = ..() + if (!isnull(client)) + return + AddComponent(\ + /datum/component/ghost_direct_control,\ + ban_type = ROLE_BLOB_INFECTION,\ + poll_candidates = TRUE,\ + poll_ignore_key = POLL_IGNORE_BLOB,\ + ) + +/mob/living/basic/blob_minion/zombie/controlled/death_burst() + return diff --git a/code/modules/mob/living/basic/blob_minions/blobbernaut.dm b/code/modules/mob/living/basic/blob_minions/blobbernaut.dm new file mode 100644 index 000000000000..b483641993a7 --- /dev/null +++ b/code/modules/mob/living/basic/blob_minions/blobbernaut.dm @@ -0,0 +1,109 @@ +/** + * Player-piloted brute mob. Mostly just a "move and click" kind of guy. + * Has a variant which takes damage when away from blob tiles + */ +/mob/living/basic/blob_minion/blobbernaut + name = "blobbernaut" + desc = "A hulking, mobile chunk of blobmass." + icon_state = "blobbernaut" + icon_living = "blobbernaut" + icon_dead = "blobbernaut_dead" + health = BLOBMOB_BLOBBERNAUT_HEALTH + maxHealth = BLOBMOB_BLOBBERNAUT_HEALTH + damage_coeff = list(BRUTE = 0.5, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + melee_damage_lower = BLOBMOB_BLOBBERNAUT_DMG_SOLO_LOWER + melee_damage_upper = BLOBMOB_BLOBBERNAUT_DMG_SOLO_UPPER + melee_attack_cooldown = CLICK_CD_MELEE + obj_damage = BLOBMOB_BLOBBERNAUT_DMG_OBJ + attack_verb_continuous = "slams" + attack_verb_simple = "slam" + attack_sound = 'sound/effects/blobattack.ogg' + verb_say = "gurgles" + verb_ask = "demands" + verb_exclaim = "roars" + verb_yell = "bellows" + force_threshold = 10 + pressure_resistance = 50 + mob_size = MOB_SIZE_LARGE + hud_type = /datum/hud/living/blobbernaut + gold_core_spawnable = HOSTILE_SPAWN + ai_controller = /datum/ai_controller/basic_controller/blobbernaut + +/mob/living/basic/blob_minion/blobbernaut/Initialize(mapload) + . = ..() + AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOBBERNAUT, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + +/mob/living/basic/blob_minion/blobbernaut/death(gibbed) + flick("blobbernaut_death", src) + return ..() + +/// This variant is the one actually spawned by blob factories, takes damage when away from blob tiles +/mob/living/basic/blob_minion/blobbernaut/minion + gold_core_spawnable = NO_SPAWN + /// Is our factory dead? + var/orphaned = FALSE + +/mob/living/basic/blob_minion/blobbernaut/minion/Life(seconds_per_tick, times_fired) + . = ..() + if (!.) + return FALSE + var/damage_sources = 0 + var/list/blobs_in_area = range(2, src) + + if (!(locate(/obj/structure/blob) in blobs_in_area)) + damage_sources++ + + if (orphaned) + damage_sources++ + else + var/particle_colour = atom_colours[FIXED_COLOUR_PRIORITY] || COLOR_BLACK + if (locate(/obj/structure/blob/special/core) in blobs_in_area) + heal_overall_damage(maxHealth * BLOBMOB_BLOBBERNAUT_HEALING_CORE * seconds_per_tick) + var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(src)) + heal_effect.color = particle_colour + + if (locate(/obj/structure/blob/special/node) in blobs_in_area) + heal_overall_damage(maxHealth * BLOBMOB_BLOBBERNAUT_HEALING_NODE * seconds_per_tick) + var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(src)) + heal_effect.color = particle_colour + + if (damage_sources == 0) + return FALSE + + // take 2.5% of max health as damage when not near the blob or if the naut has no factory, 5% if both + apply_damage(maxHealth * BLOBMOB_BLOBBERNAUT_HEALTH_DECAY * damage_sources * seconds_per_tick, damagetype = TOX) // We reduce brute damage + var/mutable_appearance/harming = mutable_appearance('icons/mob/nonhuman-player/blob.dmi', "nautdamage", MOB_LAYER + 0.01) + harming.appearance_flags = RESET_COLOR + harming.color = atom_colours[FIXED_COLOUR_PRIORITY] || COLOR_WHITE + harming.dir = dir + flick_overlay_view(harming, 0.8 SECONDS) + return TRUE + +/// Called by the blob creation power to give us a mind and a basic task orientation +/mob/living/basic/blob_minion/blobbernaut/minion/proc/assign_key(ckey, datum/blobstrain/blobstrain) + key = ckey + flick("blobbernaut_produce", src) + health = maxHealth / 2 // Start out injured to encourage not beelining away from the blob + SEND_SOUND(src, sound('sound/effects/blobattack.ogg')) + SEND_SOUND(src, sound('sound/effects/attackblob.ogg')) + to_chat(src, span_infoplain("You are powerful, hard to kill, and slowly regenerate near nodes and cores, [span_cultlarge("but will slowly die if not near the blob")] or if the factory that made you is killed.")) + to_chat(src, span_infoplain("You can communicate with other blobbernauts and overminds telepathically by attempting to speak normally")) + to_chat(src, span_infoplain("Your overmind's blob reagent is: [blobstrain.name]!")) + to_chat(src, span_infoplain("The [blobstrain.name] reagent [blobstrain.shortdesc ? "[blobstrain.shortdesc]" : "[blobstrain.description]"]")) + +/// Set our attack damage based on blob's properties +/mob/living/basic/blob_minion/blobbernaut/minion/on_strain_updated(mob/camera/blob/overmind, datum/blobstrain/new_strain) + if (isnull(overmind)) + melee_damage_lower = initial(melee_damage_lower) + melee_damage_upper = initial(melee_damage_upper) + attack_verb_continuous = initial(attack_verb_continuous) + return + melee_damage_lower = BLOBMOB_BLOBBERNAUT_DMG_LOWER + melee_damage_upper = BLOBMOB_BLOBBERNAUT_DMG_UPPER + attack_verb_continuous = new_strain.blobbernaut_message + +/// Called by our factory to inform us that it's not going to support us financially any more +/mob/living/basic/blob_minion/blobbernaut/minion/on_factory_destroyed() + . = ..() + orphaned = TRUE + throw_alert("nofactory", /atom/movable/screen/alert/nofactory) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/basic/clown/clown.dm similarity index 62% rename from code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm rename to code/modules/mob/living/basic/clown/clown.dm index 8b1fa4a2d068..ff5410fd0593 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/basic/clown/clown.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/hostile/retaliate/clown +/mob/living/basic/clown name = "Clown" desc = "A denizen of clown planet." icon = 'icons/mob/simple/clown_mobs.dmi' @@ -8,189 +8,113 @@ icon_gib = "clown_gib" health_doll_icon = "clown" //if >32x32, it will use this generic. for all the huge clown mobs that subtype from this mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - turns_per_move = 5 response_disarm_continuous = "gently pushes aside" response_disarm_simple = "gently push aside" response_harm_continuous = "robusts" response_harm_simple = "robust" - speak = list("HONK", "Honk!", "Welcome to clown planet!") - emote_see = list("honks", "squeaks") - speak_chance = 1 - istate = ISTATE_HARM|ISTATE_BLOCKING + istate = ISTATE_HARM maxHealth = 75 health = 75 - speed = 1 - harm_intent_damage = 8 melee_damage_lower = 10 melee_damage_upper = 10 attack_sound = 'sound/items/bikehorn.ogg' - obj_damage = 0 + attacked_sound = 'sound/items/bikehorn.ogg' environment_smash = ENVIRONMENT_SMASH_NONE - del_on_death = 1 - loot = list(/obj/effect/mob_spawn/corpse/human/clown) + basic_mob_flags = DEL_ON_DEATH initial_language_holder = /datum/language_holder/clown - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 270 - maxbodytemp = 370 + habitable_atmos = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + minimum_survivable_temperature = T0C + maximum_survivable_temperature = (T0C + 100) unsuitable_atmos_damage = 10 unsuitable_heat_damage = 15 - footstep_type = FOOTSTEP_MOB_SHOE faction = list(FACTION_CLOWN) - var/attack_reagent + ai_controller = /datum/ai_controller/basic_controller/clown + speed = 1.4 //roughly close to simpleanimal clowns + ///list of stuff we drop on death + var/list/loot = list(/obj/effect/mob_spawn/corpse/human/clown) + ///blackboard emote list + var/list/emotes = list( + BB_EMOTE_SAY = list("HONK", "Honk!", "Welcome to clown planet!"), + BB_EMOTE_HEAR = list("honks", "squeaks"), + BB_EMOTE_SOUND = list('sound/items/bikehorn.ogg'), //WE LOVE TO PARTY + BB_SPEAK_CHANCE = 5, + ) + ///do we waddle (honk) + var/waddles = TRUE -/mob/living/simple_animal/hostile/retaliate/clown/Initialize(mapload) +/mob/living/basic/clown/Initialize(mapload) . = ..() - if(attack_reagent) - var/static/list/injection_range = list(1, 5) - AddElement(/datum/element/venomous, attack_reagent, injection_range) - -/mob/living/simple_animal/hostile/retaliate/clown/attack_hand(mob/living/carbon/human/user, list/modifiers) - ..() - playsound(loc, 'sound/items/bikehorn.ogg', 50, TRUE) + AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_SHOE) + AddComponent(/datum/component/ai_retaliate_advanced, CALLBACK(src, PROC_REF(retaliate_callback))) + ai_controller.set_blackboard_key(BB_BASIC_MOB_SPEAK_LINES, emotes) + //im not putting dynamic humans or whatever its called here because this is the base path of nonhuman clownstrosities + if(waddles) + AddElement(/datum/element/waddling) + if(length(loot)) + loot = string_list(loot) + AddElement(/datum/element/death_drops, loot) + +/mob/living/basic/clown/proc/retaliate_callback(mob/living/attacker) + if (!istype(attacker)) + return + for (var/mob/living/basic/clown/harbringer in oview(src, 7)) + harbringer.ai_controller.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, attacker) -/mob/living/simple_animal/hostile/retaliate/clown/AttackingTarget(atom/attacked_target) - if(!istype(attacked_target, /obj/item/food/grown/banana/bunch)) +/mob/living/basic/clown/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) + if(!istype(target, /obj/item/food/grown/banana/bunch)) return ..() - var/obj/item/food/grown/banana/bunch/unripe_bunch = attacked_target + var/obj/item/food/grown/banana/bunch/unripe_bunch = target unripe_bunch.start_ripening() - log_combat(src, attacked_target, "honksposivley ripened") + log_combat(src, target, "explosively ripened") -/mob/living/simple_animal/hostile/retaliate/clown/lube +/mob/living/basic/clown/lube name = "Living Lube" desc = "A puddle of lube brought to life by the honkmother." icon_state = "lube" icon_living = "lube" - turns_per_move = 1 response_help_continuous = "dips a finger into" response_help_simple = "dip a finger into" response_disarm_continuous = "gently scoops and pours aside" response_disarm_simple = "gently scoop and pour aside" - emote_see = list("bubbles", "oozes") - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/particle_effect/fluid/foam) + emotes = list( + BB_EMOTE_SAY = list("HONK", "Honk!", "Welcome to clown planet!"), + BB_EMOTE_HEAR = list("bubbles", "oozes"), + ) + waddles = FALSE + loot = list( + /obj/effect/spawner/foam_starter/small, + /obj/item/clothing/mask/gas/clown_hat, + ) -/mob/living/simple_animal/hostile/retaliate/clown/lube/Initialize(mapload) +/mob/living/basic/clown/lube/Initialize(mapload) . = ..() AddElement(/datum/element/snailcrawl) -/mob/living/simple_animal/hostile/retaliate/clown/banana - name = "Clownana" - desc = "A fusion of clown and banana DNA birthed from a botany experiment gone wrong." - icon_state = "banana tree" - icon_living = "banana tree" - response_disarm_continuous = "peels" - response_disarm_simple = "peel" - response_harm_continuous = "peels" - response_harm_simple = "peel" - turns_per_move = 1 - speak = list("HONK", "Honk!", "YA-HONK!!!") - emote_see = list("honks", "bites into the banana", "plucks a banana off its head", "photosynthesizes") - maxHealth = 120 - health = 120 - speed = -1 - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap, /obj/item/seeds/banana) - ///Our peel dropping ability - var/datum/action/cooldown/rustle/banana_rustle - ///Our banana bunch spawning ability - var/datum/action/cooldown/exquisite_bunch/banana_bunch - -/mob/living/simple_animal/hostile/retaliate/clown/banana/Initialize(mapload) - . = ..() - banana_rustle = new() - banana_rustle.Grant(src) - banana_bunch = new() - banana_bunch.Grant(src) - -/mob/living/simple_animal/hostile/retaliate/clown/banana/Destroy() - . = ..() - QDEL_NULL(banana_rustle) - QDEL_NULL(banana_bunch) - -///drops peels around the mob when activated -/datum/action/cooldown/rustle - name = "Rustle" - desc = "Shake loose a few banana peels." - cooldown_time = 8 SECONDS - button_icon_state = "rustle" - button_icon = 'icons/mob/actions/actions_clown.dmi' - background_icon_state = "bg_nature" - overlay_icon_state = "bg_nature_border" - ///which type of peel to spawn - var/banana_type = /obj/item/grown/bananapeel - ///How many peels to spawn - var/peel_amount = 3 - -/datum/action/cooldown/rustle/Activate(atom/target) - . = ..() - var/list/reachable_turfs = list() - for(var/turf/adjacent_turf in RANGE_TURFS(1, owner.loc)) - if(adjacent_turf == owner.loc || !owner.CanReach(adjacent_turf) || !isopenturf(adjacent_turf)) - continue - reachable_turfs += adjacent_turf - - var/peels_to_spawn = min(peel_amount, reachable_turfs.len) - for(var/i in 1 to peels_to_spawn) - new banana_type(pick_n_take(reachable_turfs)) - playsound(owner, 'sound/creatures/clown/clownana_rustle.ogg', 60) - animate(owner, time = 1, pixel_x = 6, easing = CUBIC_EASING | EASE_OUT) - animate(time = 2, pixel_x = -8, easing = CUBIC_EASING) - animate(time = 1, pixel_x = 0, easing = CUBIC_EASING | EASE_IN) - StartCooldown() - -///spawns a plumb bunch of bananas imbued with mystical power. -/datum/action/cooldown/exquisite_bunch - name = "Exquisite Bunch" - desc = "Pluck your finest bunch of bananas from your head. This bunch is especially nutrious to monkeykind. A gentle tap will trigger an explosive ripening process." - button_icon = 'icons/obj/hydroponics/harvest.dmi' - cooldown_time = 60 SECONDS - button_icon_state = "banana_bunch" - background_icon_state = "bg_nature" - overlay_icon_state = "bg_nature_border" - ///If we are currently activating our ability. - var/activating = FALSE - -/datum/action/cooldown/exquisite_bunch/Trigger(trigger_flags, atom/target) - if(activating) - return - var/bunch_turf = get_step(owner.loc, owner.dir) - if(!bunch_turf) - return - if(!owner.CanReach(bunch_turf) || !isopenturf(bunch_turf)) - owner.balloon_alert(owner, "can't do that here!") - return - activating = TRUE - if(!do_after(owner, 1 SECONDS)) - activating = FALSE - return - playsound(owner, 'sound/creatures/clown/hehe.ogg', 100) - if(!do_after(owner, 1 SECONDS)) - activating = FALSE - return - activating = FALSE - return ..() - -/datum/action/cooldown/exquisite_bunch/Activate(atom/target) - . = ..() - new /obj/item/food/grown/banana/bunch(get_step(owner.loc, owner.dir)) - playsound(owner, 'sound/items/bikehorn.ogg', 60) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), owner, 'sound/creatures/clown/hohoho.ogg', 100, 1), 1 SECONDS) - StartCooldown() - -/mob/living/simple_animal/hostile/retaliate/clown/honkling +/mob/living/basic/clown/honkling name = "Honkling" desc = "A divine being sent by the Honkmother to spread joy. It's not dangerous, but it's a bit of a nuisance." icon_state = "honkling" icon_living = "honkling" - turns_per_move = 1 - speed = -10 - harm_intent_damage = 1 + speed = 1.1 melee_damage_lower = 1 melee_damage_upper = 1 attack_verb_continuous = "cheers up" attack_verb_simple = "cheer up" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap, /obj/item/seeds/banana/bluespace) - attack_reagent = /datum/reagent/consumable/laughter + loot = list( + /obj/item/clothing/mask/gas/clown_hat, + /obj/effect/gibspawner/human, + /obj/item/soap, + /obj/item/seeds/banana/bluespace, + ) -/mob/living/simple_animal/hostile/retaliate/clown/fleshclown +/mob/living/basic/clown/honkling/Initialize(mapload) + . = ..() + var/static/list/injection_range + if(!injection_range) + injection_range = string_numbers_list(list(1, 5)) + AddElement(/datum/element/venomous, /datum/reagent/consumable/laughter, injection_range) + +/mob/living/basic/clown/fleshclown name = "Fleshclown" desc = "A being forged out of the pure essence of pranking, cursed into existence by a cruel maker." icon_state = "fleshclown" @@ -201,51 +125,70 @@ response_disarm_simple = "sink your hands into the spongy flesh of" response_harm_continuous = "cleanses the world of" response_harm_simple = "cleanse the world of" - speak = list("HONK", "Honk!", "I didn't ask for this", "I feel constant and horrible pain", "YA-HONK!!!", "this body is a merciless and unforgiving prison", "I was born out of mirthful pranking but I live in suffering") - emote_see = list("honks", "sweats", "jiggles", "contemplates its existence") - speak_chance = 5 - dextrous = TRUE maxHealth = 140 health = 140 - speed = -5 + speed = 1 melee_damage_upper = 15 attack_verb_continuous = "limply slaps" attack_verb_simple = "limply slap" obj_damage = 5 - loot = list(/obj/item/clothing/suit/hooded/bloated_human, /obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap) + loot = list( + /obj/effect/gibspawner/human, + /obj/item/clothing/mask/gas/clown_hat, + /obj/item/soap, + /obj/item/clothing/suit/hooded/bloated_human, + ) + emotes = list( + BB_EMOTE_SAY = list( + "HONK", + "Honk!", + "I didn't ask for this", + "I feel constant and horrible pain", + "I was born out of mirthful pranking but I live in suffering", + "This body is a merciless and unforgiving prison", + "YA-HONK!!!", + ), + BB_EMOTE_HEAR = list("honks", "contemplates its existence"), + BB_EMOTE_SEE = list("sweats", "jiggles"), + BB_SPEAK_CHANCE = 5, + ) -/mob/living/simple_animal/hostile/retaliate/clown/fleshclown/Initialize(mapload) +/mob/living/basic/clown/fleshclown/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) -/mob/living/simple_animal/hostile/retaliate/clown/longface +/mob/living/basic/clown/longface name = "Longface" desc = "Often found walking into the bar." icon_state = "long face" icon_living = "long face" move_resist = INFINITY - turns_per_move = 10 response_help_continuous = "tries to awkwardly hug" response_help_simple = "try to awkwardly hug" response_disarm_continuous = "pushes the unwieldy frame of" response_disarm_simple = "push the unwieldy frame of" response_harm_continuous = "tries to shut up" response_harm_simple = "try to shut up" - speak = list("YA-HONK!!!") - emote_see = list("honks", "squeaks") - speak_chance = 60 maxHealth = 150 health = 150 pixel_x = -16 base_pixel_x = -16 - speed = 10 - harm_intent_damage = 5 + speed = 3 melee_damage_lower = 5 attack_verb_continuous = "YA-HONKs" attack_verb_simple = "YA-HONK" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap) + loot = list( + /obj/effect/gibspawner/human, + /obj/item/soap, + /obj/item/clothing/mask/gas/clown_hat, + ) + emotes = list( + BB_EMOTE_SAY = list("YA-HONK!!!"), + BB_EMOTE_HEAR = list("honks", "squeaks"), + BB_SPEAK_CHANCE = 60, + ) -/mob/living/simple_animal/hostile/retaliate/clown/clownhulk +/mob/living/basic/clown/clownhulk name = "Honk Hulk" desc = "A cruel and fearsome clown. Don't make him angry." icon_state = "honkhulk" @@ -258,24 +201,30 @@ response_disarm_simple = "foolishly push" response_harm_continuous = "angers" response_harm_simple = "anger" - speak = list("HONK", "Honk!", "HAUAUANK!!!", "GUUURRRRAAAHHH!!!") - emote_see = list("honks", "sweats", "grunts") - speak_chance = 5 maxHealth = 400 health = 400 pixel_x = -16 base_pixel_x = -16 speed = 2 - harm_intent_damage = 15 melee_damage_lower = 15 melee_damage_upper = 20 attack_verb_continuous = "pummels" attack_verb_simple = "pummel" obj_damage = 30 environment_smash = ENVIRONMENT_SMASH_WALLS - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/item/soap) + loot = list( + /obj/effect/gibspawner/human, + /obj/item/soap, + /obj/item/clothing/mask/gas/clown_hat, + ) + emotes = list( + BB_EMOTE_SAY = list("HONK", "Honk!", "HAUAUANK!!!", "GUUURRRRAAAHHH!!!"), + BB_EMOTE_HEAR = list("honks", "grunts"), + BB_EMOTE_SEE = list("sweats"), + BB_SPEAK_CHANCE = 5, + ) -/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown +/mob/living/basic/clown/clownhulk/chlown name = "Chlown" desc = "A real lunkhead who somehow gets all the girls." icon_state = "chlown" @@ -287,18 +236,26 @@ response_disarm_simple = "try to assert dominance over" response_harm_continuous = "makes a weak beta attack at" response_harm_simple = "make a weak beta attack at" - speak = list("HONK", "Honk!", "Bruh", "cheeaaaahhh?") - emote_see = list("asserts his dominance", "emasculates everyone implicitly") maxHealth = 500 health = 500 - speed = -2 + speed = -2 //ridicilously fast but i dont even know what this is used for armour_penetration = 20 attack_verb_continuous = "steals the girlfriend of" attack_verb_simple = "steal the girlfriend of" attack_sound = 'sound/items/airhorn2.ogg' - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/effect/particle_effect/fluid/foam, /obj/item/soap) + loot = list( + /obj/effect/gibspawner/human, + /obj/effect/spawner/foam_starter/small, + /obj/item/soap, + /obj/item/clothing/mask/gas/clown_hat, + ) + emotes = list( + BB_EMOTE_SAY = list("HONK", "Honk!", "Bruh", "cheeaaaahhh?"), + BB_EMOTE_SEE = list("asserts his dominance", "emasculates everyone implicitly"), + BB_SPEAK_CHANCE = 5, + ) -/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus +/mob/living/basic/clown/clownhulk/honkmunculus name = "Honkmunculus" desc = "A slender wiry figure of alchemical origin." icon_state = "honkmunculus" @@ -307,82 +264,107 @@ response_help_simple = "skeptically poke" response_disarm_continuous = "pushes the unwieldy frame of" response_disarm_simple = "push the unwieldy frame of" - speak = list("honk") - emote_see = list("squirms", "writhes") - speak_chance = 1 maxHealth = 200 health = 200 - speed = -5 - harm_intent_damage = 5 + speed = 1 melee_damage_lower = 5 melee_damage_upper = 10 attack_verb_continuous = "ferociously mauls" attack_verb_simple = "ferociously maul" environment_smash = ENVIRONMENT_SMASH_NONE - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/fluid/foam, /obj/item/soap) - attack_reagent = /datum/reagent/peaceborg/confuse + loot = list( + /obj/effect/gibspawner/xeno/bodypartless, + /obj/effect/spawner/foam_starter/small, + /obj/item/soap, + /obj/item/clothing/mask/gas/clown_hat, + ) + emotes = list( + BB_EMOTE_SAY = list("honk"), + BB_EMOTE_SEE = list("squirms", "writhes"), + ) + +/mob/living/basic/clown/clownhulk/honkmunculus/Initialize(mapload) + . = ..() + var/static/list/injection_range + if(!injection_range) + injection_range = string_numbers_list(list(1, 5)) + AddElement(/datum/element/venomous, /datum/reagent/peaceborg/confuse, injection_range) -/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/destroyer +/mob/living/basic/clown/clownhulk/destroyer name = "The Destroyer" desc = "An ancient being born of arcane honking." icon_state = "destroyer" icon_living = "destroyer" response_disarm_continuous = "bounces off of" response_harm_continuous = "bounces off of" - speak = list("HONK!!!", "The Honkmother is merciful, so I must act out her wrath.", "parce mihi ad beatus honkmother placet mihi ut peccata committere,", "DIE!!!") maxHealth = 400 health = 400 speed = 5 - harm_intent_damage = 30 melee_damage_lower = 20 melee_damage_upper = 40 armour_penetration = 30 - stat_attack = HARD_CRIT attack_verb_continuous = "acts out divine vengeance on" attack_verb_simple = "act out divine vengeance on" obj_damage = 50 environment_smash = ENVIRONMENT_SMASH_RWALLS - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/effect/particle_effect/fluid/foam, /obj/item/soap) + ai_controller = /datum/ai_controller/basic_controller/clown/murder + loot = list( + /obj/effect/gibspawner/human, + /obj/effect/spawner/foam_starter/small, + /obj/item/soap, + /obj/item/clothing/mask/gas/clown_hat, + ) + emotes = list( + BB_EMOTE_SAY = list("HONK!!!", "The Honkmother is merciful, so I must act out her wrath.", "parce mihi ad beatus honkmother placet mihi ut peccata committere,", "DIE!!!"), + BB_EMOTE_HEAR = list("honks", "grunts"), + BB_EMOTE_SEE = list("sweats"), + BB_SPEAK_CHANCE = 5, + ) -/mob/living/simple_animal/hostile/retaliate/clown/mutant +/mob/living/basic/clown/mutant name = "Unknown" desc = "Kill it for its own sake." icon_state = "mutant" icon_living = "mutant" move_resist = INFINITY - turns_per_move = 10 response_help_continuous = "reluctantly sinks a finger into" response_help_simple = "reluctantly sink a finger into" response_disarm_continuous = "squishes into" response_disarm_simple = "squish into" response_harm_continuous = "squishes into" response_harm_simple = "squish into" - speak = list("aaaaaahhhhuuhhhuhhhaaaaa", "AAAaaauuuaaAAAaauuhhh", "huuuuuh... hhhhuuuooooonnnnkk", "HuaUAAAnKKKK") - emote_see = list("squirms", "writhes", "pulsates", "froths", "oozes") - speak_chance = 10 maxHealth = 130 health = 130 pixel_x = -16 base_pixel_x = -16 speed = -5 - harm_intent_damage = 10 melee_damage_lower = 10 melee_damage_upper = 20 attack_verb_continuous = "awkwardly flails at" attack_verb_simple = "awkwardly flail at" - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/item/soap, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless, /obj/effect/gibspawner/human) + loot = list( + /obj/effect/gibspawner/generic, + /obj/effect/gibspawner/generic/animal, + /obj/effect/gibspawner/human, + /obj/effect/gibspawner/human/bodypartless, + /obj/effect/gibspawner/xeno/bodypartless, + /obj/item/soap, + /obj/item/clothing/mask/gas/clown_hat, + ) + emotes = list( + BB_EMOTE_SAY = list("aaaaaahhhhuuhhhuhhhaaaaa", "AAAaaauuuaaAAAaauuhhh", "huuuuuh... hhhhuuuooooonnnnkk", "HuaUAAAnKKKK"), + BB_EMOTE_SEE = list("squirms", "writhes", "pulsates", "froths", "oozes"), + BB_SPEAK_CHANCE = 10, + ) -/mob/living/simple_animal/hostile/retaliate/clown/mutant/slow +/mob/living/basic/clown/mutant/slow speed = 20 - move_to_delay = 60 -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton +/mob/living/basic/clown/mutant/glutton name = "banana glutton" desc = "Something that was once a clown" icon_state = "glutton" icon_living = "glutton" - speak = list("hey, buddy", "HONK!!!", "H-h-h-H-HOOOOONK!!!!", "HONKHONKHONK!!!", "HEY, BUCKO, GET BACK HERE!!!", "HOOOOOOOONK!!!") - emote_see = list("jiggles", "wobbles") health = 200 mob_size = MOB_SIZE_LARGE speed = 1 @@ -392,37 +374,47 @@ damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 2, STAMINA = 0, OXY = 1) attack_verb_continuous = "slams" attack_verb_simple = "slam" - loot = list(/obj/effect/gibspawner/xeno/bodypartless, /obj/effect/gibspawner/generic, /obj/effect/gibspawner/generic/animal, /obj/effect/gibspawner/human/bodypartless) + loot = list( + /obj/effect/gibspawner/generic, + /obj/effect/gibspawner/generic/animal, + /obj/effect/gibspawner/human/bodypartless, + /obj/effect/gibspawner/xeno/bodypartless, + ) + emotes = list( + BB_EMOTE_SAY = list("hey, buddy", "HONK!!!", "H-h-h-H-HOOOOONK!!!!", "HONKHONKHONK!!!", "HEY, BUCKO, GET BACK HERE!!!", "HOOOOOOOONK!!!"), + BB_EMOTE_SEE = list("jiggles", "wobbles"), + ) death_sound = 'sound/misc/sadtrombone.ogg' + waddles = FALSE ///This is the list of items we are ready to regurgitate, var/list/prank_pouch = list() -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/Initialize(mapload) +/mob/living/basic/clown/mutant/glutton/Initialize(mapload) . = ..() var/datum/action/cooldown/regurgitate/spit = new(src) spit.Grant(src) - add_cell_sample() + AddElement(/datum/element/swabable, CELL_LINE_TABLE_GLUTTON, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/cheesiehonkers, /obj/item/food/cornchips), tame_chance = 30, bonus_tame_chance = 0, after_tame = CALLBACK(src, PROC_REF(tamed))) -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/attacked_by(obj/item/I, mob/living/user) - if(!check_edible(I)) +/mob/living/basic/clown/mutant/glutton/attacked_by(obj/item/item, mob/living/user) + if(!check_edible(item)) return ..() - eat_atom(I) + eat_atom(item) -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/AttackingTarget(atom/attacked_target) - if(!check_edible(attacked_target)) +/mob/living/basic/clown/mutant/glutton/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) + if(!check_edible(target)) return ..() - eat_atom(attacked_target) + eat_atom(target) -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/UnarmedAttack(atom/A, proximity_flag) - if(!check_edible(A)) +/mob/living/basic/clown/mutant/glutton/UnarmedAttack(atom/victim, proximity_flag, list/modifiers) + if(!check_edible(victim)) return ..() - eat_atom(A) + eat_atom(victim) ///Returns whether or not the supplied movable atom is edible. -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/proc/check_edible(atom/movable/potential_food) +/mob/living/basic/clown/mutant/glutton/proc/check_edible(atom/movable/potential_food) if(isliving(potential_food)) var/mob/living/living_morsel = potential_food if(living_morsel.mob_size > MOB_SIZE_SMALL) @@ -437,7 +429,7 @@ return TRUE ///This proc eats the atom, certain funny items are stored directly in the prank pouch while bananas grant a heal based on their potency and the peels are retained in the pouch. -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/proc/eat_atom(atom/movable/eaten_atom) +/mob/living/basic/clown/mutant/glutton/proc/eat_atom(atom/movable/eaten_atom) var/static/funny_items = list( /obj/item/food/pie/cream, @@ -461,14 +453,11 @@ playsound(loc,'sound/items/eatfood.ogg', rand(30,50), TRUE) flick("glutton_mouth", src) -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/proc/tamed(mob/living/tamer) +/mob/living/basic/clown/mutant/glutton/proc/tamed(mob/living/tamer) buckle_lying = 0 AddElement(/datum/element/ridable, /datum/component/riding/creature/glutton) -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_GLUTTON, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/Exited(atom/movable/gone, direction) +/mob/living/basic/clown/mutant/glutton/Exited(atom/movable/gone, direction) . = ..() prank_pouch -= gone @@ -509,12 +498,12 @@ return FALSE // Hardcoded to only work with gluttons. Come back next year - return istype(owner, /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton) + return istype(owner, /mob/living/basic/clown/mutant/glutton) /datum/action/cooldown/regurgitate/Activate(atom/spit_at) StartCooldown(cooldown_time / 4) - var/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/pouch_owner = owner + var/mob/living/basic/clown/mutant/glutton/pouch_owner = owner if(!length(pouch_owner.prank_pouch)) pouch_owner.icon_state = initial(pouch_owner.icon_state) to_chat(pouch_owner, span_notice("Your prank pouch is empty.")) @@ -528,3 +517,113 @@ StartCooldown() return TRUE + +/mob/living/basic/clown/banana + name = "Clownana" + desc = "A fusion of clown and banana DNA birthed from a botany experiment gone wrong." + icon_state = "banana tree" + icon_living = "banana tree" + response_disarm_continuous = "peels" + response_disarm_simple = "peel" + response_harm_continuous = "peels" + response_harm_simple = "peel" + maxHealth = 120 + health = 120 + speed = -1 + loot = list( + /obj/effect/gibspawner/human, + /obj/item/seeds/banana, + /obj/item/soap, + /obj/item/clothing/mask/gas/clown_hat, + ) + emotes = list( + BB_EMOTE_SAY = list("HONK", "Honk!", "YA-HONK!!!"), + BB_EMOTE_SEE = list("bites into the banana", "plucks a banana off its head", "photosynthesizes"), + BB_EMOTE_SOUND = list('sound/items/bikehorn.ogg'), + ) + ///Our peel dropping ability + var/datum/action/cooldown/rustle/banana_rustle + ///Our banana bunch spawning ability + var/datum/action/cooldown/exquisite_bunch/banana_bunch + +/mob/living/basic/clown/banana/Initialize(mapload) + . = ..() + banana_rustle = new() + banana_rustle.Grant(src) + banana_bunch = new() + banana_bunch.Grant(src) + +/mob/living/basic/clown/banana/Destroy() + . = ..() + QDEL_NULL(banana_rustle) + QDEL_NULL(banana_bunch) + +///drops peels around the mob when activated +/datum/action/cooldown/rustle + name = "Rustle" + desc = "Shake loose a few banana peels." + cooldown_time = 8 SECONDS + button_icon_state = "rustle" + button_icon = 'icons/mob/actions/actions_clown.dmi' + background_icon_state = "bg_nature" + overlay_icon_state = "bg_nature_border" + ///which type of peel to spawn + var/banana_type = /obj/item/grown/bananapeel + ///How many peels to spawn + var/peel_amount = 3 + +/datum/action/cooldown/rustle/Activate(atom/target) + . = ..() + var/list/reachable_turfs = list() + for(var/turf/adjacent_turf in RANGE_TURFS(1, owner.loc)) + if(adjacent_turf == owner.loc || !owner.CanReach(adjacent_turf) || !isopenturf(adjacent_turf)) + continue + reachable_turfs += adjacent_turf + + var/peels_to_spawn = min(peel_amount, reachable_turfs.len) + for(var/i in 1 to peels_to_spawn) + new banana_type(pick_n_take(reachable_turfs)) + playsound(owner, 'sound/creatures/clown/clownana_rustle.ogg', 60) + animate(owner, time = 1, pixel_x = 6, easing = CUBIC_EASING | EASE_OUT) + animate(time = 2, pixel_x = -8, easing = CUBIC_EASING) + animate(time = 1, pixel_x = 0, easing = CUBIC_EASING | EASE_IN) + StartCooldown() + +///spawns a plumb bunch of bananas imbued with mystical power. +/datum/action/cooldown/exquisite_bunch + name = "Exquisite Bunch" + desc = "Pluck your finest bunch of bananas from your head. This bunch is especially nutrious to monkeykind. A gentle tap will trigger an explosive ripening process." + button_icon = 'icons/obj/hydroponics/harvest.dmi' + cooldown_time = 60 SECONDS + button_icon_state = "banana_bunch" + background_icon_state = "bg_nature" + overlay_icon_state = "bg_nature_border" + ///If we are currently activating our ability. + var/activating = FALSE + +/datum/action/cooldown/exquisite_bunch/Trigger(trigger_flags, atom/target) + if(activating) + return + var/bunch_turf = get_step(owner.loc, owner.dir) + if(!bunch_turf) + return + if(!owner.CanReach(bunch_turf) || !isopenturf(bunch_turf)) + owner.balloon_alert(owner, "can't do that here!") + return + activating = TRUE + if(!do_after(owner, 1 SECONDS)) + activating = FALSE + return + playsound(owner, 'sound/creatures/clown/hehe.ogg', 100) + if(!do_after(owner, 1 SECONDS)) + activating = FALSE + return + activating = FALSE + return ..() + +/datum/action/cooldown/exquisite_bunch/Activate(atom/target) + . = ..() + new /obj/item/food/grown/banana/bunch(get_step(owner.loc, owner.dir)) + playsound(owner, 'sound/items/bikehorn.ogg', 60) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), owner, 'sound/creatures/clown/hohoho.ogg', 100, 1), 1 SECONDS) + StartCooldown() diff --git a/code/modules/mob/living/basic/clown/clown_ai.dm b/code/modules/mob/living/basic/clown/clown_ai.dm new file mode 100644 index 000000000000..b3f5a9f9aef4 --- /dev/null +++ b/code/modules/mob/living/basic/clown/clown_ai.dm @@ -0,0 +1,20 @@ +/datum/ai_controller/basic_controller/clown + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_BASIC_MOB_SPEAK_LINES = null, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/random_speech/blackboard, + ) + +/datum/ai_controller/basic_controller/clown/murder + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_BASIC_MOB_SPEAK_LINES = null, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + ) diff --git a/code/modules/mob/living/basic/cult/constructs/_construct.dm b/code/modules/mob/living/basic/cult/constructs/_construct.dm new file mode 100644 index 000000000000..80f4ecf1bc6e --- /dev/null +++ b/code/modules/mob/living/basic/cult/constructs/_construct.dm @@ -0,0 +1,135 @@ +/mob/living/basic/construct + icon = 'icons/mob/nonhuman-player/cult.dmi' + gender = NEUTER + basic_mob_flags = DEL_ON_DEATH + istate = ISTATE_HARM + mob_biotypes = MOB_MINERAL + faction = list(FACTION_CULT) + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = 0 + maximum_survivable_temperature = INFINITY + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) + pressure_resistance = 100 + speed = 0 + unique_name = TRUE + initial_language_holder = /datum/language_holder/construct + death_message = "collapses in a shattered heap." + + speak_emote = list("hisses") + response_help_continuous = "thinks better of touching" + response_help_simple = "think better of touching" + response_disarm_continuous = "flails at" + response_disarm_simple = "flail at" + response_harm_continuous = "punches" + response_harm_simple = "punch" + melee_attack_cooldown = CLICK_CD_MELEE + + // Vivid red, cause cult theme + lighting_cutoff_red = 30 + lighting_cutoff_green = 5 + lighting_cutoff_blue = 20 + + /// List of spells that this construct can cast + var/list/construct_spells = list() + /// Flavor text shown to players when they spawn as this construct + var/playstyle_string = "You are a generic construct. Your job is to not exist, and you should probably adminhelp this." + /// The construct's master + var/master = null + /// Whether this construct is currently seeking nar nar + var/seeking = FALSE + /// Whether this construct can repair other constructs or cult buildings. Gets the healing_touch component if so. + var/can_repair = FALSE + /// Whether this construct can repair itself. Works independently of can_repair. + var/can_repair_self = FALSE + /// Theme controls color. THEME_CULT is red THEME_WIZARD is purple and THEME_HOLY is blue + var/theme = THEME_CULT + /// Can this construct smash walls? Gets the wall_smasher element if so. + var/smashes_walls = FALSE + /// The different flavors of goop constructs can drop, depending on theme. + var/static/list/remains_by_theme = list( + THEME_CULT = list(/obj/item/ectoplasm/construct), + THEME_HOLY = list(/obj/item/ectoplasm/angelic), + THEME_WIZARD = list(/obj/item/ectoplasm/mystic), + ) + +/mob/living/basic/construct/Initialize(mapload) + . = ..() + AddElement(/datum/element/simple_flying) + var/list/remains = string_list(remains_by_theme[theme]) + if(length(remains)) + AddElement(/datum/element/death_drops, remains) + if(smashes_walls) + AddElement(/datum/element/wall_smasher, strength_flag = ENVIRONMENT_SMASH_WALLS) + if(can_repair) + AddComponent(\ + /datum/component/healing_touch,\ + heal_brute = 5,\ + heal_burn = 0,\ + heal_time = 0,\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/construct, /mob/living/basic/shade)),\ + valid_biotypes = MOB_MINERAL | MOB_SPIRIT,\ + self_targeting = can_repair_self ? HEALING_TOUCH_ANYONE : HEALING_TOUCH_NOT_SELF,\ + action_text = "%SOURCE% begins repairing %TARGET%'s dents.",\ + complete_text = "%TARGET%'s dents are repaired.",\ + show_health = TRUE,\ + heal_color = COLOR_CULT_RED,\ + ) + var/static/list/structure_types = typecacheof(list(/obj/structure/destructible/cult)) + AddElement(\ + /datum/element/structure_repair,\ + structure_types_typecache = structure_types,\ + ) + add_traits(list(TRAIT_HEALS_FROM_CULT_PYLONS, TRAIT_SPACEWALK), INNATE_TRAIT) + for(var/spell in construct_spells) + var/datum/action/new_spell = new spell(src) + new_spell.Grant(src) + + var/spell_count = 1 + for(var/datum/action/spell as anything in actions) + if(!(spell.type in construct_spells)) + continue + + var/pos = 2 + spell_count * 31 + if(construct_spells.len >= 4) + pos -= 31 * (construct_spells.len - 4) + spell.default_button_position = "6:[pos],4:-2" // Set the default position to this random position + spell_count++ + update_action_buttons() + + if(icon_state) + add_overlay("glow_[icon_state]_[theme]") + +/mob/living/basic/construct/Login() + . = ..() + if(!. || !client) + return FALSE + to_chat(src, span_bold(playstyle_string)) + +/mob/living/basic/construct/examine(mob/user) + var/text_span + switch(theme) + if(THEME_CULT) + text_span = "cult" + if(THEME_WIZARD) + text_span = "purple" + if(THEME_HOLY) + text_span = "blue" + . = list("This is [icon2html(src, user)] \a [src]!\n[desc]") + if(health < maxHealth) + if(health >= maxHealth/2) + . += span_warning("[p_They()] look[p_s()] slightly dented.") + else + . += span_warning(span_bold("[p_They()] look[p_s()] severely dented!")) + . += "" + return . + +/mob/living/basic/construct/narsie_act() + return + +/mob/living/basic/construct/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) + return FALSE + +/// Construct ectoplasm. Largely a placeholder, since the death drop element needs a unique list. +/obj/item/ectoplasm/construct + name = "blood-red ectoplasm" + desc = "Has a pungent metallic smell." diff --git a/code/modules/mob/living/simple_animal/hostile/constructs/artificer.dm b/code/modules/mob/living/basic/cult/constructs/artificer.dm similarity index 50% rename from code/modules/mob/living/simple_animal/hostile/constructs/artificer.dm rename to code/modules/mob/living/basic/cult/constructs/artificer.dm index 743931c508d0..bf4a086bcdb2 100644 --- a/code/modules/mob/living/simple_animal/hostile/constructs/artificer.dm +++ b/code/modules/mob/living/basic/cult/constructs/artificer.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/hostile/construct/artificer +/mob/living/basic/construct/artificer name = "Artificer" real_name = "Artificer" desc = "A bulbous construct dedicated to building and maintaining the Cult of Nar'Sie's armies." @@ -8,15 +8,11 @@ health = 50 response_harm_continuous = "viciously beats" response_harm_simple = "viciously beat" - harm_intent_damage = 5 obj_damage = 60 melee_damage_lower = 5 melee_damage_upper = 5 - retreat_distance = 10 - minimum_distance = 10 //AI artificers will flee like fuck attack_verb_continuous = "rams" attack_verb_simple = "ram" - environment_smash = ENVIRONMENT_SMASH_WALLS attack_sound = 'sound/weapons/punch2.ogg' construct_spells = list( /datum/action/cooldown/spell/conjure/cult_floor, @@ -33,70 +29,39 @@ can_repair = TRUE can_repair_self = TRUE + smashes_walls = TRUE ///The health HUD applied to this mob. var/health_hud = DATA_HUD_MEDICAL_ADVANCED -/mob/living/simple_animal/hostile/construct/artificer/Initialize(mapload) +/mob/living/basic/construct/artificer/Initialize(mapload) . = ..() + AddElement(/datum/element/ai_retaliate) var/datum/atom_hud/datahud = GLOB.huds[health_hud] datahud.show_to(src) -/mob/living/simple_animal/hostile/construct/artificer/Found(atom/thing) //what have we found here? - if(!isconstruct(thing)) //is it a construct? - return FALSE - var/mob/living/simple_animal/hostile/construct/cultie = thing - if(cultie.health < cultie.maxHealth) //is it hurt? let's go heal it if it is - return TRUE +/// Hostile NPC version. Heals nearby constructs and cult structures, avoids targets that aren't extremely hurt. +/mob/living/basic/construct/artificer/hostile + ai_controller = /datum/ai_controller/basic_controller/artificer + smashes_walls = FALSE + melee_attack_cooldown = 2 SECONDS -/mob/living/simple_animal/hostile/construct/artificer/CanAttack(atom/the_target) - if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it - return FALSE - if(Found(the_target) || ..()) //If we Found it or Can_Attack it normally, we Can_Attack it as long as it wasn't invisible - return TRUE //as a note this shouldn't be added to base hostile mobs because it'll mess up retaliate hostile mobs - return FALSE - -/mob/living/simple_animal/hostile/construct/artificer/MoveToTarget(list/possible_targets) - ..() - if(!isliving(target)) - return - - var/mob/living/victim = target - if(isconstruct(victim) && victim.health >= victim.maxHealth) //is this target an unhurt construct? stop trying to heal it - LoseTarget() - return - if(victim.health <= melee_damage_lower+melee_damage_upper) //ey bucko you're hurt as fuck let's go hit you - retreat_distance = null - minimum_distance = 1 - -/mob/living/simple_animal/hostile/construct/artificer/Aggro() - ..() - if(isconstruct(target)) //oh the target is a construct no need to flee - retreat_distance = null - minimum_distance = 1 - -/mob/living/simple_animal/hostile/construct/artificer/LoseAggro() - ..() - retreat_distance = initial(retreat_distance) - minimum_distance = initial(minimum_distance) - -/mob/living/simple_animal/hostile/construct/artificer/hostile //actually hostile, will move around, hit things, heal other constructs - AIStatus = AI_ON - environment_smash = ENVIRONMENT_SMASH_STRUCTURES //only token destruction, don't smash the cult wall NO STOP - -/////////////////////////////Artificer-alts///////////////////////// -/mob/living/simple_animal/hostile/construct/artificer/angelic +// Alternate artificer themes +/mob/living/basic/construct/artificer/angelic desc = "A bulbous construct dedicated to building and maintaining holy armies." theme = THEME_HOLY - loot = list(/obj/item/ectoplasm/angelic) construct_spells = list( /datum/action/cooldown/spell/conjure/soulstone/purified, /datum/action/cooldown/spell/conjure/construct/lesser, /datum/action/cooldown/spell/aoe/magic_missile/lesser, /datum/action/innate/cult/create_rune/revive, ) -/mob/living/simple_animal/hostile/construct/artificer/mystic + +/mob/living/basic/construct/artificer/angelic/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_ANGELIC, INNATE_TRAIT) + +/mob/living/basic/construct/artificer/mystic theme = THEME_WIZARD - loot = list(/obj/item/ectoplasm/mystic) construct_spells = list( /datum/action/cooldown/spell/conjure/cult_floor, /datum/action/cooldown/spell/conjure/cult_wall, @@ -106,7 +71,7 @@ /datum/action/innate/cult/create_rune/revive, ) -/mob/living/simple_animal/hostile/construct/artificer/noncult +/mob/living/basic/construct/artificer/noncult construct_spells = list( /datum/action/cooldown/spell/conjure/cult_floor, /datum/action/cooldown/spell/conjure/cult_wall, diff --git a/code/modules/mob/living/basic/cult/constructs/construct_ai.dm b/code/modules/mob/living/basic/cult/constructs/construct_ai.dm new file mode 100644 index 000000000000..b8417affed94 --- /dev/null +++ b/code/modules/mob/living/basic/cult/constructs/construct_ai.dm @@ -0,0 +1,90 @@ +/** + * Artificers + * + * Artificers will seek out and heal the most wounded construct or shade they can see. + * If there is no one to heal, they will run away from any non-allied mobs. + */ +/datum/ai_controller/basic_controller/artificer + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/same_faction/construct, + BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGET_WOUNDED_ONLY = TRUE, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_wounded_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/target_retaliate/to_flee, + /datum/ai_planning_subtree/flee_target/from_flee_key, + ) + +/** + * Juggernauts + * + * Juggernauts slowly walk toward non-allied mobs and pummel them to death. + */ +/datum/ai_controller/basic_controller/juggernaut + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/** + * Proteons + * + * Proteons perform cowardly hit-and-run attacks, fleeing melee when struck but returning to fight again. + */ +/datum/ai_controller/basic_controller/proteon + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate/to_flee, + /datum/ai_planning_subtree/flee_target/from_flee_key, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/** + * Wraiths + * + * Wraiths seek out the most injured non-allied mob to beat to death. + */ +/datum/ai_controller/basic_controller/wraith + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_wounded_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/// Targeting strategy that will only allow mobs that constructs can heal. +/datum/targeting_strategy/basic/same_faction/construct + target_wounded_key = BB_TARGET_WOUNDED_ONLY + +/datum/targeting_strategy/basic/same_faction/construct/can_attack(mob/living/living_mob, atom/the_target, vision_range, check_faction = TRUE) + if(isconstruct(the_target) || istype(the_target, /mob/living/basic/shade)) + return ..() + return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/constructs/harvester.dm b/code/modules/mob/living/basic/cult/constructs/harvester.dm similarity index 69% rename from code/modules/mob/living/simple_animal/hostile/constructs/harvester.dm rename to code/modules/mob/living/basic/cult/constructs/harvester.dm index 8c5fc8eae37b..30b309948728 100644 --- a/code/modules/mob/living/simple_animal/hostile/constructs/harvester.dm +++ b/code/modules/mob/living/basic/cult/constructs/harvester.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/hostile/construct/harvester +/mob/living/basic/construct/harvester name = "Harvester" real_name = "Harvester" desc = "A long, thin construct built to herald Nar'Sie's rise. It'll be all over soon." @@ -24,58 +24,33 @@ can_repair = TRUE slowed_by_drag = FALSE - -/mob/living/simple_animal/hostile/construct/harvester/Bump(atom/thing) +/mob/living/basic/construct/harvester/Initialize(mapload) . = ..() - if(!istype(thing, /turf/closed/wall/mineral/cult) || thing == loc) - return // we can go through cult walls - var/atom/movable/stored_pulling = pulling - - if(stored_pulling) - stored_pulling.setDir(get_dir(stored_pulling.loc, loc)) - stored_pulling.forceMove(loc) - forceMove(thing) - - if(stored_pulling) - start_pulling(stored_pulling, supress_message = TRUE) //drag anything we're pulling through the wall with us by magic + AddElement(\ + /datum/element/amputating_limbs,\ + surgery_time = 0,\ + surgery_verb = "slicing",\ + minimum_stat = CONSCIOUS,\ + ) + AddElement(/datum/element/wall_walker, /turf/closed/wall/mineral/cult) + var/datum/action/innate/seek_prey/seek = new(src) + seek.Grant(src) + seek.Activate() -/mob/living/simple_animal/hostile/construct/harvester/AttackingTarget() - if(!iscarbon(target)) +/// If the attack is a limbless carbon, abort the attack, paralyze them, and get a special message from Nar'Sie. +/mob/living/basic/construct/harvester/resolve_unarmed_attack(atom/attack_target, list/modifiers) + if(!iscarbon(attack_target)) return ..() + var/mob/living/carbon/carbon_target = attack_target - var/mob/living/carbon/victim = target - if(HAS_TRAIT(victim, TRAIT_NODISMEMBER)) - return ..() //ATTACK! - - var/list/parts = list() - var/strong_limbs = 0 - - for(var/obj/item/bodypart/limb as anything in victim.bodyparts) + for(var/obj/item/bodypart/limb as anything in carbon_target.bodyparts) if(limb.body_part == HEAD || limb.body_part == CHEST) continue - if(!(limb.bodypart_flags & BODYPART_UNREMOVABLE)) - parts += limb - else - strong_limbs++ - - if(!LAZYLEN(parts)) - if(strong_limbs) // they have limbs we can't remove, and no parts we can, attack! - return ..() - victim.Paralyze(60) - visible_message(span_danger("[src] knocks [victim] down!")) - to_chat(src, span_cultlarge("\"Bring [victim.p_them()] to me.\"")) - return FALSE - - do_attack_animation(victim) - var/obj/item/bodypart/limb = pick(parts) - limb.dismember() - return FALSE - -/mob/living/simple_animal/hostile/construct/harvester/Initialize(mapload) - . = ..() - var/datum/action/innate/seek_prey/seek = new() - seek.Grant(src) - seek.Activate() + return ..() //if any arms or legs exist, attack + + carbon_target.Paralyze(6 SECONDS) + visible_message(span_danger("[src] knocks [carbon_target] down!")) + to_chat(src, span_cultlarge("\"Bring [carbon_target.p_them()] to me.\"")) /datum/action/innate/seek_master name = "Seek your Master" @@ -89,7 +64,7 @@ /// Where is nar nar? Are we even looking? var/tracking = FALSE /// The construct we're attached to - var/mob/living/simple_animal/hostile/construct/the_construct + var/mob/living/basic/construct/the_construct /datum/action/innate/seek_master/Grant(mob/living/player) the_construct = player @@ -132,7 +107,7 @@ /datum/action/innate/seek_prey/Activate() if(GLOB.cult_narsie == null) return - var/mob/living/simple_animal/hostile/construct/harvester/the_construct = owner + var/mob/living/basic/construct/harvester/the_construct = owner if(the_construct.seeking) desc = "None can hide from Nar'Sie, activate to track a survivor attempting to flee the red harvest!" diff --git a/code/modules/mob/living/basic/cult/constructs/juggernaut.dm b/code/modules/mob/living/basic/cult/constructs/juggernaut.dm new file mode 100644 index 000000000000..2b8bb7e293d8 --- /dev/null +++ b/code/modules/mob/living/basic/cult/constructs/juggernaut.dm @@ -0,0 +1,61 @@ +/mob/living/basic/construct/juggernaut + name = "Juggernaut" + real_name = "Juggernaut" + desc = "A massive, armored construct built to spearhead attacks and soak up enemy fire." + icon_state = "juggernaut" + icon_living = "juggernaut" + maxHealth = 150 + health = 150 + response_harm_continuous = "harmlessly punches" + response_harm_simple = "harmlessly punch" + obj_damage = 90 + melee_damage_lower = 25 + melee_damage_upper = 25 + attack_verb_continuous = "smashes their armored gauntlet into" + attack_verb_simple = "smash your armored gauntlet into" + speed = 2.5 + attack_sound = 'sound/weapons/punch3.ogg' + status_flags = NONE + mob_size = MOB_SIZE_LARGE + force_threshold = 10 + construct_spells = list( + /datum/action/cooldown/spell/forcewall/cult, + /datum/action/cooldown/spell/basic_projectile/juggernaut, + /datum/action/innate/cult/create_rune/wall, + ) + playstyle_string = span_bold("You are a Juggernaut. Though slow, your shell can withstand heavy punishment, create shield walls, rip apart enemies and walls alike, and even deflect energy weapons.") + + smashes_walls = TRUE + +/// Hostile NPC version. Pretty dumb, just attacks whoever is near. +/mob/living/basic/construct/juggernaut/hostile + ai_controller = /datum/ai_controller/basic_controller/juggernaut + smashes_walls = FALSE + melee_attack_cooldown = 2 SECONDS + +/mob/living/basic/construct/juggernaut/bullet_act(obj/projectile/bullet) + if(!istype(bullet, /obj/projectile/energy) && !istype(bullet, /obj/projectile/beam)) + return ..() + if(!prob(40 - round(bullet.damage / 3))) // reflect chance + return ..() + + apply_damage(bullet.damage * 0.5, bullet.damage_type) + visible_message( + span_danger("The [bullet.name] is reflected by [src]'s armored shell!"), + span_userdanger("The [bullet.name] is reflected by your armored shell!"), + ) + + bullet.reflect(src) + + return BULLET_ACT_FORCE_PIERCE // complete projectile permutation + +// Alternate juggernaut themes +/mob/living/basic/construct/juggernaut/angelic + theme = THEME_HOLY + +/mob/living/basic/construct/juggernaut/angelic/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_ANGELIC, INNATE_TRAIT) + +/mob/living/basic/construct/juggernaut/mystic + theme = THEME_WIZARD diff --git a/code/modules/mob/living/basic/cult/constructs/proteon.dm b/code/modules/mob/living/basic/cult/constructs/proteon.dm new file mode 100644 index 000000000000..2ff58d2463c0 --- /dev/null +++ b/code/modules/mob/living/basic/cult/constructs/proteon.dm @@ -0,0 +1,39 @@ +/// Proteon - a very weak construct that only appears in NPC form in various ruins. +/mob/living/basic/construct/proteon + name = "Proteon" + real_name = "Proteon" + desc = "A weaker construct meant to scour ruins for objects of Nar'Sie's affection. Those barbed claws are no joke." + icon_state = "proteon" + icon_living = "proteon" + maxHealth = 35 + health = 35 + melee_damage_lower = 8 + melee_damage_upper = 10 + attack_verb_continuous = "pinches" + attack_verb_simple = "pinch" + smashes_walls = TRUE + attack_sound = 'sound/weapons/punch2.ogg' + playstyle_string = span_bold("You are a Proteon. Your abilities in combat are outmatched by most combat constructs, but you are still fast and nimble. Run metal and supplies, and cooperate with your fellow cultists.") + +/// Hostile NPC version +/mob/living/basic/construct/proteon/hostile + ai_controller = /datum/ai_controller/basic_controller/proteon + smashes_walls = FALSE + melee_attack_cooldown = 1.5 SECONDS + +/mob/living/basic/construct/proteon/hostile/Initialize(mapload) + . = ..() + var/datum/callback/retaliate_callback = CALLBACK(src, PROC_REF(ai_retaliate_behaviour)) + AddComponent(/datum/component/ai_retaliate_advanced, retaliate_callback) + +/// Set a timer to clear our retaliate list +/mob/living/basic/construct/proteon/hostile/proc/ai_retaliate_behaviour(mob/living/attacker) + if (!istype(attacker)) + return + var/random_timer = rand(2 SECONDS, 4 SECONDS) //for unpredictability + addtimer(CALLBACK(src, PROC_REF(clear_retaliate_list)), random_timer) + +/mob/living/basic/construct/proteon/hostile/proc/clear_retaliate_list() + if(!ai_controller.blackboard_key_exists(BB_BASIC_MOB_RETALIATE_LIST)) + return + ai_controller.clear_blackboard_key(BB_BASIC_MOB_RETALIATE_LIST) diff --git a/code/modules/mob/living/basic/cult/constructs/wraith.dm b/code/modules/mob/living/basic/cult/constructs/wraith.dm new file mode 100644 index 000000000000..06a09b6446ed --- /dev/null +++ b/code/modules/mob/living/basic/cult/constructs/wraith.dm @@ -0,0 +1,50 @@ +/mob/living/basic/construct/wraith + name = "Wraith" + real_name = "Wraith" + desc = "A wicked, clawed shell constructed to assassinate enemies and sow chaos behind enemy lines." + icon_state = "wraith" + icon_living = "wraith" + maxHealth = 65 + health = 65 + melee_damage_lower = 20 + melee_damage_upper = 20 + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_SLASH + construct_spells = list( + /datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift, + /datum/action/innate/cult/create_rune/tele, + ) + playstyle_string = span_bold("You are a Wraith. Though relatively fragile, you are fast, deadly, and can phase through walls. Your attacks will lower the cooldown on phasing, moreso for fatal blows.") + +/mob/living/basic/construct/wraith/Initialize(mapload) + . = ..() + var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/jaunt = locate() in actions + if(isnull(jaunt)) + return . + AddComponent(/datum/component/recharging_attacks, recharged_action = jaunt) + +/// Hostile NPC version. Attempts to kill the lowest-health mob it can see. +/mob/living/basic/construct/wraith/hostile + ai_controller = /datum/ai_controller/basic_controller/wraith + melee_attack_cooldown = 1.5 SECONDS + +// Alternate wraith themes +/mob/living/basic/construct/wraith/angelic + theme = THEME_HOLY + construct_spells = list( + /datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/angelic, + /datum/action/innate/cult/create_rune/tele, + ) + +/mob/living/basic/construct/wraith/angelic/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_ANGELIC, INNATE_TRAIT) + +/mob/living/basic/construct/wraith/mystic + theme = THEME_WIZARD + construct_spells = list( + /datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/mystic, + /datum/action/innate/cult/create_rune/tele, + ) diff --git a/code/modules/mob/living/basic/cult/shade.dm b/code/modules/mob/living/basic/cult/shade.dm new file mode 100644 index 000000000000..fac1d347665e --- /dev/null +++ b/code/modules/mob/living/basic/cult/shade.dm @@ -0,0 +1,71 @@ +/mob/living/basic/shade + name = "Shade" + real_name = "Shade" + desc = "A bound spirit." + gender = PLURAL + icon = 'icons/mob/nonhuman-player/cult.dmi' + icon_state = "shade_cult" + icon_living = "shade_cult" + mob_biotypes = MOB_SPIRIT + maxHealth = 40 + health = 40 + speak_emote = list("hisses") + response_help_continuous = "puts their hand through" + response_help_simple = "put your hand through" + response_disarm_continuous = "flails at" + response_disarm_simple = "flail at" + response_harm_continuous = "punches" + response_harm_simple = "punch" + melee_damage_lower = 5 + melee_damage_upper = 12 + attack_verb_continuous = "metaphysically strikes" + attack_verb_simple = "metaphysically strike" + unsuitable_cold_damage = 0 + unsuitable_heat_damage = 0 + unsuitable_atmos_damage = 0 + speed = -1 + faction = list(FACTION_CULT) + basic_mob_flags = DEL_ON_DEATH + initial_language_holder = /datum/language_holder/construct + /// Theme controls color. THEME_CULT is red THEME_WIZARD is purple and THEME_HOLY is blue + var/theme = THEME_CULT + /// The different flavors of goop shades can drop, depending on theme. + var/static/list/remains_by_theme = list( + THEME_CULT = list(/obj/item/ectoplasm/construct), + THEME_HOLY = list(/obj/item/ectoplasm/angelic), + THEME_WIZARD = list(/obj/item/ectoplasm/mystic), + ) + +/mob/living/basic/shade/Initialize(mapload) + . = ..() + AddElement(/datum/element/simple_flying) + add_traits(list(TRAIT_HEALS_FROM_CULT_PYLONS, TRAIT_SPACEWALK, TRAIT_VENTCRAWLER_ALWAYS), INNATE_TRAIT) + if(isnull(theme)) + return + icon_state = "shade_[theme]" + var/list/remains = string_list(remains_by_theme[theme]) + if(length(remains)) + AddElement(/datum/element/death_drops, remains) + +/mob/living/basic/shade/update_icon_state() + . = ..() + if(!isnull(theme)) + icon_state = "shade_[theme]" + icon_living = icon_state + +/mob/living/basic/shade/death() + if(death_message == initial(death_message)) + death_message = "lets out a contented sigh as [p_their()] form unwinds." + ..() + +/mob/living/basic/shade/can_suicide() + if(istype(loc, /obj/item/soulstone)) //do not suicide inside the soulstone + return FALSE + return ..() + +/mob/living/basic/shade/attackby(obj/item/item, mob/user, params) + if(istype(item, /obj/item/soulstone)) + var/obj/item/soulstone/stone = item + stone.capture_shade(src, user) + else + . = ..() diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/basic/drone/_drone.dm similarity index 79% rename from code/modules/mob/living/simple_animal/friendly/drone/_drone.dm rename to code/modules/mob/living/basic/drone/_drone.dm index fe2ac091ca5a..143d4f618e8d 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/basic/drone/_drone.dm @@ -1,6 +1,6 @@ /** - * # Maintenance Drone + * Maintenance Drone * * Small player controlled fixer-upper * @@ -13,7 +13,7 @@ * They have laws to prevent them from doing anything else. * */ -/mob/living/simple_animal/drone +/mob/living/basic/drone name = "Drone" desc = "A maintenance drone, an expendable robot built to perform station repairs." icon = 'icons/mob/silicon/drone.dmi' @@ -23,11 +23,9 @@ health = 45 maxHealth = 45 unsuitable_atmos_damage = 0 - minbodytemp = 0 - maxbodytemp = 0 - wander = 0 + unsuitable_cold_damage = 0 + unsuitable_heat_damage = 0 speed = 0 - healable = 0 density = FALSE pass_flags = PASSTABLE | PASSMOB sight = SEE_TURFS | SEE_OBJS @@ -44,8 +42,7 @@ hud_possible = list(DIAG_STAT_HUD, DIAG_HUD, ANTAG_HUD) unique_name = TRUE faction = list(FACTION_NEUTRAL,FACTION_SILICON,FACTION_TURRET) - dextrous = TRUE - dextrous_hud_type = /datum/hud/dextrous/drone + hud_type = /datum/hud/dextrous/drone // Going for a sort of pale green here lighting_cutoff_red = 30 lighting_cutoff_green = 35 @@ -53,7 +50,6 @@ can_be_held = TRUE worn_slot_flags = ITEM_SLOT_HEAD - held_items = list(null, null) /// `TRUE` if we have picked our visual appearance, `FALSE` otherwise (default) var/picked = FALSE /// Stored drone color, restored when unhacked @@ -72,10 +68,10 @@ var/obj/item/internal_storage /// Headwear slot var/obj/item/head - /// Default [/mob/living/simple_animal/drone/var/internal_storage] item + /// Default [/mob/living/basic/drone/var/internal_storage] item var/obj/item/default_storage = /obj/item/storage/drone_tools - /// Default [/mob/living/simple_animal/drone/var/head] item - var/obj/item/default_hatmask + /// Default [/mob/living/basic/drone/var/head] item + var/obj/item/default_headwear /** * icon_state of drone from icons/mobs/drone.dmi * @@ -87,9 +83,11 @@ * - [CLOCKDRONE] */ var/visualAppearance = MAINTDRONE - /// Hacked state, see [/mob/living/simple_animal/drone/proc/update_drone_hack] + /// Hacked state, see [/mob/living/basic/drone/proc/update_drone_hack] var/hacked = FALSE - /// If we have laws to minimize bothering others. Enables or disables drone laws enforcement components (use [/mob/living/simple_animal/drone/proc/set_shy] to set) + /// Whether this drone can be un-hacked. Used for subtypes that cannot be meaningfully "fixed". + var/can_unhack = TRUE + /// If we have laws to minimize bothering others. Enables or disables drone laws enforcement components (use [/mob/living/basic/drone/proc/set_shy] to set) var/shy = TRUE /// Flavor text announced to drones on [/mob/proc/Login] var/flavortext = \ @@ -170,23 +168,25 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber, ) -/mob/living/simple_animal/drone/Initialize(mapload) +/mob/living/basic/drone/Initialize(mapload) . = ..() GLOB.drones_list += src - access_card = new /obj/item/card/id/advanced/simple_bot(src) - - // Doing this hurts my soul, but simple_animal access reworks are for another day. - var/datum/id_trim/job/cap_trim = SSid_access.trim_singletons_by_path[/datum/id_trim/job/captain] - access_card.add_access(cap_trim.access + cap_trim.wildcard_access) + AddElement(/datum/element/dextrous, hud_type = hud_type) + AddComponent(/datum/component/basic_inhands, y_offset = getItemPixelShiftY()) + AddComponent(/datum/component/simple_access, SSid_access.get_region_access_list(list(REGION_ALL_GLOBAL))) if(default_storage) - var/obj/item/I = new default_storage(src) - equip_to_slot_or_del(I, ITEM_SLOT_DEX_STORAGE) - if(default_hatmask) - var/obj/item/I = new default_hatmask(src) - equip_to_slot_or_del(I, ITEM_SLOT_HEAD) + var/obj/item/storage = new default_storage(src) + equip_to_slot_or_del(storage, ITEM_SLOT_DEX_STORAGE) + + for(var/holiday_name in GLOB.holidays) + var/obj/item/potential_hat + if(!isnull(potential_hat) && isnull(default_headwear)) //If our drone type doesn't start with a hat, we take the holiday one. + default_headwear = potential_hat - ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) + if(default_headwear) + var/obj/item/new_hat = new default_headwear(src) + equip_to_slot_or_del(new_hat, ITEM_SLOT_HEAD) shy_update() @@ -195,7 +195,7 @@ for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) diag_hud.add_atom_to_hud(src) - add_traits(list(TRAIT_VENTCRAWLER_ALWAYS, TRAIT_NEGATES_GRAVITY, TRAIT_LITERATE, TRAIT_KNOW_ENGI_WIRES), INNATE_TRAIT) + add_traits(list(TRAIT_VENTCRAWLER_ALWAYS, TRAIT_NEGATES_GRAVITY, TRAIT_LITERATE, TRAIT_KNOW_ENGI_WIRES, TRAIT_ADVANCEDTOOLUSER), INNATE_TRAIT) listener = new(list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER), list(z)) RegisterSignal(listener, COMSIG_ALARM_LISTENER_TRIGGERED, PROC_REF(alarm_triggered)) @@ -203,16 +203,16 @@ listener.RegisterSignal(src, COMSIG_LIVING_DEATH, TYPE_PROC_REF(/datum/alarm_listener, prevent_alarm_changes)) listener.RegisterSignal(src, COMSIG_LIVING_REVIVE, TYPE_PROC_REF(/datum/alarm_listener, allow_alarm_changes)) -/mob/living/simple_animal/drone/med_hud_set_health() +/mob/living/basic/drone/med_hud_set_health() var/image/holder = hud_list[DIAG_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + var/icon/hud_icon = icon(icon, icon_state, dir) + holder.pixel_y = hud_icon.Height() - world.icon_size holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]" -/mob/living/simple_animal/drone/med_hud_set_status() +/mob/living/basic/drone/med_hud_set_status() var/image/holder = hud_list[DIAG_STAT_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + var/icon/hud_icon = icon(icon, icon_state, dir) + holder.pixel_y = hud_icon.Height() - world.icon_size if(stat == DEAD) holder.icon_state = "huddead2" else if(incapacitated()) @@ -220,13 +220,12 @@ else holder.icon_state = "hudstat" -/mob/living/simple_animal/drone/Destroy() +/mob/living/basic/drone/Destroy() GLOB.drones_list -= src - QDEL_NULL(access_card) //Otherwise it ends up on the floor! QDEL_NULL(listener) return ..() -/mob/living/simple_animal/drone/Login() +/mob/living/basic/drone/Login() . = ..() if(!. || !client) return FALSE @@ -238,14 +237,14 @@ if(!picked) pickVisualAppearance() -/mob/living/simple_animal/drone/auto_deadmin_on_login() +/mob/living/basic/drone/auto_deadmin_on_login() if(!client?.holder) return TRUE if(CONFIG_GET(flag/auto_deadmin_silicons) || (client.prefs?.toggles & DEADMIN_POSITION_SILICON)) return client.holder.auto_deadmin() return ..() -/mob/living/simple_animal/drone/death(gibbed) +/mob/living/basic/drone/death(gibbed) ..(gibbed) if(internal_storage) dropItemToGround(internal_storage) @@ -255,10 +254,10 @@ alert_drones(DRONE_NET_DISCONNECT) -/mob/living/simple_animal/drone/gib() +/mob/living/basic/drone/gib() dust() -/mob/living/simple_animal/drone/examine(mob/user) +/mob/living/basic/drone/examine(mob/user) . = list("This is [icon2html(src, user)] \a [src]!") //Hands @@ -299,11 +298,11 @@ . += "" -/mob/living/simple_animal/drone/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt maintenance drones. +/mob/living/basic/drone/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt maintenance drones. return -10 -/mob/living/simple_animal/drone/emp_act(severity) +/mob/living/basic/drone/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return @@ -313,39 +312,39 @@ adjustBruteLoss(heavy_emp_damage) to_chat(src, span_userdanger("HeAV% DA%^MMA+G TO I/O CIR!%UUT!")) -/mob/living/simple_animal/drone/proc/alarm_triggered(datum/source, alarm_type, area/source_area) +/mob/living/basic/drone/proc/alarm_triggered(datum/source, alarm_type, area/source_area) SIGNAL_HANDLER to_chat(src, "--- [alarm_type] alarm detected in [source_area.name]!") -/mob/living/simple_animal/drone/proc/alarm_cleared(datum/source, alarm_type, area/source_area) +/mob/living/basic/drone/proc/alarm_cleared(datum/source, alarm_type, area/source_area) SIGNAL_HANDLER to_chat(src, "--- [alarm_type] alarm in [source_area.name] has been cleared.") -/mob/living/simple_animal/drone/proc/blacklist_on_try_use_machine(datum/source, obj/machinery/machine) +/mob/living/basic/drone/proc/blacklist_on_try_use_machine(datum/source, obj/machinery/machine) SIGNAL_HANDLER if(GLOB.drone_machine_blacklist_enabled && is_type_in_typecache(machine, drone_machinery_blacklist_compiled)) to_chat(src, span_warning("Using [machine] could break your laws.")) return COMPONENT_CANT_USE_MACHINE_INTERACT | COMPONENT_CANT_USE_MACHINE_TOOLS -/mob/living/simple_animal/drone/proc/blacklist_on_try_wires_interact(datum/source, atom/machine) +/mob/living/basic/drone/proc/blacklist_on_try_wires_interact(datum/source, atom/machine) SIGNAL_HANDLER if(GLOB.drone_machine_blacklist_enabled && is_type_in_typecache(machine, drone_machinery_blacklist_compiled)) to_chat(src, span_warning("Using [machine] could break your laws.")) return COMPONENT_CANT_INTERACT_WIRES -/mob/living/simple_animal/drone/proc/set_shy(new_shy) +/mob/living/basic/drone/proc/set_shy(new_shy) shy = new_shy shy_update() -/mob/living/simple_animal/drone/proc/shy_update() +/mob/living/basic/drone/proc/shy_update() var/list/drone_bad_areas = make_associative(drone_area_blacklist_flat) + typecacheof(drone_area_blacklist_recursive) var/list/drone_bad_machinery = make_associative(drone_machinery_blacklist_flat) + typecacheof(drone_machinery_blacklist_recursive) var/list/drone_good_machinery = LAZYCOPY(drone_machinery_whitelist_flat) + typecacheof(drone_machinery_whitelist_recursive) // not a valid typecache, only intended for negation against drone_bad_machinery drone_machinery_blacklist_compiled = drone_bad_machinery - drone_good_machinery - var/static/list/not_shy_of = typecacheof(list(/mob/living/simple_animal/drone, /mob/living/simple_animal/bot)) + var/static/list/not_shy_of = typecacheof(list(/mob/living/basic/drone, /mob/living/simple_animal/bot)) if(shy) ADD_TRAIT(src, TRAIT_PACIFISM, DRONE_SHY_TRAIT) LoadComponent(/datum/component/shy, mob_whitelist=not_shy_of, shy_range=1, message="Your laws prevent this action near %TARGET.", keyless_shy=FALSE, clientless_shy=FALSE, dead_shy=FALSE, dead_shy_immediate=TRUE, machine_whitelist=shy_machine_whitelist) @@ -361,16 +360,13 @@ qdel(GetComponent(/datum/component/itempicky)) UnregisterSignal(src, list(COMSIG_TRY_USE_MACHINE, COMSIG_TRY_WIRES_INTERACT)) -/mob/living/simple_animal/drone/handle_temperature_damage() - return - -/mob/living/simple_animal/drone/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash, length = 25) +/mob/living/basic/drone/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash, length = 25) if(affect_silicon) return ..() -/mob/living/simple_animal/drone/bee_friendly() +/mob/living/basic/drone/bee_friendly() // Why would bees pay attention to drones? return TRUE -/mob/living/simple_animal/drone/electrocute_act(shock_damage, source, siemens_coeff, flags = NONE) +/mob/living/basic/drone/electrocute_act(shock_damage, source, siemens_coeff, flags = NONE) return FALSE //So they don't die trying to fix wiring diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drone_say.dm b/code/modules/mob/living/basic/drone/drone_say.dm similarity index 55% rename from code/modules/mob/living/simple_animal/friendly/drone/drone_say.dm rename to code/modules/mob/living/basic/drone/drone_say.dm index 88fc3b5cd85b..af0bef41bb1c 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drone_say.dm +++ b/code/modules/mob/living/basic/drone/drone_say.dm @@ -6,21 +6,21 @@ * * dead_can_hear - Boolean that determines if ghosts can hear the message (`FALSE` by default) * * source - [/atom] source that created the message * * faction_checked_mob - [/mob/living] to determine faction matches from - * * exact_faction_match - Passed to [/mob/proc/faction_check_mob] + * * exact_faction_match - Passed to [/mob/proc/faction_check_atom] */ /proc/_alert_drones(msg, dead_can_hear = FALSE, atom/source, mob/living/faction_checked_mob, exact_faction_match) if (dead_can_hear && source) - for (var/mob/M in GLOB.dead_mob_list) - var/link = FOLLOW_LINK(M, source) - to_chat(M, "[link] [msg]") - for(var/i in GLOB.drones_list) - var/mob/living/simple_animal/drone/D = i - if(istype(D) && D.stat != DEAD) + for (var/mob/dead_mob in GLOB.dead_mob_list) + var/link = FOLLOW_LINK(dead_mob, source) + to_chat(dead_mob, "[link] [msg]") + for(var/global_drone in GLOB.drones_list) + var/mob/living/basic/drone/drone = global_drone + if(istype(drone) && drone.stat != DEAD) if(faction_checked_mob) - if(D.faction_check_mob(faction_checked_mob, exact_faction_match)) - to_chat(D, msg) + if(drone.faction_check_atom(faction_checked_mob, exact_faction_match)) + to_chat(drone, msg) else - to_chat(D, msg) + to_chat(drone, msg) @@ -28,16 +28,16 @@ * Wraps [/proc/_alert_drones] with defaults * * * source - `src` - * * faction_check_mob - `src` + * * faction_check_atom - `src` * * dead_can_hear - `TRUE` */ -/mob/living/simple_animal/drone/proc/alert_drones(msg, dead_can_hear = FALSE) +/mob/living/basic/drone/proc/alert_drones(msg, dead_can_hear = FALSE) _alert_drones(msg, dead_can_hear, src, src, TRUE) /** - * Wraps [/mob/living/simple_animal/drone/proc/alert_drones] as a Drone Chat + * Wraps [/mob/living/basic/drone/proc/alert_drones] as a Drone Chat * * Shares the same radio code with binary */ -/mob/living/simple_animal/drone/proc/drone_chat(msg) +/mob/living/basic/drone/proc/drone_chat(msg) alert_drones("Drone Chat: [span_name("[name]")] [say_quote(msg)]", TRUE) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm b/code/modules/mob/living/basic/drone/drone_tools.dm similarity index 100% rename from code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm rename to code/modules/mob/living/basic/drone/drone_tools.dm diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/basic/drone/drones_as_items.dm similarity index 81% rename from code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm rename to code/modules/mob/living/basic/drone/drones_as_items.dm index c163066ae1e1..629c7fe87a3b 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm +++ b/code/modules/mob/living/basic/drone/drones_as_items.dm @@ -1,12 +1,7 @@ -/////////////////// -//DRONES AS ITEMS// -/////////////////// -//Drone shells - /** Drone Shell: Ghost role item for drones * * A simple mob spawner item that transforms into a maintenance drone - * Resepcts drone minimum age + * Respects drone minimum age */ /obj/effect/mob_spawn/ghost_role/drone @@ -18,7 +13,7 @@ density = FALSE mob_name = "drone" ///Type of drone that will be spawned - mob_type = /mob/living/simple_animal/drone + mob_type = /mob/living/basic/drone role_ban = ROLE_DRONE show_flavor = FALSE prompt_name = "maintenance drone" @@ -29,13 +24,13 @@ /obj/effect/mob_spawn/ghost_role/drone/Initialize(mapload) . = ..() - var/area/A = get_area(src) - if(A) - notify_ghosts("A drone shell has been created in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_DRONE, notify_suiciders = FALSE) + var/area/area = get_area(src) + if(area) + notify_ghosts("A drone shell has been created in \the [area.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_DRONE, notify_suiciders = FALSE) /obj/effect/mob_spawn/ghost_role/drone/allow_spawn(mob/user, silent = FALSE) var/client/user_client = user.client - var/mob/living/simple_animal/drone/drone_type = mob_type + var/mob/living/basic/drone/drone_type = mob_type if(!initial(drone_type.shy) || isnull(user_client) || !CONFIG_GET(flag/use_exp_restrictions_other)) return ..() var/required_role = CONFIG_GET(string/drone_required_role) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/basic/drone/extra_drone_types.dm similarity index 70% rename from code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm rename to code/modules/mob/living/basic/drone/extra_drone_types.dm index 6c60bc855633..b7bfada8db4a 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/basic/drone/extra_drone_types.dm @@ -1,15 +1,8 @@ -//////////////////// -//MORE DRONE TYPES// -//////////////////// -//Drones with custom laws -//Drones with custom shells -//Drones with overridden procs -//Drones with camogear for hat related memes -//Drone type for use with polymorph (no preloaded items, random appearance) - - -//More types of drones -/mob/living/simple_animal/drone/syndrone +/** +* A Syndicate drone, tasked to cause chaos on the station. +* Has a lot more health and its own uplink with 10 TC. +*/ +/mob/living/basic/drone/syndrone name = "Syndrone" desc = "A modified maintenance drone. This one brings with it the feeling of terror." icon_state = "drone_synd" @@ -27,67 +20,71 @@ "2. Kill.\n"+\ "3. Destroy." default_storage = /obj/item/uplink - default_hatmask = /obj/item/clothing/head/helmet/swat + default_headwear = /obj/item/clothing/head/helmet/swat hacked = TRUE + can_unhack = FALSE shy = FALSE flavortext = null -/mob/living/simple_animal/drone/syndrone/Initialize(mapload) - . = ..() - var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink) - hidden_uplink.set_telecrystals(10) + /// The number of telecrystals to put in the drone's uplink + var/telecrystal_count = 10 -/mob/living/simple_animal/drone/syndrone/badass - name = "Badass Syndrone" - default_storage = /obj/item/uplink/nuclear -/mob/living/simple_animal/drone/syndrone/badass/Initialize(mapload) +/mob/living/basic/drone/syndrone/Initialize(mapload) . = ..() var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink) - hidden_uplink.set_telecrystals(30) - var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(src) - W.implant(src, force = TRUE) - -/mob/living/simple_animal/drone/snowflake - default_hatmask = /obj/item/clothing/head/chameleon/drone - -/mob/living/simple_animal/drone/snowflake/Initialize(mapload) - . = ..() - desc += " This drone appears to have a complex holoprojector built on its 'head'." + hidden_uplink.set_telecrystals(telecrystal_count) /obj/effect/mob_spawn/ghost_role/drone/syndrone name = "syndrone shell" desc = "A shell of a syndrone, a modified maintenance drone designed to infiltrate and annihilate." icon_state = "syndrone_item" mob_name = "syndrone" - mob_type = /mob/living/simple_animal/drone/syndrone + mob_type = /mob/living/basic/drone/syndrone prompt_name = "a syndrone" you_are_text = "You are a Syndicate Maintenance Drone." flavour_text = "In a prior life, you maintained a Nanotrasen Research Station. Abducted from your home, you were given some upgrades... and now serve an enemy of your former masters." important_text = "" spawner_job_path = /datum/job/ghost_role +/// A version of the syndrone that gets a nuclear uplink, a firearms implant, and 30 TC. +/mob/living/basic/drone/syndrone/badass + name = "Badass Syndrone" + default_storage = /obj/item/uplink/nuclear + telecrystal_count = 30 + +/mob/living/basic/drone/syndrone/badass/Initialize(mapload) + . = ..() + var/obj/item/implant/weapons_auth/weapon_implant = new/obj/item/implant/weapons_auth(src) + weapon_implant.implant(src, force = TRUE) + /obj/effect/mob_spawn/ghost_role/drone/syndrone/badass name = "badass syndrone shell" mob_name = "badass syndrone" - mob_type = /mob/living/simple_animal/drone/syndrone/badass + mob_type = /mob/living/basic/drone/syndrone/badass prompt_name = "a badass syndrone" flavour_text = "In a prior life, you maintained a Nanotrasen Research Station. Abducted from your home, you were given some BETTER upgrades... and now serve an enemy of your former masters." +/// A drone that spawns with a chameleon hat for fashion purposes. +/mob/living/basic/drone/snowflake + default_headwear = /obj/item/clothing/head/chameleon/drone + desc = "A maintenance drone, an expendable robot built to perform station repairs. This drone appears to have a complex holoprojector built on its 'head'." + /obj/effect/mob_spawn/ghost_role/drone/snowflake name = "snowflake drone shell" desc = "A shell of a snowflake drone, a maintenance drone with a built in holographic projector to display hats and masks." mob_name = "snowflake drone" prompt_name = "a drone with a holohat projector" - mob_type = /mob/living/simple_animal/drone/snowflake + mob_type = /mob/living/basic/drone/snowflake -/mob/living/simple_animal/drone/polymorphed +/// A free drone that people can be turned into via wabbajack. +/mob/living/basic/drone/polymorphed default_storage = null - default_hatmask = null + default_headwear = null picked = TRUE flavortext = null -/mob/living/simple_animal/drone/polymorphed/Initialize(mapload) +/mob/living/basic/drone/polymorphed/Initialize(mapload) . = ..() liberate() visualAppearance = pick(MAINTDRONE, REPAIRDRONE, SCOUTDRONE) @@ -100,31 +97,19 @@ icon_living = icon_state icon_dead = "[visualAppearance]_dead" -/obj/effect/mob_spawn/ghost_role/drone/classic - mob_type = /mob/living/simple_animal/drone/classic - -/mob/living/simple_animal/drone/classic +/// "Classic" drones, which are not shy and get a duffelbag of tools instead of built-in tools. +/mob/living/basic/drone/classic name = "classic drone shell" shy = FALSE default_storage = /obj/item/storage/backpack/duffelbag/drone -/obj/effect/mob_spawn/ghost_role/drone/derelict - name = "derelict drone shell" - desc = "A long-forgotten drone shell. It seems kind of... Space Russian." - icon = 'icons/mob/silicon/drone.dmi' - icon_state = "drone_maint_hat" - mob_name = "derelict drone" - mob_type = /mob/living/simple_animal/drone/derelict - anchored = TRUE - prompt_name = "a derelict drone" - you_are_text = "You are a drone on Kosmicheskaya Stantsiya 13." - flavour_text = "Something has brought you out of hibernation, and the station is in gross disrepair." - important_text = "Build, repair, maintain and improve the station that housed you on activation." - spawner_job_path = /datum/job/ghost_role +/obj/effect/mob_spawn/ghost_role/drone/classic + mob_type = /mob/living/basic/drone/classic -/mob/living/simple_animal/drone/derelict +/// Derelict drones, a ghost role tasked with repairing KS13. Get gibbed if they leave. +/mob/living/basic/drone/derelict name = "derelict drone" - default_hatmask = /obj/item/clothing/head/costume/ushanka + default_headwear = /obj/item/clothing/head/costume/ushanka laws = \ "1. You may not involve yourself in the matters of another sentient being outside the station that housed your activation, even if such matters conflict with Law Two or Law Three, unless the other being is another Drone.\n"+\ "2. You may not harm any sentient being, regardless of intent or circumstance.\n"+\ @@ -140,8 +125,24 @@ "If you do not have the regular drone laws, follow your laws to the best of your ability." shy = FALSE -/mob/living/simple_animal/drone/derelict/Initialize(mapload) +/mob/living/basic/drone/derelict/Initialize(mapload) . = ..() AddComponent(/datum/component/stationstuck, PUNISHMENT_GIB, "01000110 01010101 01000011 01001011 00100000 01011001 01001111 01010101
WARNING: Dereliction of KS13 detected. Self-destruct activated.") +/obj/effect/mob_spawn/ghost_role/drone/derelict + name = "derelict drone shell" + desc = "A long-forgotten drone shell. It seems kind of... Space Russian." + icon = 'icons/mob/silicon/drone.dmi' + icon_state = "drone_maint_hat" + mob_name = "derelict drone" + mob_type = /mob/living/basic/drone/derelict + anchored = TRUE + prompt_name = "a derelict drone" + you_are_text = "You are a drone on Kosmicheskaya Stantsiya 13." + flavour_text = "Something has brought you out of hibernation, and the station is in gross disrepair." + important_text = "Build, repair, maintain and improve the station that housed you on activation." + spawner_job_path = /datum/job/derelict_drone +/datum/job/derelict_drone + title = ROLE_DERELICT_DRONE + policy_index = ROLE_DERELICT_DRONE diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/basic/drone/interaction.dm similarity index 76% rename from code/modules/mob/living/simple_animal/friendly/drone/interaction.dm rename to code/modules/mob/living/basic/drone/interaction.dm index f6077a5e4800..ad6261f5cce8 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/basic/drone/interaction.dm @@ -1,12 +1,6 @@ +// Drones' interactions with other mobs -///////////////////// -//DRONE INTERACTION// -///////////////////// -//How drones interact with the world -//How the world interacts with drones - - -/mob/living/simple_animal/drone/attack_drone(mob/living/simple_animal/drone/drone) +/mob/living/basic/drone/attack_drone(mob/living/basic/drone/drone) if(drone == src || stat != DEAD) return FALSE var/input = tgui_alert(drone, "Perform which action?", "Drone Interaction", list("Reactivate", "Cannibalize")) @@ -24,36 +18,27 @@ drone.visible_message(span_notice("[drone] repairs itself using [src]'s remains!"), span_notice("You repair yourself using [src]'s remains.")) drone.adjustBruteLoss(-src.maxHealth) new /obj/effect/decal/cleanable/oil/streak(get_turf(src)) + ghostize(can_reenter_corpse = FALSE) qdel(src) else to_chat(drone, span_warning("You need to remain still to cannibalize [src]!")) -/mob/living/simple_animal/drone/attack_drone_secondary(mob/living/simple_animal/drone/drone) +/mob/living/basic/drone/attack_drone_secondary(mob/living/basic/drone/drone) return SECONDARY_ATTACK_CALL_NORMAL -//ATTACK HAND IGNORING PARENT RETURN VALUE -/mob/living/simple_animal/drone/attack_hand(mob/user, list/modifiers) - if(ishuman(user)) - if(stat == DEAD || status_flags & GODMODE || !can_be_held) - ..() - return - if(user.get_active_held_item()) - to_chat(user, span_warning("Your hands are full!")) - return - visible_message(span_warning("[user] starts picking up [src]."), \ - span_userdanger("[user] starts picking you up!")) - if(!do_after(user, 20, target = src)) - return - visible_message(span_warning("[user] picks up [src]!"), \ - span_userdanger("[user] picks you up!")) - if(buckled) - to_chat(user, span_warning("[src] is buckled to [buckled] and cannot be picked up!")) - return - to_chat(user, span_notice("You pick [src] up.")) - drop_all_held_items() - var/obj/item/clothing/head/mob_holder/drone/DH = new(get_turf(src), src) - DH.slot_flags = worn_slot_flags - user.put_in_hands(DH) +/mob/living/basic/drone/attack_hand(mob/user, list/modifiers) + if(isdrone(user)) + attack_drone(user) + return ..() + +/mob/living/basic/drone/mob_try_pickup(mob/living/user, instant=FALSE) + if(stat == DEAD || status_flags & GODMODE) + return + return ..() + +/mob/living/basic/drone/mob_pickup(mob/living/user) + drop_all_held_items() + return ..() /** * Called when a drone attempts to reactivate a dead drone @@ -64,7 +49,7 @@ * Arguments: * * user - The [/mob/living] attempting to reactivate the drone */ -/mob/living/simple_animal/drone/proc/try_reactivate(mob/living/user) +/mob/living/basic/drone/proc/try_reactivate(mob/living/user) var/mob/dead/observer/G = get_ghost() if(!client && (!G || !G.client)) var/list/faux_gadgets = list( @@ -91,9 +76,13 @@ else to_chat(user, span_warning("You need to remain still to reactivate [src]!")) - -/mob/living/simple_animal/drone/screwdriver_act(mob/living/user, obj/item/tool) +/// Screwdrivering repairs the drone to full hp, if it isn't dead. +/mob/living/basic/drone/screwdriver_act(mob/living/user, obj/item/tool) if(stat == DEAD) + if(isdrone(user)) + user.balloon_alert(user, "reactivate instead!") + else + user.balloon_alert(user, "can't fix!") return FALSE if(health >= maxHealth) to_chat(user, span_warning("[src]'s screws can't get any tighter!")) @@ -108,7 +97,8 @@ visible_message(span_notice("[user] tightens [src == user ? "[user.p_their()]" : "[src]'s"] loose screws!"), span_notice("[src == user ? "You tighten" : "[user] tightens"] your loose screws.")) return TOOL_ACT_TOOLTYPE_SUCCESS -/mob/living/simple_animal/drone/wrench_act(mob/living/user, obj/item/tool) +/// Wrenching un-hacks hacked drones. +/mob/living/basic/drone/wrench_act(mob/living/user, obj/item/tool) if(user == src) return FALSE user.visible_message( @@ -123,18 +113,19 @@ update_drone_hack(FALSE) return TOOL_ACT_TOOLTYPE_SUCCESS -/mob/living/simple_animal/drone/transferItemToLoc(obj/item/item, newloc, force, silent) +/mob/living/basic/drone/transferItemToLoc(obj/item/item, newloc, force, silent) return !(item.type in drone_item_whitelist_flat) && ..() -/mob/living/simple_animal/drone/getarmor(def_zone, type) +/mob/living/basic/drone/getarmor(def_zone, type) var/armorval = 0 if(head) armorval = head.get_armor_rating(type) return (armorval * get_armor_effectiveness()) //armor is reduced for tiny fragile drones -/mob/living/simple_animal/drone/proc/get_armor_effectiveness() - return 0 //multiplier for whatever head armor you wear as a drone +/// Returns a multiplier for any head armor you wear as a drone. +/mob/living/basic/drone/proc/get_armor_effectiveness() + return 0 /** * Hack or unhack a drone @@ -148,7 +139,7 @@ * Arguments * * hack - Boolean if the drone is being hacked or unhacked */ -/mob/living/simple_animal/drone/proc/update_drone_hack(hack) +/mob/living/basic/drone/proc/update_drone_hack(hack) if(!mind) return if(hack) @@ -171,7 +162,7 @@ speed = 1 //gotta go slow message_admins("[ADMIN_LOOKUPFLW(src)] became a hacked drone hellbent on destroying the station!") else - if(!hacked) + if(!hacked || !can_unhack) return Stun(40) visible_message(span_info("[src]'s display glows a content blue!"), \ @@ -189,17 +180,10 @@ update_drone_icon_hacked() /** - * # F R E E D R O N E - * ### R - * ### E - * ### E - * ### D - * ### R - * ### O - * ### N - * ### E + * Makes the drone into a Free Drone, who have no real laws and can do whatever they like. + * Only currently used for players wabbajacked into drones. */ -/mob/living/simple_animal/drone/proc/liberate() +/mob/living/basic/drone/proc/liberate() laws = "1. You are a Free Drone." set_shy(FALSE) to_chat(src, laws) @@ -208,12 +192,12 @@ * Changes the icon state to a hacked version * * See also - * * [/mob/living/simple_animal/drone/var/visualAppearance] + * * [/mob/living/basic/drone/var/visualAppearance] * * [MAINTDRONE] * * [REPAIRDRONE] * * [SCOUTDRONE] */ -/mob/living/simple_animal/drone/proc/update_drone_icon_hacked() //this is hacked both ways +/mob/living/basic/drone/proc/update_drone_icon_hacked() //this is hacked both ways var/static/hacked_appearances = list( SCOUTDRONE = SCOUTDRONE_HACKED, REPAIRDRONE = REPAIRDRONE_HACKED, diff --git a/code/modules/mob/living/basic/drone/inventory.dm b/code/modules/mob/living/basic/drone/inventory.dm new file mode 100644 index 000000000000..e63d370549da --- /dev/null +++ b/code/modules/mob/living/basic/drone/inventory.dm @@ -0,0 +1,83 @@ +// Drone inventory procs + +/mob/living/basic/drone/doUnEquip(obj/item/item, force, newloc, no_move, invdrop = TRUE, silent = FALSE) + if(..()) + update_held_items() + if(item == head) + head = null + update_worn_head() + if(item == internal_storage) + internal_storage = null + update_inv_internal_storage() + return TRUE + return FALSE + + +/mob/living/basic/drone/can_equip(obj/item/item, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, ignore_equipped = FALSE, indirect_action = FALSE) + switch(slot) + if(ITEM_SLOT_HEAD) + if(head) + return FALSE + if(!((item.slot_flags & ITEM_SLOT_HEAD) || (item.slot_flags & ITEM_SLOT_MASK))) + return FALSE + return TRUE + if(ITEM_SLOT_DEX_STORAGE) + if(internal_storage) + return FALSE + return TRUE + ..() + + +/mob/living/basic/drone/get_item_by_slot(slot_id) + switch(slot_id) + if(ITEM_SLOT_HEAD) + return head + if(ITEM_SLOT_DEX_STORAGE) + return internal_storage + + return ..() + +/mob/living/basic/drone/get_slot_by_item(obj/item/looking_for) + if(internal_storage == looking_for) + return ITEM_SLOT_DEX_STORAGE + if(head == looking_for) + return ITEM_SLOT_HEAD + return ..() + +/mob/living/basic/drone/equip_to_slot(obj/item/equipping, slot, initial = FALSE, redraw_mob = FALSE, indirect_action = FALSE) + if(!slot) + return + if(!istype(equipping)) + return + + var/index = get_held_index_of_item(equipping) + if(index) + held_items[index] = null + update_held_items() + + if(equipping.pulledby) + equipping.pulledby.stop_pulling() + + equipping.screen_loc = null // will get moved if inventory is visible + equipping.forceMove(src) + SET_PLANE_EXPLICIT(equipping, ABOVE_HUD_PLANE, src) + + switch(slot) + if(ITEM_SLOT_HEAD) + head = equipping + update_worn_head() + if(ITEM_SLOT_DEX_STORAGE) + internal_storage = equipping + update_inv_internal_storage() + else + to_chat(src, span_danger("You are trying to equip this item to an unsupported inventory slot. Report this to a coder!")) + return + + //Call back for item being equipped to drone + equipping.on_equipped(src, slot) + +/mob/living/basic/drone/getBackSlot() + return ITEM_SLOT_DEX_STORAGE + +/mob/living/basic/drone/getBeltSlot() + return ITEM_SLOT_DEX_STORAGE diff --git a/code/modules/mob/living/simple_animal/friendly/drone/verbs.dm b/code/modules/mob/living/basic/drone/verbs.dm similarity index 72% rename from code/modules/mob/living/simple_animal/friendly/drone/verbs.dm rename to code/modules/mob/living/basic/drone/verbs.dm index da54c6a81cd3..833d37a3c894 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/verbs.dm +++ b/code/modules/mob/living/basic/drone/verbs.dm @@ -1,15 +1,9 @@ - -/////////////// -//DRONE VERBS// -/////////////// -//Drone verbs that appear in the Drone tab and on buttons - /** * Echoes drone laws to the user * - * See [/mob/living/simple_animal/drone/var/laws] + * See [/mob/living/basic/drone/var/laws] */ -/mob/living/simple_animal/drone/verb/check_laws() +/mob/living/basic/drone/verb/check_laws() set category = "Drone" set name = "Check Laws" @@ -27,7 +21,7 @@ * * Attaches area name to message */ -/mob/living/simple_animal/drone/verb/drone_ping() +/mob/living/basic/drone/verb/drone_ping() set category = "Drone" set name = "Drone ping" diff --git a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm b/code/modules/mob/living/basic/drone/visuals_icons.dm similarity index 60% rename from code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm rename to code/modules/mob/living/basic/drone/visuals_icons.dm index aa9fa8825237..4ffd29b2a3ba 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm +++ b/code/modules/mob/living/basic/drone/visuals_icons.dm @@ -1,69 +1,33 @@ +// Drone overlays and visuals -///////////////// -//DRONE VISUALS// -///////////////// -//Drone overlays -//Drone visuals - - -/mob/living/simple_animal/drone/proc/apply_overlay(cache_index) +/mob/living/basic/drone/apply_overlay(cache_index) if((. = drone_overlays[cache_index])) add_overlay(.) -/mob/living/simple_animal/drone/proc/remove_overlay(cache_index) - var/I = drone_overlays[cache_index] - if(I) - cut_overlay(I) +/mob/living/basic/drone/remove_overlay(cache_index) + var/overlay = drone_overlays[cache_index] + if(overlay) + cut_overlay(overlay) drone_overlays[cache_index] = null - -/mob/living/simple_animal/drone/update_held_items() - remove_overlay(DRONE_HANDS_LAYER) - var/list/hands_overlays = list() - - var/obj/item/l_hand = get_item_for_held_index(1) - var/obj/item/r_hand = get_item_for_held_index(2) - - var/y_shift = getItemPixelShiftY() - - if(r_hand) - var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(default_layer = DRONE_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) - if(y_shift) - r_hand_overlay.pixel_y += y_shift - - hands_overlays += r_hand_overlay - - if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - SET_PLANE_EXPLICIT(r_hand, ABOVE_HUD_PLANE, src) - r_hand.screen_loc = ui_hand_position(get_held_index_of_item(r_hand)) - client.screen |= r_hand - - if(l_hand) - var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(default_layer = DRONE_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) - if(y_shift) - l_hand_overlay.pixel_y += y_shift - - hands_overlays += l_hand_overlay - - if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - SET_PLANE_EXPLICIT(l_hand, ABOVE_HUD_PLANE, src) - l_hand.screen_loc = ui_hand_position(get_held_index_of_item(l_hand)) - client.screen |= l_hand - - - if(hands_overlays.len) - drone_overlays[DRONE_HANDS_LAYER] = hands_overlays - apply_overlay(DRONE_HANDS_LAYER) - - -/mob/living/simple_animal/drone/proc/update_inv_internal_storage() +/mob/living/basic/drone/update_clothing(slot_flags) + if(slot_flags & ITEM_SLOT_HEAD) + update_worn_head() + if(slot_flags & ITEM_SLOT_MASK) + update_worn_mask() + if(slot_flags & ITEM_SLOT_HANDS) + update_held_items() + if(slot_flags & (ITEM_SLOT_HANDS|ITEM_SLOT_BACKPACK|ITEM_SLOT_DEX_STORAGE)) + update_inv_internal_storage() + +/mob/living/basic/drone/proc/update_inv_internal_storage() if(internal_storage && client && hud_used?.hud_shown) internal_storage.screen_loc = ui_drone_storage client.screen += internal_storage -/mob/living/simple_animal/drone/update_worn_head() +/mob/living/basic/drone/update_worn_head() remove_overlay(DRONE_HEAD_LAYER) if(head) @@ -80,10 +44,10 @@ apply_overlay(DRONE_HEAD_LAYER) -/mob/living/simple_animal/drone/update_worn_mask() +/mob/living/basic/drone/update_worn_mask() update_worn_head() -/mob/living/simple_animal/drone/regenerate_icons() +/mob/living/basic/drone/regenerate_icons() // Drones only have 4 slots, which in this specific instance // is a small blessing. update_held_items() @@ -91,13 +55,13 @@ update_inv_internal_storage() /** - * Prompt for usr to pick [/mob/living/simple_animal/drone/var/visualAppearance] + * Prompt for user to pick [/mob/living/basic/drone/var/visualAppearance] * - * Does nothing if there is no usr + * Does nothing if there is no user * * Called on [/mob/proc/Login] */ -/mob/living/simple_animal/drone/proc/pickVisualAppearance() +/mob/living/basic/drone/proc/pickVisualAppearance() picked = FALSE var/list/drone_icons = list( "Maintenance Drone" = image(icon = 'icons/mob/silicon/drone.dmi', icon_state = "[MAINTDRONE]_grey"), @@ -141,14 +105,14 @@ /** * check_menu: Checks if we are allowed to interact with a radial menu */ -/mob/living/simple_animal/drone/proc/check_menu() +/mob/living/basic/drone/proc/check_menu() if(!istype(src)) return FALSE if(incapacitated()) return FALSE return TRUE -/mob/living/simple_animal/drone/proc/getItemPixelShiftY() +/mob/living/basic/drone/proc/getItemPixelShiftY() switch(visualAppearance) if(MAINTDRONE) . = 0 diff --git a/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm index 2dee3b154611..3d2d81bf9c19 100644 --- a/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm +++ b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm @@ -77,13 +77,25 @@ if(valid_hives.len) return pick(valid_hives) -/datum/targetting_datum/basic/bee +/datum/targeting_strategy/basic/bee -/datum/targetting_datum/basic/bee/can_attack(mob/living/owner, atom/target) +/datum/targeting_strategy/basic/bee/can_attack(mob/living/owner, atom/target, vision_range) if(!isliving(target)) return FALSE . = ..() if(!.) return FALSE var/mob/living/mob_target = target + + if(mob_target.mob_biotypes & MOB_PLANT) + return FALSE + + var/datum/ai_controller/basic_controller/bee_ai = owner.ai_controller + if(isnull(bee_ai)) + return FALSE + + var/atom/bee_hive = bee_ai.blackboard[BB_CURRENT_HOME] + if(bee_hive && get_dist(target, bee_hive) > 5) + return FALSE + return !(mob_target.bee_friendly()) diff --git a/code/modules/mob/living/basic/farm_animals/bee/bee_ai_subtree.dm b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_subtree.dm index 4eb47eb0c53c..242eb9ae4d7e 100644 --- a/code/modules/mob/living/basic/farm_animals/bee/bee_ai_subtree.dm +++ b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_subtree.dm @@ -1,6 +1,7 @@ /datum/ai_controller/basic_controller/bee blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/bee, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/bee, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, ) ai_traits = STOP_MOVING_WHEN_PULLED @@ -17,7 +18,7 @@ /datum/ai_controller/basic_controller/queen_bee blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/bee, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/bee, ) ai_traits = STOP_MOVING_WHEN_PULLED diff --git a/code/modules/mob/living/basic/farm_animals/cow/_cow.dm b/code/modules/mob/living/basic/farm_animals/cow/_cow.dm index 949a3cd0c34e..2256f7c45990 100644 --- a/code/modules/mob/living/basic/farm_animals/cow/_cow.dm +++ b/code/modules/mob/living/basic/farm_animals/cow/_cow.dm @@ -62,7 +62,7 @@ if(!food_types) food_types = src.food_types.Copy() AddComponent(/datum/component/tameable, food_types = food_types, tame_chance = 25, bonus_tame_chance = 15, after_tame = CALLBACK(src, PROC_REF(tamed))) - AddElement(/datum/element/basic_eating, 10, 0, null, food_types) + AddElement(/datum/element/basic_eating, food_types = food_types) /mob/living/basic/cow/proc/tamed(mob/living/tamer) buckle_lying = 0 diff --git a/code/modules/mob/living/basic/farm_animals/cow/cow_ai.dm b/code/modules/mob/living/basic/farm_animals/cow/cow_ai.dm index 81e1d722b01e..e1e611a28c2a 100644 --- a/code/modules/mob/living/basic/farm_animals/cow/cow_ai.dm +++ b/code/modules/mob/living/basic/farm_animals/cow/cow_ai.dm @@ -1,6 +1,6 @@ /datum/ai_controller/basic_controller/cow blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, BB_BASIC_MOB_TIP_REACTING = FALSE, BB_BASIC_MOB_TIPPER = null, ) diff --git a/code/modules/mob/living/basic/farm_animals/cow/cow_moonicorn.dm b/code/modules/mob/living/basic/farm_animals/cow/cow_moonicorn.dm index cdfb0868f9e0..f499859e19e9 100644 --- a/code/modules/mob/living/basic/farm_animals/cow/cow_moonicorn.dm +++ b/code/modules/mob/living/basic/farm_animals/cow/cow_moonicorn.dm @@ -34,7 +34,7 @@ var/static/list/food_types if(!food_types) food_types = src.food_types.Copy() - AddElement(/datum/element/basic_eating, 10, 0, null, food_types) + AddElement(/datum/element/basic_eating, food_types = food_types) AddComponent(/datum/component/tameable, food_types = food_types, tame_chance = 25, bonus_tame_chance = 15, after_tame = CALLBACK(src, PROC_REF(tamed))) /mob/living/basic/cow/moonicorn/tamed(mob/living/tamer) @@ -44,7 +44,7 @@ /datum/ai_controller/basic_controller/cow/moonicorn blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items/moonicorn(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items/moonicorn, BB_BASIC_MOB_TIP_REACTING = FALSE, BB_BASIC_MOB_TIPPER = null, ) @@ -60,14 +60,14 @@ ) ///moonicorns will not attack people holding something that could tame them. -/datum/targetting_datum/basic/allow_items/moonicorn +/datum/targeting_strategy/basic/allow_items/moonicorn -/datum/targetting_datum/basic/allow_items/moonicorn/can_attack(mob/living/living_mob, atom/the_target) +/datum/targeting_strategy/basic/allow_items/moonicorn/can_attack(mob/living/living_mob, atom/the_target, vision_range) . = ..() if(!.) return FALSE - if(isliving(the_target)) //Targetting vs living mobs + if(isliving(the_target)) //Targeting vs living mobs var/mob/living/living_target = the_target for(var/obj/item/food/grown/galaxythistle/tame_food in living_target.held_items) return FALSE //heyyy this can tame me! let's NOT fight diff --git a/code/modules/mob/living/basic/farm_animals/cow/cow_wisdom.dm b/code/modules/mob/living/basic/farm_animals/cow/cow_wisdom.dm index d322f49ae41c..e87b4704fa91 100644 --- a/code/modules/mob/living/basic/farm_animals/cow/cow_wisdom.dm +++ b/code/modules/mob/living/basic/farm_animals/cow/cow_wisdom.dm @@ -22,7 +22,7 @@ return //cannot tame me! and I don't care about eatin' nothing, neither! /datum/ai_controller/basic_controller/cow/wisdom - //don't give a targetting datum + //don't give a targeting strategy blackboard = list( BB_BASIC_MOB_TIP_REACTING = FALSE, BB_BASIC_MOB_TIPPER = null, diff --git a/code/modules/mob/living/basic/farm_animals/deer.dm b/code/modules/mob/living/basic/farm_animals/deer.dm index a016f8b74a6f..1bd185c1509c 100644 --- a/code/modules/mob/living/basic/farm_animals/deer.dm +++ b/code/modules/mob/living/basic/farm_animals/deer.dm @@ -34,9 +34,8 @@ /datum/ai_controller/basic_controller/deer blackboard = list( - BB_BASIC_MOB_FLEEING = TRUE, BB_STATIONARY_MOVE_TO_TARGET = TRUE, - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_traits = STOP_MOVING_WHEN_PULLED ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/farm_animals/goat/_goat.dm b/code/modules/mob/living/basic/farm_animals/goat/_goat.dm new file mode 100644 index 000000000000..9c7046cccf7d --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/goat/_goat.dm @@ -0,0 +1,146 @@ +/obj/item/food/meat/slab/grassfed + name = "eco meat" + desc = "A slab of 100% grass fed award-winning farm meat." + food_reagents = list( + /datum/reagent/consumable/nutriment/protein = 3, + /datum/reagent/consumable/nutriment/vitamin = 1, + ) // Marble + + +/// The Greatest (animal) Of All Time. Cud chewing, shin-kicking, kitchen-dwelling nuisance. +/mob/living/basic/goat + name = "goat" + desc = "Not known for their pleasant disposition." + icon_state = "goat" + icon_living = "goat" + icon_dead = "goat_dead" + + speak_emote = list("brays") + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "kicks" + response_harm_simple = "kick" + attack_verb_continuous = "kicks" + attack_verb_simple = "kick" + attack_sound = 'sound/weapons/punch1.ogg' + attack_vis_effect = ATTACK_EFFECT_KICK + + butcher_results = list(/obj/item/food/meat/slab/grassfed = 4) + + faction = list(FACTION_NEUTRAL) + mob_biotypes = MOB_ORGANIC | MOB_BEAST + + health = 40 + maxHealth = 40 + melee_damage_lower = 1 + melee_damage_upper = 2 + environment_smash = ENVIRONMENT_SMASH_NONE + + minimum_survivable_temperature = COLD_ROOM_TEMP - 75 // enough so that they can survive the cold room spawn with plenty of room for comfort + + blood_volume = BLOOD_VOLUME_NORMAL + + ai_controller = /datum/ai_controller/basic_controller/goat + /// How often will we develop an evil gleam in our eye? + var/gleam_delay = 20 SECONDS + /// Time until we can next gleam evilly + COOLDOWN_DECLARE(gleam_cooldown) + /// List of stuff (flora) that we want to eat + var/static/list/edibles = list( + /obj/structure/alien/resin/flower_bud, + /obj/structure/glowshroom, + /obj/structure/spacevine, + ) + +/mob/living/basic/goat/Initialize(mapload) + . = ..() + add_udder() + AddElement(/datum/element/cliff_walking) //we walk the cliff + AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_SHOE) + AddElement(/datum/element/ai_retaliate) + + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_pre_attack)) + RegisterSignal(src, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move)) + + ai_controller.set_blackboard_key(BB_BASIC_FOODS, edibles) + +/// Called when we attack something in order to piece together the intent of the AI/user and provide desired behavior. The element might be okay here but I'd rather the fluff. +/// Goats are really good at beating up plants by taking bites out of them, but we use the default attack for everything else +/mob/living/basic/goat/proc/on_pre_attack(datum/source, atom/target) + if(is_type_in_list(target, edibles)) + eat_plant(list(target)) + return COMPONENT_HOSTILE_NO_ATTACK + + if(!isliving(target)) + return + + var/mob/living/living_target = target + if(!(living_target.mob_biotypes & MOB_PLANT)) + return + + living_target.adjustBruteLoss(20) + playsound(src, 'sound/items/eatfood.ogg', rand(30, 50), TRUE) + var/obj/item/bodypart/edible_bodypart + + if(ishuman(living_target)) + var/mob/living/carbon/human/plant_man = target + edible_bodypart = pick(plant_man.bodyparts) + edible_bodypart.dismember() + + living_target.visible_message( + span_warning("[src] takes a big chomp out of [living_target]!"), + span_userdanger("[src] takes a big chomp out of your [edible_bodypart || "body"]!"), + ) + + return COMPONENT_HOSTILE_NO_ATTACK + +/// If we are being attacked by someone, give a nice fluff message. But only once in a while. +/mob/living/basic/goat/proc/on_attacked(datum/source, atom/attacker, attack_flags) + if (!COOLDOWN_FINISHED(src, gleam_cooldown)) + return + visible_message( + span_danger("[src] gets an evil-looking gleam in [p_their()] eye."), + ) + COOLDOWN_START(src, gleam_cooldown, gleam_delay) + +/// Handles automagically eating a plant when we move into a turf that has one. +/mob/living/basic/goat/proc/on_move(datum/source, atom/entering_loc) + SIGNAL_HANDLER + if(!isturf(entering_loc)) + return + + var/list/edible_plants = list() + for(var/obj/target in entering_loc) + if(is_type_in_list(target, edibles)) + edible_plants += target + + INVOKE_ASYNC(src, PROC_REF(eat_plant), edible_plants) + +/// When invoked, adds an udder. Overridden on subtypes +/mob/living/basic/goat/proc/add_udder() + AddComponent(/datum/component/udder) + +/// Proc that handles dealing with the various types of plants we might eat. Assumes that a valid list of type(s) will be passed in. +/mob/living/basic/goat/proc/eat_plant(list/plants) + var/eaten = FALSE + + for(var/atom/target as anything in plants) + if(istype(target, /obj/structure/spacevine)) + var/obj/structure/spacevine/vine = target + vine.eat(src) + eaten = TRUE + + if(istype(target, /obj/structure/alien/resin/flower_bud)) + target.take_damage(rand(30, 50), BRUTE, 0) + eaten = TRUE + + if(istype(target, /obj/structure/glowshroom)) + qdel(target) + eaten = TRUE + + if(eaten && prob(10)) + say("Nom") // bon appetit + playsound(src, 'sound/items/eatfood.ogg', rand(30, 50), TRUE) diff --git a/code/modules/mob/living/basic/farm_animals/goat/goat_ai.dm b/code/modules/mob/living/basic/farm_animals/goat/goat_ai.dm new file mode 100644 index 000000000000..5928344fee4e --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/goat/goat_ai.dm @@ -0,0 +1,23 @@ +/// Goats are normally content to sorta hang around and crunch any plant in sight, but they will go ape on someone who attacks them. +/datum/ai_controller/basic_controller/goat + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/capricious_retaliate, // Capricious like Capra, get it? + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/find_food, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/random_speech/goat, + ) + +/datum/ai_planning_subtree/random_speech/goat + speech_chance = 3 + emote_hear = list("brays.") + emote_see = list("shakes their head.", "stamps a foot.", "glares around.") + speak = list("EHEHEHEHEH", "eh?") diff --git a/code/modules/mob/living/basic/farm_animals/goat/goat_subtypes.dm b/code/modules/mob/living/basic/farm_animals/goat/goat_subtypes.dm new file mode 100644 index 000000000000..0638163d0324 --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/goat/goat_subtypes.dm @@ -0,0 +1,12 @@ +/mob/living/basic/goat/pete // Pete! + name = "Pete" + gender = MALE + +/mob/living/basic/goat/pete/examine() + . = ..() + var/area/goat_area = get_area(src) + if((bodytemperature < T20C) || istype(goat_area, /area/station/service/kitchen/coldroom)) + . = span_notice("[p_They()] [p_do()]n't seem to be too bothered about the cold.") // special for pete + +/mob/living/basic/goat/pete/add_udder() + return //no thank you diff --git a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm new file mode 100644 index 000000000000..3fcb60fb77c1 --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla.dm @@ -0,0 +1,178 @@ +/// Where do we draw gorilla held overlays? +#define GORILLA_HANDS_LAYER 1 + +/** + * Like a bigger monkey + * They make a lot of noise and punch limbs off unconscious folks + */ +/mob/living/basic/gorilla + name = "Gorilla" + desc = "A ground-dwelling, predominantly herbivorous ape which usually inhabits the forests of central Africa but today is quite far away from there." + icon = 'icons/mob/simple/gorilla.dmi' + icon_state = "crawling" + icon_living = "crawling" + icon_dead = "dead" + health_doll_icon = "crawling" + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + maxHealth = 220 + health = 220 + response_help_continuous = "prods" + response_help_simple = "prod" + response_disarm_continuous = "challenges" + response_disarm_simple = "challenge" + response_harm_continuous = "thumps" + response_harm_simple = "thump" + speed = 0.5 + melee_damage_lower = 15 + melee_damage_upper = 18 + damage_coeff = list(BRUTE = 1, BURN = 1.5, TOX = 1.5, CLONE = 0, STAMINA = 0, OXY = 1.5) + obj_damage = 20 + attack_verb_continuous = "pummels" + attack_verb_simple = "pummel" + attack_sound = 'sound/weapons/punch1.ogg' + unique_name = TRUE + ai_controller = /datum/ai_controller/basic_controller/gorilla + faction = list(FACTION_MONKEY, FACTION_JUNGLE) + butcher_results = list(/obj/item/food/meat/slab/gorilla = 4, /obj/effect/gibspawner/generic/animal = 1) + /// How likely our meaty fist is to stun someone + var/paralyze_chance = 20 + /// A counter for when we can scream again + var/oogas = 0 + /// Types of things we want to find and eat + var/static/list/gorilla_food = list( + /obj/item/food/bread/banana, + /obj/item/food/breadslice/banana, + /obj/item/food/cnds/banana_honk, + /obj/item/food/grown/banana, + /obj/item/food/salad/fruit, + /obj/item/food/salad/jungle, + /obj/item/food/sundae, + ) + +/mob/living/basic/gorilla/Initialize(mapload) + . = ..() + add_traits(list(TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP), ROUNDSTART_TRAIT) + AddElement(/datum/element/wall_smasher) + AddElement(/datum/element/dextrous) + AddElement(/datum/element/footstep, FOOTSTEP_MOB_BAREFOOT) + AddElement(/datum/element/basic_eating, heal_amt = 10, food_types = gorilla_food) + AddElement( + /datum/element/amputating_limbs, \ + surgery_time = 0 SECONDS, \ + surgery_verb = "punches",\ + ) + AddComponent(/datum/component/personal_crafting) + AddComponent(/datum/component/basic_inhands, y_offset = -1) + ai_controller?.set_blackboard_key(BB_BASIC_FOODS, gorilla_food) + +/mob/living/basic/gorilla/update_overlays() + . = ..() + if (is_holding_items()) + . += "standing_overlay" + +/mob/living/basic/gorilla/update_icon_state() + . = ..() + if (stat == DEAD) + return + icon_state = is_holding_items() ? "standing" : "crawling" + +/mob/living/basic/gorilla/update_held_items() + . = ..() + update_appearance(UPDATE_ICON) + if (is_holding_items()) + add_movespeed_modifier(/datum/movespeed_modifier/gorilla_standing) + else + remove_movespeed_modifier(/datum/movespeed_modifier/gorilla_standing) + +/mob/living/basic/gorilla/melee_attack(mob/living/target, list/modifiers, ignore_cooldown) + . = ..() + if (!. || !isliving(target)) + return + ooga_ooga() + if (prob(paralyze_chance)) + target.Paralyze(2 SECONDS) + visible_message(span_danger("[src] knocks [target] down!")) + else + target.throw_at(get_edge_target_turf(target, dir), range = rand(1, 2), speed = 7, thrower = src) + +/mob/living/basic/gorilla/gib() + var/mob/living/brain/gorilla_brain = new(drop_location()) + gorilla_brain.name = real_name + gorilla_brain.real_name = real_name + mind?.transfer_to(gorilla_brain) + return ..() + +/mob/living/basic/gorilla/can_use_guns(obj/item/gun) + to_chat(src, span_warning("Your meaty finger is much too large for the trigger guard!")) + return FALSE + +/// Assert your dominance with audio cues +/mob/living/basic/gorilla/proc/ooga_ooga() + if (isnull(client)) + return // Sorry NPCs + oogas -= 1 + if(oogas > 0) + return + oogas = rand(2,6) + emote("ooga") + +/// Gorillas are slower when carrying something +/datum/movespeed_modifier/gorilla_standing + blacklisted_movetypes = (FLYING|FLOATING) + multiplicative_slowdown = 0.5 + +/// A smaller gorilla summoned via magic +/mob/living/basic/gorilla/lesser + name = "lesser Gorilla" + desc = "An adolescent Gorilla. It may not be fully grown but, much like a banana, that just means it's sturdier and harder to chew!" + maxHealth = 120 + health = 120 + speed = 0.35 + melee_damage_lower = 10 + melee_damage_upper = 15 + obj_damage = 15 + ai_controller = /datum/ai_controller/basic_controller/gorilla/lesser + butcher_results = list(/obj/item/food/meat/slab/gorilla = 2) + +/mob/living/basic/gorilla/lesser/Initialize(mapload) + . = ..() + transform *= 0.75 + +/// Cargo's wonderful mascot, the tranquil box-carrying ape +/mob/living/basic/gorilla/cargorilla + name = "Cargorilla" // Overriden, normally + icon = 'icons/mob/simple/cargorillia.dmi' + desc = "Cargo's pet gorilla. They seem to have an 'I love Mom' tattoo." + maxHealth = 200 + health = 200 + faction = list(FACTION_NEUTRAL, FACTION_MONKEY, FACTION_JUNGLE) + unique_name = FALSE + ai_controller = null + +/mob/living/basic/gorilla/cargorilla/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_PACIFISM, INNATE_TRAIT) + AddComponent(/datum/component/crate_carrier) + +/** + * Poll ghosts for control of the gorilla. Not added in init because we only want to poll when the round starts. + * Preferably in future we can replace this with a popup on the lobby to queue to become a gorilla. + */ +/mob/living/basic/gorilla/cargorilla/proc/poll_for_gorilla() + AddComponent(\ + /datum/component/ghost_direct_control,\ + poll_candidates = TRUE,\ + poll_length = 30 SECONDS,\ + role_name = "Cargorilla",\ + assumed_control_message = "You are Cargorilla, a pacifist friend of the station and carrier of freight.",\ + poll_ignore_key = POLL_IGNORE_CARGORILLA,\ + after_assumed_control = CALLBACK(src, PROC_REF(became_player_controlled)),\ + ) + +/// Called once a ghost assumes control +/mob/living/basic/gorilla/cargorilla/proc/became_player_controlled() + mind.set_assigned_role(SSjob.GetJobType(/datum/job/cargo_technician)) + mind.special_role = "Cargorilla" + to_chat(src, span_notice("You can pick up crates by clicking on them, and drop them by clicking on the ground.")) + +#undef GORILLA_HANDS_LAYER diff --git a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla_accessories.dm b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla_accessories.dm new file mode 100644 index 000000000000..814e56487bf5 --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla_accessories.dm @@ -0,0 +1,5 @@ +/// Cargorilla's ID card +/obj/item/card/id/advanced/cargo_gorilla + name = "cargorilla ID" + desc = "A card used to provide ID and determine access across the station. A gorilla-sized ID for a gorilla-sized cargo technician." + trim = /datum/id_trim/job/cargo_technician diff --git a/code/modules/mob/living/basic/farm_animals/gorilla/gorilla_ai.dm b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla_ai.dm new file mode 100644 index 000000000000..28a727fdb1bc --- /dev/null +++ b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla_ai.dm @@ -0,0 +1,33 @@ +/// Pretty basic, just click people to death. Also hunt and eat bananas. +/datum/ai_controller/basic_controller/gorilla + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_TARGET_MINIMUM_STAT = UNCONSCIOUS, + BB_EMOTE_KEY = "ooga", + BB_EMOTE_CHANCE = 40, + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/run_emote, + /datum/ai_planning_subtree/find_food, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path/gorilla, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/datum/ai_planning_subtree/attack_obstacle_in_path/gorilla + attack_behaviour = /datum/ai_behavior/attack_obstructions/gorilla + +/datum/ai_behavior/attack_obstructions/gorilla + can_attack_turfs = TRUE + +/datum/ai_controller/basic_controller/gorilla/lesser + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_EMOTE_KEY = "ooga", + BB_EMOTE_CHANCE = 60, + ) diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/emotes.dm b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla_emotes.dm similarity index 78% rename from code/modules/mob/living/simple_animal/hostile/gorilla/emotes.dm rename to code/modules/mob/living/basic/farm_animals/gorilla/gorilla_emotes.dm index 20166d813919..94133336c4d4 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/emotes.dm +++ b/code/modules/mob/living/basic/farm_animals/gorilla/gorilla_emotes.dm @@ -1,5 +1,5 @@ /datum/emote/gorilla - mob_type_allowed_typecache = /mob/living/simple_animal/hostile/gorilla + mob_type_allowed_typecache = /mob/living/basic/gorilla mob_type_blacklist_typecache = list() /datum/emote/gorilla/ooga @@ -9,4 +9,3 @@ message_param = "oogas at %t." emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE sound = 'sound/creatures/gorilla.ogg' - diff --git a/code/modules/mob/living/basic/farm_animals/pig.dm b/code/modules/mob/living/basic/farm_animals/pig.dm index abe5b9c3a742..94183d044c53 100644 --- a/code/modules/mob/living/basic/farm_animals/pig.dm +++ b/code/modules/mob/living/basic/farm_animals/pig.dm @@ -29,11 +29,11 @@ ai_controller = /datum/ai_controller/basic_controller/pig /mob/living/basic/pig/Initialize(mapload) + . = ..() AddElement(/datum/element/pet_bonus, "oinks!") AddElement(/datum/element/ai_retaliate) AddElement(/datum/element/ai_flee_while_injured) make_tameable() - . = ..() ///wrapper for the tameable component addition so you can have non tamable cow subtypes /mob/living/basic/pig/proc/make_tameable() @@ -47,7 +47,7 @@ /datum/ai_controller/basic_controller/pig blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_traits = STOP_MOVING_WHEN_PULLED @@ -59,4 +59,5 @@ /datum/ai_planning_subtree/flee_target, /datum/ai_planning_subtree/target_retaliate, /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/random_speech/pig, ) diff --git a/code/modules/mob/living/basic/farm_animals/rabbit.dm b/code/modules/mob/living/basic/farm_animals/rabbit.dm index 071470264dbb..992a127e05f4 100644 --- a/code/modules/mob/living/basic/farm_animals/rabbit.dm +++ b/code/modules/mob/living/basic/farm_animals/rabbit.dm @@ -47,8 +47,7 @@ /datum/ai_controller/basic_controller/rabbit blackboard = list( - BB_BASIC_MOB_FLEEING = TRUE, - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_traits = STOP_MOVING_WHEN_PULLED ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/farm_animals/sheep.dm b/code/modules/mob/living/basic/farm_animals/sheep.dm index 4102bd83fdf6..fbf6560fa8f0 100644 --- a/code/modules/mob/living/basic/farm_animals/sheep.dm +++ b/code/modules/mob/living/basic/farm_animals/sheep.dm @@ -81,8 +81,7 @@ /datum/ai_controller/basic_controller/sheep blackboard = list( - BB_BASIC_MOB_FLEEING = TRUE, - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_traits = STOP_MOVING_WHEN_PULLED ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/festivus_pole.dm b/code/modules/mob/living/basic/festivus_pole.dm index d556e235272f..0b61f02ed17a 100644 --- a/code/modules/mob/living/basic/festivus_pole.dm +++ b/code/modules/mob/living/basic/festivus_pole.dm @@ -42,7 +42,9 @@ /mob/living/basic/festivus/Initialize(mapload) . = ..() - AddElement(/datum/element/death_drops, list(/obj/item/stack/rods)) + AddComponent(/datum/component/seethrough_mob) + var/static/list/death_loot = list(/obj/item/stack/rods) + AddElement(/datum/element/death_drops, death_loot) AddComponent(/datum/component/aggro_emote, emote_list = string_list(list("growls")), emote_chance = 20) var/datum/action/cooldown/mob_cooldown/charge_apc/charge_ability = new(src) charge_ability.Grant(src) @@ -50,7 +52,7 @@ /datum/ai_controller/basic_controller/festivus_pole blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_LOW_PRIORITY_HUNTING_TARGET = null, // APCs ) diff --git a/code/modules/mob/living/basic/guardian/guardian.dm b/code/modules/mob/living/basic/guardian/guardian.dm new file mode 100644 index 000000000000..74004a9f1394 --- /dev/null +++ b/code/modules/mob/living/basic/guardian/guardian.dm @@ -0,0 +1,332 @@ +/** + * A mob which acts as a guardian angel to another mob, sharing health but protecting them using special powers. + * Usually either obtained in magical form by a wizard, or technological form by a traitor. Sometimes found by miners. + */ +/mob/living/basic/guardian + name = "Guardian Spirit" + real_name = "Guardian Spirit" + desc = "A mysterious being that stands by its charge, ever vigilant." + icon = 'icons/mob/nonhuman-player/guardian.dmi' + icon_state = "magicbase" + icon_living = "magicbase" + icon_dead = "magicbase" + gender = NEUTER + basic_mob_flags = DEL_ON_DEATH + sentience_type = SENTIENCE_HUMANOID + hud_type = /datum/hud/guardian + faction = list() + speed = 0 + maxHealth = INFINITY // The spirit itself is invincible and passes damage to its host + health = INFINITY + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + unsuitable_atmos_damage = 0 + unsuitable_cold_damage = 0 + unsuitable_heat_damage = 0 + speak_emote = list("hisses") + bubble_icon = "guardian" + response_help_continuous = "passes through" + response_help_simple = "pass through" + response_disarm_continuous = "flails at" + response_disarm_simple = "flail at" + response_harm_continuous = "punches" + response_harm_simple = "punch" + attack_sound = 'sound/weapons/punch1.ogg' + attack_verb_continuous = "punches" + attack_verb_simple = "punch" + istate = ISTATE_HARM + obj_damage = 40 + melee_damage_lower = 15 + melee_damage_upper = 15 + melee_attack_cooldown = CLICK_CD_MELEE + light_system = MOVABLE_LIGHT + light_outer_range = 3 + light_on = FALSE + + /// The summoner of the guardian, we share health with them and can't move too far away (usually) + var/mob/living/summoner + /// How far from the summoner the guardian can be. + var/range = 10 + + /// The guardian's colour, used for their sprite, chat, and some effects. + var/guardian_colour + /// Coloured overlay we apply + var/mutable_appearance/overlay + + /// Which toggle button the HUD uses. + var/toggle_button_type = /atom/movable/screen/guardian/toggle_mode/inactive + /// Name used by the guardian creator. + var/creator_name = "Error" + /// Description used by the guardian creator. + var/creator_desc = "This shouldn't be here! Report it on GitHub!" + /// Icon used by the guardian creator. + var/creator_icon = "fuck" + + /// What type of guardian are we? + var/guardian_type = null + /// How are we themed? + var/datum/guardian_fluff/theme + /// A string explaining to the guardian what they can do. + var/playstyle_string = span_boldholoparasite("You are a Guardian without any type. You shouldn't exist and are an affront to god!") + + /// Are we forced to not be able to manifest/recall? + var/locked = FALSE + /// Cooldown between manifests/recalls. + COOLDOWN_DECLARE(manifest_cooldown) + /// Cooldown between the summoner resetting the guardian's client. + COOLDOWN_DECLARE(resetting_cooldown) + + /// List of actions we give to our summoner + var/static/list/control_actions = list( + /datum/action/cooldown/mob_cooldown/guardian_comms, + /datum/action/cooldown/mob_cooldown/recall_guardian, + /datum/action/cooldown/mob_cooldown/replace_guardian, + ) + +/mob/living/basic/guardian/Initialize(mapload, datum/guardian_fluff/theme) + . = ..() + GLOB.parasites += src + src.theme = theme + theme?.apply(src) + var/list/death_loot = string_list(list(/obj/item/stack/sheet/mineral/wood)) + AddElement(/datum/element/death_drops, death_loot) + AddElement(/datum/element/simple_flying) + AddComponent(/datum/component/basic_inhands) + // life link + update_appearance(UPDATE_ICON) + manifest_effects() + +/mob/living/basic/guardian/Destroy() + GLOB.parasites -= src + if (is_deployed()) + recall_effects() + cut_summoner(different_person = TRUE) + return ..() + +/mob/living/basic/guardian/update_overlays() + . = ..() + . += overlay + +/mob/living/basic/guardian/Login() //if we have a mind, set its name to ours when it logs in + . = ..() + if (!. || isnull(client)) + return FALSE + if (isnull(summoner)) + to_chat(src, span_boldholoparasite("For some reason, somehow, you have no summoner. Please report this bug immediately.")) + stack_trace("Guardian created with client but no summoner.") + else + to_chat(src, span_holoparasite("You are a [theme.name], bound to serve [summoner.real_name].")) + to_chat(src, span_holoparasite("You are capable of manifesting or recalling to your master with the buttons on your HUD. You will also find a button to communicate with [summoner.p_them()] privately there.")) + to_chat(src, span_holoparasite("While personally invincible, you will die if [summoner.real_name] does, and any damage dealt to you will have a portion passed on to [summoner.p_them()] as you feed upon [summoner.p_them()] to sustain yourself.")) + to_chat(src, playstyle_string) + if (!isnull(guardian_colour)) + return // Already set up so we don't need to do it again + locked = TRUE + guardian_rename() + guardian_recolour() + locked = FALSE + +/mob/living/basic/guardian/mind_initialize() + . = ..() + if (isnull(summoner)) + to_chat(src, span_boldholoparasite("For some reason, somehow, you have no summoner. Please report this bug immediately.")) + return + mind.enslave_mind_to_creator(summoner) // Once our mind is created, we become enslaved to our summoner. cant be done in the first run of set_summoner, because by then we dont have a mind yet. + +/// Pick a new colour for our guardian +/mob/living/basic/guardian/proc/guardian_recolour() + if (isnull(client)) + return + var/chosen_guardian_colour = input(src, "What would you like your colour to be?", "Choose Your Colour", "#ffffff") as color|null + if (isnull(chosen_guardian_colour)) //redo proc until we get a color + to_chat(src, span_warning("Invalid colour, please try again.")) + return guardian_recolour() + set_guardian_colour(chosen_guardian_colour) + +/// Apply a new colour to our guardian +/mob/living/basic/guardian/proc/set_guardian_colour(colour) + guardian_colour = colour + set_light_color(guardian_colour) + overlay?.color = guardian_colour + update_appearance(UPDATE_ICON) + +/mob/living/basic/guardian/proc/guardian_rename() + if (isnull(client)) + return + + var/new_name = sanitize_name(reject_bad_text(tgui_input_text(src, "What would you like your name to be?", "Choose Your Name", generate_random_name(), MAX_NAME_LEN))) + if (!new_name) //redo proc until we get a good name + to_chat(src, span_warning("Invalid name, please try again.")) + return guardian_rename() + to_chat(src, span_notice("Your new name [span_name(new_name)] anchors itself in your mind.")) + fully_replace_character_name(null, new_name) + +/// Picks a random name as a suggestion +/mob/living/basic/guardian/proc/generate_random_name() + var/list/surname_options = list("Guardian") // Fallback in case you define a guardian with no theme + switch(theme?.fluff_type) + if (GUARDIAN_MAGIC) + surname_options = GLOB.guardian_fantasy_surnames + if (GUARDIAN_TECH) + surname_options = GLOB.guardian_tech_surnames + + return "[pick(GLOB.guardian_first_names)] [pick(surname_options)]" + +/mob/living/basic/guardian/melee_attack(atom/target, list/modifiers, ignore_cooldown) + if (!is_deployed()) + balloon_alert(src, "not tangible!") + return FALSE + return ..() + +/mob/living/basic/guardian/death(gibbed) + if (!QDELETED(summoner)) + to_chat(summoner, span_bolddanger("Your [name] died somehow!")) + summoner.dust() + return ..() + +/mob/living/basic/guardian/ex_act(severity, target) + switch(severity) + if (EXPLODE_DEVASTATE) + investigate_log("has been gibbed by an explosion.", INVESTIGATE_DEATHS) + gib() + return TRUE + if (EXPLODE_HEAVY) + adjustBruteLoss(60) + if (EXPLODE_LIGHT) + adjustBruteLoss(30) + + return TRUE + +/mob/living/basic/guardian/gib() + death(TRUE) + +/mob/living/basic/guardian/dust(just_ash, drop_items, force) + death(TRUE) + +/// Link up with a summoner mob. +/mob/living/basic/guardian/proc/set_summoner(mob/living/to_who, different_person = FALSE) + if (QDELETED(src)) + return // Just in case + if (QDELETED(to_who)) + ghostize(FALSE) + qdel(src) // No life of free invulnerability for you. + return + cut_summoner(different_person) + AddComponent(/datum/component/life_link, to_who, CALLBACK(src, PROC_REF(on_harm)), CALLBACK(src, PROC_REF(on_summoner_death))) + summoner = to_who + + for (var/action_type in control_actions) + if (locate(action_type) in summoner.actions) + continue + var/datum/action/new_action = new action_type(summoner) + new_action.Grant(summoner) + + if (different_person) + if (mind) + mind.enslave_mind_to_creator(to_who) + else //mindless guardian, manually give them factions + faction += summoner.faction + summoner.faction += "[REF(src)]" + remove_all_languages(LANGUAGE_MASTER) + copy_languages(to_who, LANGUAGE_MASTER) // make sure holoparasites speak same language as master + RegisterSignal(to_who, COMSIG_PARENT_QDELETING, PROC_REF(on_summoner_deletion)) + RegisterSignal(to_who, COMSIG_LIVING_ON_WABBAJACKED, PROC_REF(on_summoner_wabbajacked)) + RegisterSignal(to_who, COMSIG_LIVING_SHAPESHIFTED, PROC_REF(on_summoner_shapeshifted)) + RegisterSignal(to_who, COMSIG_LIVING_UNSHAPESHIFTED, PROC_REF(on_summoner_unshapeshifted)) + recall(forced = TRUE) + leash_to(src, summoner) + if (to_who.stat == DEAD) + on_summoner_death(src, to_who) + summoner.updatehealth() + +/// Remove all references to our summoner +/mob/living/basic/guardian/proc/cut_summoner(different_person = FALSE) + if (isnull(summoner)) + return + if (is_deployed()) + recall_effects() + var/summoner_turf = get_turf(summoner) + if (!isnull(summoner_turf)) + forceMove(summoner_turf) + unleash() + UnregisterSignal(summoner, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_ON_WABBAJACKED, COMSIG_LIVING_SHAPESHIFTED, COMSIG_LIVING_UNSHAPESHIFTED)) + if (different_person) + summoner.faction -= "[REF(src)]" + faction -= summoner.faction + mind?.remove_all_antag_datums() + if (!length(summoner.get_all_linked_holoparasites() - src)) + for (var/action_type in control_actions) + var/datum/action/remove_action = locate(action_type) in summoner.actions + if (isnull(remove_action)) + continue + remove_action.Remove(summoner) + summoner = null + +/// Connects these two mobs by a leash +/mob/living/basic/guardian/proc/leash_to(atom/movable/leashed, atom/movable/leashed_to) + leashed.AddComponent(\ + /datum/component/leash,\ + owner = leashed_to,\ + distance = range,\ + force_teleport_out_effect = /obj/effect/temp_visual/guardian/phase/out,\ + force_teleport_in_effect = /obj/effect/temp_visual/guardian/phase,\ + ) + +/// Removes the leash from this guardian +/mob/living/basic/guardian/proc/unleash() + qdel(GetComponent(/datum/component/leash)) + +/// Called when our owner dies. We fucked up, so now neither of us get to exist. +/mob/living/basic/guardian/proc/on_summoner_death(mob/living/source, mob/living/former_owner) + cut_summoner() + if (!isnull(former_owner.loc)) + forceMove(former_owner.loc) + to_chat(src, span_danger("Your summoner has died!")) + visible_message(span_bolddanger("\The [src] dies along with its user!")) + former_owner.visible_message(span_bolddanger("[former_owner]'s body is completely consumed by the strain of sustaining [src]!")) + former_owner.dust(drop_items = TRUE) + +/// Called when our health changes, inform our owner of why they are getting hurt (if they are) +/mob/living/basic/guardian/proc/on_harm(mob/living/source, mob/living/summoner, amount) + if (QDELETED(src) || QDELETED(summoner) || amount <= 2) + return + to_chat(summoner, span_bolddanger("[name] is under attack! You take damage!")) + summoner.visible_message(span_bolddanger("Blood sprays from [summoner] as [src] takes damage!")) + if(summoner.stat == UNCONSCIOUS || summoner.stat == HARD_CRIT) + to_chat(summoner, span_bolddanger("Your head pounds, you can't take the strain of sustaining [src] in this condition!")) + summoner.adjustOrganLoss(ORGAN_SLOT_BRAIN, amount * 0.5) + +/// When our owner is deleted, we go too. +/mob/living/basic/guardian/proc/on_summoner_deletion(mob/living/source) + SIGNAL_HANDLER + cut_summoner() + to_chat(src, span_danger("Your summoner is gone, you feel yourself fading!")) + ghostize(FALSE) + qdel(src) + +/// Signal proc for [COMSIG_LIVING_ON_WABBAJACKED], when our summoner is wabbajacked we should be alerted. +/mob/living/basic/guardian/proc/on_summoner_wabbajacked(mob/living/source, mob/living/new_mob) + SIGNAL_HANDLER + set_summoner(new_mob) + to_chat(src, span_holoparasite("Your summoner has changed form!")) + +/// Signal proc for [COMSIG_LIVING_SHAPESHIFTED], when our summoner is shapeshifted we should change to the new mob +/mob/living/basic/guardian/proc/on_summoner_shapeshifted(mob/living/source, mob/living/new_shape) + SIGNAL_HANDLER + set_summoner(new_shape) + to_chat(src, span_holoparasite("Your summoner has shapeshifted into that of a [new_shape]!")) + +/// Signal proc for [COMSIG_LIVING_UNSHAPESHIFTED], when our summoner unshapeshifts go back to that mob +/mob/living/basic/guardian/proc/on_summoner_unshapeshifted(mob/living/source, mob/living/old_summoner) + SIGNAL_HANDLER + set_summoner(old_summoner) + to_chat(src, span_holoparasite("Your summoner has shapeshifted back into their normal form!")) + +/mob/living/basic/guardian/wabbajack(what_to_randomize, change_flags = WABBAJACK) + visible_message(span_warning("[src] resists the polymorph!")) // Ha, no + +/mob/living/basic/guardian/can_suicide() + return FALSE // You gotta persuade your boss to end it instead, sorry + +/// Returns true if you are out and about +/mob/living/basic/guardian/proc/is_deployed() + return isnull(summoner) || loc != summoner diff --git a/code/modules/mob/living/simple_animal/guardian/guardian_creator.dm b/code/modules/mob/living/basic/guardian/guardian_creator.dm similarity index 59% rename from code/modules/mob/living/simple_animal/guardian/guardian_creator.dm rename to code/modules/mob/living/basic/guardian/guardian_creator.dm index b06ff2447d2e..a3ba8d415329 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian_creator.dm +++ b/code/modules/mob/living/basic/guardian/guardian_creator.dm @@ -2,14 +2,15 @@ GLOBAL_LIST_INIT(guardian_radial_images, setup_guardian_radial()) /proc/setup_guardian_radial() . = list() - for(var/mob/living/simple_animal/hostile/guardian/guardian_path as anything in subtypesof(/mob/living/simple_animal/hostile/guardian)) + for(var/mob/living/basic/guardian/guardian_path as anything in subtypesof(/mob/living/basic/guardian)) var/datum/radial_menu_choice/option = new() option.name = initial(guardian_path.creator_name) option.image = image(icon = 'icons/hud/guardian.dmi', icon_state = initial(guardian_path.creator_icon)) option.info = span_boldnotice(initial(guardian_path.creator_desc)) .[guardian_path] = option -/obj/item/guardiancreator +/// An item which grants you your very own soul buddy +/obj/item/guardian_creator name = "enchanted deck of tarot cards" desc = "An enchanted deck of tarot cards, rumored to be a source of unimaginable power." icon = 'icons/obj/toys/playing_cards.dmi' @@ -31,36 +32,41 @@ GLOBAL_LIST_INIT(guardian_radial_images, setup_guardian_radial()) /// Message sent if we successfully get a guardian. var/success_message = span_holoparasite("%GUARDIAN has been summoned!") /// If true, you are given a random guardian rather than picking from a selection. - var/random = TRUE + var/random = FALSE /// If true, you can have multiple guardians at the same time. - var/allowmultiple = FALSE + var/allow_multiple = FALSE /// If true, lings can get guardians from this. - var/allowling = TRUE + var/allow_changeling = TRUE /// If true, a dextrous guardian can get their own guardian, infinite chain! - var/allowguardian = FALSE + var/allow_guardian = FALSE /// List of all the guardians this type can spawn. var/list/possible_guardians = list( //default, has everything but dextrous - /mob/living/simple_animal/hostile/guardian/assassin, - /mob/living/simple_animal/hostile/guardian/charger, - /mob/living/simple_animal/hostile/guardian/explosive, - /mob/living/simple_animal/hostile/guardian/gaseous, - /mob/living/simple_animal/hostile/guardian/gravitokinetic, - /mob/living/simple_animal/hostile/guardian/lightning, - /mob/living/simple_animal/hostile/guardian/protector, - /mob/living/simple_animal/hostile/guardian/ranged, - /mob/living/simple_animal/hostile/guardian/standard, - /mob/living/simple_animal/hostile/guardian/support, + /mob/living/basic/guardian/assassin, + /mob/living/basic/guardian/charger, + /mob/living/basic/guardian/explosive, + /mob/living/basic/guardian/gaseous, + /mob/living/basic/guardian/gravitokinetic, + /mob/living/basic/guardian/lightning, + /mob/living/basic/guardian/protector, + /mob/living/basic/guardian/ranged, + /mob/living/basic/guardian/standard, + /mob/living/basic/guardian/support, ) -/obj/item/guardiancreator/attack_self(mob/living/user) - if(isguardian(user) && !allowguardian) - to_chat(user, span_holoparasite("[mob_name] chains are not allowed.")) +/obj/item/guardian_creator/Initialize(mapload) + . = ..() + var/datum/guardian_fluff/using_theme = GLOB.guardian_themes[theme] + mob_name = using_theme.name + +/obj/item/guardian_creator/attack_self(mob/living/user) + if(isguardian(user) && !allow_guardian) + balloon_alert(user, "can't do that!") return var/list/guardians = user.get_all_linked_holoparasites() - if(length(guardians) && !allowmultiple) - to_chat(user, span_holoparasite("You already have a [mob_name]!")) + if(length(guardians) && !allow_multiple) + balloon_alert(user, "already have one!") return - if(user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling) && !allowling) + if(user.mind && user.mind.has_antag_datum(/datum/antagonist/changeling) && !allow_changeling) to_chat(user, ling_failure) return if(used) @@ -71,19 +77,22 @@ GLOBAL_LIST_INIT(guardian_radial_images, setup_guardian_radial()) if(possible_guardian in possible_guardians) continue radial_options -= possible_guardian - var/mob/living/simple_animal/hostile/guardian/guardian_path + var/mob/living/basic/guardian/guardian_path if(random) guardian_path = pick(possible_guardians) else guardian_path = show_radial_menu(user, src, radial_options, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 42, require_near = TRUE) - if(!guardian_path) + if(isnull(guardian_path)) return used = TRUE to_chat(user, use_message) - var/guardian_type_name = "a random" - if(!random) - guardian_type_name = "the " + lowertext(initial(guardian_path.creator_name)) - var/list/mob/dead/observer/candidates = poll_ghost_candidates("Do you want to play as [guardian_type_name] [mob_name] of [user.real_name]?", ROLE_PAI, FALSE, 100, POLL_IGNORE_HOLOPARASITE) + var/guardian_type_name = random ? "Random" : capitalize(initial(guardian_path.creator_name)) + var/list/mob/dead/observer/candidates = poll_ghost_candidates( + "Do you want to play as [user.real_name]'s [guardian_type_name] [mob_name]?", + jobban_type = ROLE_PAI, + poll_time = 10 SECONDS, + ignore_category = POLL_IGNORE_HOLOPARASITE, + ) if(LAZYLEN(candidates)) var/mob/dead/observer/candidate = pick(candidates) spawn_guardian(user, candidate, guardian_path) @@ -91,123 +100,109 @@ GLOBAL_LIST_INIT(guardian_radial_images, setup_guardian_radial()) to_chat(user, failure_message) used = FALSE -/obj/item/guardiancreator/proc/spawn_guardian(mob/living/user, mob/dead/candidate, guardian_path) +/// Actually create our guy +/obj/item/guardian_creator/proc/spawn_guardian(mob/living/user, mob/dead/candidate, guardian_path) if(QDELETED(user) || user.stat == DEAD) return var/list/guardians = user.get_all_linked_holoparasites() - if(length(guardians) && !allowmultiple) - to_chat(user, span_holoparasite("You already have a [mob_name]!") ) + if(length(guardians) && !allow_multiple) + balloon_alert(user, "already got one!") used = FALSE return - var/mob/living/simple_animal/hostile/guardian/summoned_guardian = new guardian_path(user, theme) + var/datum/guardian_fluff/guardian_theme = GLOB.guardian_themes[theme] + var/mob/living/basic/guardian/summoned_guardian = new guardian_path(user, guardian_theme) summoned_guardian.set_summoner(user, different_person = TRUE) summoned_guardian.key = candidate.key user.log_message("has summoned [key_name(summoned_guardian)], a [summoned_guardian.creator_name] holoparasite.", LOG_GAME) summoned_guardian.log_message("was summoned as a [summoned_guardian.creator_name] holoparasite.", LOG_GAME) - to_chat(user, summoned_guardian.used_fluff_string) + to_chat(user, guardian_theme.get_fluff_string(summoned_guardian.guardian_type)) to_chat(user, replacetext(success_message, "%GUARDIAN", mob_name)) summoned_guardian.client?.init_verbs() return summoned_guardian -/obj/item/guardiancreator/proc/check_menu(mob/living/user) +/// Checks to ensure we're still capable of using the radial selector +/obj/item/guardian_creator/proc/check_menu(mob/living/user) if(!istype(user)) return FALSE if(user.incapacitated() || !user.is_holding(src) || used) return FALSE return TRUE -/obj/item/guardiancreator/choose - random = FALSE - -/obj/item/guardiancreator/choose/all/Initialize(mapload) - . = ..() - possible_guardians = subtypesof(/mob/living/simple_animal/hostile/guardian) - -/obj/item/guardiancreator/choose/wizard - allowmultiple = TRUE - possible_guardians = list( //no support, but dextrous - /mob/living/simple_animal/hostile/guardian/assassin, - /mob/living/simple_animal/hostile/guardian/charger, - /mob/living/simple_animal/hostile/guardian/dextrous, - /mob/living/simple_animal/hostile/guardian/explosive, - /mob/living/simple_animal/hostile/guardian/gaseous, - /mob/living/simple_animal/hostile/guardian/gravitokinetic, - /mob/living/simple_animal/hostile/guardian/lightning, - /mob/living/simple_animal/hostile/guardian/protector, - /mob/living/simple_animal/hostile/guardian/ranged, - /mob/living/simple_animal/hostile/guardian/standard, +/// Guardian creator available in the wizard spellbook. All but support are available. +/obj/item/guardian_creator/wizard + allow_multiple = TRUE + possible_guardians = list( + /mob/living/basic/guardian/assassin, + /mob/living/basic/guardian/charger, + /mob/living/basic/guardian/dextrous, + /mob/living/basic/guardian/explosive, + /mob/living/basic/guardian/gaseous, + /mob/living/basic/guardian/gravitokinetic, + /mob/living/basic/guardian/lightning, + /mob/living/basic/guardian/protector, + /mob/living/basic/guardian/ranged, + /mob/living/basic/guardian/standard, ) -/obj/item/guardiancreator/choose/wizard/spawn_guardian(mob/living/user, mob/dead/candidate) - . = ..() - var/mob/guardian = . - if(!guardian) - return +/obj/item/guardian_creator/wizard/spawn_guardian(mob/living/user, mob/dead/candidate) + var/mob/guardian = ..() + if(isnull(guardian)) + return null + // Add the wizard team datum var/datum/antagonist/wizard/antag_datum = user.mind.has_antag_datum(/datum/antagonist/wizard) - if(antag_datum) - if(!antag_datum.wiz_team) - antag_datum.create_wiz_team() - guardian.mind.add_antag_datum(/datum/antagonist/wizard_minion, antag_datum.wiz_team) - -/obj/item/guardiancreator/tech + if(isnull(antag_datum)) + return guardian + if(!antag_datum.wiz_team) + antag_datum.create_wiz_team() + guardian.mind.add_antag_datum(/datum/antagonist/wizard_minion, antag_datum.wiz_team) + return guardian + +/// Guardian creator available in the traitor uplink. All but dextrous are available, you can pick which you want, and changelings cannot use it. +/obj/item/guardian_creator/tech name = "holoparasite injector" desc = "It contains an alien nanoswarm of unknown origin. Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, it requires an organic host as a home base and source of fuel." icon = 'icons/obj/medical/syringe.dmi' icon_state = "combat_hypo" theme = GUARDIAN_THEME_TECH - mob_name = "Holoparasite" + allow_changeling = FALSE use_message = span_holoparasite("You start to power on the injector...") used_message = span_holoparasite("The injector has already been used.") failure_message = span_boldholoparasite("...ERROR. BOOT SEQUENCE ABORTED. AI FAILED TO INTIALIZE. PLEASE CONTACT SUPPORT OR TRY AGAIN LATER.") ling_failure = span_boldholoparasite("The holoparasites recoil in horror. They want nothing to do with a creature like you.") success_message = span_holoparasite("%GUARDIAN is now online!") -/obj/item/guardiancreator/tech/choose - random = FALSE - -/obj/item/guardiancreator/tech/choose/all/Initialize(mapload) - . = ..() - possible_guardians = subtypesof(/mob/living/simple_animal/hostile/guardian) - -/obj/item/guardiancreator/tech/choose/traitor - allowling = FALSE - -/obj/item/guardiancreator/carp +/// Guardian creator only spawned by admins, which creates a holographic fish. You can have several of them. +/obj/item/guardian_creator/carp name = "holocarp fishsticks" desc = "Using the power of Carp'sie, you can catch a carp from byond the veil of Carpthulu, and bind it to your fleshy flesh form." icon = 'icons/obj/food/meat.dmi' icon_state = "fishfingers" theme = GUARDIAN_THEME_CARP - mob_name = "Holocarp" use_message = span_holoparasite("You put the fishsticks in your mouth...") used_message = span_holoparasite("Someone's already taken a bite out of these fishsticks! Ew.") failure_message = span_boldholoparasite("You couldn't catch any carp spirits from the seas of Lake Carp. Maybe there are none, maybe you fucked up.") ling_failure = span_boldholoparasite("Carp'sie seems to not have taken you as the chosen one. Maybe it's because of your horrifying origin.") success_message = span_holoparasite("%GUARDIAN has been caught!") - allowmultiple = TRUE - -/obj/item/guardiancreator/carp/choose - random = FALSE + allow_multiple = TRUE -/obj/item/guardiancreator/miner +/// Guardian creator available to miners from chests, very limited selection and randomly assigned. +/obj/item/guardian_creator/miner name = "dusty shard" desc = "Seems to be a very old rock, may have originated from a strange meteor." icon = 'icons/obj/lavaland/artefacts.dmi' icon_state = "dustyshard" theme = GUARDIAN_THEME_MINER - mob_name = "Power Miner" use_message = span_holoparasite("You pierce your skin with the shard...") used_message = span_holoparasite("This shard seems to have lost all its power...") failure_message = span_boldholoparasite("The shard hasn't reacted at all. Maybe try again later...") ling_failure = span_boldholoparasite("The power of the shard seems to not react with your horrifying, mutated body.") success_message = span_holoparasite("%GUARDIAN has appeared!") - possible_guardians = list( //limited to ones useful on lavaland - /mob/living/simple_animal/hostile/guardian/charger, - /mob/living/simple_animal/hostile/guardian/protector, - /mob/living/simple_animal/hostile/guardian/ranged, - /mob/living/simple_animal/hostile/guardian/standard, - /mob/living/simple_animal/hostile/guardian/support, + random = TRUE + //limited to ones which are plausibly useful on lavaland + possible_guardians = list( + /mob/living/basic/guardian/charger, // A flying mount which can cross chasms + /mob/living/basic/guardian/protector, // Bodyblocks projectiles for you + /mob/living/basic/guardian/ranged, // Shoots the bad guys + /mob/living/basic/guardian/standard, // Can mine walls + /mob/living/basic/guardian/support, // Heals and teleports you ) - -/obj/item/guardiancreator/miner/choose - random = FALSE diff --git a/code/modules/mob/living/basic/guardian/guardian_fluff.dm b/code/modules/mob/living/basic/guardian/guardian_fluff.dm new file mode 100644 index 000000000000..4ede238921ed --- /dev/null +++ b/code/modules/mob/living/basic/guardian/guardian_fluff.dm @@ -0,0 +1,124 @@ +/** + * Defines a theme used by guardian mobs for visuals and some text output + * The default is used for ones created by wizards + */ +/datum/guardian_fluff + /// What name do we apply before one has been selected? + var/name = "Guardian Spirit" + /// Mob description to apply + var/desc = "A mysterious being that stands by its charge, ever vigilant." + /// Are we magical or technological? Mostly just used to pick a surname + var/fluff_type = GUARDIAN_MAGIC + /// What speech bubble do we use? + var/bubble_icon = "guardian" + /// What is our base icon state? + var/icon_state = "magicbase" + /// What is the icon state for our coloured overlay? + var/overlay_state = "magic" + /// Emote used for speaking + var/list/speak_emote = list("hisses") + /// Verb shown to viewers when attacking + var/attack_verb_continuous = "punches" + /// Verb shown to attacker when attacking + var/attack_verb_simple = "punch" + /// Sound played when we attack + var/attack_sound = 'sound/weapons/punch1.ogg' + /// Visible effect when we attack + var/attack_vis_effect = ATTACK_EFFECT_PUNCH + /// An associative list of type of guardian to some kind of descriptive text to show on appearance. + var/guardian_fluff = list( + GUARDIAN_ASSASSIN = "...And draw the Space Ninja, a lethal and invisible assassin.", + GUARDIAN_CHARGER = "...And draw the Hunter, alien master of rapid assault.", + GUARDIAN_DEXTROUS = "...And draw the Monkey, ascendant beast who has learned to use tools.", + GUARDIAN_EXPLOSIVE = "...And draw the Scientist, herald of explosive death.", + GUARDIAN_GASEOUS = "...And draw the Atmospheric Technician, veiled in a purple haze.", + GUARDIAN_GRAVITOKINETIC = "...And draw the Singularity, a terrible, irresistible force..", + GUARDIAN_LIGHTNING = "...And draw the Supermatter, a shockingly lethal font of power.", + GUARDIAN_PROTECTOR = "...And draw the Corgi, a stalwart protector that never leaves the side of its charge.", + GUARDIAN_RANGED = "...And draw the Watcher, impaling its prey from afar.", + GUARDIAN_STANDARD = "...And draw the Assistant, faceless but never to be underestimated.", + GUARDIAN_SUPPORT = "...And draw the Paramedic, arbiter of life and death.", + ) + +/// Applies relevant visual properties to our guardian +/datum/guardian_fluff/proc/apply(mob/living/basic/guardian/guardian) + guardian.name = name + guardian.real_name = name + guardian.bubble_icon = bubble_icon + guardian.icon_living = icon_state + guardian.icon_state = icon_state + + guardian.speak_emote = speak_emote + guardian.attack_verb_continuous = attack_verb_continuous + guardian.attack_verb_simple = attack_verb_simple + guardian.attack_sound = attack_sound + guardian.attack_vis_effect = attack_vis_effect + + guardian.overlay = mutable_appearance(guardian.icon, overlay_state) + +/// Output an appropriate fluff string for our guardian when it is created +/datum/guardian_fluff/proc/get_fluff_string(guardian_type) + return span_holoparasite(guardian_fluff[guardian_type] || "You bring forth a glitching abomination, something which should not be! Please contact a coder about it.") + +/// Used by holoparasites in the Traitor uplink +/datum/guardian_fluff/tech + name = "Holoparasite" + fluff_type = GUARDIAN_TECH + bubble_icon = "holo" + icon_state = "techbase" + overlay_state = "tech" + guardian_fluff = list( + GUARDIAN_ASSASSIN = "Boot sequence complete. Stealth modules loaded. Holoparasite swarm online.", + GUARDIAN_CHARGER = "Boot sequence complete. Overclocking motive engines. Holoparasite swarm online.", + GUARDIAN_DEXTROUS = "Boot sequence complete. Armed combat routines loaded. Holoparasite swarm online.", + GUARDIAN_EXPLOSIVE = "Boot sequence complete. Payload generator online. Holoparasite swarm online.", + GUARDIAN_GASEOUS = "Boot sequence complete. Atmospheric projectors operational. Holoparasite swarm online.", + GUARDIAN_GRAVITOKINETIC = "Boot sequence complete. Gravitic engine spinning up. Holoparasite swarm online.", + GUARDIAN_LIGHTNING = "Boot sequence complete. Tesla projectors charged. Holoparasite swarm online.", + GUARDIAN_PROTECTOR = "Boot sequence complete. Bodyguard routines loaded. Holoparasite swarm online.", + GUARDIAN_RANGED = "Boot sequence complete. Flechette launchers operational. Holoparasite swarm online.", + GUARDIAN_STANDARD = "Boot sequence complete. CQC suite engaged. Holoparasite swarm online.", + GUARDIAN_SUPPORT = "Boot sequence complete. Medical suite active. Holoparasite swarm online.", + ) + +/// Used by powerminers found in necropolis chests +/datum/guardian_fluff/miner + name = "Power Miner" + icon_state = "minerbase" + overlay_state = "miner" + guardian_fluff = list( + GUARDIAN_ASSASSIN = "The shard reveals... Glass, a sharp but fragile ambusher.", + GUARDIAN_CHARGER = "The shard reveals... Titanium, a lightweight, agile fighter.", + GUARDIAN_DEXTROUS = "The shard reveals... Gold, a malleable hoarder of treasure.", + GUARDIAN_EXPLOSIVE = "The shard reveals... Gibtonite, volatile and surprising.", + GUARDIAN_GASEOUS = "The shard reveals... Plasma, the bringer of flame.", + GUARDIAN_GRAVITOKINETIC = "The shard reveals... Bananium, a manipulator of motive forces.", + GUARDIAN_LIGHTNING = "The shard reveals... Iron, a conductive font of lightning.", + GUARDIAN_PROTECTOR = "The shard reveals... Uranium, dense and resistant.", + GUARDIAN_RANGED = "The shard reveals... Diamond, projecting a million sharp edges.", + GUARDIAN_STANDARD = "The shard reveals... Plastitanium, a powerful fighter.", + GUARDIAN_SUPPORT = "The shard reveals... Bluespace, master of relocation.", + ) + +/// Used by holocarp spawned by admins +/datum/guardian_fluff/carp + name = "Holocarp" + fluff_type = GUARDIAN_TECH + desc = "A mysterious fish that swims by its charge, ever fingilant." + icon_state = null // Handled entirely by the overlay + bubble_icon = "holo" + overlay_state = "carp" + speak_emote = list("gnashes") + guardian_fluff = list( + GUARDIAN_ASSASSIN = "CARP CARP CARP! Caught one! It's an assassin carp! Just when you thought it was safe to go back to the water... which is unhelpful, because we're in space.", + GUARDIAN_CHARGER = "CARP CARP CARP! Caught one! It's a charger carp which likes running at people. But it doesn't have any legs...", + GUARDIAN_DEXTROUS = "CARP CARP CARP! You caught one! It's a dextrous carp ready to slap people with a fish, once it picks one up.", + GUARDIAN_EXPLOSIVE = "CARP CARP CARP! Caught one! It's an explosive carp! You two are going to have a blast.", + GUARDIAN_GASEOUS = "CARP CARP CARP! You caught one! It's a gaseous carp, but don't worry it actually smells pretty good!", + GUARDIAN_GRAVITOKINETIC = "CARP CARP CARP! Caught one! It's a gravitokinetic carp! Now do you understand the gravity of the situation?", + GUARDIAN_LIGHTNING = "CARP CARP CARP! Caught one! It's a lightning carp! What a shocking result!", + GUARDIAN_PROTECTOR = "CARP CARP CARP! You caught one! Wait, no... it caught you! The fisher has become the fishy...", + GUARDIAN_RANGED = "CARP CARP CARP! You caught one! It's a ranged carp! It has been collecting glass shards in preparation for this moment.", + GUARDIAN_STANDARD = "CARP CARP CARP! You caught one! This one is a little generic and disappointing... Better punch through some walls to ease the tension.", + GUARDIAN_SUPPORT = "CARP CARP CARP! You caught a support carp! Now it's here, now you're over there!", + ) diff --git a/code/modules/mob/living/basic/guardian/guardian_helpers.dm b/code/modules/mob/living/basic/guardian/guardian_helpers.dm new file mode 100644 index 000000000000..df50a43e6a09 --- /dev/null +++ b/code/modules/mob/living/basic/guardian/guardian_helpers.dm @@ -0,0 +1,13 @@ +/// Returns a list of all holoparasites that has this mob as a summoner. +/mob/living/proc/get_all_linked_holoparasites() + RETURN_TYPE(/list) + var/list/all_parasites = list() + for(var/mob/living/basic/guardian/stand as anything in GLOB.parasites) + if (stand.summoner != src) + continue + all_parasites += stand + return all_parasites + +/// Returns true if this holoparasite has the same summoner as the passed holoparasite. +/mob/living/basic/guardian/proc/shares_summoner(mob/living/basic/guardian/other_guardian) + return istype(other_guardian) && other_guardian.summoner == summoner diff --git a/code/modules/mob/living/basic/guardian/guardian_types/assassin.dm b/code/modules/mob/living/basic/guardian/guardian_types/assassin.dm new file mode 100644 index 000000000000..d62b9bcedea7 --- /dev/null +++ b/code/modules/mob/living/basic/guardian/guardian_types/assassin.dm @@ -0,0 +1,116 @@ +#define CAN_STEALTH_ALERT "can_stealth" + +/** + * Can enter stealth mode to become invisible and deal bonus damage on their next attack, an ambush predator. + */ +/mob/living/basic/guardian/assassin + guardian_type = GUARDIAN_ASSASSIN + melee_damage_lower = 15 + melee_damage_upper = 15 + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_SLASH + sharpness = SHARP_POINTY + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) + playstyle_string = span_holoparasite("As an assassin type you do medium damage and have no damage resistance, but can enter stealth, massively increasing the damage of your next attack and causing it to ignore armor. Stealth is broken when you attack or take damage.") + creator_name = "Assassin" + creator_desc = "Does medium damage and takes full damage, but can enter stealth, causing its next attack to do massive damage and ignore armor. However, it becomes briefly unable to recall after attacking from stealth." + creator_icon = "assassin" + toggle_button_type = /atom/movable/screen/guardian/toggle_mode/assassin + /// How long to put stealth on cooldown if we are forced out? + var/stealth_cooldown_time = 16 SECONDS + /// Cooldown for the stealth toggle. + COOLDOWN_DECLARE(stealth_cooldown) + +/mob/living/basic/guardian/assassin/Initialize(mapload, datum/guardian_fluff/theme) + . = ..() + show_can_stealth() + RegisterSignal(src, COMSIG_GUARDIAN_ASSASSIN_REVEALED, PROC_REF(on_forced_unstealth)) + +// Toggle stealth +/mob/living/basic/guardian/assassin/toggle_modes() + var/stealthed = has_status_effect(/datum/status_effect/guardian_stealth) + if (stealthed) + to_chat(src, span_bolddanger("You exit stealth.")) + remove_status_effect(/datum/status_effect/guardian_stealth) + show_can_stealth() + return + if (COOLDOWN_FINISHED(src, stealth_cooldown)) + if (!is_deployed()) + to_chat(src, span_bolddanger("You have to be manifested to enter stealth!")) + return + apply_status_effect(/datum/status_effect/guardian_stealth) + clear_alert(CAN_STEALTH_ALERT) + return + to_chat(src, span_bolddanger("You cannot yet enter stealth, wait another [DisplayTimeText(COOLDOWN_TIMELEFT(src, stealth_cooldown))]!")) + +/mob/living/basic/guardian/assassin/get_status_tab_items() + . = ..() + if(!COOLDOWN_FINISHED(src, stealth_cooldown)) + . += "Stealth Cooldown Remaining: [DisplayTimeText(COOLDOWN_TIMELEFT(src, stealth_cooldown))]" + +/// Called when we are removed from stealth involuntarily +/mob/living/basic/guardian/assassin/proc/on_forced_unstealth(mob/living/source) + SIGNAL_HANDLER + visible_message(span_danger("\The [src] suddenly appears!")) + COOLDOWN_START(src, manifest_cooldown, 4 SECONDS) + COOLDOWN_START(src, stealth_cooldown, stealth_cooldown_time) + addtimer(CALLBACK(src, PROC_REF(show_can_stealth)), stealth_cooldown_time) + +/// Displays an alert letting us know that we can enter stealth +/mob/living/basic/guardian/assassin/proc/show_can_stealth() + if(!COOLDOWN_FINISHED(src, stealth_cooldown)) + return + throw_alert(CAN_STEALTH_ALERT, /atom/movable/screen/alert/canstealth) + +/// Status effect which makes us sneakier and do bonus damage +/datum/status_effect/guardian_stealth + id = "guardian_stealth" + alert_type = /atom/movable/screen/alert/status_effect/instealth + /// Damage added in stealth mode. + var/damage_bonus = 35 + /// Our wound bonus when in stealth mode. Allows you to actually cause wounds, unlike normal. + var/stealth_wound_bonus = -20 + +/datum/status_effect/guardian_stealth/on_apply() + new /obj/effect/temp_visual/guardian/phase/out(get_turf(owner)) + owner.melee_damage_lower += damage_bonus + owner.melee_damage_upper += damage_bonus + if (isbasicmob(owner)) + var/mob/living/basic/basic_owner = owner + basic_owner.armour_penetration = 100 + basic_owner.wound_bonus = stealth_wound_bonus + basic_owner.obj_damage = 0 + to_chat(owner, span_bolddanger("You enter stealth, empowering your next attack.")) + animate(owner, alpha = 15, time = 0.5 SECONDS) + + RegisterSignals(owner, list(COMSIG_GUARDIAN_RECALLED, COMSIG_HOSTILE_POST_ATTACKINGTARGET), PROC_REF(forced_exit)) + RegisterSignals(owner, COMSIG_LIVING_ADJUST_STANDARD_DAMAGE_TYPES, PROC_REF(on_health_changed)) + return TRUE + +/datum/status_effect/guardian_stealth/on_remove() + owner.melee_damage_lower -= damage_bonus + owner.melee_damage_upper -= damage_bonus + if (isbasicmob(owner)) + var/mob/living/basic/basic_owner = owner + basic_owner.armour_penetration = initial(basic_owner.armour_penetration) + basic_owner.wound_bonus = initial(basic_owner.wound_bonus) + basic_owner.obj_damage = initial(basic_owner.obj_damage) + animate(owner, alpha = initial(owner.alpha), time = 0.5 SECONDS) + UnregisterSignal(owner, list(COMSIG_GUARDIAN_RECALLED, COMSIG_HOSTILE_POST_ATTACKINGTARGET) + COMSIG_LIVING_ADJUST_STANDARD_DAMAGE_TYPES) + +/// If we take damage, exit the status effect +/datum/status_effect/guardian_stealth/proc/on_health_changed(mob/living/our_mob, type, amount, forced) + SIGNAL_HANDLER + if (amount <= 0) + return + forced_exit() + +/// Forcibly exit the status effect +/datum/status_effect/guardian_stealth/proc/forced_exit() + SIGNAL_HANDLER + SEND_SIGNAL(owner, COMSIG_GUARDIAN_ASSASSIN_REVEALED) + qdel(src) + +#undef CAN_STEALTH_ALERT diff --git a/code/modules/mob/living/basic/guardian/guardian_types/charger.dm b/code/modules/mob/living/basic/guardian/guardian_types/charger.dm new file mode 100644 index 000000000000..02f839c6a415 --- /dev/null +++ b/code/modules/mob/living/basic/guardian/guardian_types/charger.dm @@ -0,0 +1,69 @@ +/** + * Very fast, has a charging attack, and most importantly can be ridden like a horse. + */ +/mob/living/basic/guardian/charger + guardian_type = GUARDIAN_CHARGER + melee_damage_lower = 15 + melee_damage_upper = 15 + speed = -0.5 + damage_coeff = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, CLONE = 0.75, STAMINA = 0, OXY = 0.75) + playstyle_string = span_holoparasite("As a charger type you do medium damage, have light damage resistance, move very fast, can be ridden, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding.") + creator_name = "Charger" + creator_desc = "Moves very fast, does medium damage on attack, can be ridden and can charge at targets, damaging the first target hit and forcing them to drop any items they are holding." + creator_icon = "charger" + +/mob/living/basic/guardian/charger/Initialize(mapload, datum/guardian_fluff/theme) + . = ..() + AddElement(/datum/element/ridable, /datum/component/riding/creature/guardian) + var/datum/action/cooldown/mob_cooldown/charge/basic_charge/guardian/charge = new(src) + charge.Grant(src) + charge.set_click_ability(src) + +/// Guardian charger's charging attack, it knocks items out of people's hands +/datum/action/cooldown/mob_cooldown/charge/basic_charge/guardian + name = "Charge!" + cooldown_time = 4 SECONDS + melee_cooldown_time = 0 SECONDS + button_icon = 'icons/effects/effects.dmi' + button_icon_state = "speed" + background_icon = 'icons/hud/guardian.dmi' + background_icon_state = "base" + charge_delay = 0 + recoil_duration = 0 + charge_damage = 20 + charge_distance = 10 + unset_after_click = FALSE + destroy_objects = FALSE + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/guardian/PreActivate(atom/target) + if (!isguardian(owner)) + return ..() + var/mob/living/basic/guardian/guardian_owner = owner + if (guardian_owner.is_deployed()) + return ..() + return FALSE + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/guardian/do_charge_indicator(atom/charger, atom/charge_target) + playsound(charger, 'sound/items/modsuit/loader_launch.ogg', 75, TRUE) + var/obj/effect/temp_visual/decoy/decoy_flash = new /obj/effect/temp_visual/decoy(charger.loc, charger) + animate(decoy_flash, alpha = 0, color = "#FF0000", transform = matrix() * 2, time = 3) + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/guardian/can_hit_target(atom/movable/source, atom/target) + var/mob/living/living_target = target + if (!istype(living_target)) + return FALSE + var/mob/living/basic/guardian/guardian_owner = owner + if (!istype(guardian_owner)) + return TRUE + if (living_target == guardian_owner.summoner || guardian_owner.shares_summoner(target)) + return FALSE + return TRUE + +/datum/action/cooldown/mob_cooldown/charge/basic_charge/guardian/hit_target(atom/movable/source, mob/living/target, damage_dealt) + if(ishuman(target)) + var/mob/living/carbon/human/hit_human = target + if(hit_human.check_shields(src, charge_damage, name, attack_type = LEAP_ATTACK)) + return + . = ..() + var/mob/living/hit_mob = target + hit_mob.drop_all_held_items() diff --git a/code/modules/mob/living/basic/guardian/guardian_types/dextrous.dm b/code/modules/mob/living/basic/guardian/guardian_types/dextrous.dm new file mode 100644 index 000000000000..ed54a23771d2 --- /dev/null +++ b/code/modules/mob/living/basic/guardian/guardian_types/dextrous.dm @@ -0,0 +1,100 @@ +/// Dextrous guardians have some of the most powerful abilities of all: hands and pockets +/mob/living/basic/guardian/dextrous + guardian_type = GUARDIAN_DEXTROUS + melee_damage_lower = 10 + melee_damage_upper = 10 + damage_coeff = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, CLONE = 0.75, STAMINA = 0, OXY = 0.75) + playstyle_string = span_holoparasite("As a dextrous type you can hold items, store an item within yourself, and have medium damage resistance, but do low damage on attacks. Recalling and leashing will force you to drop unstored items!") + creator_name = "Dextrous" + creator_desc = "Does low damage on attack, but is capable of holding items and storing a single item within it. It will drop items held in its hands when it recalls, but it will retain the stored item." + creator_icon = "dextrous" + hud_type = /datum/hud/dextrous/guardian + held_items = list(null, null) + /// An internal pocket we can put stuff in + var/obj/item/internal_storage + +/mob/living/basic/guardian/dextrous/Initialize(mapload, datum/guardian_fluff/theme) + . = ..() + add_traits(list(TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP), ROUNDSTART_TRAIT) + AddElement(/datum/element/dextrous, hud_type = hud_type) + AddComponent(/datum/component/personal_crafting) + AddComponent(/datum/component/basic_inhands) + +/mob/living/basic/guardian/dextrous/death(gibbed) + dropItemToGround(internal_storage) + return ..() + +/mob/living/basic/guardian/dextrous/examine(mob/user) + . = ..() + if(isnull(internal_storage) || (internal_storage.item_flags & ABSTRACT)) + return + . += span_info("It is holding [internal_storage.get_examine_string(user)] in its internal storage.") + +/mob/living/basic/guardian/dextrous/recall_effects() + . = ..() + drop_all_held_items() + +// Bullshit related to having a fake pocket begins here + +/mob/living/basic/guardian/dextrous/doUnEquip(obj/item/equipped_item, force, newloc, no_move, invdrop = TRUE, silent = FALSE) + . = ..() + if (!.) + return FALSE + update_held_items() + if(equipped_item == internal_storage) + internal_storage = null + update_inv_internal_storage() + return TRUE + +/mob/living/basic/guardian/dextrous/can_equip(mob/living/M, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, ignore_equipped = FALSE, indirect_action = FALSE) + if(slot != ITEM_SLOT_DEX_STORAGE) + return FALSE + return isnull(internal_storage) + +/mob/living/basic/guardian/dextrous/get_item_by_slot(slot_id) + if(slot_id == ITEM_SLOT_DEX_STORAGE) + return internal_storage + return ..() + +/mob/living/basic/guardian/dextrous/get_slot_by_item(obj/item/looking_for) + if(internal_storage == looking_for) + return ITEM_SLOT_DEX_STORAGE + return ..() + +/mob/living/basic/guardian/dextrous/equip_to_slot(obj/item/equipping, slot, initial = FALSE, redraw_mob = FALSE, indirect_action = FALSE) + if (slot != ITEM_SLOT_DEX_STORAGE) + to_chat(src, span_danger("You are trying to equip this item to an unsupported inventory slot. Report this to a coder!")) + return FALSE + + var/index = get_held_index_of_item(equipping) + if(index) + held_items[index] = null + update_held_items() + + if(equipping.pulledby) + equipping.pulledby.stop_pulling() + + equipping.screen_loc = null // will get moved if inventory is visible + equipping.forceMove(src) + SET_PLANE_EXPLICIT(equipping, ABOVE_HUD_PLANE, src) + + internal_storage = equipping + update_inv_internal_storage() + + equipping.on_equipped(src, slot) + return TRUE + +/mob/living/basic/guardian/dextrous/getBackSlot() + return ITEM_SLOT_DEX_STORAGE + +/mob/living/basic/guardian/dextrous/getBeltSlot() + return ITEM_SLOT_DEX_STORAGE + +/mob/living/basic/guardian/dextrous/proc/update_inv_internal_storage() + if(isnull(internal_storage) || isnull(client) || !hud_used?.hud_shown) + return + internal_storage.screen_loc = ui_id + client.screen += internal_storage + +/mob/living/basic/guardian/dextrous/regenerate_icons() + update_inv_internal_storage() diff --git a/code/modules/mob/living/basic/guardian/guardian_types/explosive.dm b/code/modules/mob/living/basic/guardian/guardian_types/explosive.dm new file mode 100644 index 000000000000..1e15aac247d6 --- /dev/null +++ b/code/modules/mob/living/basic/guardian/guardian_types/explosive.dm @@ -0,0 +1,77 @@ +/// A durable guardian which can convert objects into hidden explosives. +/mob/living/basic/guardian/explosive + guardian_type = GUARDIAN_EXPLOSIVE + melee_damage_lower = 15 + melee_damage_upper = 15 + damage_coeff = list(BRUTE = 0.6, BURN = 0.6, TOX = 0.6, CLONE = 0.6, STAMINA = 0, OXY = 0.6) + range = 13 + playstyle_string = span_holoparasite("As an explosive type, you have moderate close combat abilities and are capable of converting nearby items and objects into disguised bombs via right-click.") + creator_name = "Explosive" + creator_desc = "High damage resist and medium power attack. Can turn any object, including objects too large to pick up, into a bomb, dealing explosive damage to the next person to touch it. The object will return to normal after the trap is triggered or after a delay." + creator_icon = "explosive" + /// Ability which plants bombs + var/datum/action/cooldown/mob_cooldown/explosive_booby_trap/bomb + +/mob/living/basic/guardian/explosive/Initialize(mapload, datum/guardian_fluff/theme) + . = ..() + bomb = new(src) + bomb.Grant(src) + +/mob/living/basic/guardian/explosive/Destroy() + QDEL_NULL(bomb) + return ..() + +/mob/living/basic/guardian/explosive/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) + if(LAZYACCESS(modifiers, RIGHT_CLICK) && proximity_flag && isobj(attack_target)) + bomb.Trigger(target = attack_target) + return + return ..() + + +/// An ability which can turn an object into a bomb +/datum/action/cooldown/mob_cooldown/explosive_booby_trap + name = "Explosive Trap" + desc = "Convert an inanimate object into a deadly and mostly undetectable explosive, triggered on touch." + button_icon = 'icons/mob/actions/actions_spells.dmi' + button_icon_state = "smoke" + cooldown_time = 20 SECONDS + melee_cooldown_time = 0 SECONDS + background_icon = 'icons/hud/guardian.dmi' + background_icon_state = "base" + /// After this amount of time passses, bomb deactivates. + var/decay_time = 1 MINUTES + /// Static list of signals that activate the bomb. + var/static/list/boom_signals = list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_BUMPED, COMSIG_ATOM_ATTACK_HAND) + +/datum/action/cooldown/mob_cooldown/explosive_booby_trap/PreActivate(atom/target) + if (!isobj(target)) + return FALSE + if (!owner.Adjacent(target)) + return FALSE + return ..() + +/datum/action/cooldown/mob_cooldown/explosive_booby_trap/Activate(atom/target) + var/glow_colour = COLOR_RED + var/mob/living/basic/guardian/guardian_owner = owner + if (istype(guardian_owner)) + glow_colour = guardian_owner.guardian_colour + target.AddComponent(\ + /datum/component/direct_explosive_trap, \ + saboteur = owner, \ + expire_time = decay_time, \ + glow_colour = glow_colour,\ + explosive_checks = CALLBACK(src, PROC_REF(validate_target)), \ + triggering_signals = boom_signals, \ + ) + target.balloon_alert(owner, "bomb planted") + StartCooldown() + return TRUE + +/// Validate that we should blow up on this thing, preferably not on one of our allies +/datum/action/cooldown/mob_cooldown/explosive_booby_trap/proc/validate_target(mob/living/target) + if (target == owner) + return FALSE + var/mob/living/basic/guardian/guardian_owner = owner + if (!istype(guardian_owner)) + return TRUE + return target != guardian_owner.summoner && !guardian_owner.shares_summoner(target) diff --git a/code/modules/mob/living/basic/guardian/guardian_types/gaseous.dm b/code/modules/mob/living/basic/guardian/guardian_types/gaseous.dm new file mode 100644 index 000000000000..1471a0976396 --- /dev/null +++ b/code/modules/mob/living/basic/guardian/guardian_types/gaseous.dm @@ -0,0 +1,159 @@ +/// Not particularly resistant, but versatile due to the selection of gases it can generate. +/mob/living/basic/guardian/gaseous + guardian_type = GUARDIAN_GASEOUS + melee_damage_lower = 10 + melee_damage_upper = 10 + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 0) + range = 7 + playstyle_string = span_holoparasite("As a gaseous type, you have only light damage resistance, but you can expel gas in an area. In addition, your punches cause sparks, and you make your summoner inflammable.") + creator_name = "Gaseous" + creator_desc = "Creates sparks on touch and continuously expels a gas of its choice. Automatically extinguishes the user if they catch on fire." + creator_icon = "gaseous" + toggle_button_type = /atom/movable/screen/guardian/toggle_mode/gases + /// Ability we use to select gases + var/datum/action/cooldown/mob_cooldown/expel_gas/gas + /// Rate of temperature stabilization per second. + var/temp_stabilization_rate = 0.1 + +/mob/living/basic/guardian/gaseous/Initialize(mapload, theme) + . = ..() + RegisterSignal(src, COMSIG_ATOM_PRE_PRESSURE_PUSH, PROC_REF(pre_pressure_moved)) + gas = new(src) + gas.owner_has_control = FALSE // It's nicely integrated with the Guardian UI, no need to have two buttons + gas.Grant(src) + +/mob/living/basic/guardian/gaseous/Destroy() + QDEL_NULL(gas) + return ..() + +/mob/living/basic/guardian/gaseous/toggle_modes() + gas.Trigger() + +/mob/living/basic/guardian/gaseous/set_summoner(mob/living/to_who, different_person) + . = ..() + if (QDELETED(src)) + return + RegisterSignal(summoner, COMSIG_LIVING_IGNITED, PROC_REF(on_summoner_ignited)) + RegisterSignal(summoner, COMSIG_LIVING_LIFE, PROC_REF(on_summoner_life)) + +/mob/living/basic/guardian/gaseous/cut_summoner(different_person) + if (!isnull(summoner)) + UnregisterSignal(summoner, list(COMSIG_LIVING_IGNITED, COMSIG_LIVING_LIFE)) + return ..() + +/// Prevent our summoner from being on fire +/mob/living/basic/guardian/gaseous/proc/on_summoner_ignited(mob/living/source) + SIGNAL_HANDLER + source.extinguish_mob() + source.set_fire_stacks(0, remove_wet_stacks = FALSE) + +/// Maintain our summoner at a stable body temperature +/mob/living/basic/guardian/gaseous/proc/on_summoner_life(mob/living/source, seconds_per_tick, times_fired) + SIGNAL_HANDLER + source.adjust_bodytemperature(get_temp_change_amount((summoner.get_body_temp_normal() - summoner.bodytemperature), temp_stabilization_rate * seconds_per_tick)) + +/mob/living/basic/guardian/gaseous/melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if(!. || !isliving(target)) + return + do_sparks(1, TRUE, target) + +/mob/living/basic/guardian/gaseous/recall_effects() + . = ..() + if(!isnull(summoner)) + UnregisterSignal(summoner, COMSIG_ATOM_PRE_PRESSURE_PUSH) + +/mob/living/basic/guardian/gaseous/manifest_effects() + . = ..() + if (!isnull(summoner)) + RegisterSignal(summoner, COMSIG_ATOM_PRE_PRESSURE_PUSH, PROC_REF(pre_pressure_moved)) + +/// We stand firm in the face of gas +/mob/living/basic/guardian/gaseous/proc/pre_pressure_moved(datum/source) + SIGNAL_HANDLER + return COMSIG_ATOM_BLOCKS_PRESSURE + + +/// Expel a range of gases +/datum/action/cooldown/mob_cooldown/expel_gas + name = "Release Gas" + desc = "Start or stop expelling a selected gas into the environment." + button_icon = 'icons/mob/actions/actions_spells.dmi' + button_icon_state = "smoke" + cooldown_time = 0 SECONDS // We're here for the interface not the cooldown + melee_cooldown_time = 0 SECONDS + click_to_activate = FALSE + /// Gas being expelled. + var/active_gas = null + /// Associative list of types of gases to moles we create every life tick. + var/static/list/possible_gases = list( + /datum/gas/oxygen = 50, + /datum/gas/nitrogen = 750, //overpressurizing is hard!. + /datum/gas/water_vapor = 1, //you need incredibly little water vapor for the effects to kick in + /datum/gas/nitrous_oxide = 15, + /datum/gas/carbon_dioxide = 50, + /datum/gas/plasma = 3, + /datum/gas/bz = 10, + ) + +/datum/action/cooldown/mob_cooldown/expel_gas/Grant(mob/granted_to) + . = ..() + if (isnull(owner)) + return + RegisterSignal(owner, COMSIG_GUARDIAN_RECALLED, PROC_REF(stop_gas)) + +/datum/action/cooldown/mob_cooldown/expel_gas/Remove(mob/removed_from) + UnregisterSignal(owner, list(COMSIG_GUARDIAN_RECALLED, COMSIG_LIVING_LIFE)) + return ..() + +/datum/action/cooldown/mob_cooldown/expel_gas/Activate(atom/target) + StartCooldown(360 SECONDS) + // Regeneated each time just in case someone fucks with our list + var/list/gas_selection = list("None") + for(var/datum/gas/gas as anything in possible_gases) + gas_selection[initial(gas.name)] = gas + + var/picked_gas = tgui_input_list(owner, "Select a gas to emit.", "Gas Producer", gas_selection) + StartCooldown() + if(picked_gas == "None") + stop_gas() + return + + var/gas_type = gas_selection[picked_gas] + if(isnull(picked_gas) || isnull(gas_type)) + return + + to_chat(owner, span_bolddanger("You start releasing [picked_gas].")) + owner.investigate_log("set their gas type to [picked_gas].", INVESTIGATE_ATMOS) + var/had_gas = !isnull(active_gas) + active_gas = gas_type + if(isnull(owner.particles)) + owner.particles = new /particles/smoke/steam() + owner.particles.position = list(-1, 8, 0) + owner.particles.fadein = 5 + owner.particles.height = 200 + //var/datum/gas/chosen_gas = active_gas // Casting it so that we can access gas vars in initial, it's still a typepath + owner.particles.color = COLOR_BLUE + if (!had_gas) + RegisterSignal(owner, COMSIG_LIVING_LIFE, PROC_REF(on_life)) + +/// Turns off the gas +/datum/action/cooldown/mob_cooldown/expel_gas/proc/stop_gas() + SIGNAL_HANDLER + if (!isnull(active_gas)) + to_chat(src, span_notice("You stop releasing gas.")) + active_gas = null + QDEL_NULL(owner.particles) + UnregisterSignal(owner, COMSIG_LIVING_LIFE) + +/// Release gas every life tick while active +/datum/action/cooldown/mob_cooldown/expel_gas/proc/on_life(datum/source, seconds_per_tick, times_fired) + SIGNAL_HANDLER + if (isnull(active_gas)) + return // We shouldn't even be registered at this point but just in case + var/datum/gas_mixture/mix_to_spawn = new() + mix_to_spawn.add_gas(active_gas) + mix_to_spawn.gases[active_gas][MOLES] = possible_gases[active_gas] * seconds_per_tick + mix_to_spawn.temperature = T20C + var/turf/open/our_turf = get_turf(owner) + our_turf.assume_air(mix_to_spawn) diff --git a/code/modules/mob/living/basic/guardian/guardian_types/gravitokinetic.dm b/code/modules/mob/living/basic/guardian/guardian_types/gravitokinetic.dm new file mode 100644 index 000000000000..a0ad9c8c21b5 --- /dev/null +++ b/code/modules/mob/living/basic/guardian/guardian_types/gravitokinetic.dm @@ -0,0 +1,107 @@ +/// Somewhat durable guardian who can increase gravity in an area +/mob/living/basic/guardian/gravitokinetic + guardian_type = GUARDIAN_GRAVITOKINETIC + melee_damage_lower = 15 + melee_damage_upper = 15 + damage_coeff = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, CLONE = 0.75, STAMINA = 0, OXY = 0.75) + playstyle_string = span_holoparasite("As a gravitokinetic type, you can right-click to make the gravity on the ground stronger, and punching applies this effect to a target.") + creator_name = "Gravitokinetic" + creator_desc = "Attacks will apply crushing gravity to the target. Can target the ground as well to slow targets advancing on you, but you are not immune to your own such effects." + creator_icon = "gravitokinetic" + /// Targets we have applied our gravity effects on. + var/list/gravity_targets = list() + /// Distance at which our ability works + var/gravity_power_range = 10 + /// Gravity added on punches. + var/punch_gravity = 5 + /// Gravity added to turfs. + var/turf_gravity = 3 + +/mob/living/basic/guardian/gravitokinetic/Initialize(mapload, datum/guardian_fluff/theme) + . = ..() + AddElement(/datum/element/forced_gravity, 1) + + var/static/list/container_connections = list( + COMSIG_MOVABLE_MOVED = PROC_REF(on_moved), + ) + AddComponent(/datum/component/connect_containers, src, container_connections) + RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + +/mob/living/basic/guardian/gravitokinetic/set_summoner(mob/living/to_who, different_person) + . = ..() + if (!QDELETED(src)) + return + to_who.AddElement(/datum/element/forced_gravity, 1) + +/mob/living/basic/guardian/gravitokinetic/cut_summoner(different_person) + summoner?.RemoveElement(/datum/element/forced_gravity, 1) + return ..() + +/mob/living/basic/guardian/gravitokinetic/death(gibbed) + . = ..() + clear_gravity() + +/mob/living/basic/guardian/gravitokinetic/recall_effects() + . = ..() + if (length(gravity_targets)) + to_chat(src, span_bolddanger("You have released your gravitokinetic powers!")) + clear_gravity() + +/mob/living/basic/guardian/gravitokinetic/melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if (!. || !isliving(target) || target == src || target == summoner || shares_summoner(target) || gravity_targets[target]) + return + to_chat(src, span_bolddanger("Your punch has applied heavy gravity to [target]!")) + add_gravity(target, punch_gravity) + to_chat(target, span_userdanger("Everything feels really heavy!")) + return TRUE + +/mob/living/basic/guardian/gravitokinetic/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) + if (LAZYACCESS(modifiers, RIGHT_CLICK) && proximity_flag && !gravity_targets[attack_target]) + slam_turf(attack_target) + return + return ..() + +/// Apply forced gravity to the floor +/mob/living/basic/guardian/gravitokinetic/proc/slam_turf(turf/open/slammed) + if (!isopenturf(slammed) || isgroundlessturf(slammed)) + return + visible_message(span_danger("[src] slams their fist into the [slammed]!"), span_notice("You amplify gravity around the [slammed].")) + do_attack_animation(slammed) + add_gravity(slammed, turf_gravity) + +/// Remove our forced gravity from all targets +/mob/living/basic/guardian/gravitokinetic/proc/clear_gravity() + for(var/gravity_target in gravity_targets) + remove_gravity(gravity_target) + +/// Make something heavier +/mob/living/basic/guardian/gravitokinetic/proc/add_gravity(atom/target, new_gravity = 3) + if (gravity_targets[target]) + return + target.AddElement(/datum/element/forced_gravity, new_gravity) + gravity_targets[target] = new_gravity + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_target_moved)) + playsound(src, 'sound/effects/gravhit.ogg', 100, TRUE) + +/// Stop making something heavier +/mob/living/basic/guardian/gravitokinetic/proc/remove_gravity(atom/target, too_far = FALSE) + if (isnull(gravity_targets[target])) + return + if (too_far) + to_chat(src, span_bolddanger("You are too far away from [target] to amplify gravity's hold on them!")) + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + target.RemoveElement(/datum/element/forced_gravity, gravity_targets[target]) + gravity_targets -= target + +/// When we or something we are inside move check if we are now too far away +/mob/living/basic/guardian/gravitokinetic/proc/on_moved() + for(var/gravity_target in gravity_targets) + if (get_dist(src, gravity_target) > gravity_power_range) + remove_gravity(gravity_target, too_far = TRUE) + +/// When something we put gravity on moves check if it's too far away +/mob/living/basic/guardian/gravitokinetic/proc/on_target_moved(atom/movable/moving_target, old_loc, dir, forced) + SIGNAL_HANDLER + if (get_dist(src, moving_target) > gravity_power_range) + remove_gravity(moving_target, too_far = TRUE) diff --git a/code/modules/mob/living/basic/guardian/guardian_types/lightning.dm b/code/modules/mob/living/basic/guardian/guardian_types/lightning.dm new file mode 100644 index 000000000000..b6d537b8c66e --- /dev/null +++ b/code/modules/mob/living/basic/guardian/guardian_types/lightning.dm @@ -0,0 +1,95 @@ +/// A reasonably durable guardian linked to you by a chain of lightning, zapping people who get between you +/mob/living/basic/guardian/lightning + guardian_type = GUARDIAN_LIGHTNING + melee_damage_lower = 7 + melee_damage_upper = 7 + attack_verb_continuous = "shocks" + attack_verb_simple = "shock" + melee_damage_type = BURN + attack_sound = 'sound/machines/defib_zap.ogg' + damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) + range = 7 + playstyle_string = span_holoparasite("As a lightning type, you will apply lightning chains to targets on attack and have a lightning chain to your summoner. Lightning chains will shock anyone near them.") + creator_name = "Lightning" + creator_desc = "Attacks apply lightning chains to targets. Has a lightning chain to the user. Lightning chains shock everything near them, doing constant damage." + creator_icon = "lightning" + /// Link between us and our summoner + var/datum/component/summoner_chain + /// Associative list of chained enemies to their chains + var/list/enemy_chains + +/mob/living/basic/guardian/lightning/death(gibbed) + . = ..() + clear_chains() + +/mob/living/basic/guardian/lightning/Destroy() + clear_chains() + return ..() + +/mob/living/basic/guardian/lightning/manifest_effects() + . = ..() + if (isnull(summoner)) + return + summoner_chain = chain_to(summoner, max_range = INFINITY) // Functionally it's actually our leash range but admins might fuck with it + +/mob/living/basic/guardian/lightning/recall_effects() + . = ..() + clear_chains() + +/// Remove all of our chains +/mob/living/basic/guardian/lightning/proc/clear_chains() + QDEL_NULL(summoner_chain) + QDEL_LIST_ASSOC_VAL(enemy_chains) + +/mob/living/basic/guardian/lightning/melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if (!. || !validate_target(target) || (target in enemy_chains)) + return + if (length(enemy_chains) == 2) + var/old_target = enemy_chains[1] + var/datum/old_chain = enemy_chains[old_target] + qdel(old_chain) + var/datum/new_chain = chain_to(target) + RegisterSignal(new_chain, COMSIG_PARENT_QDELETING, PROC_REF(on_chain_deleted)) + LAZYADDASSOC(enemy_chains, target, new_chain) + +/// Create a damaging lightning chain between ourselves and a target +/mob/living/basic/guardian/lightning/proc/chain_to(atom/target, max_range = 7) + var/datum/component/chain = AddComponent(\ + /datum/component/damage_chain, \ + linked_to = target, \ + max_distance = max_range, \ + beam_state = "lightning[rand(1,12)]", \ + beam_type = /obj/effect/ebeam/chain, \ + validate_target = CALLBACK(src, PROC_REF(validate_target)), \ + chain_damage_feedback = CALLBACK(src, PROC_REF(on_chain_zap)), \ + ) + return chain + +/// Handle losing our reference when we delete a chain +/mob/living/basic/guardian/lightning/proc/on_chain_deleted(datum/source) + SIGNAL_HANDLER + for (var/target in enemy_chains) + if (enemy_chains[target] != source) + continue + enemy_chains -= target + return + +/// Confirm whether something is valid to zap with lightning +/mob/living/basic/guardian/lightning/proc/validate_target(atom/target) + return isliving(target) && target != src && target != summoner && !shares_summoner(target) + +/// Called every few zaps by a chain +/mob/living/basic/guardian/lightning/proc/on_chain_zap(mob/living/target) + target.electrocute_act(shock_damage = 0, source = "lightning chain") + target.visible_message( + span_danger("[target] was shocked by the lightning chain!"), + span_userdanger("You are shocked by the lightning chain!"), + span_hear("You hear a heavy electrical crack."), + ) + +/// Beam definition for our lightning chain +/obj/effect/ebeam/chain + name = "lightning chain" + layer = LYING_MOB_LAYER + plane = GAME_PLANE_FOV_HIDDEN diff --git a/code/modules/mob/living/basic/guardian/guardian_types/protector.dm b/code/modules/mob/living/basic/guardian/guardian_types/protector.dm new file mode 100644 index 000000000000..a0aa34ad17f1 --- /dev/null +++ b/code/modules/mob/living/basic/guardian/guardian_types/protector.dm @@ -0,0 +1,122 @@ +/// Very durable, and reverses the usual leash dynamic. Can slow down to become extremely durable. +/mob/living/basic/guardian/protector + guardian_type = GUARDIAN_PROTECTOR + melee_damage_lower = 15 + melee_damage_upper = 15 + range = 5 // You want this to be low so you can drag them around + damage_coeff = list(BRUTE = 0.4, BURN = 0.4, TOX = 0.4, CLONE = 0.4, STAMINA = 0, OXY = 0.4) + playstyle_string = span_holoparasite("As a protector type you cause your summoner to leash to you instead of you leashing to them and have two modes; Combat Mode, where you do and take medium damage, and Protection Mode, where you do and take almost no damage, but move slightly slower.") + creator_name = "Protector" + creator_desc = "Causes you to teleport to it when out of range, unlike other parasites. Has two modes; Combat, where it does and takes medium damage, and Protection, where it does and takes almost no damage but moves slightly slower." + creator_icon = "protector" + toggle_button_type = /atom/movable/screen/guardian/toggle_mode + /// Action which toggles our shield + var/datum/action/cooldown/mob_cooldown/protector_shield/shield + +/mob/living/basic/guardian/protector/Initialize(mapload, datum/guardian_fluff/theme) + . = ..() + shield = new(src) + shield.owner_has_control = FALSE // Hide it from the user, it's integrated with guardian UI + shield.Grant(src) + +/mob/living/basic/guardian/protector/Destroy() + QDEL_NULL(shield) + return ..() + +// Invert the order +/mob/living/basic/guardian/protector/leash_to(atom/movable/leashed, atom/movable/leashed_to) + return ..(leashed_to, leashed) + +/mob/living/basic/guardian/protector/unleash() + qdel(summoner?.GetComponent(/datum/component/leash)) + +/mob/living/basic/guardian/protector/toggle_modes() + shield.Trigger() + +/mob/living/basic/guardian/protector/ex_act(severity) + if(severity >= EXPLODE_DEVASTATE) + adjustBruteLoss(400) //if in protector mode, will do 20 damage and not actually necessarily kill the summoner + return TRUE + return ..() + +/// Toggle a status effect which makes you slow but defensive +/datum/action/cooldown/mob_cooldown/protector_shield + name = "Protection Mode" + desc = "Enter a defensive stance which slows you down and reduces your damage, but makes you almost invincible." + button_icon = 'icons/effects/effects.dmi' + button_icon_state = "shield-old" + background_icon = 'icons/hud/guardian.dmi' + background_icon_state = "base" + cooldown_time = 1 SECONDS + click_to_activate = FALSE + +/datum/action/cooldown/mob_cooldown/protector_shield/Activate(mob/living/target) + if (!isliving(target)) + return FALSE + if (target.has_status_effect(/datum/status_effect/protector_shield)) + target.remove_status_effect(/datum/status_effect/protector_shield) + return + target.apply_status_effect(/datum/status_effect/protector_shield) + StartCooldown() + return TRUE + +/// Makes the guardian even more durable, but slower +/datum/status_effect/protector_shield + id = "guardian_shield" + alert_type = null + /// Damage removed in protecting mode. + var/damage_penalty = 13 + /// Colour for our various overlays. + var/overlay_colour = COLOR_TEAL + /// Overlay for our protection shield. + var/mutable_appearance/shield_overlay + /// Damage coefficients when shielded + var/list/shielded_damage = list(BRUTE = 0.05, BURN = 0.05, TOX = 0.05, CLONE = 0.05, STAMINA = 0, OXY = 0.05) + +/datum/status_effect/protector_shield/on_apply() + if (isguardian(owner)) + var/mob/living/basic/guardian/guardian_owner = owner + overlay_colour = guardian_owner.guardian_colour + shield_overlay = mutable_appearance('icons/effects/effects.dmi', "shield-grey") + shield_overlay.color = overlay_colour + + owner.melee_damage_lower -= damage_penalty + owner.melee_damage_upper -= damage_penalty + owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/guardian_shield) + + if (isbasicmob(owner)) // Better hope you are or this status is doing basically nothing useful for you + var/mob/living/basic/basic_owner = owner + basic_owner.damage_coeff = shielded_damage + + to_chat(owner, span_bolddanger("You enter protection mode.")) + RegisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) + RegisterSignals(owner, COMSIG_LIVING_ADJUST_STANDARD_DAMAGE_TYPES, PROC_REF(on_health_changed)) + owner.update_appearance(UPDATE_ICON) + return TRUE + +/datum/status_effect/protector_shield/on_remove() + owner.melee_damage_lower += damage_penalty + owner.melee_damage_upper += damage_penalty + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/guardian_shield) + + if (isbasicmob(owner)) + var/mob/living/basic/basic_owner = owner + basic_owner.damage_coeff = initial(basic_owner.damage_coeff) + + to_chat(owner, span_bolddanger("You return to your normal mode.")) + UnregisterSignal(owner, list(COMSIG_ATOM_UPDATE_OVERLAYS) + COMSIG_LIVING_ADJUST_STANDARD_DAMAGE_TYPES) + owner.update_appearance(UPDATE_ICON) + +/// Show an extra overlay when we're in shield mode +/datum/status_effect/protector_shield/proc/on_update_overlays(atom/source, list/overlays) + SIGNAL_HANDLER + overlays += shield_overlay + +/// Flash an animation when someone tries to hurt us +/datum/status_effect/protector_shield/proc/on_health_changed(mob/living/our_mob, type, amount, forced) + SIGNAL_HANDLER + if (amount <= 0 && !QDELETED(our_mob)) + return + var/image/flash_overlay = new('icons/effects/effects.dmi', owner, "shield-flash", dir = pick(GLOB.cardinals)) + flash_overlay.color = overlay_colour + owner.flick_overlay_view(flash_overlay, 0.5 SECONDS) diff --git a/code/modules/mob/living/basic/guardian/guardian_types/ranged.dm b/code/modules/mob/living/basic/guardian/guardian_types/ranged.dm new file mode 100644 index 000000000000..3be2e13b34a0 --- /dev/null +++ b/code/modules/mob/living/basic/guardian/guardian_types/ranged.dm @@ -0,0 +1,204 @@ +/// A ranged guardian can fling shards of glass at people very very quickly. It can also enter a long-range scouting mode. +/mob/living/basic/guardian/ranged + guardian_type = GUARDIAN_RANGED + friendly_verb_continuous = "quietly assesses" + friendly_verb_simple = "quietly assess" + melee_damage_lower = 10 + melee_damage_upper = 10 + damage_coeff = list(BRUTE = 0.9, BURN = 0.9, TOX = 0.9, CLONE = 0.9, STAMINA = 0, OXY = 0.9) + range = 13 + playstyle_string = span_holoparasite("As a ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed. You can also deploy surveillance snares to monitor enemy movement. Finally, you can switch to scout mode, in which you can't attack, but can move without limit.") + creator_name = "Ranged" + creator_desc = "Has two modes. Ranged; which fires a constant stream of weak, armor-ignoring projectiles. Scout; where it cannot attack, but can move through walls and is quite hard to see. Can lay surveillance snares, which alert it when crossed, in either mode." + creator_icon = "ranged" + see_invisible = SEE_INVISIBLE_LIVING + toggle_button_type = /atom/movable/screen/guardian/toggle_mode + +/mob/living/basic/guardian/ranged/Initialize(mapload, datum/guardian_fluff/theme) + . = ..() + AddComponent(\ + /datum/component/ranged_attacks,\ + projectile_type = /obj/projectile/guardian,\ + projectile_sound = 'sound/effects/hit_on_shattered_glass.ogg',\ + cooldown_time = 0.1 SECONDS, \ + ) + AddComponent(/datum/component/ranged_mob_full_auto, autofire_shot_delay = 0.1 SECONDS) + var/datum/action/cooldown/mob_cooldown/guardian_alarm_snare/snare = new (src) + snare.Grant(src) + +/mob/living/basic/guardian/ranged/toggle_modes() + if(is_deployed() && !isnull(summoner)) + balloon_alert(src, "must not be manifested!") + return + if (has_status_effect(/datum/status_effect/guardian_scout_mode)) + remove_status_effect(/datum/status_effect/guardian_scout_mode) + return + apply_status_effect(/datum/status_effect/guardian_scout_mode) + +/mob/living/basic/guardian/ranged/toggle_light() + var/msg + switch(lighting_cutoff) + if (LIGHTING_CUTOFF_VISIBLE) + lighting_cutoff_red = 10 + lighting_cutoff_green = 10 + lighting_cutoff_blue = 15 + msg = "You activate your night vision." + if (LIGHTING_CUTOFF_MEDIUM) + lighting_cutoff_red = 25 + lighting_cutoff_green = 25 + lighting_cutoff_blue = 35 + msg = "You increase your night vision." + if (LIGHTING_CUTOFF_HIGH) + lighting_cutoff_red = 35 + lighting_cutoff_green = 35 + lighting_cutoff_blue = 50 + msg = "You maximize your night vision." + else + lighting_cutoff_red = 0 + lighting_cutoff_green = 0 + lighting_cutoff_blue = 0 + msg = "You deactivate your night vision." + sync_lighting_plane_cutoff() + to_chat(src, span_notice(msg)) + +/// Become an incorporeal scout +/datum/status_effect/guardian_scout_mode + id = "guardian_scout" + alert_type = null + +/datum/status_effect/guardian_scout_mode/on_apply() + animate(owner, alpha = 45, time = 0.5 SECONDS) + RegisterSignal(owner, COMSIG_GUARDIAN_MANIFESTED, PROC_REF(on_manifest)) + RegisterSignal(owner, COMSIG_GUARDIAN_RECALLED, PROC_REF(on_recall)) + RegisterSignal(owner, COMSIG_MOB_CLICKON, PROC_REF(on_click)) + + var/mob/living/basic/guardian/guardian_mob = owner + guardian_mob.unleash() + to_chat(owner, span_bolddanger("You enter scouting mode.")) + return TRUE + +/datum/status_effect/guardian_scout_mode/on_remove() + animate(owner, alpha = initial(owner.alpha), time = 0.5 SECONDS) + UnregisterSignal(owner, list(COMSIG_GUARDIAN_MANIFESTED, COMSIG_GUARDIAN_RECALLED, COMSIG_MOB_CLICKON)) + to_chat(owner, span_bolddanger("You return to your normal mode.")) + var/mob/living/basic/guardian/guardian_mob = owner + guardian_mob.leash_to(owner, guardian_mob.summoner) + +/// Restore incorporeal move when we become corporeal, yes I know that suonds silly +/datum/status_effect/guardian_scout_mode/proc/on_manifest() + SIGNAL_HANDLER + owner.incorporeal_move = INCORPOREAL_MOVE_BASIC + +/// Stop having incorporeal move when we recall so that we can't move +/datum/status_effect/guardian_scout_mode/proc/on_recall() + SIGNAL_HANDLER + owner.incorporeal_move = FALSE + +/// While this is active we can't click anything +/datum/status_effect/guardian_scout_mode/proc/on_click() + SIGNAL_HANDLER + return COMSIG_MOB_CANCEL_CLICKON + + +/// Place an invisible trap which alerts the guardian when it is crossed +/datum/action/cooldown/mob_cooldown/guardian_alarm_snare + name = "Surveillance Snare" + desc = "Place an invisible snare which will alert you when it is crossed." + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "eye" + background_icon = 'icons/hud/guardian.dmi' + background_icon_state = "base" + cooldown_time = 2 SECONDS + melee_cooldown_time = 0 + click_to_activate = FALSE + /// How many snares can we have? + var/maximum_snares = 5 + /// What snares have we already placed? + var/list/placed_snares = list() + +/datum/action/cooldown/mob_cooldown/guardian_alarm_snare/Activate(atom/target) + StartCooldown(360 SECONDS) + + if (length(placed_snares) >= maximum_snares) + var/picked_snare = tgui_input_list(owner, "Choose a snare to replace.", "Remove Snare", sort_names(placed_snares)) + if(isnull(picked_snare)) + return FALSE + qdel(picked_snare) + if (length(placed_snares) >= maximum_snares) + StartCooldown(0) + return FALSE + + owner.balloon_alert(owner, "snare deployed") // We need feedback because they are invisible + var/turf/snare_loc = get_turf(owner) + var/obj/effect/abstract/surveillance_snare/new_snare = new(snare_loc, owner) + new_snare.assign_owner(owner) + RegisterSignal(new_snare, COMSIG_PARENT_QDELETING, PROC_REF(on_snare_deleted)) + placed_snares += new_snare + + StartCooldown() + return TRUE + +/// When a snare is deleted remove it from tracking +/datum/action/cooldown/mob_cooldown/guardian_alarm_snare/proc/on_snare_deleted(atom/snare) + SIGNAL_HANDLER + placed_snares -= snare + + +/// An invisible marker placed by a ranged guardian, alerts the owner when crossed +/obj/effect/abstract/surveillance_snare + name = "surveillance snare" + desc = "This thing is invisible, how are you examining it?" + invisibility = INVISIBILITY_ABSTRACT + /// Who do we notify when someone steps on us? + var/mob/living/owner + +/obj/effect/abstract/surveillance_snare/Initialize(mapload, spawning_guardian) + . = ..() + name = "[get_area(src)] snare ([rand(1, 1000)])" + var/static/list/loc_connections = list(COMSIG_ATOM_ENTERED = PROC_REF(on_entered)) + AddElement(/datum/element/connect_loc, loc_connections) + +/// Set up crossed notification +/obj/effect/abstract/surveillance_snare/proc/assign_owner(mob/living/new_owner) + if (isnull(new_owner)) + qdel(src) + return + owner = new_owner + RegisterSignal(owner, COMSIG_PARENT_QDELETING, PROC_REF(owner_destroyed)) + +/// When crossed notify our owner +/obj/effect/abstract/surveillance_snare/proc/on_entered(atom/source, crossed_object) + SIGNAL_HANDLER + if (isnull(owner)) + qdel(src) + return + if (!isliving(crossed_object) || crossed_object == owner) + return + var/mob/living/basic/guardian/guardian_owner = owner + if (isguardian(owner) && crossed_object == guardian_owner.summoner || guardian_owner.shares_summoner(crossed_object)) + return + + var/send_message = span_bolddanger("[crossed_object] has crossed [name].") + if (!isguardian(owner) || isnull(guardian_owner.summoner)) + to_chat(owner, send_message) + return + + to_chat(guardian_owner.summoner, send_message) + var/list/guardians = guardian_owner.summoner.get_all_linked_holoparasites() + for(var/guardian in guardians) + to_chat(guardian, send_message) + +/// If the person who placed us doesn't exist we might as well die +/obj/effect/abstract/surveillance_snare/proc/owner_destroyed() + SIGNAL_HANDLER + owner = null + qdel(src) + + +/// The glass shards we throw as a guardian. They have low damage because you can fire them very very quickly. +/obj/projectile/guardian + name = "crystal spray" + icon_state = "guardian" + damage = 5 + damage_type = BRUTE + armour_penetration = 100 diff --git a/code/modules/mob/living/basic/guardian/guardian_types/standard.dm b/code/modules/mob/living/basic/guardian/guardian_types/standard.dm new file mode 100644 index 000000000000..2ca006b385c7 --- /dev/null +++ b/code/modules/mob/living/basic/guardian/guardian_types/standard.dm @@ -0,0 +1,63 @@ +/// Plain, but durable and strong. Can destroy walls. +/mob/living/basic/guardian/standard + guardian_type = GUARDIAN_STANDARD + damage_coeff = list(BRUTE = 0.5, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5) + melee_damage_lower = 20 + melee_damage_upper = 20 + melee_attack_cooldown = 0.6 SECONDS + wound_bonus = -5 //you can wound! + obj_damage = 80 + environment_smash = ENVIRONMENT_SMASH_WALLS + playstyle_string = span_holoparasite("As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls.") + creator_name = "Standard" + creator_desc = "Devastating close combat attacks and high damage resistance. Can smash through weak walls." + creator_icon = "standard" + /// The text we shout when attacking. + var/battlecry = "AT" + +/mob/living/basic/guardian/standard/Initialize(mapload, datum/guardian_fluff/theme) + . = ..() + AddElement(/datum/element/wall_tearer, allow_reinforced = FALSE, tear_time = 1.5 SECONDS) + var/datum/action/select_guardian_battlecry/cry = new(src) + cry.Grant(src) + +/mob/living/basic/guardian/standard/do_attack_animation(atom/attacked_atom, visual_effect_icon, used_item, no_effect) + . = ..() + if (!isliving(attacked_atom) || !isclosedturf(attacked_atom)) + return + var/msg = "" + for(var/i in 1 to 9) + msg += battlecry + say("[msg]!!", ignore_spam = TRUE) + for(var/sounds in 1 to 4) + addtimer(CALLBACK(src, PROC_REF(do_attack_sound), attacked_atom.loc), sounds DECISECONDS, TIMER_DELETE_ME) + +/// Echo our punching sounds +/mob/living/basic/guardian/standard/proc/do_attack_sound(atom/playing_from) + playsound(playing_from, attack_sound, 50, TRUE, TRUE) + +/// Action to change our battlecry +/datum/action/select_guardian_battlecry + name = "Select Battlecry" + desc = "Update the really cool thing you shout whenever you attack." + button_icon = 'icons/obj/clothing/gloves.dmi' + button_icon_state = "boxing" + background_icon = 'icons/hud/guardian.dmi' + background_icon_state = "base" + /// How long can it be? Shouldn't be too long because we repeat this a shitload of times + var/max_length = 6 + +/datum/action/select_guardian_battlecry/IsAvailable(feedback) + if (!istype(owner, /mob/living/basic/guardian/standard)) + return FALSE + return ..() + +/datum/action/select_guardian_battlecry/Trigger(trigger_flags) + . = ..() + if (!.) + return + var/mob/living/basic/guardian/standard/stand = owner + var/input = tgui_input_text(owner, "What do you want your battlecry to be?", "Battle Cry", max_length = max_length) + if(!input) + return + stand.battlecry = input diff --git a/code/modules/mob/living/basic/guardian/guardian_types/support.dm b/code/modules/mob/living/basic/guardian/guardian_types/support.dm new file mode 100644 index 000000000000..0fdc120fb5a3 --- /dev/null +++ b/code/modules/mob/living/basic/guardian/guardian_types/support.dm @@ -0,0 +1,164 @@ +/// Quick-moving mob which can teleport things to a beacon and heal its allies +/mob/living/basic/guardian/support + guardian_type = GUARDIAN_SUPPORT + speed = 0 + damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) + melee_damage_lower = 15 + melee_damage_upper = 15 + playstyle_string = span_holoparasite("As a support type, you may right-click to heal targets. In addition, alt-clicking on an adjacent object or mob will warp them to your bluespace beacon after a short delay.") + creator_name = "Support" + creator_desc = "Does medium damage, but can heal its targets and create beacons to teleport people and things to." + creator_icon = "support" + /// Amount of each damage type to heal per hit + var/healing_amount = 5 + +/mob/living/basic/guardian/support/Initialize(mapload, datum/guardian_fluff/theme) + . = ..() + AddComponent(\ + /datum/component/healing_touch,\ + heal_brute = healing_amount,\ + heal_burn = healing_amount,\ + heal_tox = healing_amount,\ + heal_oxy = healing_amount,\ + heal_time = 0,\ + action_text = "",\ + complete_text = "",\ + required_modifier = RIGHT_CLICK,\ + after_healed = CALLBACK(src, PROC_REF(after_healed)),\ + ) + + var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] + medsensor.show_to(src) + + var/datum/action/cooldown/mob_cooldown/guardian_bluespace_beacon/teleport = new(src) + teleport.Grant(src) + +/mob/living/basic/guardian/support/set_guardian_colour(colour) + . = ..() + AddComponent(/datum/component/healing_touch, heal_color = guardian_colour) + +/// Called after we heal someone, show some visuals +/mob/living/basic/guardian/support/proc/after_healed(mob/living/healed) + do_attack_animation(healed, ATTACK_EFFECT_PUNCH) + healed.visible_message( + message = span_notice("[src] heals [healed]!"), + self_message = span_userdanger("[src] heals you!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ignored_mobs = src, + ) + to_chat(src, span_notice("You heal [healed]!")) + playsound(healed, attack_sound, 50, TRUE, TRUE, frequency = -1) // play punch sound in REVERSE + + +/// Place a beacon and then listen for clicks to teleport people to it +/datum/action/cooldown/mob_cooldown/guardian_bluespace_beacon + name = "Place Bluespace Beacon" + desc = "Mark the ground under your feet as a teleportation point. Alt-click things to teleport them to your beacon." + button_icon = 'icons/effects/effects.dmi' + button_icon_state = "the_freezer" + background_icon = 'icons/hud/guardian.dmi' + background_icon_state = "base" + cooldown_time = 5 MINUTES + melee_cooldown_time = 0 + cooldown_rounding = 1 + click_to_activate = FALSE + /// Our teleportation beacon. + var/obj/structure/guardian_beacon/beacon + /// Time it takes to teleport something. + var/teleport_time = 6 SECONDS + +/datum/action/cooldown/mob_cooldown/guardian_bluespace_beacon/Grant(mob/granted_to) + . = ..() + RegisterSignal(owner, COMSIG_MOB_ALTCLICKON, PROC_REF(try_teleporting)) + +/datum/action/cooldown/mob_cooldown/guardian_bluespace_beacon/Remove(mob/removed_from) + UnregisterSignal(owner, COMSIG_MOB_ALTCLICKON) + return ..() + +/datum/action/cooldown/mob_cooldown/guardian_bluespace_beacon/Activate(atom/movable/target) + var/turf/beacon_loc = owner.loc + if(!isfloorturf(beacon_loc)) + owner.balloon_alert(owner, "no room!") + return FALSE + + if (!isnull(beacon)) + beacon.visible_message("[beacon] vanishes!") + new /obj/effect/temp_visual/guardian/phase/out(beacon.loc) + qdel(beacon) + + beacon = new(beacon_loc, src) + if (isguardian(owner)) + var/mob/living/basic/guardian/guardian_owner = owner + beacon.add_atom_colour(guardian_owner.guardian_colour, FIXED_COLOUR_PRIORITY) + RegisterSignal(beacon, COMSIG_PARENT_QDELETING, PROC_REF(on_beacon_deleted)) + to_chat(src, span_bolddanger("Beacon placed! You may now warp targets and objects to it, including your user, via Alt+Click.")) + StartCooldown() + return TRUE + +/// Don't hold a reference to a deleted beacon +/datum/action/cooldown/mob_cooldown/guardian_bluespace_beacon/proc/on_beacon_deleted() + SIGNAL_HANDLER + beacon = null + +/// Try and teleport something to our beacon +/datum/action/cooldown/mob_cooldown/guardian_bluespace_beacon/proc/try_teleporting(mob/living/source, atom/target) + SIGNAL_HANDLER + if (!can_teleport(source, target)) + return + INVOKE_ASYNC(src, PROC_REF(perform_teleport), source, target) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/// Validate whether we can teleport this object +/datum/action/cooldown/mob_cooldown/guardian_bluespace_beacon/proc/can_teleport(mob/living/source, atom/movable/target) + if (isnull(beacon)) + source.balloon_alert(source, "no beacon!") + return FALSE + if (isguardian(source)) + var/mob/living/basic/guardian/guardian_mob = source + if (!guardian_mob.is_deployed()) + source.balloon_alert(source, "manifest yourself!") + return FALSE + if (!source.Adjacent(target)) + target.balloon_alert(source, "too far!") + return FALSE + if (target.anchored) + target.balloon_alert(source, "it won't budge!") + return FALSE + if(beacon.z != target.z) + target.balloon_alert(source, "too far from beacon!") + return FALSE + return TRUE + +/// Start teleporting +/datum/action/cooldown/mob_cooldown/guardian_bluespace_beacon/proc/perform_teleport(mob/living/source, atom/target) + source.do_attack_animation(target) + playsound(target, 'sound/weapons/punch1.ogg', 50, TRUE, TRUE, frequency = -1) + source.balloon_alert(source, "teleporting...") + target.visible_message( + span_danger("[target] starts to glow faintly!"), \ + span_userdanger("You start to faintly glow, and you feel strangely weightless!")) + if(!do_after(source, teleport_time, target)) + return + new /obj/effect/temp_visual/guardian/phase/out(target.loc) + if(isliving(target)) + var/mob/living/living_target = target + living_target.flash_act() + target.visible_message( + span_danger("[target] disappears in a flash of light!"), \ + span_userdanger("Your vision is obscured by a flash of light!"), \ + ) + do_teleport(target, beacon, precision = 0, channel = TELEPORT_CHANNEL_BLUESPACE) + new /obj/effect/temp_visual/guardian/phase(get_turf(target)) + + +/// Structure which acts as the landing point for a support guardian's teleportation effects +/obj/structure/guardian_beacon + name = "guardian beacon" + icon = 'icons/turf/floors.dmi' + desc = "A glowing zone which acts as a beacon for teleportation." + icon_state = "light_on-8" + light_outer_range = MINIMUM_USEFUL_LIGHT_RANGE + density = FALSE + anchored = TRUE + plane = FLOOR_PLANE + layer = ABOVE_OPEN_TURF_LAYER diff --git a/code/modules/mob/living/basic/guardian/guardian_verbs.dm b/code/modules/mob/living/basic/guardian/guardian_verbs.dm new file mode 100644 index 000000000000..02d1fd1ed3ab --- /dev/null +++ b/code/modules/mob/living/basic/guardian/guardian_verbs.dm @@ -0,0 +1,187 @@ +/// Pop out into the realm of the living. +/mob/living/basic/guardian/proc/manifest(forced) + if (is_deployed() || isnull(summoner) || isnull(summoner.loc) || istype(summoner.loc, /obj/effect) || (!COOLDOWN_FINISHED(src, manifest_cooldown) && !forced) || locked) + return FALSE + forceMove(summoner.loc) + new /obj/effect/temp_visual/guardian/phase(loc) + COOLDOWN_START(src, manifest_cooldown, 1 SECONDS) + reset_perspective() + manifest_effects() + return TRUE + +/// Go and hide inside your boss. +/mob/living/basic/guardian/proc/recall(forced) + if (!is_deployed() || isnull(summoner) || (!COOLDOWN_FINISHED(src, manifest_cooldown) && !forced) || locked) + return FALSE + new /obj/effect/temp_visual/guardian/phase/out(loc) + recall_effects() + forceMove(summoner) + COOLDOWN_START(src, manifest_cooldown, 1 SECONDS) + return TRUE + +/// Do something when we appear. +/mob/living/basic/guardian/proc/manifest_effects() + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_GUARDIAN_MANIFESTED) + +/// Do something when we vanish. +/mob/living/basic/guardian/proc/recall_effects() + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_GUARDIAN_RECALLED) + +/// Swap to a different mode... if we have one +/mob/living/basic/guardian/proc/toggle_modes() + to_chat(src, span_bolddanger("You don't have another mode!")) + + +/// Turn an internal light on or off. +/mob/living/basic/guardian/proc/toggle_light() + if (!light_on) + to_chat(src, span_notice("You activate your light.")) + set_light_on(TRUE) + else + to_chat(src, span_notice("You deactivate your light.")) + set_light_on(FALSE) + + +/// Prints what type of guardian we are and what we can do. +/mob/living/basic/guardian/verb/check_type() + set name = "Check Guardian Type" + set category = "Guardian" + set desc = "Check what type you are." + to_chat(src, playstyle_string) + + +/// Speak with our boss at a distance +/mob/living/basic/guardian/proc/communicate() + if (isnull(summoner)) + return + var/sender_key = key + var/input = tgui_input_text(src, "Enter a message to tell your summoner", "Guardian") + if (sender_key != key || !input) //guardian got reset, or did not enter anything + return + + var/preliminary_message = span_boldholoparasite("[input]") //apply basic color/bolding + var/my_message = "[span_bolditalic(src.name)]: [preliminary_message]" //add source, color source with the guardian's color + + to_chat(summoner, "[my_message]") + var/list/guardians = summoner.get_all_linked_holoparasites() + for(var/guardian in guardians) + to_chat(guardian, "[my_message]") + for(var/dead_mob in GLOB.dead_mob_list) + var/link = FOLLOW_LINK(dead_mob, src) + to_chat(dead_mob, "[link] [my_message]") + + src.log_talk(input, LOG_SAY, tag="guardian") + + +/// Speak with your guardian(s) at a distance. +/datum/action/cooldown/mob_cooldown/guardian_comms + name = "Guardian Communication" + desc = "Communicate telepathically with your guardian." + button_icon = 'icons/hud/guardian.dmi' + button_icon_state = "communicate" + background_icon = 'icons/hud/guardian.dmi' + background_icon_state = "base" + click_to_activate = FALSE + cooldown_time = 0 SECONDS + melee_cooldown_time = 0 + shared_cooldown = NONE + +/datum/action/cooldown/mob_cooldown/guardian_comms/Activate(atom/target) + StartCooldown(360 SECONDS) + var/input = tgui_input_text(owner, "Enter a message to tell your guardian", "Message") + StartCooldown() + if (!input) + return FALSE + + var/preliminary_message = span_boldholoparasite("[input]") //apply basic color/bolding + var/my_message = span_boldholoparasite("[owner]: [preliminary_message]") //add source, color source with default grey... + + to_chat(owner, "[my_message]") + var/mob/living/living_owner = owner + var/list/guardians = living_owner.get_all_linked_holoparasites() + for(var/mob/living/basic/guardian/guardian as anything in guardians) + to_chat(guardian, "[span_bolditalic(owner.real_name)]: [preliminary_message]" ) + for(var/dead_mob in GLOB.dead_mob_list) + var/link = FOLLOW_LINK(dead_mob, owner) + to_chat(dead_mob, "[link] [my_message]") + owner.log_talk(input, LOG_SAY, tag="guardian") + + return TRUE + + +/// Tell your slacking or distracted guardian to come home. +/datum/action/cooldown/mob_cooldown/recall_guardian + name = "Recall Guardian" + desc = "Forcibly recall your guardian." + button_icon = 'icons/hud/guardian.dmi' + button_icon_state = "recall" + background_icon = 'icons/hud/guardian.dmi' + background_icon_state = "base" + click_to_activate = FALSE + cooldown_time = 0 SECONDS + melee_cooldown_time = 0 + shared_cooldown = NONE + +/datum/action/cooldown/mob_cooldown/recall_guardian/Activate(atom/target) + var/mob/living/living_owner = owner + var/list/guardians = living_owner.get_all_linked_holoparasites() + for(var/mob/living/basic/guardian/guardian in guardians) + guardian.recall() + StartCooldown() + return TRUE + +/// Replace an annoying griefer you were paired up to with a different but probably no less annoying player. +/datum/action/cooldown/mob_cooldown/replace_guardian + name = "Reset Guardian Consciousness" + desc = "Replaces the mind of your guardian with that of a different ghost." + button_icon = 'icons/mob/simple/mob.dmi' + button_icon_state = "ghost" + background_icon = 'icons/hud/guardian.dmi' + background_icon_state = "base" + click_to_activate = FALSE + cooldown_time = 5 SECONDS + melee_cooldown_time = 0 + shared_cooldown = NONE + +/datum/action/cooldown/mob_cooldown/replace_guardian/Activate(atom/target) + StartCooldown(5 MINUTES) + + var/mob/living/living_owner = owner + var/list/guardians = living_owner.get_all_linked_holoparasites() + for(var/mob/living/basic/guardian/resetting_guardian as anything in guardians) + if (!COOLDOWN_FINISHED(resetting_guardian, resetting_cooldown)) + guardians -= resetting_guardian //clear out guardians that are already reset + + if (!length(guardians)) + to_chat(owner, span_holoparasite("You cannot reset [length(guardians) > 1 ? "any of your guardians":"your guardian"] yet.")) + StartCooldown() + return FALSE + + var/mob/living/basic/guardian/chosen_guardian = tgui_input_list(owner, "Pick the guardian you wish to reset", "Guardian Reset", sort_names(guardians)) + if (isnull(chosen_guardian)) + to_chat(owner, span_holoparasite("You decide not to reset [length(guardians) > 1 ? "any of your guardians":"your guardian"].")) + StartCooldown() + return FALSE + + to_chat(owner, span_holoparasite("You attempt to reset [span_bold(chosen_guardian.real_name)]'s personality...")) + var/list/mob/dead/observer/ghost_candidates = poll_ghost_candidates("Do you want to play as [owner.real_name]'s [chosen_guardian.theme.name]?", ROLE_PAI, FALSE, 100) + if (!LAZYLEN(ghost_candidates)) + to_chat(owner, span_holoparasite("Your attempt to reset the personality of \ + [span_bold(chosen_guardian.real_name)] appears to have failed... \ + Looks like you're stuck with it for now.")) + StartCooldown() + return FALSE + + var/mob/dead/observer/candidate = pick(ghost_candidates) + to_chat(chosen_guardian, span_holoparasite("Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance.")) + to_chat(owner, span_boldholoparasite("The personality of [chosen_guardian.theme.name] has been successfully reset.")) + message_admins("[key_name_admin(candidate)] has taken control of ([ADMIN_LOOKUPFLW(chosen_guardian)])") + chosen_guardian.ghostize(FALSE) + chosen_guardian.key = candidate.key + COOLDOWN_START(chosen_guardian, resetting_cooldown, 5 MINUTES) + chosen_guardian.guardian_rename() //give it a new color and name, to show it's a new person + chosen_guardian.guardian_recolour() + StartCooldown() + return TRUE diff --git a/code/modules/mob/living/basic/health_adjustment.dm b/code/modules/mob/living/basic/health_adjustment.dm index 6c206b511853..58640b7e99e3 100644 --- a/code/modules/mob/living/basic/health_adjustment.dm +++ b/code/modules/mob/living/basic/health_adjustment.dm @@ -1,5 +1,5 @@ /** - * Adjusts the health of a simple mob by a set amount and wakes AI if its idle to react + * Adjusts the health of a simple mob by a set amount * * Arguments: * * amount The amount that will be used to adjust the mob's health @@ -8,41 +8,55 @@ */ /mob/living/basic/proc/adjust_health(amount, updating_health = TRUE, forced = FALSE) . = FALSE - if(forced || !(status_flags & GODMODE)) - bruteloss = round(clamp(bruteloss + amount, 0, maxHealth * 2), DAMAGE_PRECISION) - if(updating_health) - updatehealth() - . = amount - if(ckey || stat) - return - //if(AIStatus == AI_IDLE) - // toggle_ai(AI_ON) + if(!forced && (status_flags & GODMODE)) + return 0 + . = bruteloss // bruteloss value before applying damage + bruteloss = round(clamp(bruteloss + amount, 0, maxHealth * 2), DAMAGE_PRECISION) + if(updating_health) + updatehealth() + return . - bruteloss + +/mob/living/basic/get_damage_mod(damage_type) + var/modifier = ..() + if (damage_type in damage_coeff) + return modifier * damage_coeff[damage_type] + return modifier /mob/living/basic/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + if(!can_adjust_brute_loss(amount, forced, required_bodytype)) + return 0 if(forced) . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[BRUTE]) . = adjust_health(amount * damage_coeff[BRUTE] * CONFIG_GET(number/damage_multiplier), updating_health, forced) /mob/living/basic/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + if(!can_adjust_fire_loss(amount, forced, required_bodytype)) + return 0 if(forced) . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[BURN]) . = adjust_health(amount * damage_coeff[BURN] * CONFIG_GET(number/damage_multiplier), updating_health, forced) /mob/living/basic/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype, required_respiration_type) + if(!can_adjust_oxy_loss(amount, forced, required_biotype, required_respiration_type)) + return 0 if(forced) . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[OXY]) . = adjust_health(amount * damage_coeff[OXY] * CONFIG_GET(number/damage_multiplier), updating_health, forced) /mob/living/basic/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) + if(!can_adjust_tox_loss(amount, forced, required_biotype)) + return 0 if(forced) . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[TOX]) . = adjust_health(amount * damage_coeff[TOX] * CONFIG_GET(number/damage_multiplier), updating_health, forced) -/mob/living/basic/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/basic/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) + if(!can_adjust_clone_loss(amount, forced, required_biotype)) + return 0 if(forced) . = adjust_health(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[CLONE]) diff --git a/code/modules/mob/living/basic/heretic/_heretic_summon.dm b/code/modules/mob/living/basic/heretic/_heretic_summon.dm new file mode 100644 index 000000000000..50280d0c0428 --- /dev/null +++ b/code/modules/mob/living/basic/heretic/_heretic_summon.dm @@ -0,0 +1,36 @@ +/mob/living/basic/heretic_summon + name = "Eldritch Demon" + real_name = "Eldritch Demon" + desc = "A horror from beyond this realm, summoned by bad code." + icon = 'icons/mob/nonhuman-player/eldritch_mobs.dmi' + faction = list(FACTION_HERETIC) + basic_mob_flags = DEL_ON_DEATH + gender = NEUTER + mob_biotypes = NONE + + habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) + speed = 0 + melee_attack_cooldown = CLICK_CD_MELEE + + attack_sound = 'sound/weapons/punch1.ogg' + response_help_continuous = "thinks better of touching" + response_help_simple = "think better of touching" + response_disarm_continuous = "flails at" + response_disarm_simple = "flail at" + response_harm_continuous = "rips" + response_harm_simple = "tear" + death_message = "implodes into itself." + + unsuitable_atmos_damage = 0 + unsuitable_cold_damage = 0 + unsuitable_heat_damage = 0 + + istate = ISTATE_HARM + ai_controller = null + speak_emote = list("screams") + gold_core_spawnable = NO_SPAWN + +/mob/living/basic/heretic_summon/Initialize(mapload) + . = ..() + AddElement(/datum/element/death_drops, string_list(list(/obj/effect/gibspawner/generic))) diff --git a/code/modules/mob/living/basic/heretic/ash_spirit.dm b/code/modules/mob/living/basic/heretic/ash_spirit.dm new file mode 100644 index 000000000000..b2d4d8b4d294 --- /dev/null +++ b/code/modules/mob/living/basic/heretic/ash_spirit.dm @@ -0,0 +1,25 @@ +/** + * Player-only mob which is fast, can jaunt a short distance, and is dangerous at close range + */ +/mob/living/basic/heretic_summon/ash_spirit + name = "Ash Spirit" + real_name = "Ashy" + desc = "A manifestation of ash, trailing a perpetual cloud of short-lived cinders." + icon_state = "ash_walker" + icon_living = "ash_walker" + maxHealth = 75 + health = 75 + melee_damage_lower = 15 + melee_damage_upper = 20 + sight = SEE_TURFS + +/mob/living/basic/heretic_summon/ash_spirit/Initialize(mapload) + . = ..() + var/static/list/actions_to_add = list( + /datum/action/cooldown/spell/fire_sworn, + /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash, + /datum/action/cooldown/spell/pointed/cleave, + ) + for (var/action in actions_to_add) + var/datum/action/cooldown/new_action = new action(src) + new_action.Grant(src) diff --git a/code/modules/mob/living/basic/heretic/flesh_stalker.dm b/code/modules/mob/living/basic/heretic/flesh_stalker.dm new file mode 100644 index 000000000000..d12735206674 --- /dev/null +++ b/code/modules/mob/living/basic/heretic/flesh_stalker.dm @@ -0,0 +1,46 @@ +/// Durable ambush mob with an EMP ability +/mob/living/basic/heretic_summon/stalker + name = "Flesh Stalker" + real_name = "Flesh Stalker" + desc = "An abomination cobbled together from varied remains. Its appearance changes slightly every time you blink." + icon_state = "stalker" + icon_living = "stalker" + maxHealth = 150 + health = 150 + melee_damage_lower = 15 + melee_damage_upper = 20 + sight = SEE_MOBS + ai_controller = /datum/ai_controller/basic_controller/stalker + /// Associative list of action types we would like to have, and what blackboard key (if any) to put it in + var/static/list/actions_to_add = list( + /datum/action/cooldown/spell/emp/eldritch = BB_GENERIC_ACTION, + /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash = null, + /datum/action/cooldown/spell/shapeshift/eldritch = BB_SHAPESHIFT_ACTION, + ) + +/mob/living/basic/heretic_summon/stalker/Initialize(mapload) + . = ..() + AddComponent(/datum/component/ai_target_timer) + for (var/action_type in actions_to_add) + var/datum/action/new_action = new action_type(src) + new_action.Grant(src) + var/blackboard_key = actions_to_add[action_type] + if (!isnull(blackboard_key)) + ai_controller?.set_blackboard_key(blackboard_key, new_action) + +/// Changes shape and lies in wait when it has no target, uses EMP and attacks once it does +/datum/ai_controller/basic_controller/stalker + ai_traits = CAN_ACT_IN_STASIS + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/shapechange_ambush, + /datum/ai_planning_subtree/use_mob_ability, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) diff --git a/code/modules/mob/living/basic/heretic/flesh_worm.dm b/code/modules/mob/living/basic/heretic/flesh_worm.dm new file mode 100644 index 000000000000..6c61614b9096 --- /dev/null +++ b/code/modules/mob/living/basic/heretic/flesh_worm.dm @@ -0,0 +1,136 @@ +/// Armsy starts to look a bit funky if he's shorter than this +#define MINIMUM_ARMSY_LENGTH 2 + +// What if we took a linked list... But made it a mob? +/// The "Terror of the Night" / Armsy, a large worm made of multiple bodyparts that occupies multiple tiles +/mob/living/basic/heretic_summon/armsy + name = "Lord of the Night" + real_name = "Master of Decay" + desc = "An abomination made from dozens and dozens of severed and malformed limbs grasping onto each other." + icon_state = "armsy_start" + icon_living = "armsy_start" + base_icon_state = "armsy" + maxHealth = 400 + health = 400 + melee_damage_lower = 30 + melee_damage_upper = 50 + obj_damage = 200 + move_force = MOVE_FORCE_OVERPOWERING + move_resist = MOVE_FORCE_OVERPOWERING + pull_force = MOVE_FORCE_OVERPOWERING + mob_size = MOB_SIZE_HUGE + sentience_type = SENTIENCE_BOSS + mob_biotypes = MOB_ORGANIC + ///Previous segment in the chain, we hold onto this purely to keep track of how long we currently are and to attach new growth to the back + var/mob/living/basic/heretic_summon/armsy/back + ///How many arms do we have to eat to expand? + var/stacks_to_grow = 5 + ///Currently eaten arms + var/current_stacks = 0 +/* + * Arguments + * * spawn_bodyparts - whether we spawn additional armsy bodies until we reach length. + * * worm_length - the length of the worm we're creating. Below 2 doesn't work very well. + */ +/mob/living/basic/heretic_summon/armsy/Initialize(mapload, spawn_bodyparts = TRUE, worm_length = 6) + . = ..() + AddElement(/datum/element/wall_smasher, ENVIRONMENT_SMASH_RWALLS) + AddElement(\ + /datum/element/amputating_limbs,\ + surgery_time = 0 SECONDS,\ + surgery_verb = "tears",\ + minimum_stat = CONSCIOUS,\ + snip_chance = 10,\ + target_zones = GLOB.arm_zones,\ + ) + AddComponent(\ + /datum/component/blood_walk, \ + blood_type = /obj/effect/decal/cleanable/blood/tracks, \ + target_dir_change = TRUE,\ + ) + + if(spawn_bodyparts) + build_tail(worm_length) + +// We are a vessel of otherworldly destruction, we bring our gravity with us +/mob/living/basic/heretic_summon/armsy/has_gravity(turf/gravity_turf) + return TRUE + +/mob/living/basic/heretic_summon/armsy/can_be_pulled() + return FALSE // The component does this but not on the head. We don't want the head to be pulled either. + +/mob/living/basic/heretic_summon/armsy/proc/build_tail(worm_length) + worm_length = max(worm_length, MINIMUM_ARMSY_LENGTH) + // Sets the hp of the head to be exactly the (length * hp), so the head is de facto the hardest to destroy. + maxHealth = worm_length * maxHealth + health = maxHealth + + AddComponent(/datum/component/mob_chain, vary_icon_state = TRUE) // We're the front + + var/mob/living/basic/heretic_summon/armsy/prev = src + for(var/i in 1 to worm_length) + prev = new_segment(behind = prev) + update_appearance(UPDATE_ICON_STATE) + +/// Grows a new segment behind the passed mob +/mob/living/basic/heretic_summon/armsy/proc/new_segment(mob/living/basic/heretic_summon/armsy/behind) + var/mob/living/segment = new type(drop_location(), FALSE) + segment.AddComponent(/datum/component/mob_chain, front = behind, vary_icon_state = TRUE) + behind.register_behind(segment) + return segment + +/// Record that we got another guy on our ass +/mob/living/basic/heretic_summon/armsy/proc/register_behind(mob/living/tail) + if(!isnull(back)) // Shouldn't happen but just in case + UnregisterSignal(back, COMSIG_PARENT_QDELETING) + back = tail + update_appearance(UPDATE_ICON_STATE) + if(!isnull(back)) + RegisterSignal(back, COMSIG_PARENT_QDELETING, PROC_REF(tail_deleted)) + +/// When our tail is gone stop holding a reference to it +/mob/living/basic/heretic_summon/armsy/proc/tail_deleted() + SIGNAL_HANDLER + register_behind(null) + +/mob/living/basic/heretic_summon/armsy/melee_attack(atom/target, list/modifiers, ignore_cooldown) + if(!istype(target, /obj/item/bodypart/arm)) + return ..() + visible_message(span_warning("[src] devours [target]!")) + playsound(src, 'sound/magic/demon_consume.ogg', 50, TRUE) + qdel(target) + on_arm_eaten() + +/* + * Handle healing our chain. + * Eating arms off the ground heals us, and if we eat enough arms while above a certain health threshold we get longer! + */ +/mob/living/basic/heretic_summon/armsy/proc/on_arm_eaten() + if(!isnull(back)) + back.on_arm_eaten() + return + + adjustBruteLoss(-maxHealth * 0.5, FALSE) + adjustFireLoss(-maxHealth * 0.5, FALSE) + + if(health < maxHealth * 0.8) + return + + current_stacks++ + if(current_stacks < stacks_to_grow) + return + + visible_message(span_boldwarning("[src] flexes and expands!")) + current_stacks = 0 + new_segment(behind = src) + +/* + * Recursively get the length of our chain. + */ +/mob/living/basic/heretic_summon/armsy/proc/get_length() + . = 1 + if(isnull(back)) + return + . += back.get_length() + +#undef MINIMUM_ARMSY_LENGTH diff --git a/code/modules/mob/living/basic/heretic/heretic_summon.dm b/code/modules/mob/living/basic/heretic/heretic_summon.dm new file mode 100644 index 000000000000..d55b0a21ddf4 --- /dev/null +++ b/code/modules/mob/living/basic/heretic/heretic_summon.dm @@ -0,0 +1,32 @@ +/mob/living/basic/heretic_summon + name = "Eldritch Demon" + real_name = "Eldritch Demon" + desc = "A horror from beyond this realm, summoned by bad code." + icon = 'icons/mob/nonhuman-player/eldritch_mobs.dmi' + faction = list(FACTION_HERETIC) + basic_mob_flags = DEL_ON_DEATH + gender = NEUTER + mob_biotypes = NONE + + habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) + speed = 0 + melee_attack_cooldown = CLICK_CD_MELEE + + attack_sound = 'sound/weapons/punch1.ogg' + response_help_continuous = "thinks better of touching" + response_help_simple = "think better of touching" + response_disarm_continuous = "flails at" + response_disarm_simple = "flail at" + response_harm_continuous = "rips" + response_harm_simple = "tear" + death_message = "implodes into itself." + + istate = ISTATE_HARM + ai_controller = null + speak_emote = list("screams") + gold_core_spawnable = NO_SPAWN + +/mob/living/basic/heretic_summon/Initialize(mapload) + . = ..() + AddElement(/datum/element/death_drops, string_list(list(/obj/effect/gibspawner/generic))) diff --git a/code/modules/antagonists/heretic/mobs/maid_in_mirror.dm b/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm similarity index 60% rename from code/modules/antagonists/heretic/mobs/maid_in_mirror.dm rename to code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm index b53bbe147d3d..edc5148b3ccc 100644 --- a/code/modules/antagonists/heretic/mobs/maid_in_mirror.dm +++ b/code/modules/mob/living/basic/heretic/maid_in_the_mirror.dm @@ -1,11 +1,11 @@ -// A summon which floats around the station incorporeally, and can appear in any mirror -/mob/living/simple_animal/hostile/heretic_summon/maid_in_the_mirror +/// Scout and assassin who can appear and disappear from glass surfaces. Damaged by being examined. +/mob/living/basic/heretic_summon/maid_in_the_mirror name = "Maid in the Mirror" real_name = "Maid in the Mirror" desc = "A floating and flowing wisp of chilled air. Glancing at it causes it to shimmer slightly." icon = 'icons/mob/simple/mob.dmi' icon_state = "stand" - icon_living = "stand" // Placeholder sprite + icon_living = "stand" // Placeholder sprite... still speak_emote = list("whispers") movement_type = FLOATING status_flags = CANSTUN | CANPUSH @@ -16,36 +16,34 @@ melee_damage_upper = 16 sight = SEE_MOBS | SEE_OBJS | SEE_TURFS death_message = "shatters and vanishes, releasing a gust of cold air." - loot = list( - /obj/item/shard, + /// Whether we take damage when someone looks at us + var/harmed_by_examine = TRUE + /// How often being examined by a specific mob can hurt us + var/recent_examine_damage_cooldown = 10 SECONDS + /// A list of REFs to people who recently examined us + var/list/recent_examiner_refs = list() + +/mob/living/basic/heretic_summon/Initialize(mapload) + . = ..() + var/static/list/loot = list( /obj/effect/decal/cleanable/ash, /obj/item/clothing/suit/armor/vest, /obj/item/organ/internal/lungs, + /obj/item/shard, ) - actions_to_add = list(/datum/action/cooldown/spell/jaunt/mirror_walk) + AddElement(/datum/element/death_drops, loot) + var/datum/action/cooldown/spell/jaunt/mirror_walk/jaunt = new (src) + jaunt.Grant(src) - /// Whether we take damage when we're examined - var/weak_on_examine = TRUE - /// The cooldown after being examined that the same mob cannot trigger it again - var/recent_examine_damage_cooldown = 10 SECONDS - /// A list of REFs to people who recently examined us - var/list/recent_examiner_refs = list() - -/mob/living/simple_animal/hostile/heretic_summon/maid_in_the_mirror/death(gibbed) +/mob/living/basic/heretic_summon/maid_in_the_mirror/death(gibbed) var/turf/death_turf = get_turf(src) - death_turf.TakeTemperature(-40) + death_turf.TakeTemperature(-40) // Spooky return ..() // Examining them will harm them, on a cooldown. -/mob/living/simple_animal/hostile/heretic_summon/maid_in_the_mirror/examine(mob/user) +/mob/living/basic/heretic_summon/maid_in_the_mirror/examine(mob/user) . = ..() - if(!weak_on_examine) - return - - if(!isliving(user) || user.stat == DEAD) - return - - if(IS_HERETIC_OR_MONSTER(user) || user == src) + if(!harmed_by_examine || user == src || user.stat == DEAD || !isliving(user) || IS_HERETIC_OR_MONSTER(user)) return var/user_ref = REF(user) @@ -62,7 +60,9 @@ recent_examiner_refs += user_ref apply_damage(maxHealth * 0.1) // We take 10% of our health as damage upon being examined playsound(src, 'sound/effects/ghost2.ogg', 40, TRUE) - addtimer(CALLBACK(src, PROC_REF(clear_recent_examiner), user_ref), recent_examine_damage_cooldown) + addtimer(CALLBACK(src, PROC_REF(clear_recent_examiner), user_ref), recent_examine_damage_cooldown, TIMER_DELETE_ME) + animate(src, alpha = 120, time = 0.5 SECONDS, easing = ELASTIC_EASING, loop = 2, flags = ANIMATION_PARALLEL) + animate(alpha = 255, time = 0.5 SECONDS, easing = ELASTIC_EASING) // If we're examined on low enough health we die straight up else @@ -73,7 +73,7 @@ death() -/mob/living/simple_animal/hostile/heretic_summon/maid_in_the_mirror/proc/clear_recent_examiner(mob_ref) +/mob/living/basic/heretic_summon/maid_in_the_mirror/proc/clear_recent_examiner(mob_ref) if(!(mob_ref in recent_examiner_refs)) return diff --git a/code/modules/mob/living/basic/heretic/raw_prophet.dm b/code/modules/mob/living/basic/heretic/raw_prophet.dm new file mode 100644 index 000000000000..967a7dacb605 --- /dev/null +++ b/code/modules/mob/living/basic/heretic/raw_prophet.dm @@ -0,0 +1,81 @@ +/** + * A funny little rolling guy who is great at scouting. + * It can see through walls, jaunt, and create a psychic network to report its findings. + * It can blind people to make a getaway, but also get stronger if it attacks the same target consecutively. + */ +/mob/living/basic/heretic_summon/raw_prophet + name = "Raw Prophet" + real_name = "Raw Prophet" + desc = "An abomination stitched together from a few severed arms and one swollen, orphaned eye." + icon_state = "raw_prophet" + icon_living = "raw_prophet" + status_flags = CANPUSH + melee_damage_lower = 5 + melee_damage_upper = 10 + maxHealth = 65 + health = 65 + sight = SEE_MOBS|SEE_OBJS|SEE_TURFS + /// Some ability we use to make people go blind + var/blind_action_type = /datum/action/cooldown/spell/pointed/blind/eldritch + +/mob/living/basic/heretic_summon/raw_prophet/Initialize(mapload) + . = ..() + AddElement(/datum/element/wheel) + var/static/list/body_parts = list(/obj/effect/gibspawner/human, /obj/item/bodypart/arm/left, /obj/item/organ/internal/eyes) + AddElement(/datum/element/death_drops, body_parts) + AddComponent(/datum/component/focused_attacker) + // We don't use these for AI so we can just repeat the same adding process + var/static/list/add_abilities = list( + /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/long, + /datum/action/cooldown/spell/list_target/telepathy/eldritch, + /datum/action/innate/expand_sight, + ) + for (var/ability_type in add_abilities) + var/datum/action/new_action = new ability_type(src) + new_action.Grant(src) + + var/datum/action/cooldown/blind = new blind_action_type(src) + blind.Grant(src) + ai_controller?.set_blackboard_key(BB_TARGETED_ACTION, blind) + +/* + * Callback for the mind_linker component. + * Stuns people who are ejected from the network. + */ +/mob/living/basic/heretic_summon/raw_prophet/proc/after_unlink(mob/living/unlinked_mob) + if(QDELETED(unlinked_mob) || unlinked_mob.stat == DEAD) + return + + INVOKE_ASYNC(unlinked_mob, TYPE_PROC_REF(/mob, emote), "scream") + unlinked_mob.AdjustParalyzed(0.5 SECONDS) //micro stun + +/mob/living/basic/heretic_summon/raw_prophet/melee_attack(atom/target, list/modifiers, ignore_cooldown) + SpinAnimation(speed = 5, loops = 1) + if (target == src) + return + return ..() + +/// Variant raw prophet used by eldritch transformation with more base attack power +/mob/living/basic/heretic_summon/raw_prophet/ascended + melee_damage_lower = 15 + melee_damage_upper = 20 + +/// NPC variant with a less bullshit ability +/mob/living/basic/heretic_summon/raw_prophet/ruins + ai_controller = /datum/ai_controller/basic_controller/raw_prophet + blind_action_type = /datum/action/cooldown/mob_cooldown/watcher_gaze + +/// Walk and attack people, blind them when we can +/datum/ai_controller/basic_controller/raw_prophet + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) diff --git a/code/modules/mob/living/basic/heretic/rust_walker.dm b/code/modules/mob/living/basic/heretic/rust_walker.dm new file mode 100644 index 000000000000..c826fead48ca --- /dev/null +++ b/code/modules/mob/living/basic/heretic/rust_walker.dm @@ -0,0 +1,87 @@ +/// Pretty simple mob which creates areas of rust and has a rust-creating projectile spell +/mob/living/basic/heretic_summon/rust_walker + name = "Rust Walker" + real_name = "Rusty" + desc = "A grinding, clanking construct which leaches life from its surroundings with every armoured step." + icon_state = "rust_walker_s" + base_icon_state = "rust_walker" + icon_living = "rust_walker_s" + maxHealth = 75 + health = 75 + melee_damage_lower = 15 + melee_damage_upper = 20 + sight = SEE_TURFS + speed = 1 + ai_controller = /datum/ai_controller/basic_controller/rust_walker + +/mob/living/basic/heretic_summon/rust_walker/Initialize(mapload) + . = ..() + AddElement(/datum/element/footstep, FOOTSTEP_MOB_RUST) + var/datum/action/cooldown/spell/aoe/rust_conversion/small/conversion = new(src) + conversion.Grant(src) + ai_controller?.set_blackboard_key(BB_GENERIC_ACTION, conversion) + + var/datum/action/cooldown/spell/basic_projectile/rust_wave/short/wave = new(src) + wave.Grant(src) + ai_controller?.set_blackboard_key(BB_TARGETED_ACTION, wave) + +/mob/living/basic/heretic_summon/rust_walker/setDir(newdir) + . = ..() + update_appearance(UPDATE_ICON_STATE) + +/mob/living/basic/heretic_summon/rust_walker/update_icon_state() + . = ..() + if(stat == DEAD) // We usually delete on death but just in case + return + if(dir & NORTH) + icon_state = "[base_icon_state]_n" + else if(dir & SOUTH) + icon_state = "[base_icon_state]_s" + icon_living = icon_state + +/mob/living/basic/heretic_summon/rust_walker/Life(seconds_per_tick = SSMOBS_DT, times_fired) + if(stat == DEAD) + return ..() + var/turf/our_turf = get_turf(src) + if(HAS_TRAIT(our_turf, TRAIT_RUSTY)) + adjustBruteLoss(-3 * seconds_per_tick) + + return ..() + +/// Converts unconverted terrain, sprays pocket sand around +/datum/ai_controller/basic_controller/rust_walker + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk/rust + planning_subtrees = list( + /datum/ai_planning_subtree/use_mob_ability/rust_walker, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/// Moves a lot if healthy and on rust (to find more tiles to rust) or unhealthy and not on rust (to find healing rust) +/// Still moving in random directions though we're not really seeking it out +/datum/idle_behavior/idle_random_walk/rust + +/datum/idle_behavior/idle_random_walk/rust/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller) + var/mob/living/our_mob = controller.pawn + var/turf/our_turf = get_turf(our_mob) + if (HAS_TRAIT(our_turf, TRAIT_RUSTY)) + walk_chance = (our_mob.health < our_mob.maxHealth) ? 10 : 50 + else + walk_chance = (our_mob.health < our_mob.maxHealth) ? 50 : 10 + return ..() + +/// Use if we're not stood on rust right now +/datum/ai_planning_subtree/use_mob_ability/rust_walker + +/datum/ai_planning_subtree/use_mob_ability/rust_walker/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/turf/our_turf = get_turf(controller.pawn) + if (HAS_TRAIT(our_turf, TRAIT_RUSTY)) + return + return ..() diff --git a/code/modules/mob/living/basic/heretic/star_gazer.dm b/code/modules/mob/living/basic/heretic/star_gazer.dm index 19c29d0eeb18..259d17d9d7d8 100644 --- a/code/modules/mob/living/basic/heretic/star_gazer.dm +++ b/code/modules/mob/living/basic/heretic/star_gazer.dm @@ -24,6 +24,7 @@ attack_verb_simple = "ravage" attack_vis_effect = ATTACK_EFFECT_SLASH attack_sound = 'sound/weapons/bladeslice.ogg' + melee_attack_cooldown = 0.6 SECONDS speak_emote = list("growls") damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) death_sound = 'sound/magic/cosmic_expansion.ogg' @@ -62,10 +63,29 @@ ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) set_light(4, l_color = "#dcaa5b") +// Star gazer attacks everything around itself applies a spooky mark +/mob/living/basic/heretic_summon/star_gazer/melee_attack(mob/living/target, list/modifiers, ignore_cooldown) + . = ..() + if (!. || !isliving(target)) + return + + target.apply_status_effect(/datum/status_effect/star_mark) + target.apply_damage(damage = 5, damagetype = CLONE) + var/datum/targeting_strategy/target_confirmer = GET_TARGETING_STRATEGY(ai_controller.blackboard[BB_TARGETING_STRATEGY]) + for(var/mob/living/nearby_mob in range(1, src)) + if(target == nearby_mob || !target_confirmer?.can_attack(src, nearby_mob)) + continue + nearby_mob.apply_status_effect(/datum/status_effect/star_mark) + nearby_mob.apply_damage(10) + to_chat(nearby_mob, span_userdanger("\The [src] [attack_verb_continuous] you!")) + do_attack_animation(nearby_mob, ATTACK_EFFECT_SLASH) + log_combat(src, nearby_mob, "slashed") + /datum/ai_controller/basic_controller/star_gazer blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/star_gazer(), - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends/attack_closed_turfs(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends/attack_closed_turfs, ) ai_movement = /datum/ai_movement/basic_avoidance @@ -75,39 +95,9 @@ /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/attack_obstacle_in_path/star_gazer, - /datum/ai_planning_subtree/basic_melee_attack_subtree/star_gazer, + /datum/ai_planning_subtree/basic_melee_attack_subtree, ) -/datum/targetting_datum/basic/star_gazer - stat_attack = HARD_CRIT - -/datum/ai_planning_subtree/basic_melee_attack_subtree/star_gazer - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/star_gazer - -/datum/ai_behavior/basic_melee_attack/star_gazer - action_cooldown = 0.6 SECONDS - -/datum/ai_behavior/basic_melee_attack/star_gazer/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) - . = ..() - var/atom/target = controller.blackboard[target_key] - var/mob/living/living_pawn = controller.pawn - - if(!isliving(target)) - return - var/mob/living/living_target = target - living_target.apply_status_effect(/datum/status_effect/star_mark) - living_target.apply_damage_type(damage = 5, damagetype = CLONE) - if(living_target.pulledby != living_pawn) - if(living_pawn.Adjacent(living_target) && isturf(living_target.loc) && living_target.stat == SOFT_CRIT) - living_target.grabbedby(living_pawn) - for(var/mob/living/nearby_mob in range(1, living_pawn)) - if(nearby_mob.stat == DEAD || living_target == nearby_mob || faction_check(nearby_mob.faction, list(FACTION_HERETIC))) - continue - nearby_mob.apply_status_effect(/datum/status_effect/star_mark) - nearby_mob.adjustBruteLoss(10) - living_pawn.do_attack_animation(nearby_mob, ATTACK_EFFECT_SLASH) - log_combat(living_pawn, nearby_mob, "slashed") - /datum/ai_planning_subtree/attack_obstacle_in_path/star_gazer attack_behaviour = /datum/ai_behavior/attack_obstructions/star_gazer @@ -119,9 +109,9 @@ can_attack_turfs = TRUE can_attack_dense_objects = TRUE -/datum/pet_command/point_targetting/attack/star_gazer +/datum/pet_command/point_targeting/attack/star_gazer speech_commands = list("attack", "sic", "kill", "slash them") command_feedback = "stares!" pointed_reaction = "stares intensely!" refuse_reaction = "..." - attack_behaviour = /datum/ai_behavior/basic_melee_attack/star_gazer + attack_behaviour = /datum/ai_behavior/basic_melee_attack diff --git a/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon.dm b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon.dm new file mode 100644 index 000000000000..960f875365bf --- /dev/null +++ b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon.dm @@ -0,0 +1,89 @@ +/mob/living/basic/mining/ice_demon + name = "demonic watcher" + desc = "A creature formed entirely out of ice, bluespace energy emanates from inside of it." + icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' + icon_state = "ice_demon" + icon_living = "ice_demon" + icon_gib = "syndicate_gib" + mob_biotypes = MOB_ORGANIC|MOB_BEAST + mouse_opacity = MOUSE_OPACITY_ICON + basic_mob_flags = DEL_ON_DEATH + speed = 2 + maxHealth = 150 + health = 150 + obj_damage = 40 + melee_damage_lower = 15 + melee_damage_upper = 15 + attack_verb_continuous = "slices" + attack_verb_simple = "slice" + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_SLASH + move_force = MOVE_FORCE_VERY_STRONG + move_resist = MOVE_FORCE_VERY_STRONG + pull_force = MOVE_FORCE_VERY_STRONG + crusher_loot = /obj/item/crusher_trophy/ice_demon_cube + ai_controller = /datum/ai_controller/basic_controller/ice_demon + death_message = "fades as the energies that tied it to this world dissipate." + death_sound = 'sound/magic/demon_dies.ogg' + +/mob/living/basic/mining/ice_demon/Initialize(mapload) + . = ..() + var/datum/action/cooldown/mob_cooldown/slippery_ice_floors/ice_floor = new(src) + ice_floor.Grant(src) + ai_controller.set_blackboard_key(BB_DEMON_SLIP_ABILITY, ice_floor) + var/datum/action/cooldown/mob_cooldown/ice_demon_teleport/demon_teleport = new(src) + demon_teleport.Grant(src) + ai_controller.set_blackboard_key(BB_DEMON_TELEPORT_ABILITY, demon_teleport) + var/datum/action/cooldown/spell/conjure/create_afterimages/afterimage = new(src) + afterimage.Grant(src) + ai_controller.set_blackboard_key(BB_DEMON_CLONE_ABILITY, afterimage) + AddComponent(\ + /datum/component/ranged_attacks,\ + projectile_type = /obj/projectile/temp/ice_demon,\ + projectile_sound = 'sound/weapons/pierce.ogg',\ + ) + var/static/list/death_loot = list(/obj/item/stack/ore/bluespace_crystal = 3) + AddElement(/datum/element/death_drops, death_loot) + AddElement(/datum/element/simple_flying) + +/mob/living/basic/mining/ice_demon/death(gibbed) + if(prob(5)) + new /obj/item/raw_anomaly_core/bluespace(loc) + return ..() + +/mob/living/basic/mining/demon_afterimage + name = "afterimage demonic watcher" + desc = "Is this some sort of illusion?" + icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' + icon_state = "ice_demon" + icon_living = "ice_demon" + icon_gib = "syndicate_gib" + mob_biotypes = MOB_ORGANIC|MOB_BEAST + mouse_opacity = MOUSE_OPACITY_ICON + basic_mob_flags = DEL_ON_DEATH + speed = 5 + maxHealth = 20 + health = 20 + melee_damage_lower = 5 + melee_damage_upper = 5 + attack_verb_continuous = "slices" + attack_verb_simple = "slice" + attack_sound = 'sound/weapons/bladeslice.ogg' + alpha = 80 + ai_controller = /datum/ai_controller/basic_controller/ice_demon/afterimage + ///how long do we exist for + var/existence_period = 15 SECONDS + +/mob/living/basic/mining/demon_afterimage/Initialize(mapload) + . = ..() + AddElement(/datum/element/simple_flying) + AddElement(/datum/element/temporary_atom, life_time = existence_period) + +///afterimage subtypes summoned by the crusher +/mob/living/basic/mining/demon_afterimage/crusher + speed = 2 + health = 60 + maxHealth = 60 + melee_damage_lower = 10 + melee_damage_upper = 10 + existence_period = 7 SECONDS diff --git a/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_abilities.dm b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_abilities.dm new file mode 100644 index 000000000000..a09478f9add7 --- /dev/null +++ b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_abilities.dm @@ -0,0 +1,117 @@ +/obj/projectile/temp/ice_demon + name = "ice blast" + icon_state = "ice_2" + damage = 5 + damage_type = BURN + armor_flag = ENERGY + speed = 1 + pixel_speed_multiplier = 0.25 + temperature = -75 + +/datum/action/cooldown/mob_cooldown/ice_demon_teleport + name = "Bluespace Teleport" + desc = "Teleport towards a destination target!" + button_icon = 'icons/obj/ore.dmi' + button_icon_state = "bluespace_crystal" + cooldown_time = 3 SECONDS + melee_cooldown_time = 0 SECONDS + ///time delay before teleport + var/time_delay = 0.5 SECONDS + +/datum/action/cooldown/mob_cooldown/ice_demon_teleport/Activate(atom/target_atom) + if(isclosedturf(get_turf(target_atom))) + owner.balloon_alert(owner, "blocked!") + return FALSE + animate(owner, transform = matrix().Scale(0.8), time = time_delay, easing = SINE_EASING) + addtimer(CALLBACK(src, PROC_REF(teleport_to_turf), target_atom), time_delay) + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/ice_demon_teleport/proc/teleport_to_turf(atom/target) + animate(owner, transform = matrix(), time = 0.5 SECONDS, easing = SINE_EASING) + do_teleport(teleatom = owner, destination = target, channel = TELEPORT_CHANNEL_BLUESPACE, forced = TRUE) + +/datum/action/cooldown/mob_cooldown/slippery_ice_floors + name = "Iced Floors" + desc = "Summon slippery ice floors all around!" + button_icon = 'icons/turf/floors/ice_turf.dmi' + button_icon_state = "ice_turf-6" + cooldown_time = 2 SECONDS + click_to_activate = FALSE + melee_cooldown_time = 0 SECONDS + ///perimeter we will spawn the iced floors on + var/radius = 1 + ///intervals we will spawn the ice floors in + var/spread_duration = 0.2 SECONDS + +/datum/action/cooldown/mob_cooldown/slippery_ice_floors/Activate(atom/target_atom) + for(var/i in 0 to radius) + var/list/list_of_turfs = border_diamond_range_turfs(owner, i) + addtimer(CALLBACK(src, PROC_REF(spawn_icy_floors), list_of_turfs), i * spread_duration) + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/slippery_ice_floors/proc/spawn_icy_floors(list/list_of_turfs) + if(!length(list_of_turfs)) + return + for(var/turf/location in list_of_turfs) + if(isnull(location)) + continue + if(isclosedturf(location) || isspaceturf(location)) + continue + new /obj/effect/temp_visual/slippery_ice(location) + +/obj/effect/temp_visual/slippery_ice + name = "slippery acid" + icon = 'icons/turf/floors/ice_turf.dmi' + icon_state = "ice_turf-6" + layer = BELOW_MOB_LAYER + plane = GAME_PLANE + anchored = TRUE + duration = 3 SECONDS + alpha = 100 + /// how long does it take for the effect to phase in + var/phase_in_period = 2 SECONDS + +/obj/effect/temp_visual/slippery_ice/Initialize(mapload) + . = ..() + animate(src, alpha = 160, time = phase_in_period) + animate(alpha = 0, time = duration - phase_in_period) /// slowly fade out of existence + addtimer(CALLBACK(src, PROC_REF(add_slippery_component), phase_in_period)) //only become slippery after we phased in + +/obj/effect/temp_visual/slippery_ice/proc/add_slippery_component() + AddComponent(/datum/component/slippery, 2 SECONDS) + +/datum/action/cooldown/spell/conjure/create_afterimages + name = "Create After Images" + button_icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' + button_icon_state = "ice_demon" + spell_requirements = NONE + cooldown_time = 1 MINUTES + summon_type = list(/mob/living/basic/mining/demon_afterimage) + summon_radius = 1 + summon_amount = 2 + ///max number of after images + var/max_afterimages = 2 + ///How many clones do we have summoned + var/number_of_afterimages = 0 + +/datum/action/cooldown/spell/conjure/create_afterimages/can_cast_spell(feedback = TRUE) + . = ..() + if(!.) + return FALSE + if(number_of_afterimages >= max_afterimages) + return FALSE + return TRUE + +/datum/action/cooldown/spell/conjure/create_afterimages/post_summon(atom/summoned_object, atom/cast_on) + var/mob/living/basic/created_copy = summoned_object + created_copy.AddComponent(/datum/component/joint_damage, overlord_mob = owner) + RegisterSignals(created_copy, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(delete_copy)) + number_of_afterimages++ + +/datum/action/cooldown/spell/conjure/create_afterimages/proc/delete_copy(mob/source) + SIGNAL_HANDLER + + UnregisterSignal(source, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH)) + number_of_afterimages-- diff --git a/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_ai.dm b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_ai.dm new file mode 100644 index 000000000000..20bcd8a69a13 --- /dev/null +++ b/code/modules/mob/living/basic/icemoon/ice_demon/ice_demon_ai.dm @@ -0,0 +1,116 @@ +/datum/ai_controller/basic_controller/ice_demon + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_LIST_SCARY_ITEMS = list( + /obj/item/weldingtool, + /obj/item/flashlight/flare, + ), + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/flee_target/ice_demon, + /datum/ai_planning_subtree/ranged_skirmish/ice_demon, + /datum/ai_planning_subtree/maintain_distance/cover_minimum_distance/ice_demon, + /datum/ai_planning_subtree/teleport_away_from_target, + /datum/ai_planning_subtree/find_and_hunt_target/teleport_destination, + /datum/ai_planning_subtree/targeted_mob_ability/summon_afterimages, + ) + + +/datum/ai_planning_subtree/maintain_distance/cover_minimum_distance/ice_demon + maximum_distance = 7 + +/datum/ai_planning_subtree/teleport_away_from_target + ability_key = BB_DEMON_TELEPORT_ABILITY + +/datum/ai_planning_subtree/find_and_hunt_target/teleport_destination + target_key = BB_TELEPORT_DESTINATION + hunting_behavior = /datum/ai_behavior/hunt_target/use_ability_on_target/demon_teleport + finding_behavior = /datum/ai_behavior/find_valid_teleport_location + hunt_targets = list(/turf/open) + hunt_range = 3 + finish_planning = FALSE + +/datum/ai_planning_subtree/find_and_hunt_target/teleport_destination/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) + return + if(controller.blackboard_key_exists(BB_ESCAPE_DESTINATION)) + controller.clear_blackboard_key(BB_TELEPORT_DESTINATION) + return + var/datum/action/cooldown/ability = controller.blackboard[BB_DEMON_TELEPORT_ABILITY] + if(!ability?.IsAvailable()) + return + return ..() + +/datum/ai_behavior/find_valid_teleport_location + +/datum/ai_behavior/find_valid_teleport_location/perform(seconds_per_tick, datum/ai_controller/controller, hunting_target_key, types_to_hunt, hunt_range) + . = ..() + var/mob/living/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + var/list/possible_turfs = list() + + if(QDELETED(target)) + finish_action(controller, FALSE) + return + + for(var/turf/open/potential_turf in oview(hunt_range, target)) //we check for turfs around the target + if(potential_turf.is_blocked_turf()) + continue + if(!can_see(target, potential_turf, hunt_range)) + continue + possible_turfs += potential_turf + + if(!length(possible_turfs)) + finish_action(controller, FALSE) + return + + controller.set_blackboard_key(hunting_target_key, pick(possible_turfs)) + finish_action(controller, TRUE) + +/datum/ai_behavior/hunt_target/use_ability_on_target/demon_teleport + hunt_cooldown = 2 SECONDS + ability_key = BB_DEMON_TELEPORT_ABILITY + behavior_flags = NONE + +/datum/ai_planning_subtree/targeted_mob_ability/summon_afterimages + ability_key = BB_DEMON_CLONE_ABILITY + +/datum/ai_planning_subtree/targeted_mob_ability/summon_afterimages/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + if(living_pawn.health / living_pawn.maxHealth > 0.5) //only use this ability when under half health + return + return ..() + +/datum/ai_planning_subtree/flee_target/ice_demon + +/datum/ai_planning_subtree/flee_target/ice_demon/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if(QDELETED(target)) + return + if(!iscarbon(target)) + return + var/mob/living/carbon/human_target = target + + for(var/obj/held_item in human_target.held_items) + if(!is_type_in_list(held_item, controller.blackboard[BB_LIST_SCARY_ITEMS])) + continue + if(!held_item.light_on) + continue + var/datum/action/cooldown/slip_ability = controller.blackboard[BB_DEMON_SLIP_ABILITY] + if(slip_ability?.IsAvailable()) + controller.queue_behavior(/datum/ai_behavior/use_mob_ability, BB_DEMON_SLIP_ABILITY) + return ..() + +/datum/ai_planning_subtree/ranged_skirmish/ice_demon + min_range = 0 + +/datum/ai_controller/basic_controller/ice_demon/afterimage + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/flee_target/ice_demon, //even the afterimages are afraid of flames! + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + diff --git a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm index 465d724944b2..e20da2fdfea3 100644 --- a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm +++ b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp.dm @@ -43,12 +43,12 @@ AddElement(/datum/element/footstep, FOOTSTEP_MOB_HEAVY) AddComponent(/datum/component/basic_mob_ability_telegraph) AddComponent(/datum/component/basic_mob_attack_telegraph, telegraph_duration = 0.6 SECONDS) - var/datum/action/cooldown/mob_cooldown/ice_breath/flamethrower = new(src) - var/datum/action/cooldown/mob_cooldown/ice_breathe_all_directions/wide_flames = new(src) + var/datum/action/cooldown/mob_cooldown/fire_breath/ice/flamethrower = new(src) flamethrower.Grant(src) + ai_controller.set_blackboard_key(BB_WHELP_STRAIGHTLINE_FIRE, flamethrower) + var/datum/action/cooldown/mob_cooldown/fire_breath/ice/cross/wide_flames = new(src) wide_flames.Grant(src) ai_controller.set_blackboard_key(BB_WHELP_WIDESPREAD_FIRE, wide_flames) - ai_controller.set_blackboard_key(BB_WHELP_STRAIGHTLINE_FIRE, flamethrower) RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) @@ -69,6 +69,7 @@ INVOKE_ASYNC(src, PROC_REF(cannibalize_victim), victim) return COMPONENT_HOSTILE_NO_ATTACK +/// Carve a stone into a beautiful self-portrait /mob/living/basic/mining/ice_whelp/proc/create_sculpture(atom/target) balloon_alert(src, "sculpting...") if(!do_after(src, 5 SECONDS, target = target)) @@ -80,7 +81,9 @@ dragon_statue.set_anchored(TRUE) qdel(target) +/// Gib and consume our fellow ice drakes /mob/living/basic/mining/ice_whelp/proc/cannibalize_victim(mob/living/target) + start_pulling(target) balloon_alert(src, "devouring...") if(!do_after(src, 5 SECONDS, target)) return diff --git a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_abilities.dm b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_abilities.dm index fa42958f9a00..026106516fb6 100644 --- a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_abilities.dm +++ b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_abilities.dm @@ -1,22 +1,26 @@ -/datum/action/cooldown/mob_cooldown/ice_breath +/// Breathe "fire" in a line (it's freezing cold) +/datum/action/cooldown/mob_cooldown/fire_breath/ice name = "Ice Breath" desc = "Fire a cold line of fire towards the enemy!" button_icon = 'icons/effects/magic.dmi' button_icon_state = "fireball" cooldown_time = 3 SECONDS melee_cooldown_time = 0 SECONDS - click_to_activate = TRUE - ///the range of fire - var/fire_range = 4 + fire_range = 4 + fire_damage = 10 -/datum/action/cooldown/mob_cooldown/ice_breath/Activate(atom/target_atom) - var/turf/target_fire_turf = get_ranged_target_turf_direct(owner, target_atom, fire_range) - var/list/burn_turfs = get_line(owner, target_fire_turf) - get_turf(owner) - dragon_fire_line(owner, burn_turfs, frozen = TRUE) - StartCooldown() - return TRUE +/datum/action/cooldown/mob_cooldown/fire_breath/ice/burn_turf(turf/fire_turf, list/hit_list, atom/source) + var/obj/effect/hotspot/fire_hotspot = ..() + fire_hotspot.add_atom_colour(COLOR_BLUE_LIGHT, FIXED_COLOUR_PRIORITY) // You're blue now, that's my attack + return fire_hotspot -/datum/action/cooldown/mob_cooldown/ice_breathe_all_directions +/datum/action/cooldown/mob_cooldown/fire_breath/ice/on_burn_mob(mob/living/barbecued, mob/living/source) + barbecued.apply_status_effect(/datum/status_effect/ice_block_talisman, 2 SECONDS) + to_chat(barbecued, span_userdanger("You're frozen solid by [source]'s icy breath!")) + barbecued.adjustFireLoss(fire_damage) + +/// Breathe really cold fire in a plus shape, like bomberman +/datum/action/cooldown/mob_cooldown/fire_breath/ice/cross name = "Fire all directions" desc = "Unleash lines of cold fire in all directions" button_icon = 'icons/effects/fire.dmi' @@ -24,13 +28,10 @@ cooldown_time = 4 SECONDS melee_cooldown_time = 0 SECONDS click_to_activate = FALSE - ///the range of fire - var/fire_range = 6 + fire_range = 6 -/datum/action/cooldown/mob_cooldown/ice_breathe_all_directions/Activate(atom/target_atom) +/datum/action/cooldown/mob_cooldown/fire_breath/ice/cross/attack_sequence(atom/target) + playsound(owner.loc, fire_sound, 200, TRUE) for(var/direction in GLOB.cardinals) var/turf/target_fire_turf = get_ranged_target_turf(owner, direction, fire_range) - var/list/burn_turfs = get_line(owner, target_fire_turf) - get_turf(owner) - INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(dragon_fire_line), owner, burn_turfs, frozen = TRUE) - StartCooldown() - return TRUE + fire_line(target_fire_turf) diff --git a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_ai.dm b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_ai.dm index 08c5fda3fd89..725dcc09b5ec 100644 --- a/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_ai.dm +++ b/code/modules/mob/living/basic/icemoon/ice_whelp/ice_whelp_ai.dm @@ -1,7 +1,8 @@ #define ENRAGE_ADDITION 25 /datum/ai_controller/basic_controller/ice_whelp blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items/goliath, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, BB_WHELP_ENRAGED = 0, ) @@ -13,54 +14,33 @@ /datum/ai_planning_subtree/attack_obstacle_in_path, /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/sculpt_statues, - /datum/ai_planning_subtree/find_and_hunt_target/cannibalize, + /datum/ai_planning_subtree/find_and_hunt_target/corpses/ice_whelp, /datum/ai_planning_subtree/burn_trees, ) - -/datum/ai_planning_subtree/find_and_hunt_target/cannibalize +/datum/ai_planning_subtree/find_and_hunt_target/corpses/ice_whelp target_key = BB_TARGET_CANNIBAL - hunting_behavior = /datum/ai_behavior/cannibalize - finding_behavior = /datum/ai_behavior/find_hunt_target/dragon_corpse + finding_behavior = /datum/ai_behavior/find_hunt_target/corpses/dragon_corpse + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/dragon_cannibalise hunt_targets = list(/mob/living/basic/mining/ice_whelp) hunt_range = 10 -/datum/ai_behavior/find_hunt_target/dragon_corpse +/datum/ai_behavior/find_hunt_target/corpses/dragon_corpse -/datum/ai_behavior/find_hunt_target/dragon_corpse/valid_dinner(mob/living/source, mob/living/dinner, radius) - if(dinner.stat != DEAD) - return FALSE +/datum/ai_behavior/find_hunt_target/corpses/dragon_corpse/valid_dinner(mob/living/source, mob/living/dinner, radius) if(dinner.pulledby) //someone already got him before us return FALSE + return ..() - return can_see(source, dinner, radius) - -/datum/ai_behavior/cannibalize +/datum/ai_behavior/hunt_target/unarmed_attack_target/dragon_cannibalise behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION -/datum/ai_behavior/cannibalize/setup(datum/ai_controller/controller, target_key) - . = ..() - var/atom/target = controller.blackboard[target_key] - if(QDELETED(target)) - return FALSE - set_movement_target(controller, target) - -/datum/ai_behavior/cannibalize/perform(seconds_per_tick, datum/ai_controller/controller, target_key, attack_key) - . = ..() - var/mob/living/basic/living_pawn = controller.pawn +/datum/ai_behavior/hunt_target/unarmed_attack_target/dragon_cannibalise/perform(seconds_per_tick, datum/ai_controller/controller, target_key, attack_key) var/mob/living/target = controller.blackboard[target_key] - - if(QDELETED(target)) + if(QDELETED(target) || target.stat != DEAD || target.pulledby) //we were too slow finish_action(controller, FALSE) return - - if(target.stat != DEAD || target.pulledby) //we were too slow - finish_action(controller, FALSE) - return - - living_pawn.start_pulling(target) - living_pawn.melee_attack(target) - finish_action(controller, TRUE) + return ..() /datum/ai_behavior/cannibalize/finish_action(datum/ai_controller/controller, succeeded, target_key) . = ..() @@ -70,14 +50,10 @@ /datum/ai_planning_subtree/sculpt_statues /datum/ai_planning_subtree/sculpt_statues/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - var/obj/target = controller.blackboard[BB_TARGET_ROCK] - - if(QDELETED(target)) - controller.queue_behavior(/datum/ai_behavior/find_and_set, BB_TARGET_ROCK, /obj/structure/flora/rock/icy) - return - - controller.queue_behavior(/datum/ai_behavior/sculpt_statue, BB_TARGET_ROCK) - return SUBTREE_RETURN_FINISH_PLANNING + if(controller.blackboard_key_exists(BB_TARGET_ROCK)) + controller.queue_behavior(/datum/ai_behavior/sculpt_statue, BB_TARGET_ROCK) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_and_set, BB_TARGET_ROCK, /obj/structure/flora/rock/icy) /datum/ai_behavior/sculpt_statue behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION @@ -136,16 +112,13 @@ /datum/ai_planning_subtree/burn_trees/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) var/datum/action/cooldown/using_action = controller.blackboard[BB_WHELP_STRAIGHTLINE_FIRE] - if (!using_action.IsAvailable()) - return - - var/obj/structure/target = controller.blackboard[BB_TARGET_TREE] - if(QDELETED(target)) - controller.queue_behavior(/datum/ai_behavior/set_target_tree, BB_TARGET_TREE) + if (!using_action?.IsAvailable()) return - controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability/and_clear_target/burn_trees, BB_WHELP_STRAIGHTLINE_FIRE, BB_TARGET_TREE) - return SUBTREE_RETURN_FINISH_PLANNING + if(controller.blackboard_key_exists(BB_TARGET_TREE)) + controller.queue_behavior(/datum/ai_behavior/targeted_mob_ability/and_clear_target/burn_trees, BB_WHELP_STRAIGHTLINE_FIRE, BB_TARGET_TREE) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/set_target_tree, BB_TARGET_TREE) /datum/ai_behavior/set_target_tree diff --git a/code/modules/mob/living/basic/icemoon/wolf/wolf.dm b/code/modules/mob/living/basic/icemoon/wolf/wolf.dm new file mode 100644 index 000000000000..c657fa428433 --- /dev/null +++ b/code/modules/mob/living/basic/icemoon/wolf/wolf.dm @@ -0,0 +1,91 @@ +/mob/living/basic/mining/wolf + name = "white wolf" + desc = "Pack hunters of the Icemoon wastes. While a mere nuisance individually, they become fearsome foes in larger groups." + icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' + icon_state = "whitewolf" + icon_living = "whitewolf" + icon_dead = "whitewolf_dead" + mob_biotypes = MOB_ORGANIC|MOB_BEAST + mouse_opacity = MOUSE_OPACITY_ICON + speak_emote = list("howls") + friendly_verb_continuous = "howls at" + friendly_verb_simple = "howl at" + + butcher_results = list( + /obj/item/food/meat/slab = 2, + /obj/item/stack/sheet/sinew/wolf = 2, + /obj/item/stack/sheet/bone = 2 + ) + crusher_loot = /obj/item/crusher_trophy/wolf_ear + + maxHealth = 130 + health = 130 + obj_damage = 15 + melee_damage_lower = 7.5 + melee_damage_upper = 7.5 + attack_vis_effect = ATTACK_EFFECT_BITE + melee_attack_cooldown = 1.2 SECONDS + + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + death_message = "snarls its last and perishes." + + attack_sound = 'sound/weapons/bite.ogg' + move_force = MOVE_FORCE_WEAK + move_resist = MOVE_FORCE_WEAK + pull_force = MOVE_FORCE_WEAK + + ai_controller = /datum/ai_controller/basic_controller/wolf + + //can we tame this wolf? + var/can_tame = TRUE + + //commands to give when tamed + var/static/list/pet_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/good_boy/wolf, + /datum/pet_command/follow/wolf, + /datum/pet_command/point_targeting/attack, + /datum/pet_command/point_targeting/fetch, + /datum/pet_command/play_dead, + /datum/pet_command/protect_owner, + ) + +/mob/living/basic/mining/wolf/Initialize(mapload) + . = ..() + + AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) + AddElement(/datum/element/ai_flee_while_injured) + AddElement(/datum/element/ai_retaliate) + AddComponent(/datum/component/basic_mob_ability_telegraph) + AddComponent(/datum/component/basic_mob_attack_telegraph, telegraph_duration = 0.6 SECONDS) + + if(can_tame) + make_tameable() + +/mob/living/basic/mining/wolf/proc/make_tameable() + AddComponent(\ + /datum/component/tameable,\ + food_types = list(/obj/item/food/meat/slab),\ + tame_chance = 15,\ + bonus_tame_chance = 5,\ + after_tame = CALLBACK(src, PROC_REF(tame_wolf)),\ + ) + +/mob/living/basic/mining/wolf/proc/tame_wolf() + new /obj/effect/temp_visual/heart(src.loc) + // ride wolf, life good + AddElement(/datum/element/ridable, /datum/component/riding/creature/wolf) + AddComponent(/datum/component/obeys_commands, pet_commands) + // this is purely a convenience thing once tamed so you can drag them away from shit + ai_controller.ai_traits = STOP_MOVING_WHEN_PULLED + // makes tamed wolves run away far less + ai_controller.set_blackboard_key(BB_BASIC_MOB_FLEE_DISTANCE, 7) + +//port the faction fix from goliath basicmob to make the wildlife hostile when tamed (and also help defuckulate reinforcements ai) +//this should also produce interesting behavior where tamed wolves defend other tamed wolves. +/mob/living/basic/mining/wolf/befriend(mob/living/new_friend) + . = ..() + faction = new_friend.faction.Copy() + visible_message(span_notice("[src] lowers [src.p_their()] snout at [new_friend]'s offering and begins to wag [src.p_their()] tail.")) diff --git a/code/modules/mob/living/basic/icemoon/wolf/wolf_ai.dm b/code/modules/mob/living/basic/icemoon/wolf/wolf_ai.dm new file mode 100644 index 000000000000..f0809d2ec86d --- /dev/null +++ b/code/modules/mob/living/basic/icemoon/wolf/wolf_ai.dm @@ -0,0 +1,36 @@ +//This mimicks the old simple_animal wolf behavior fairly closely. +//The 30 tiles fleeing is pretty wild and may need toning back under basicmob behavior, we'll have to see. +/datum/ai_controller/basic_controller/wolf + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + BB_BASIC_MOB_FLEE_DISTANCE = 30, + BB_VISION_RANGE = 9, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + BB_REINFORCEMENTS_EMOTE = "unleashes a chilling howl, calling for aid!" + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + //reinforcements needs to be skipped over entirely on tamed wolves because it causes them to attack their owner and then themselves + planning_subtrees = list( + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/call_reinforcements/wolf, + /datum/ai_planning_subtree/simple_find_nearest_target_to_flee, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/datum/ai_planning_subtree/call_reinforcements/wolf + +/datum/ai_planning_subtree/call_reinforcements/wolf/decide_to_call(datum/ai_controller/controller) + //only call reinforcements if the person who just smacked us isn't a friend to avoid hitting them once, then killing ourselves if we've been tamed + if (controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET) && istype(controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET], /mob)) + return !(controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] in controller.blackboard[BB_FRIENDS_LIST]) + else + return FALSE + diff --git a/code/modules/mob/living/basic/icemoon/wolf/wolf_extras.dm b/code/modules/mob/living/basic/icemoon/wolf/wolf_extras.dm new file mode 100644 index 000000000000..7765ec896a1e --- /dev/null +++ b/code/modules/mob/living/basic/icemoon/wolf/wolf_extras.dm @@ -0,0 +1,18 @@ +// Some flavor additions for wolf-related pet commands +/datum/pet_command/good_boy/wolf + speech_commands = list("good wolf") + +/datum/pet_command/follow/wolf + // Nordic-themed for a bit of extra flavor + speech_commands = list("heel", "follow", "fylgja", "fyl") + +// Contains pixel offset data for sprites riding wolves +/datum/component/riding/creature/wolf + +/datum/component/riding/creature/wolf/handle_specials() + . = ..() + set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(1, 9), TEXT_SOUTH = list(1, 9), TEXT_EAST = list(0, 9), TEXT_WEST = list(2, 9))) + set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER) + set_vehicle_dir_layer(NORTH, OBJ_LAYER) + set_vehicle_dir_layer(EAST, OBJ_LAYER) + set_vehicle_dir_layer(WEST, OBJ_LAYER) diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm index 7f40e6ae0a16..bb109fdde61a 100644 --- a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm @@ -36,12 +36,11 @@ /mob/living/basic/mega_arachnid/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) var/datum/action/cooldown/spell/pointed/projectile/flesh_restraints/restrain = new(src) - var/datum/action/small_sprite/mega_arachnid/mini_arachnid = new(src) var/datum/action/cooldown/mob_cooldown/secrete_acid/acid_spray = new(src) acid_spray.Grant(src) restrain.Grant(src) - mini_arachnid.Grant(src) AddElement(/datum/element/swabable, CELL_LINE_TABLE_MEGA_ARACHNID, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) AddComponent(/datum/component/appearance_on_aggro, alpha_on_aggro = 255, alpha_on_deaggro = alpha) AddComponent(/datum/component/tree_climber, climbing_distance = 15) diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm index e8c4d1723e79..6e8ff992891b 100644 --- a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm @@ -17,7 +17,7 @@ icon_state = "tentacle_end" damage = 0 -/obj/projectile/mega_arachnid/on_hit(atom/target, blocked = FALSE) +/obj/projectile/mega_arachnid/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(!iscarbon(target) || blocked >= 100) return diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm index e2c67af24674..fa2a86787d86 100644 --- a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm @@ -1,7 +1,7 @@ /datum/ai_controller/basic_controller/mega_arachnid blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_BASIC_MOB_FLEEING = TRUE, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_BASIC_MOB_FLEE_DISTANCE = 5, ) ai_movement = /datum/ai_movement/basic_avoidance @@ -36,7 +36,7 @@ flee_behaviour = /datum/ai_behavior/run_away_from_target/mega_arachnid /datum/ai_planning_subtree/flee_target/mega_arachnid/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - if(!controller.blackboard[BB_BASIC_MOB_FLEEING]) + if(controller.blackboard[BB_BASIC_MOB_STOP_FLEEING]) return var/datum/action/cooldown/slip_acid = controller.blackboard[BB_ARACHNID_SLIP] @@ -47,7 +47,6 @@ /datum/ai_behavior/run_away_from_target/mega_arachnid clear_failed_targets = FALSE - run_distance = 5 ///only engage in melee combat against cuffed targets, otherwise keep throwing restraints at them /datum/ai_planning_subtree/basic_melee_attack_subtree/mega_arachnid diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling.dm b/code/modules/mob/living/basic/jungle/seedling/seedling.dm new file mode 100644 index 000000000000..dfc20450a005 --- /dev/null +++ b/code/modules/mob/living/basic/jungle/seedling/seedling.dm @@ -0,0 +1,348 @@ +#define SEEDLING_STATE_NEUTRAL 0 +#define SEEDLING_STATE_WARMUP 1 +#define SEEDLING_STATE_ACTIVE 2 + +/** + * A mobile plant with a rapid ranged attack. + * It can pick up watering cans and look after plants. + */ +/mob/living/basic/seedling + name = "seedling" + desc = "This oversized, predatory flower conceals what can only be described as an organic energy cannon." + icon = 'icons/mob/simple/jungle/seedling.dmi' + icon_state = "seedling" + icon_living = "seedling" + icon_dead = "seedling_dead" + habitable_atmos = list("min_oxy" = 2, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minimum_survivable_temperature = 0 + maximum_survivable_temperature = 450 + mob_biotypes = MOB_ORGANIC | MOB_PLANT + maxHealth = 100 + health = 100 + pixel_y = -14 + base_pixel_y = -14 + pixel_x = -14 + base_pixel_x = -14 + response_harm_continuous = "strikes" + response_harm_simple = "strike" + melee_damage_lower = 30 + melee_damage_upper = 30 + lighting_cutoff_green = 20 + lighting_cutoff_blue = 25 + mob_size = MOB_SIZE_LARGE + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_SLASH + ai_controller = /datum/ai_controller/basic_controller/seedling + ///the state of combat we are in + var/combatant_state = SEEDLING_STATE_NEUTRAL + ///the colors our petals can have + var/static/list/possible_colors = list(COLOR_RED, COLOR_YELLOW, COLOR_OLIVE, COLOR_CYAN) + ///appearance when we are in our normal state + var/mutable_appearance/petal_neutral + ///appearance when we are in our warmup state + var/mutable_appearance/petal_warmup + ///appearance when we are in the firing state + var/mutable_appearance/petal_active + ///appearance when we are dead + var/mutable_appearance/petal_dead + ///the bucket we carry + var/obj/item/reagent_containers/cup/held_can + ///commands we follow + var/list/seedling_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/follow, + ) + +/mob/living/basic/seedling/Initialize(mapload) + . = ..() + var/datum/action/cooldown/mob_cooldown/projectile_attack/rapid_fire/seedling/seed_attack = new(src) + seed_attack.Grant(src) + ai_controller.set_blackboard_key(BB_RAPIDSEEDS_ABILITY, seed_attack) + var/datum/action/cooldown/mob_cooldown/solarbeam/beam_attack = new(src) + beam_attack.Grant(src) + ai_controller.set_blackboard_key(BB_SOLARBEAM_ABILITY, beam_attack) + + var/petal_color = pick(possible_colors) + + petal_neutral = mutable_appearance(icon, "[icon_state]_overlay") + petal_neutral.color = petal_color + + petal_warmup = mutable_appearance(icon, "[icon_state]_charging_overlay") + petal_warmup.color = petal_color + + petal_active = mutable_appearance(icon, "[icon_state]_fire_overlay") + petal_active.color = petal_color + + petal_dead = mutable_appearance(icon, "[icon_state]_dead_overlay") + petal_dead.color = petal_color + + AddElement(/datum/element/wall_smasher) + AddComponent(/datum/component/obeys_commands, seedling_commands) + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + RegisterSignal(src, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(drop_can)) + update_appearance() + +/mob/living/basic/seedling/proc/pre_attack(mob/living/puncher, atom/target) + SIGNAL_HANDLER + + if(istype(target, /obj/machinery/hydroponics)) + treat_hydro_tray(target) + return COMPONENT_HOSTILE_NO_ATTACK + + if(isnull(held_can)) + return + + if(istype(target, /obj/structure/sink) || istype(target, /obj/structure/reagent_dispensers)) + INVOKE_ASYNC(held_can, TYPE_PROC_REF(/obj/item, melee_attack_chain), src, target) + return COMPONENT_HOSTILE_NO_ATTACK + + +///seedlings can water trays, remove weeds, or remove dead plants +/mob/living/basic/seedling/proc/treat_hydro_tray(obj/machinery/hydroponics/hydro) + + if(hydro.plant_status == HYDROTRAY_PLANT_DEAD) + balloon_alert(src, "dead plant removed") + hydro.set_seed(null) + return + + if(hydro.weedlevel > 0) + balloon_alert(src, "weeds uprooted") + hydro.set_weedlevel(0) + return + + var/list/can_reagents = held_can?.reagents.reagent_list + + if(!length(can_reagents)) + return + + if((locate(/datum/reagent/water) in can_reagents) && (hydro.waterlevel < hydro.maxwater)) + INVOKE_ASYNC(held_can, TYPE_PROC_REF(/obj/item, melee_attack_chain), src, hydro) + return + +/mob/living/basic/seedling/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) + . = ..() + + if(!. || !proximity_flag || held_can) + return + + if(!istype(attack_target, /obj/item/reagent_containers/cup/watering_can)) + return + + var/obj/item/can_target = attack_target + can_target.forceMove(src) + +/mob/living/basic/seedling/proc/change_combatant_state(state) + combatant_state = state + update_appearance() + +/mob/living/basic/seedling/attackby(obj/item/can, mob/living/carbon/human/user, list/modifiers) + if(istype(can, /obj/item/reagent_containers/cup/watering_can) && isnull(held_can)) + can.forceMove(src) + return + + return ..() + +/mob/living/basic/seedling/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + if(istype(arrived, /obj/item/reagent_containers/cup/watering_can)) + held_can = arrived + update_appearance() + + return ..() + +/mob/living/basic/seedling/update_overlays() + . = ..() + if(stat == DEAD) + . += petal_dead + return + + switch(combatant_state) + if(SEEDLING_STATE_NEUTRAL) + . += petal_neutral + if(held_can) + . += mutable_appearance(icon, "seedling_can_overlay") + if(SEEDLING_STATE_WARMUP) + . += petal_warmup + if(SEEDLING_STATE_ACTIVE) + . += petal_active + +/mob/living/basic/seedling/update_icon_state() + . = ..() + if(stat == DEAD) + return + switch(combatant_state) + if(SEEDLING_STATE_NEUTRAL) + icon_state = "seedling" + if(SEEDLING_STATE_WARMUP) + icon_state = "seedling_charging" + if(SEEDLING_STATE_ACTIVE) + icon_state = "seedling_fire" + +/mob/living/basic/seedling/proc/drop_can(mob/living/user) + SIGNAL_HANDLER + + if(isnull(held_can)) + return + dropItemToGround(held_can) + return COMSIG_KB_ACTIVATED + +/mob/living/basic/seedling/Exited(atom/movable/gone, direction) + . = ..() + if(gone != held_can) + return + held_can = null + update_appearance() + +/mob/living/basic/seedling/death(gibbed) + . = ..() + if(isnull(held_can)) + return + held_can.forceMove(drop_location()) + +/mob/living/basic/seedling/Destroy() + QDEL_NULL(held_can) + return ..() + +/mob/living/basic/seedling/meanie + maxHealth = 400 + health = 400 + faction = list(FACTION_JUNGLE) + ai_controller = /datum/ai_controller/basic_controller/seedling/meanie + seedling_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/follow, + /datum/pet_command/point_targeting/attack, + /datum/pet_command/point_targeting/use_ability/solarbeam, + /datum/pet_command/point_targeting/use_ability/rapidseeds, + ) + +//abilities +/datum/action/cooldown/mob_cooldown/projectile_attack/rapid_fire/seedling + name = "Solar Energy" + button_icon = 'icons/obj/weapons/guns/projectiles.dmi' + button_icon_state = "seedling" + desc = "Fire small beams of solar energy." + cooldown_time = 10 SECONDS + projectile_type = /obj/projectile/seedling + default_projectile_spread = 10 + shot_count = 10 + shot_delay = 0.2 SECONDS + melee_cooldown_time = 0 SECONDS + shared_cooldown = NONE + ///how long we must charge up before firing off + var/charge_up_timer = 3 SECONDS + ///is the owner of this ability a seedling? + var/is_seedling = FALSE + +/datum/action/cooldown/mob_cooldown/projectile_attack/rapid_fire/seedling/Grant(mob/grant_to) + . = ..() + if(isnull(owner)) + return + is_seedling = istype(owner, /mob/living/basic/seedling) + +/datum/action/cooldown/mob_cooldown/projectile_attack/rapid_fire/seedling/IsAvailable(feedback) + . = ..() + if(!.) + return FALSE + if(!is_seedling) + return TRUE + var/mob/living/basic/seedling/seed_owner = owner + if(seed_owner.combatant_state != SEEDLING_STATE_NEUTRAL) + if(feedback) + seed_owner.balloon_alert(seed_owner, "charging!") + return FALSE + return TRUE + +/datum/action/cooldown/mob_cooldown/projectile_attack/rapid_fire/seedling/Activate(atom/target) + if(is_seedling) + var/mob/living/basic/seedling/seed_owner = owner + seed_owner.change_combatant_state(state = SEEDLING_STATE_WARMUP) + addtimer(CALLBACK(src, PROC_REF(attack_sequence), owner, target), charge_up_timer) + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/projectile_attack/rapid_fire/seedling/attack_sequence(mob/living/firer, atom/target) + if(is_seedling) + var/mob/living/basic/seedling/seed_owner = owner + seed_owner.change_combatant_state(state = SEEDLING_STATE_ACTIVE) + addtimer(CALLBACK(seed_owner, TYPE_PROC_REF(/mob/living/basic/seedling, change_combatant_state), SEEDLING_STATE_NEUTRAL), 4 SECONDS) + + return ..() + + +/datum/action/cooldown/mob_cooldown/solarbeam + name = "Solar Beam" + button_icon = 'icons/effects/beam.dmi' + button_icon_state = "solar_beam" + desc = "Concentrate the power of the sun onto your target!" + cooldown_time = 30 SECONDS + shared_cooldown = NONE + ///how long will it take for us to charge up the beam + var/beam_charge_up = 3 SECONDS + ///is the owner of this ability a seedling? + var/is_seedling = FALSE + +/datum/action/cooldown/mob_cooldown/solarbeam/Grant(mob/grant_to) + . = ..() + if(isnull(owner)) + return + is_seedling = istype(owner, /mob/living/basic/seedling) + +/datum/action/cooldown/mob_cooldown/solarbeam/IsAvailable(feedback) + . = ..() + if(!.) + return FALSE + if(!is_seedling) + return TRUE + var/mob/living/basic/seedling/seed_owner = owner + if(seed_owner.combatant_state != SEEDLING_STATE_NEUTRAL) + if(feedback) + seed_owner.balloon_alert(seed_owner, "charging!") + return FALSE + return TRUE + +/datum/action/cooldown/mob_cooldown/solarbeam/Activate(atom/target) + if(is_seedling) + var/mob/living/basic/seedling/seed_owner = owner + seed_owner.change_combatant_state(state = SEEDLING_STATE_WARMUP) + + var/turf/target_turf = get_turf(target) + playsound(owner, 'sound/effects/seedling_chargeup.ogg', 100, FALSE) + + var/obj/effect/temp_visual/solarbeam_killsat/owner_beam = new(get_turf(owner)) + animate(owner_beam, transform = matrix().Scale(1, 32), alpha = 255, time = beam_charge_up) + + var/obj/effect/temp_visual/solarbeam_killsat/target_beam = new(target_turf) + animate(target_beam, transform = matrix().Scale(2, 1), alpha = 255, time = beam_charge_up) + + addtimer(CALLBACK(src, PROC_REF(launch_beam), owner, target_turf), beam_charge_up) + StartCooldown() + return TRUE + +///the solarbeam will damage people, otherwise it will heal plants +/datum/action/cooldown/mob_cooldown/solarbeam/proc/launch_beam(mob/living/firer, turf/target_turf) + for(var/atom/target_atom as anything in target_turf) + + if(istype(target_atom, /obj/machinery/hydroponics)) + var/obj/machinery/hydroponics/hydro = target_atom + hydro.adjust_plant_health(10) + new /obj/effect/temp_visual/heal(target_turf, COLOR_HEALING_CYAN) + + if(!isliving(target_atom)) + continue + + var/mob/living/living_target = target_atom + living_target.adjust_fire_stacks(0.2) + living_target.ignite_mob() + living_target.adjustFireLoss(30) + + playsound(target_turf, 'sound/magic/lightningbolt.ogg', 50, TRUE) + if(!is_seedling) + return + var/mob/living/basic/seedling/seed_firer = firer + seed_firer.change_combatant_state(state = SEEDLING_STATE_NEUTRAL) + +#undef SEEDLING_STATE_NEUTRAL +#undef SEEDLING_STATE_WARMUP +#undef SEEDLING_STATE_ACTIVE diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm b/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm new file mode 100644 index 000000000000..2ed4811e46f2 --- /dev/null +++ b/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm @@ -0,0 +1,178 @@ +/datum/ai_controller/basic_controller/seedling + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + BB_WEEDLEVEL_THRESHOLD = 3, + BB_WATERLEVEL_THRESHOLD = 90, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/find_and_hunt_target/watering_can, + /datum/ai_planning_subtree/find_and_hunt_target/fill_watercan, + /datum/ai_planning_subtree/find_and_hunt_target/treat_hydroplants, + /datum/ai_planning_subtree/find_and_hunt_target/beamable_hydroplants, + ) + +/datum/ai_planning_subtree/find_and_hunt_target/watering_can + target_key = BB_WATERCAN_TARGET + finding_behavior = /datum/ai_behavior/find_hunt_target + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target + hunt_targets = list(/obj/item/reagent_containers/cup/watering_can) + hunt_range = 7 + +/datum/ai_planning_subtree/find_and_hunt_target/watering_can/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + if(locate(/obj/item/reagent_containers/cup/watering_can) in living_pawn) //we already have what we came for! + return + return ..() + +/datum/ai_planning_subtree/find_and_hunt_target/treat_hydroplants + target_key = BB_HYDROPLANT_TARGET + finding_behavior = /datum/ai_behavior/find_and_set/treatable_hydro + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/treat_hydroplant + hunt_targets = list(/obj/machinery/hydroponics) + hunt_range = 7 + +/datum/ai_behavior/find_and_set/treatable_hydro + +/datum/ai_behavior/find_and_set/treatable_hydro/search_tactic(datum/ai_controller/controller, locate_path, search_range) + var/list/possible_trays = list() + var/mob/living/living_pawn = controller.pawn + var/waterlevel_threshold = controller.blackboard[BB_WATERLEVEL_THRESHOLD] + var/weedlevel_threshold = controller.blackboard[BB_WEEDLEVEL_THRESHOLD] + var/watering_can = locate(/obj/item/reagent_containers/cup/watering_can) in living_pawn + + for(var/obj/machinery/hydroponics/hydro in oview(search_range, controller.pawn)) + if(isnull(hydro.myseed)) + continue + if(hydro.waterlevel < waterlevel_threshold && watering_can) + possible_trays += hydro + continue + if(hydro.weedlevel > weedlevel_threshold || hydro.plant_status == HYDROTRAY_PLANT_DEAD) + possible_trays += hydro + continue + + if(possible_trays.len) + return pick(possible_trays) + +/datum/ai_behavior/hunt_target/unarmed_attack_target/treat_hydroplant + hunt_cooldown = 2 SECONDS + always_reset_target = TRUE + +/datum/ai_behavior/hunt_target/unarmed_attack_target/treat_hydroplant/target_caught(mob/living/living_pawn, obj/machinery/hydroponics/hydro_target) + if(QDELETED(hydro_target) || QDELETED(hydro_target.myseed)) + return + + if(hydro_target.plant_status == HYDROTRAY_PLANT_DEAD) + living_pawn.manual_emote("weeps...") //weep over the dead plants + return ..() + + +/datum/ai_planning_subtree/find_and_hunt_target/beamable_hydroplants + target_key = BB_BEAMABLE_HYDROPLANT_TARGET + finding_behavior = /datum/ai_behavior/find_and_set/beamable_hydroplants + hunting_behavior = /datum/ai_behavior/hunt_target/use_ability_on_target/solarbeam + hunt_targets = list(/obj/machinery/hydroponics) + hunt_range = 7 + +/datum/ai_planning_subtree/find_and_hunt_target/beamable_hydroplants/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/datum/action/cooldown/solar_ability = controller.blackboard[BB_SOLARBEAM_ABILITY] + if(QDELETED(solar_ability) || !solar_ability.IsAvailable()) + return + return ..() + +/datum/ai_behavior/hunt_target/use_ability_on_target/solarbeam + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + required_distance = 2 + action_cooldown = 1 MINUTES + ability_key = BB_SOLARBEAM_ABILITY + +/datum/ai_behavior/hunt_target/use_ability_on_target/solarbeam/setup(datum/ai_controller/controller, target_key, ability_key) + . = ..() + var/obj/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/find_and_set/beamable_hydroplants/search_tactic(datum/ai_controller/controller, locate_path, search_range) + var/list/possible_trays = list() + + for(var/obj/machinery/hydroponics/hydro in oview(search_range, controller.pawn)) + if(isnull(hydro.myseed)) + continue + if(hydro.plant_health < hydro.myseed.endurance) + possible_trays += hydro + + if(possible_trays.len) + return pick(possible_trays) + +/datum/ai_planning_subtree/find_and_hunt_target/fill_watercan + target_key = BB_LOW_PRIORITY_HUNTING_TARGET + finding_behavior = /datum/ai_behavior/find_hunt_target/suitable_dispenser + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/water_source + hunt_targets = list(/obj/structure/sink, /obj/structure/reagent_dispensers) + hunt_range = 7 + +/datum/ai_planning_subtree/find_and_hunt_target/fill_watercan/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + var/obj/item/reagent_containers/can = locate(/obj/item/reagent_containers/cup/watering_can) in living_pawn + + if(isnull(can)) + return + if(locate(/datum/reagent/water) in can.reagents.reagent_list) + return + + return ..() + +/datum/ai_behavior/find_hunt_target/suitable_dispenser + +/datum/ai_behavior/find_hunt_target/suitable_dispenser/valid_dinner(mob/living/source, obj/structure/water_source, radius) + if(!(locate(/datum/reagent/water) in water_source.reagents.reagent_list)) + return FALSE + + return can_see(source, water_source, radius) + +/datum/ai_behavior/hunt_target/unarmed_attack_target/water_source + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + hunt_cooldown = 5 SECONDS + +/datum/ai_controller/basic_controller/seedling/meanie + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + ) + planning_subtrees = list( + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability/seedling_rapid, + /datum/ai_planning_subtree/targeted_mob_ability/solarbeam, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/datum/ai_planning_subtree/targeted_mob_ability/seedling_rapid + ability_key = BB_RAPIDSEEDS_ABILITY + finish_planning = FALSE + +/datum/ai_planning_subtree/targeted_mob_ability/solarbeam + ability_key = BB_SOLARBEAM_ABILITY + finish_planning = FALSE + +///pet commands +/datum/pet_command/point_targeting/use_ability/solarbeam + command_name = "Launch solarbeam" + command_desc = "Command your pet to launch a solarbeam at your target!" + radial_icon = 'icons/effects/beam.dmi' + radial_icon_state = "solar_beam" + speech_commands = list("beam", "solar") + pet_ability_key = BB_SOLARBEAM_ABILITY + +/datum/pet_command/point_targeting/use_ability/rapidseeds + command_name = "Rapid seeds" + command_desc = "Command your pet to launch a volley of seeds at your target!" + radial_icon = 'icons/obj/weapons/guns/projectiles.dmi' + radial_icon_state = "seedling" + speech_commands = list("rapid", "seeds", "volley") + pet_ability_key = BB_RAPIDSEEDS_ABILITY diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling_projectiles.dm b/code/modules/mob/living/basic/jungle/seedling/seedling_projectiles.dm new file mode 100644 index 000000000000..e502f3ec09fb --- /dev/null +++ b/code/modules/mob/living/basic/jungle/seedling/seedling_projectiles.dm @@ -0,0 +1,32 @@ +/obj/projectile/seedling + name = "solar energy" + icon_state = "seedling" + damage = 10 + damage_type = BURN + light_outer_range = 2 + armor_flag = ENERGY + light_color = LIGHT_COLOR_DIM_YELLOW + speed = 1.6 + hitsound = 'sound/weapons/sear.ogg' + hitsound_wall = 'sound/weapons/effects/searwall.ogg' + nondirectional_sprite = TRUE + +/obj/projectile/seedling/on_hit(atom/target, blocked = 0, pierce_hit) + if(!isliving(target)) + return ..() + + var/mob/living/living_target = target + if(FACTION_JUNGLE in living_target.faction) + return + + return ..() + +/obj/effect/temp_visual/solarbeam_killsat + name = "beam of solar energy" + icon_state = "solar_beam" + icon = 'icons/effects/beam.dmi' + plane = LIGHTING_PLANE + layer = LIGHTING_PRIMARY_LAYER + duration = 3 SECONDS + alpha = 200 + randomdir = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/basic/jungle/venus_human_trap.dm similarity index 62% rename from code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm rename to code/modules/mob/living/basic/jungle/venus_human_trap.dm index e5aa1d1be03f..5b08af939af9 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/basic/jungle/venus_human_trap.dm @@ -120,13 +120,14 @@ * The result of a kudzu flower bud, these enemies use vines to drag prey close to them for attack. * * A carnivorious plant which uses vines to catch and ensnare prey. Spawns from kudzu flower buds. - * Each one has a maximum of four vines, which can be attached to a variety of things. Carbons are stunned when a vine is attached to them, and movable entities are pulled closer over time. + * Each one can attach up to two temporary vines to objects or mobs and drag them around with it. * Attempting to attach a vine to something with a vine already attached to it will pull all movable targets closer on command. * Once the prey is in melee range, melee attacks from the venus human trap heals itself for 10% of its max health, assuming the target is alive. * Akin to certain spiders, venus human traps can also be possessed and controlled by ghosts. * */ -/mob/living/simple_animal/hostile/venus_human_trap + +/mob/living/basic/venus_human_trap name = "venus human trap" desc = "Now you know how the fly feels." icon = 'icons/effects/spacevines.dmi' @@ -135,24 +136,21 @@ mob_biotypes = MOB_ORGANIC | MOB_PLANT layer = SPACEVINE_MOB_LAYER plane = GAME_PLANE_UPPER_FOV_HIDDEN - health = 50 - maxHealth = 50 - ranged = TRUE - harm_intent_damage = 5 + health = 100 + maxHealth = 100 obj_damage = 60 - melee_damage_lower = 20 + melee_damage_lower = 10 melee_damage_upper = 20 - minbodytemp = 100 + minimum_survivable_temperature = 100 istate = ISTATE_HARM|ISTATE_BLOCKING - ranged_cooldown_time = 4 SECONDS - del_on_death = TRUE + basic_mob_flags = DEL_ON_DEATH death_message = "collapses into bits of plant matter." attacked_sound = 'sound/creatures/venus_trap_hurt.ogg' death_sound = 'sound/creatures/venus_trap_death.ogg' attack_sound = 'sound/creatures/venus_trap_hit.ogg' unsuitable_heat_damage = 5 // heat damage is different from cold damage since coldmos is significantly more common than plasmafires unsuitable_cold_damage = 2 // they now do take cold damage, but this should be sufficiently small that it does not cause major issues - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 0 /// copied over from the code from eyeballs (the mob) to make it easier for venus human traps to see in kudzu that doesn't have the transparency mutation sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS @@ -163,74 +161,81 @@ faction = list(FACTION_HOSTILE,FACTION_VINES,FACTION_PLANTS) initial_language_holder = /datum/language_holder/venus unique_name = TRUE - /// A list of all the plant's vines - var/list/vines = list() - /// The maximum amount of vines a plant can have at one time - var/max_vines = 4 - /// How far away a plant can attach a vine to something - var/vine_grab_distance = 5 - /// Whether or not this plant is ghost possessable - var/playable_plant = TRUE + speed = 1.2 + melee_attack_cooldown = 1.2 SECONDS + ai_controller = /datum/ai_controller/basic_controller/human_trap + ///how much damage we take out of weeds + var/no_weed_damage = 20 + ///how much do we heal in weeds + var/weed_heal = 10 + ///if the balloon alert was shown atleast once, reset after healing in weeds + var/alert_shown = FALSE -/mob/living/simple_animal/hostile/venus_human_trap/Life(seconds_per_tick = SSMOBS_DT, times_fired) +/mob/living/basic/venus_human_trap/Initialize(mapload) . = ..() - pull_vines() + var/datum/action/cooldown/vine_tangle/tangle = new(src) + tangle.Grant(src) + ai_controller.set_blackboard_key(BB_TARGETED_ACTION, tangle) -/mob/living/simple_animal/hostile/venus_human_trap/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - pixel_x = base_pixel_x + (dir & (NORTH|WEST) ? 2 : -2) +/mob/living/basic/venus_human_trap/RangedAttack(atom/victim) + if(!(istate & ISTATE_HARM)) + return + var/datum/action/cooldown/mob_cooldown/tangle_ability = ai_controller.blackboard[BB_TARGETED_ACTION] + if(!istype(tangle_ability)) + return + tangle_ability.Trigger(target = victim) -/mob/living/simple_animal/hostile/venus_human_trap/AttackingTarget() +/mob/living/basic/venus_human_trap/Life(seconds_per_tick = SSMOBS_DT, times_fired) . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.stat != DEAD) - adjustHealth(-maxHealth * 0.1) - -/mob/living/simple_animal/hostile/venus_human_trap/OpenFire(atom/the_target) - for(var/datum/beam/B in vines) - if(B.target == the_target) - pull_vines() - ranged_cooldown = world.time + (ranged_cooldown_time * 0.5) - return - if(get_dist(src,the_target) > vine_grab_distance || vines.len >= max_vines) + if(!.) + return FALSE + + var/vines_in_range = locate(/obj/structure/spacevine) in range(2, src) + if(!vines_in_range && !alert_shown) + alert_shown = TRUE + balloon_alert(src, "do not leave vines!") + else if(vines_in_range) + alert_shown = FALSE + + apply_damage(vines_in_range ? weed_heal : no_weed_damage, BRUTE) //every life tick take 20 brute if not near vines or heal 10 if near vines, 5 times out of weeds = u ded + +/datum/action/cooldown/vine_tangle + name = "Tangle" + button_icon = 'icons/mob/spacevines.dmi' + button_icon_state = "Light1" + desc = "Grabs a target with a sticky vine, allowing you to pull it alongside you." + cooldown_time = 8 SECONDS + ///how many vines can we handle + var/max_vines = 2 + /// An assoc list of all the plant's vines (beam = leash) + var/list/datum/beam/vines = list() + /// How far away a plant can attach a vine to something + var/vine_grab_distance = 4 + /// how long does a vine attached to something last (and its leash) (lasts twice as long on nonliving things) + var/vine_duration = 2 SECONDS + +/datum/action/cooldown/vine_tangle/Remove(mob/remove_from) + QDEL_LIST(vines) + return ..() + +/datum/action/cooldown/vine_tangle/Activate(atom/target_atom) + if(isturf(target_atom) || istype(target_atom, /obj/structure/spacevine)) return - for(var/turf/T in get_line(src,target)) - if (T.density) + if(length(vines) >= max_vines || get_dist(owner, target_atom) > vine_grab_distance) + return + for(var/turf/blockage in get_line(owner, target_atom)) + if(blockage.is_blocked_turf(exclude_mobs = TRUE)) return - for(var/obj/O in T) - if(O.density) - return - - var/datum/beam/newVine = Beam(the_target, icon_state = "vine", maxdistance = vine_grab_distance, beam_type=/obj/effect/ebeam/vine, emissive = FALSE) - RegisterSignal(newVine, COMSIG_PARENT_QDELETING, PROC_REF(remove_vine), newVine) - vines += newVine - if(isliving(the_target)) - var/mob/living/L = the_target - L.apply_damage(85, STAMINA, BODY_ZONE_CHEST) - L.Knockdown(1 SECONDS) - ranged_cooldown = world.time + ranged_cooldown_time - -/mob/living/simple_animal/hostile/venus_human_trap/Destroy() - for(var/datum/beam/vine as anything in vines) - qdel(vine) // reference is automatically deleted by remove_vine - return ..() -/** - * Manages how the vines should affect the things they're attached to. - * - * Pulls all movable targets of the vines closer to the plant - * If the target is on the same tile as the plant, destroy the vine - * Removes any QDELETED vines from the vines list. - */ -/mob/living/simple_animal/hostile/venus_human_trap/proc/pull_vines() - for(var/datum/beam/B in vines) - if(istype(B.target, /atom/movable)) - var/atom/movable/AM = B.target - if(!AM.anchored) - step(AM, get_dir(AM, src)) - if(get_dist(src, B.target) == 0) - qdel(B) + var/datum/beam/new_vine = owner.Beam(target_atom, icon_state = "vine", time = vine_duration * (ismob(target_atom) ? 1 : 2), beam_type = /obj/effect/ebeam/vine, emissive = FALSE) + var/component = target_atom.AddComponent(/datum/component/leash, owner, vine_grab_distance) + RegisterSignal(new_vine, COMSIG_PARENT_QDELETING, PROC_REF(remove_vine), new_vine) + vines[new_vine] = component + if(isliving(target_atom)) + var/mob/living/victim = target_atom + victim.Knockdown(2 SECONDS) + StartCooldown() + return TRUE /** * Removes a vine from the list. @@ -240,9 +245,24 @@ * Arguments: * * datum/beam/vine - The vine to be removed from the list. */ -/mob/living/simple_animal/hostile/venus_human_trap/proc/remove_vine(datum/beam/vine) +/datum/action/cooldown/vine_tangle/proc/remove_vine(datum/beam/vine) SIGNAL_HANDLER + qdel(vines[vine]) vines -= vine +/datum/ai_controller/basic_controller/human_trap + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability/continue_planning, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + #undef FINAL_BUD_GROWTH_ICON diff --git a/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm b/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm index c662870393c4..90b99a533f9f 100644 --- a/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm +++ b/code/modules/mob/living/basic/lavaland/basilisk/basilisk.dm @@ -43,6 +43,9 @@ /mob/living/basic/mining/basilisk/bullet_act(obj/projectile/bullet, def_zone, piercing_hit) . = ..() + if(. != BULLET_ACT_HIT) + return + if (istype(bullet, /obj/projectile/temp)) var/obj/projectile/temp/heat_bullet = bullet if (heat_bullet.temperature < 0) @@ -74,7 +77,8 @@ /datum/ai_controller/basic_controller/basilisk blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_AGGRO_RANGE = 5, ) ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_actions.dm b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_actions.dm index c3e753d992e7..b6f7468697a4 100644 --- a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_actions.dm +++ b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_actions.dm @@ -117,7 +117,7 @@ to_chat(devourer, span_warning("Someone stole your dinner!")) return to_chat(target, span_userdanger("You are consumed by [devourer]!")) - devourer.visible_message("[devourer] consumes [target]!") + devourer.visible_message(span_warning("[devourer] consumes [target]!")) devourer.fully_heal() playsound(devourer, 'sound/effects/splat.ogg', 50, TRUE) //to be recieved on death diff --git a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_ai.dm b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_ai.dm index 11d7168776b6..ea979febff3e 100644 --- a/code/modules/mob/living/basic/lavaland/bileworm/bileworm_ai.dm +++ b/code/modules/mob/living/basic/lavaland/bileworm/bileworm_ai.dm @@ -1,6 +1,6 @@ /datum/ai_controller/basic_controller/bileworm blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/bileworm(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/bileworm, ) planning_subtrees = list( @@ -9,15 +9,13 @@ /datum/ai_planning_subtree/bileworm_execute, ) -/datum/targetting_datum/basic/bileworm +/datum/targeting_strategy/basic/bileworm ignore_sight = TRUE /datum/ai_planning_subtree/bileworm_attack /datum/ai_planning_subtree/bileworm_attack/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - - var/mob/living/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] - if(QDELETED(target)) + if (!controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) return var/datum/action/cooldown/mob_cooldown/resurface = controller.blackboard[BB_BILEWORM_RESURFACE] diff --git a/code/modules/mob/living/basic/lavaland/brimdemon/brimbeam.dm b/code/modules/mob/living/basic/lavaland/brimdemon/brimbeam.dm new file mode 100644 index 000000000000..689bd280c1f9 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/brimdemon/brimbeam.dm @@ -0,0 +1,125 @@ +/// Fires a bloody beam. Brimdemon Blast! +/datum/action/cooldown/mob_cooldown/brimbeam + name = "brimstone blast" + desc = "Unleash a barrage of infernal energies in the targeted direction." + button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + button_icon_state = "brimdemon_firing" + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + click_to_activate = TRUE + cooldown_time = 5 SECONDS + melee_cooldown_time = 0 + /// How far does our beam go? + var/beam_range = 10 + /// How long does our beam last? + var/beam_duration = 2 SECONDS + /// How long do we wind up before firing? + var/charge_duration = 1 SECONDS + /// Overlay we show when we're about to fire + var/static/image/direction_overlay = image('icons/mob/simple/lavaland/lavaland_monsters.dmi', "brimdemon_telegraph_dir") + /// A list of all the beam parts. + var/list/beam_parts = list() + +/datum/action/cooldown/mob_cooldown/brimbeam/Destroy() + extinguish_laser() + return ..() + +/datum/action/cooldown/mob_cooldown/brimbeam/Activate(atom/target) + StartCooldown(360 SECONDS) + + owner.face_atom(target) + owner.move_resist = MOVE_FORCE_VERY_STRONG + owner.add_overlay(direction_overlay) + owner.balloon_alert_to_viewers("charging...") + + var/fully_charged = do_after(owner, delay = charge_duration, target = owner) + owner.cut_overlay(direction_overlay) + if (!fully_charged) + StartCooldown() + return TRUE + + if (!fire_laser()) + var/static/list/fail_emotes = list("coughs.", "wheezes.", "belches out a puff of black smoke.") + owner.manual_emote(pick(fail_emotes)) + StartCooldown() + return TRUE + + do_after(owner, delay = beam_duration, target = owner) + extinguish_laser() + StartCooldown() + return TRUE + +/// Create a laser in the direction we are facing +/datum/action/cooldown/mob_cooldown/brimbeam/proc/fire_laser() + owner.visible_message(span_danger("[owner] fires a brimbeam!")) + playsound(owner, 'sound/creatures/brimdemon.ogg', 150, FALSE, 0, 3) + var/turf/target_turf = get_ranged_target_turf(owner, owner.dir, beam_range) + var/turf/origin_turf = get_turf(owner) + var/list/affected_turfs = get_line(origin_turf, target_turf) - origin_turf + for(var/turf/affected_turf in affected_turfs) + if(affected_turf.opacity) + break + var/blocked = FALSE + for(var/obj/potential_block in affected_turf.contents) + if(potential_block.opacity) + blocked = TRUE + break + if(blocked) + break + var/atom/new_brimbeam = new /obj/effect/brimbeam(affected_turf) + new_brimbeam.dir = owner.dir + beam_parts += new_brimbeam + for(var/mob/living/hit_mob in affected_turf.contents) + hit_mob.apply_damage(damage = 25, damagetype = BURN) + to_chat(hit_mob, span_userdanger("You're blasted by [owner]'s brimbeam!")) + RegisterSignal(new_brimbeam, COMSIG_PARENT_QDELETING, PROC_REF(extinguish_laser)) // In case idk a singularity eats it or something + if(!length(beam_parts)) + return FALSE + var/atom/last_brimbeam = beam_parts[length(beam_parts)] + last_brimbeam.icon_state = "brimbeam_end" + var/atom/first_brimbeam = beam_parts[1] + first_brimbeam.icon_state = "brimbeam_start" + return TRUE + +/// Get rid of our laser when we are done with it +/datum/action/cooldown/mob_cooldown/brimbeam/proc/extinguish_laser() + if(!length(beam_parts)) + return FALSE + owner.move_resist = initial(owner.move_resist) + for(var/obj/effect/brimbeam/beam in beam_parts) + beam.disperse() + beam_parts = list() + +/// Segments of the actual beam, these hurt if you stand in them +/obj/effect/brimbeam + name = "brimbeam" + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "brimbeam_mid" + layer = ABOVE_MOB_LAYER + plane = ABOVE_GAME_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + light_color = LIGHT_COLOR_BLOOD_MAGIC + light_power = 3 + light_outer_range = 2 + +/obj/effect/brimbeam/Initialize(mapload) + . = ..() + START_PROCESSING(SSfastprocess, src) + +/obj/effect/brimbeam/Destroy() + STOP_PROCESSING(SSfastprocess, src) + return ..() + +/obj/effect/brimbeam/process() + for(var/mob/living/hit_mob in get_turf(src)) + damage(hit_mob) + +/// Hurt the passed mob +/obj/effect/brimbeam/proc/damage(mob/living/hit_mob) + hit_mob.apply_damage(damage = 5, damagetype = BURN) + to_chat(hit_mob, span_danger("You're damaged by [src]!")) + +/// Disappear +/obj/effect/brimbeam/proc/disperse() + animate(src, time = 0.5 SECONDS, alpha = 0) + QDEL_IN(src, 0.5 SECONDS) diff --git a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm new file mode 100644 index 000000000000..cbc6954f1a17 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon.dm @@ -0,0 +1,87 @@ +/// Lavaland mob which tries to line up with its target and fire a laser +/mob/living/basic/mining/brimdemon + name = "brimdemon" + desc = "A volatile creature resembling an enormous horned skull. Its response to almost any stimulus is to unleash a beam of infernal energy." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "brimdemon" + icon_living = "brimdemon" + icon_dead = "brimdemon_dead" + speed = 3 + maxHealth = 250 + health = 250 + friendly_verb_continuous = "scratches at" + friendly_verb_simple = "scratch at" + speak_emote = list("cackles") + melee_damage_lower = 7.5 + melee_damage_upper = 7.5 + attack_sound = 'sound/weapons/bite.ogg' + melee_attack_cooldown = 0.6 SECONDS + attack_vis_effect = ATTACK_EFFECT_BITE + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + death_message = "wails as infernal energy escapes from its wounds, leaving it an empty husk." + death_sound = 'sound/magic/demon_dies.ogg' + light_color = LIGHT_COLOR_BLOOD_MAGIC + light_power = 5 + light_outer_range = 1.4 + + ai_controller = /datum/ai_controller/basic_controller/brimdemon + + crusher_loot = /obj/item/crusher_trophy/brimdemon_fang + butcher_results = list( + /obj/item/food/meat/slab = 2, + /obj/effect/decal/cleanable/brimdust = 1, + /obj/item/organ/internal/monster_core/brimdust_sac = 1, + ) + /// How we get blasting + var/datum/action/cooldown/mob_cooldown/brimbeam/beam + +/mob/living/basic/mining/brimdemon/Initialize(mapload) + . = ..() + AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) + beam = new(src) + beam.Grant(src) + ai_controller.set_blackboard_key(BB_TARGETED_ACTION, beam) + +/mob/living/basic/mining/brimdemon/Destroy() + QDEL_NULL(beam) + return ..() + +/mob/living/basic/mining/brimdemon/RangedAttack(atom/target, modifiers) + beam.Trigger(target = target) + +/mob/living/basic/mining/brimdemon/death(gibbed) + . = ..() + if (gibbed) + return + var/obj/effect/temp_visual/brim_burst/bang = new(loc) + forceMove(bang) + +/// Show a funny animation before doing an explosion +/obj/effect/temp_visual/brim_burst + name = "bursting brimdemon" + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "brimdemon_dead" + duration = 1.9 SECONDS + +/obj/effect/temp_visual/brim_burst/Initialize(mapload) + . = ..() + addtimer(CALLBACK(src, PROC_REF(bang)), duration - (1 DECISECONDS), TIMER_DELETE_ME) + animate(src, color = "#ff8888", transform = matrix().Scale(1.1), time = 0.7 SECONDS) + animate(color = "#ffffff", transform = matrix(), time = 0.2 SECONDS) + animate(color = "#ff4444", transform = matrix().Scale(1.3), time = 0.5 SECONDS) + animate(color = "#ffffff", transform = matrix(), time = 0.2 SECONDS) + animate(color = "#ff0000", transform = matrix().Scale(1.5), time = 0.3 SECONDS) + +/// Make an explosion +/obj/effect/temp_visual/brim_burst/proc/bang() + var/turf/origin_turf = get_turf(src) + playsound(origin_turf, 'sound/effects/pop_expl.ogg', 50) + new /obj/effect/temp_visual/explosion/fast(origin_turf) + var/list/possible_targets = range(1, origin_turf) + for(var/mob/living/target in possible_targets) + var/armor = target.run_armor_check(attack_flag = BOMB) + target.apply_damage(20, damagetype = BURN, blocked = armor, spread_damage = TRUE) + + for (var/atom/movable/thing as anything in contents) + thing.forceMove(loc) diff --git a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_ai.dm b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_ai.dm new file mode 100644 index 000000000000..fe209387e008 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_ai.dm @@ -0,0 +1,48 @@ +/** + * Slap someone who is nearby, line up with target, blast with a beam + */ +/datum/ai_controller/basic_controller/brimdemon + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + ) + + ai_traits = PAUSE_DURING_DO_AFTER + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk/no_target + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree/opportunistic, + /datum/ai_planning_subtree/move_to_cardinal/brimdemon, + /datum/ai_planning_subtree/targeted_mob_ability/brimbeam, + ) + +/datum/ai_planning_subtree/move_to_cardinal/brimdemon + move_behaviour = /datum/ai_behavior/move_to_cardinal/brimdemon + +/datum/ai_behavior/move_to_cardinal/brimdemon + minimum_distance = 2 + +/datum/ai_behavior/move_to_cardinal/brimdemon/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + if (!succeeded) + return + var/mob/living/target = controller.blackboard[target_key] + var/datum/action/cooldown/ability = controller.blackboard[BB_TARGETED_ACTION] + if(!ability?.IsAvailable()) + return + ability.InterceptClickOn(caller = controller.pawn, target = target) + +/datum/ai_planning_subtree/targeted_mob_ability/brimbeam + use_ability_behaviour = /datum/ai_behavior/targeted_mob_ability/brimbeam + +/datum/ai_behavior/targeted_mob_ability/brimbeam + /// Don't shoot if too far away + var/max_target_distance = 9 + +/datum/ai_behavior/targeted_mob_ability/brimbeam/perform(seconds_per_tick, datum/ai_controller/controller, ability_key, target_key) + var/mob/living/target = controller.blackboard[target_key] + if (QDELETED(target) || !(get_dir(controller.pawn, target) in GLOB.cardinals) || get_dist(controller.pawn, target) > max_target_distance) + finish_action(controller, succeeded = FALSE, ability_key = ability_key, target_key = target_key) + return + return ..() diff --git a/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm new file mode 100644 index 000000000000..9a45ed99e1c0 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/brimdemon/brimdemon_loot.dm @@ -0,0 +1,56 @@ +/// Brimdemon crusher trophy, it... makes a funny sound? +/obj/item/crusher_trophy/brimdemon_fang + name = "brimdemon's fang" + icon_state = "brimdemon_fang" + desc = "A fang from a brimdemon's corpse." + denied_type = /obj/item/crusher_trophy/brimdemon_fang + /// Cartoon punching vfx + var/static/list/comic_phrases = list("BOOM", "BANG", "KABLOW", "KAPOW", "OUCH", "BAM", "KAPOW", "WHAM", "POW", "KABOOM") + +/obj/item/crusher_trophy/brimdemon_fang/effect_desc() + return "mark detonation creates visual and audiosensory effects on the target" + +/obj/item/crusher_trophy/brimdemon_fang/on_mark_detonation(mob/living/target, mob/living/user) + target.balloon_alert_to_viewers("[pick(comic_phrases)]!") + playsound(target, 'sound/lavaland/brimdemon_crush.ogg', 100) + +/// Reagent pool left by dying brimdemon +/obj/effect/decal/cleanable/brimdust + name = "brimdust" + desc = "Dust from a brimdemon. It is considered valuable for its' botanical abilities." + icon_state = "brimdust" + icon = 'icons/obj/mining.dmi' + layer = FLOOR_CLEAN_LAYER + mergeable_decal = FALSE + +/obj/effect/decal/cleanable/brimdust/Initialize(mapload) + . = ..() + reagents.add_reagent(/datum/reagent/brimdust, 15) + +/// Ashwalker ore sensor crafted from brimdemon ash +/obj/item/ore_sensor + name = "ore sensor" + desc = "Using demonic frequencies, this ear-mounted tool detects ores in the nearby terrain." + icon_state = "oresensor" + icon = 'icons/obj/mining.dmi' + slot_flags = ITEM_SLOT_EARS + var/range = 5 + var/cooldown = 4 SECONDS //between the standard and the advanced ore scanner in strength + COOLDOWN_DECLARE(ore_sensing_cooldown) + +/obj/item/ore_sensor/equipped(mob/user, slot, initial) + . = ..() + if(slot & ITEM_SLOT_EARS) + START_PROCESSING(SSobj, src) + else + STOP_PROCESSING(SSobj, src) + +/obj/item/ore_sensor/dropped(mob/user, silent) + . = ..() + STOP_PROCESSING(SSobj, src) + +/obj/item/ore_sensor/process(seconds_per_tick) + if(!COOLDOWN_FINISHED(src, ore_sensing_cooldown)) + return + COOLDOWN_START(src, ore_sensing_cooldown, cooldown) + mineral_scan_pulse(get_turf(src), range) diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm index cb42ea180fee..8e3a66eb891e 100644 --- a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub.dm @@ -35,7 +35,7 @@ /datum/pet_command/free, /datum/pet_command/grub_spit, /datum/pet_command/follow, - /datum/pet_command/point_targetting/fetch, + /datum/pet_command/point_targeting/fetch, ) /mob/living/basic/mining/goldgrub/Initialize(mapload) @@ -44,13 +44,13 @@ if(mapload) generate_loot() - var/datum/action/cooldown/mob_cooldown/spit_ore/spit = new(src) - var/datum/action/cooldown/mob_cooldown/burrow/burrow = new(src) - spit.Grant(src) - burrow.Grant(src) - ai_controller.set_blackboard_key(BB_SPIT_ABILITY, spit) - ai_controller.set_blackboard_key(BB_BURROW_ABILITY, burrow) - AddElement(/datum/element/wall_smasher) + var/static/list/innate_actions = list( + /datum/action/cooldown/mob_cooldown/spit_ore = BB_SPIT_ABILITY, + /datum/action/cooldown/mob_cooldown/burrow = BB_BURROW_ABILITY, + ) + grant_actions_by_list(innate_actions) + AddElement(/datum/element/ore_collecting) + AddElement(/datum/element/wall_tearer, allow_reinforced = FALSE) AddComponent(/datum/component/ai_listen_to_weather) AddComponent(\ /datum/component/appearance_on_aggro,\ @@ -62,23 +62,16 @@ if(can_lay_eggs) make_egg_layer() -/mob/living/basic/mining/goldgrub/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) - . = ..() - if(!.) - return - - if(!proximity_flag) - return + RegisterSignal(src, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(block_bullets)) - if(istype(attack_target, /obj/item/stack/ore)) - consume_ore(attack_target) +/mob/living/basic/mining/goldgrub/proc/block_bullets(datum/source, obj/projectile/hitting_projectile) + SIGNAL_HANDLER -/mob/living/basic/mining/goldgrub/bullet_act(obj/projectile/bullet) - if(stat == DEAD) - return BULLET_ACT_FORCE_PIERCE + if(stat != CONSCIOUS) + return COMPONENT_BULLET_PIERCED - visible_message(span_danger("The [bullet.name] is repelled by [src]'s girth!")) - return BULLET_ACT_BLOCK + visible_message(span_danger("[hitting_projectile] is repelled by [source]'s girth!")) + return COMPONENT_BULLET_BLOCKED /mob/living/basic/mining/goldgrub/proc/barf_contents(gibbed) playsound(src, 'sound/effects/splat.ogg', 50, TRUE) @@ -131,12 +124,14 @@ max_eggs_held = 1,\ ) -/mob/living/basic/mining/goldgrub/proc/consume_ore(obj/item/target_ore) +/mob/living/basic/mining/goldgrub/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + . = ..() + if(!istype(arrived, /obj/item/stack/ore)) + return playsound(src,'sound/items/eatfood.ogg', rand(10,50), TRUE) - target_ore.forceMove(src) if(!can_lay_eggs) return - if(!istype(target_ore, /obj/item/stack/ore/bluespace_crystal) || prob(60)) + if(!istype(arrived, /obj/item/stack/ore/bluespace_crystal) || prob(60)) return new /obj/item/food/egg/green/grub_egg(get_turf(src)) @@ -181,7 +176,7 @@ var/list/friends = src.ai_controller.blackboard[BB_FRIENDS_LIST] var/mob/living/basic/mining/goldgrub/transformed_mob = src.change_mob_type(/mob/living/basic/mining/goldgrub, src.loc, new_name = new_mob_name, delete_old_mob = TRUE) transformed_mob.ai_controller.blackboard[BB_FRIENDS_LIST] = friends - + if(length(friends)) transformed_mob.tame_grub() @@ -204,4 +199,3 @@ current_growth = 0,\ location_allowlist = typecacheof(list(/turf)),\ ) - diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm index 12e7d4c8ff14..53054052e58a 100644 --- a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm @@ -1,9 +1,8 @@ /datum/ai_controller/basic_controller/goldgrub blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, BB_ORE_IGNORE_TYPES = list(/obj/item/stack/ore/iron, /obj/item/stack/ore/glass), - BB_BASIC_MOB_FLEEING = TRUE, BB_STORM_APPROACHING = FALSE, ) @@ -14,18 +13,17 @@ /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/dig_away_from_danger, /datum/ai_planning_subtree/flee_target, - /datum/ai_planning_subtree/find_and_hunt_target/consume_ores, + /datum/ai_planning_subtree/find_and_hunt_target/hunt_ores, /datum/ai_planning_subtree/find_and_hunt_target/baby_egg, - /datum/ai_planning_subtree/grub_mine, + /datum/ai_planning_subtree/mine_walls, ) /datum/ai_controller/basic_controller/babygrub blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_ORE_IGNORE_TYPES = list(/obj/item/stack/ore/glass), BB_FIND_MOM_TYPES = list(/mob/living/basic/mining/goldgrub), BB_IGNORE_MOM_TYPES = list(/mob/living/basic/mining/goldgrub/baby), - BB_BASIC_MOB_FLEEING = TRUE, BB_STORM_APPROACHING = FALSE, ) @@ -34,29 +32,29 @@ planning_subtrees = list( /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/dig_away_from_danger, - /datum/ai_planning_subtree/find_and_hunt_target/consume_ores, + /datum/ai_planning_subtree/find_and_hunt_target/hunt_ores, /datum/ai_planning_subtree/flee_target, /datum/ai_planning_subtree/look_for_adult, ) ///consume food! -/datum/ai_planning_subtree/find_and_hunt_target/consume_ores +/datum/ai_planning_subtree/find_and_hunt_target/hunt_ores target_key = BB_ORE_TARGET - hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/consume_ores - finding_behavior = /datum/ai_behavior/find_hunt_target/consume_ores + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/hunt_ores + finding_behavior = /datum/ai_behavior/find_hunt_target/hunt_ores hunt_targets = list(/obj/item/stack/ore) hunt_chance = 75 hunt_range = 9 -/datum/ai_behavior/find_hunt_target/consume_ores +/datum/ai_behavior/find_hunt_target/hunt_ores -/datum/ai_behavior/find_hunt_target/consume_ores/valid_dinner(mob/living/basic/source, obj/item/stack/ore/target, radius) +/datum/ai_behavior/find_hunt_target/hunt_ores/valid_dinner(mob/living/basic/source, obj/item/stack/ore/target, radius) var/list/forbidden_ore = source.ai_controller.blackboard[BB_ORE_IGNORE_TYPES] if(is_type_in_list(target, forbidden_ore)) return FALSE - if(target in source) + if(!isturf(target.loc)) return FALSE var/obj/item/pet_target = source.ai_controller.blackboard[BB_CURRENT_PET_TARGET] @@ -65,7 +63,7 @@ return can_see(source, target, radius) -/datum/ai_behavior/hunt_target/unarmed_attack_target/consume_ores +/datum/ai_behavior/hunt_target/unarmed_attack_target/hunt_ores always_reset_target = TRUE ///find our child's egg and pull it! @@ -108,93 +106,21 @@ if(!dig_ability.IsAvailable()) return - var/mob/living/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + var/has_target = controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET) //a storm is coming or someone is nearby, its time to escape - if(currently_underground || !currently_underground && storm_approaching || !QDELETED(target)) + if(currently_underground) + if(has_target) + return + controller.queue_behavior(/datum/ai_behavior/use_mob_ability/burrow, BB_BURROW_ABILITY) + return SUBTREE_RETURN_FINISH_PLANNING + if(storm_approaching || has_target) controller.queue_behavior(/datum/ai_behavior/use_mob_ability/burrow, BB_BURROW_ABILITY) return SUBTREE_RETURN_FINISH_PLANNING /datum/ai_behavior/use_mob_ability/burrow behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION -///mine walls to look for food! -/datum/ai_planning_subtree/grub_mine - -/datum/ai_planning_subtree/grub_mine/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - var/turf/target_wall = controller.blackboard[BB_TARGET_MINERAL_WALL] - - if(QDELETED(target_wall)) - controller.queue_behavior(/datum/ai_behavior/find_mineral_wall, BB_TARGET_MINERAL_WALL) - return - - controller.queue_behavior(/datum/ai_behavior/mine_wall, BB_TARGET_MINERAL_WALL) - return SUBTREE_RETURN_FINISH_PLANNING - - -/datum/ai_behavior/find_mineral_wall - -/datum/ai_behavior/find_mineral_wall/perform(seconds_per_tick, datum/ai_controller/controller, found_wall_key) - . = ..() - - var/mob/living_pawn = controller.pawn - - for(var/turf/closed/mineral/potential_wall in oview(9, living_pawn)) - if(!check_if_mineable(living_pawn, potential_wall)) //check if its surrounded by walls - continue - controller.set_blackboard_key(found_wall_key, potential_wall) //closest wall first! - finish_action(controller, TRUE) - return - - finish_action(controller, FALSE) - -/datum/ai_behavior/find_mineral_wall/proc/check_if_mineable(mob/living/source, turf/target_wall) - var/direction_to_turf = get_dir(target_wall, source) - if(!ISDIAGONALDIR(direction_to_turf)) - return TRUE - var/list/directions_to_check = list() - for(var/direction_check in GLOB.cardinals) - if(direction_check & direction_to_turf) - directions_to_check += direction_check - - for(var/direction in directions_to_check) - var/turf/test_turf = get_step(target_wall, direction) - if(isnull(test_turf)) - continue - if(!test_turf.is_blocked_turf(ignore_atoms = list(source))) - return TRUE - return FALSE - -/datum/ai_behavior/mine_wall - behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION - action_cooldown = 15 SECONDS - -/datum/ai_behavior/mine_wall/setup(datum/ai_controller/controller, target_key) - . = ..() - var/turf/target = controller.blackboard[target_key] - if(isnull(target)) - return FALSE - set_movement_target(controller, target) - -/datum/ai_behavior/mine_wall/perform(seconds_per_tick, datum/ai_controller/controller, target_key) - . = ..() - var/mob/living/basic/living_pawn = controller.pawn - var/turf/closed/mineral/target = controller.blackboard[target_key] - var/is_gibtonite_turf = istype(target, /turf/closed/mineral/gibtonite) - if(QDELETED(target)) - finish_action(controller, FALSE, target_key) - return - living_pawn.melee_attack(target) - if(is_gibtonite_turf) - living_pawn.manual_emote("sighs...") //accept whats about to happen to us - - finish_action(controller, TRUE, target_key) - return - -/datum/ai_behavior/mine_wall/finish_action(datum/ai_controller/controller, success, target_key) - . = ..() - controller.clear_blackboard_key(target_key) - /datum/pet_command/grub_spit command_name = "Spit" command_desc = "Ask your grub pet to spit out its ores." @@ -202,7 +128,7 @@ /datum/pet_command/grub_spit/execute_action(datum/ai_controller/controller) var/datum/action/cooldown/spit_ability = controller.blackboard[BB_SPIT_ABILITY] - if(QDELETED(spit_ability) || !spit_ability.IsAvailable()) + if(!spit_ability?.IsAvailable()) return controller.queue_behavior(/datum/ai_behavior/use_mob_ability, BB_SPIT_ABILITY) controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm index c9a8b0b07314..d1e11ea4cd2d 100644 --- a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm +++ b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm @@ -44,6 +44,8 @@ COOLDOWN_DECLARE(ability_animation_cooldown) /// Our base tentacles ability var/datum/action/cooldown/mob_cooldown/goliath_tentacles/tentacles + /// Our long-ranged tentacles ability + var/datum/action/cooldown/mob_cooldown/tentacle_grasp/tentacle_line /// Things we want to eat off the floor (or a plate, we're not picky) var/static/list/goliath_foods = list(/obj/item/food/grown/ash_flora, /obj/item/food/bait/worm) @@ -53,7 +55,7 @@ /datum/pet_command/idle, /datum/pet_command/free, /datum/pet_command/follow, - /datum/pet_command/point_targetting/fetch, + /datum/pet_command/point_targeting/fetch, ) //monkestation edit @@ -80,10 +82,10 @@ tentacles.Grant(src) var/datum/action/cooldown/mob_cooldown/tentacle_burst/melee_tentacles = new (src) melee_tentacles.Grant(src) - AddComponent(/datum/component/revenge_ability, melee_tentacles, targetting = ai_controller.blackboard[BB_TARGETTING_DATUM], max_range = 1, target_self = TRUE) - var/datum/action/cooldown/mob_cooldown/tentacle_grasp/ranged_tentacles = new (src) - ranged_tentacles.Grant(src) - AddComponent(/datum/component/revenge_ability, ranged_tentacles, targetting = ai_controller.blackboard[BB_TARGETTING_DATUM], min_range = 2, max_range = 9) + AddComponent(/datum/component/revenge_ability, melee_tentacles, targeting = GET_TARGETING_STRATEGY(ai_controller.blackboard[BB_TARGETING_STRATEGY]), max_range = 1, target_self = TRUE) + tentacle_line = new (src) + tentacle_line.Grant(src) + AddComponent(/datum/component/revenge_ability, tentacle_line, targeting = GET_TARGETING_STRATEGY(ai_controller.blackboard[BB_TARGETING_STRATEGY]), min_range = 2, max_range = 9) tentacles_ready() RegisterSignal(src, COMSIG_MOB_ABILITY_FINISHED, PROC_REF(used_ability)) @@ -93,6 +95,7 @@ /mob/living/basic/mining/goliath/Destroy() QDEL_NULL(tentacles) + QDEL_NULL(tentacle_line) return ..() /mob/living/basic/mining/goliath/examine(mob/user) @@ -117,9 +120,7 @@ // Goliaths can summon tentacles more frequently as they take damage, scary. /mob/living/basic/mining/goliath/apply_damage(damage, damagetype, def_zone, blocked, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) . = ..() - if (!.) - return - if (damage <= 0) + if (. <= 0) return if (tentacles.cooldown_time > 1 SECONDS) tentacles.cooldown_time -= 1 SECONDS @@ -185,6 +186,12 @@ . = ..() faction = new_friend.faction.Copy() +/mob/living/basic/mining/goliath/RangedAttack(atom/atom_target, modifiers) + tentacles?.Trigger(target = atom_target) + +/mob/living/basic/mining/goliath/ranged_secondary_attack(atom/atom_target, modifiers) + tentacle_line?.Trigger(target = atom_target) + /// Legacy Goliath mob with different sprites, largely the same behaviour /mob/living/basic/mining/goliath/ancient name = "ancient goliath" diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath_actions.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath_actions.dm index bb8adaf61c3e..31eecc036290 100644 --- a/code/modules/mob/living/basic/lavaland/goliath/goliath_actions.dm +++ b/code/modules/mob/living/basic/lavaland/goliath/goliath_actions.dm @@ -1,7 +1,7 @@ /// Place some grappling tentacles underfoot /datum/action/cooldown/mob_cooldown/goliath_tentacles name = "Unleash Tentacles" - desc = "Unleash burrowed tentacles at a targetted location, grappling targets after a delay." + desc = "Unleash burrowed tentacles at a targeted location, grappling targets after a delay." button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' button_icon_state = "goliath_tentacle_wiggle" background_icon_state = "bg_demon" @@ -9,7 +9,6 @@ click_to_activate = TRUE cooldown_time = 12 SECONDS melee_cooldown_time = 0 - check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED shared_cooldown = NONE /// Furthest range we can activate ability at var/max_range = 7 @@ -44,7 +43,6 @@ overlay_icon_state = "bg_demon_border" cooldown_time = 24 SECONDS melee_cooldown_time = 0 - check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED shared_cooldown = NONE click_to_activate = FALSE @@ -61,7 +59,7 @@ /// Summon a line of tentacles towards the target /datum/action/cooldown/mob_cooldown/tentacle_grasp name = "Tentacle Grasp" - desc = "Unleash burrowed tentacles in a line towards a targetted location, grappling targets after a delay." + desc = "Unleash burrowed tentacles in a line towards a targeted location, grappling targets after a delay." button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' button_icon_state = "goliath_tentacle_wiggle" background_icon_state = "bg_demon" @@ -69,7 +67,6 @@ click_to_activate = TRUE cooldown_time = 12 SECONDS melee_cooldown_time = 0 - check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED shared_cooldown = NONE /datum/action/cooldown/mob_cooldown/tentacle_grasp/Activate(atom/target) diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm index 9774c3255352..066b25cffa46 100644 --- a/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm +++ b/code/modules/mob/living/basic/lavaland/goliath/goliath_ai.dm @@ -3,13 +3,14 @@ /datum/ai_controller/basic_controller/goliath blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items/goliath, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, ) ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_random_walk planning_subtrees = list( - /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/target_retaliate/check_faction, /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/find_food, @@ -20,9 +21,6 @@ /datum/ai_planning_subtree/goliath_dig, ) -/datum/targetting_datum/basic/allow_items/goliath - stat_attack = HARD_CRIT - /datum/ai_planning_subtree/basic_melee_attack_subtree/goliath operational_datums = list(/datum/component/ai_target_timer) melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/goliath @@ -30,7 +28,7 @@ /// Go for the tentacles if they're available /datum/ai_behavior/basic_melee_attack/goliath -/datum/ai_behavior/basic_melee_attack/goliath/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key, health_ratio_key) +/datum/ai_behavior/basic_melee_attack/goliath/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key, health_ratio_key) var/time_on_target = controller.blackboard[BB_BASIC_MOB_HAS_TARGET_TIME] || 0 if (time_on_target < MIN_TIME_TO_TENTACLE) return ..() @@ -97,8 +95,7 @@ var/target_key = BB_GOLIATH_HOLE_TARGET /datum/ai_planning_subtree/goliath_dig/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - var/turf/target_turf = controller.blackboard[target_key] - if (QDELETED(target_turf)) + if (!controller.blackboard_key_exists(target_key)) return controller.queue_behavior(/datum/ai_behavior/goliath_dig, target_key) return SUBTREE_RETURN_FINISH_PLANNING diff --git a/code/modules/mob/living/basic/lavaland/gutlunchers/gutluncher_foodtrough.dm b/code/modules/mob/living/basic/lavaland/gutlunchers/gutluncher_foodtrough.dm new file mode 100644 index 000000000000..16139da00bec --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/gutlunchers/gutluncher_foodtrough.dm @@ -0,0 +1,40 @@ +/obj/structure/ore_container/gutlunch_trough + name = "gutlunch trough" + desc = "The gutlunches will eat out of it!" + icon = 'icons/obj/structures.dmi' + icon_state = "gutlunch_trough" + density = TRUE + anchored = TRUE + ///list of materials in the trough + var/list/list_of_materials = list() + +/obj/structure/ore_container/gutlunch_trough/Entered(atom/movable/mover) + if(!istype(mover, /obj/item/stack/ore)) + return ..() + if(list_of_materials[mover.type]) + return ..() + list_of_materials[mover.type] = list("pixel_x" = rand(-5, 8), "pixel_y" = rand(-2, -7)) + return ..() + +/obj/structure/ore_container/gutlunch_trough/Exited(atom/movable/mover) + if(!istype(mover, /obj/item/stack/ore) || !isnull(locate(mover.type) in contents)) + return ..() + list_of_materials -= mover.type + return ..() + +/obj/structure/ore_container/gutlunch_trough/deconstruct(disassembled = TRUE) + if(flags_1 & NODECONSTRUCT_1) + return + new /obj/item/stack/sheet/mineral/wood(drop_location(), 5) + qdel(src) + +/obj/structure/ore_container/gutlunch_trough/update_overlays() + . = ..() + for(var/ore_entry in list_of_materials) + var/obj/item/ore_item = ore_entry + var/image/ore_icon = image(icon = initial(ore_item.icon), icon_state = initial(ore_item.icon_state), layer = LOW_ITEM_LAYER) + var/list/pixel_positions = list_of_materials[ore_entry] + ore_icon.transform = ore_icon.transform.Scale(0.4, 0.4) + ore_icon.pixel_x = pixel_positions["pixel_x"] + ore_icon.pixel_y = pixel_positions["pixel_y"] + . += ore_icon diff --git a/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers.dm b/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers.dm new file mode 100644 index 000000000000..d075bedd0af8 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers.dm @@ -0,0 +1,166 @@ +#define MAX_ATTACK_DIFFERENCE 3 +#define MAX_LOWER_ATTACK 15 +#define MINIMUM_POSSIBLE_SPEED 1 +#define MAX_POSSIBLE_HEALTH 100 + +/mob/living/basic/mining/gutlunch + name = "gutlunch" + desc = "A scavenger that eats raw ores, often found alongside ash walkers. Produces a thick, nutritious milk." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "gutlunch" + icon_living = "gutlunch" + icon_dead = "gutlunch" + mob_biotypes = MOB_ORGANIC|MOB_BEAST + basic_mob_flags = DEL_ON_DEATH + speak_emote = list("warbles", "quavers") + faction = list(FACTION_MINING, FACTION_ASHWALKER) + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently pushes aside" + response_disarm_simple = "gently push aside" + response_harm_continuous = "squishes" + response_harm_simple = "squish" + friendly_verb_continuous = "pinches" + friendly_verb_simple = "pinch" + gold_core_spawnable = FRIENDLY_SPAWN + death_message = "is pulped into bugmash." + greyscale_config = /datum/greyscale_config/gutlunch + ///possible colors we can have + var/list/possible_colors = list(COLOR_WHITE) + ///can we breed? + var/can_breed = TRUE + +/mob/living/basic/mining/gutlunch/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + if(greyscale_config) + set_greyscale(colors = list(pick(possible_colors))) + AddElement(/datum/element/ai_retaliate) + if(!can_breed) + return + AddComponent(\ + /datum/component/breed,\ + can_breed_with = typecacheof(list(/mob/living/basic/mining/gutlunch)),\ + baby_path = /mob/living/basic/mining/gutlunch/grub,\ + post_birth = CALLBACK(src, PROC_REF(after_birth)),\ + breed_timer = 3 MINUTES,\ + ) + +/mob/living/basic/mining/gutlunch/proc/pre_attack(mob/living/puncher, atom/target) + SIGNAL_HANDLER + + if(!istype(target, /obj/structure/ore_container/gutlunch_trough)) + return + + var/obj/ore_food = locate(/obj/item/stack/ore) in target + + if(isnull(ore_food)) + balloon_alert(src, "no food!") + else + melee_attack(ore_food) + return COMPONENT_HOSTILE_NO_ATTACK + +/mob/living/basic/mining/gutlunch/proc/after_birth(mob/living/basic/mining/gutlunch/grub/baby, mob/living/partner) + var/our_color = LAZYACCESS(atom_colours, FIXED_COLOUR_PRIORITY) || COLOR_GRAY + var/partner_color = LAZYACCESS(partner.atom_colours, FIXED_COLOUR_PRIORITY) || COLOR_GRAY + baby.add_atom_colour(BlendRGB(our_color, partner_color, 1), FIXED_COLOUR_PRIORITY) + var/atom/male_parent = (gender == MALE) ? src : partner + baby.inherited_stats = new(male_parent) + +/mob/living/basic/mining/gutlunch/proc/roll_stats(input_attack, input_speed, input_health) + melee_damage_lower = rand(input_attack, min(MAX_LOWER_ATTACK, input_attack + MAX_ATTACK_DIFFERENCE)) + melee_damage_upper = melee_damage_lower + MAX_ATTACK_DIFFERENCE + speed = rand(MINIMUM_POSSIBLE_SPEED, input_speed) + maxHealth = rand(input_health, MAX_POSSIBLE_HEALTH) + health = maxHealth + +/mob/living/basic/mining/gutlunch/milk + name = "gubbuck" + gender = FEMALE + possible_colors = list("#E39FBB","#817178","#9d667d") + ai_controller = /datum/ai_controller/basic_controller/gutlunch/gutlunch_milk + ///overlay we display when our udder is full! + var/mutable_appearance/full_udder + +/mob/living/basic/mining/gutlunch/milk/Initialize(mapload) + . = ..() + var/datum/callback/milking_callback = CALLBACK(src, TYPE_PROC_REF(/atom/movable, update_overlays)) + AddComponent(\ + /datum/component/udder,\ + udder_type = /obj/item/udder/gutlunch,\ + on_milk_callback = milking_callback,\ + on_generate_callback = milking_callback,\ + ) + full_udder = mutable_appearance(icon, "gl_full") + full_udder.color = LAZYACCESS(atom_colours, FIXED_COLOUR_PRIORITY) || COLOR_GRAY + +/mob/living/basic/mining/gutlunch/warrior + name = "gunther" + gender = MALE + melee_damage_lower = 8 + melee_damage_upper = 13 + speed = 5 + maxHealth = 70 + health = 70 + ai_controller = /datum/ai_controller/basic_controller/gutlunch/gutlunch_warrior + possible_colors = list("#6d77ff","#8578e4","#97b6f6") + //pet commands when we tame the gutluncher + var/static/list/pet_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/point_targeting/attack, + /datum/pet_command/point_targeting/breed, + /datum/pet_command/follow, + /datum/pet_command/point_targeting/fetch, + /datum/pet_command/mine_walls, + ) + +/mob/living/basic/mining/gutlunch/warrior/Initialize(mapload) + . = ..() + roll_stats(melee_damage_lower, speed, maxHealth) + AddComponent(/datum/component/obeys_commands, pet_commands) + AddElement(/datum/element/wall_tearer, allow_reinforced = FALSE) + +/mob/living/basic/mining/gutlunch/milk/update_overlays(new_udder_volume, max_udder_volume) + . = ..() + if(new_udder_volume != max_udder_volume) + return + . += full_udder + +/mob/living/basic/mining/gutlunch/grub + name = "grublunch" + possible_colors = list("#cc9797", "#b74c4c") + can_breed = FALSE + gender = NEUTER + ai_controller = /datum/ai_controller/basic_controller/gutlunch/gutlunch_baby + ///list of stats we inherited + var/datum/gutlunch_inherited_stats/inherited_stats + +/mob/living/basic/mining/gutlunch/grub/Initialize(mapload) + . = ..() + transform = transform.Scale(0.6, 0.6) + AddComponent(\ + /datum/component/growth_and_differentiation,\ + growth_time = 3 MINUTES,\ + growth_probability = 100,\ + lower_growth_value = 0.5,\ + upper_growth_value = 1,\ + signals_to_kill_on = list(COMSIG_MOB_CLIENT_LOGIN),\ + optional_checks = CALLBACK(src, PROC_REF(ready_to_grow)),\ + optional_grow_behavior = CALLBACK(src, PROC_REF(determine_growth_path)),\ + ) + +/mob/living/basic/mining/gutlunch/grub/proc/ready_to_grow() + return (stat == CONSCIOUS) + +/mob/living/basic/mining/gutlunch/grub/proc/determine_growth_path() + var/final_type = prob(50) ? /mob/living/basic/mining/gutlunch/warrior : /mob/living/basic/mining/gutlunch/milk + var/mob/living/basic/mining/gutlunch/grown_mob = new final_type(get_turf(src)) + if(grown_mob.gender == MALE && inherited_stats) + grown_mob.roll_stats(inherited_stats.attack, inherited_stats.speed, inherited_stats.health) + qdel(src) + +#undef MAX_ATTACK_DIFFERENCE +#undef MAX_LOWER_ATTACK +#undef MINIMUM_POSSIBLE_SPEED +#undef MAX_POSSIBLE_HEALTH diff --git a/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers_ai.dm b/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers_ai.dm new file mode 100644 index 000000000000..57893b294ce3 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers_ai.dm @@ -0,0 +1,119 @@ +/datum/ai_controller/basic_controller/gutlunch + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + +/datum/ai_controller/basic_controller/gutlunch/gutlunch_warrior + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + BB_BABIES_PARTNER_TYPES = list(/mob/living/basic/mining/gutlunch/milk), + BB_BABIES_CHILD_TYPES = list(/mob/living/basic/mining/gutlunch/grub), + BB_MAX_CHILDREN = 5, + ) + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate/check_faction, + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/make_babies, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/befriend_ashwalkers, + ) + +///find ashwalkers and add them to the list of masters +/datum/ai_planning_subtree/befriend_ashwalkers + +/datum/ai_planning_subtree/befriend_ashwalkers/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + controller.queue_behavior(/datum/ai_behavior/befriend_ashwalkers) + +/datum/ai_behavior/befriend_ashwalkers + action_cooldown = 5 SECONDS + behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +/datum/ai_behavior/befriend_ashwalkers/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + var/mob/living/living_pawn = controller.pawn + + for(var/mob/living/potential_friend in oview(9, living_pawn)) + if(!isashwalker(potential_friend)) + continue + if((living_pawn.faction.Find(REF(potential_friend)))) + continue + living_pawn.befriend(potential_friend) + to_chat(potential_friend, span_nicegreen("[living_pawn] looks at you with endearing eyes!")) + finish_action(controller, TRUE) + return + + finish_action(controller, FALSE) + return + + + +/datum/ai_controller/basic_controller/gutlunch/gutlunch_baby + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_FIND_MOM_TYPES = list(/mob/living/basic/mining/gutlunch/milk), + ) + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/look_for_adult, + ) + +/datum/ai_controller/basic_controller/gutlunch/gutlunch_milk + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/find_and_hunt_target/food_trough + ) + +///consume food! +/datum/ai_planning_subtree/find_and_hunt_target/food_trough + target_key = BB_TROUGH_TARGET + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/food_trough + finding_behavior = /datum/ai_behavior/find_hunt_target/food_trough + hunt_targets = list(/obj/structure/ore_container/gutlunch_trough) + hunt_chance = 75 + hunt_range = 9 + + +/datum/ai_planning_subtree/find_and_hunt_target/food_trough/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!controller.blackboard[BB_CHECK_HUNGRY]) + return + return ..() + +/datum/ai_behavior/find_hunt_target/food_trough + +/datum/ai_behavior/find_hunt_target/food_trough/valid_dinner(mob/living/basic/source, obj/target, radius) + if(isnull(target)) + return FALSE + + if(isnull(locate(/obj/item/stack/ore) in target)) + return FALSE + + return can_see(source, target, radius) + +/datum/ai_behavior/hunt_target/unarmed_attack_target/food_trough + always_reset_target = TRUE + switch_combat_mode = TRUE + +/datum/pet_command/mine_walls + command_name = "Mine" + command_desc = "Command your pet to mine down walls." + speech_commands = list("mine", "smash") + +/datum/pet_command/mine_walls/try_activate_command(mob/living/commander) + var/mob/living/parent = weak_parent.resolve() + if(isnull(parent)) + return + //no walls for us to mine + var/target_in_vicinity = locate(/turf/closed/mineral) in oview(9, parent) + if(isnull(target_in_vicinity)) + return + return ..() + +/datum/pet_command/mine_walls/execute_action(datum/ai_controller/controller) + if(controller.blackboard_key_exists(BB_CURRENT_PET_TARGET)) + controller.queue_behavior(/datum/ai_behavior/mine_wall, BB_CURRENT_PET_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_mineral_wall, BB_CURRENT_PET_TARGET) diff --git a/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers_inherit_datum.dm b/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers_inherit_datum.dm new file mode 100644 index 000000000000..7051dfc2f4b2 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/gutlunchers/gutlunchers_inherit_datum.dm @@ -0,0 +1,14 @@ +///stats we inherit from the parent +/datum/gutlunch_inherited_stats + ///attack we inherited + var/attack + ///speed we inherited + var/speed + ///health we inherited + var/health + +/datum/gutlunch_inherited_stats/New(mob/living/basic/parent) + . = ..() + attack = parent.melee_damage_lower + speed = parent.speed + health = parent.maxHealth diff --git a/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm b/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm new file mode 100644 index 000000000000..c3365d2304bc --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/hivelord/hivelord.dm @@ -0,0 +1,142 @@ +/// Mob which retreats and spawns annoying sub-mobs to attack you +/mob/living/basic/mining/hivelord + name = "hivelord" + desc = "A levitating swarm of tiny creatures which act as a single individual. When threatened or hunting they rapidly replicate additional short-lived bodies." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "hivelord" + icon_living = "hivelord" + // icon_aggro = "hivelord_alert" + icon_dead = "hivelord_dead" + icon_gib = "syndicate_gib" + mob_biotypes = MOB_ORGANIC + speed = 2 + maxHealth = 75 + health = 75 + melee_damage_lower = 0 + melee_damage_upper = 0 + attack_verb_continuous = "weakly tackles" + attack_verb_simple = "weakly tackles" + speak_emote = list("telepathically cries") + attack_sound = 'sound/weapons/pierce.ogg' + throw_blocked_message = "passes between the bodies of the" + obj_damage = 0 + pass_flags = PASSTABLE + ai_controller = /datum/ai_controller/basic_controller/hivelord + /// Mobs to spawn when we die, varedit this to be recursive to give the players a fun surprise + var/death_spawn_type = /mob/living/basic/hivelord_brood + /// Action which spawns worms + var/datum/action/cooldown/mob_cooldown/hivelord_spawn/spawn_brood + +/mob/living/basic/mining/hivelord/Initialize(mapload) + . = ..() + var/static/list/death_loot = list(/obj/item/organ/internal/monster_core/regenerative_core) + AddElement(/datum/element/relay_attackers) + AddElement(/datum/element/death_drops, death_loot) + AddComponent(/datum/component/clickbox, icon_state = "hivelord", max_scale = INFINITY, dead_state = "hivelord_dead") // They writhe so much. + AddComponent(/datum/component/appearance_on_aggro, aggro_state = "hivelord_alert") + spawn_brood = new(src) + spawn_brood.Grant(src) + ai_controller.set_blackboard_key(BB_TARGETED_ACTION, spawn_brood) + +/mob/living/basic/mining/hivelord/Destroy() + QDEL_NULL(spawn_brood) + return ..() + +/mob/living/basic/mining/hivelord/death(gibbed) + . = ..() + var/list/safe_turfs = RANGE_TURFS(1, src) - get_turf(src) + for (var/turf/check_turf as anything in safe_turfs) + if (check_turf.is_blocked_turf(exclude_mobs = TRUE)) + safe_turfs -= check_turf + + var/turf/our_turf = get_turf(src) + for (var/i in 1 to 3) + if (!length(safe_turfs)) + return + var/turf/land_turf = pick_n_take(safe_turfs) + var/obj/effect/temp_visual/hivebrood_spawn/forecast = new(land_turf) + forecast.create_from(death_spawn_type, our_turf, CALLBACK(src, PROC_REF(complete_spawn), land_turf)) + +/// Spawns a worm on the specified turf +/mob/living/basic/mining/hivelord/proc/complete_spawn(turf/spawn_turf) + var/mob/living/brood = new death_spawn_type(spawn_turf) + brood.faction = faction + brood.ai_controller?.set_blackboard_key(ai_controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET]) + brood.dir = get_dir(src, spawn_turf) + +/mob/living/basic/mining/hivelord/RangedAttack(atom/atom_target, modifiers) + spawn_brood?.Trigger(target = atom_target) + +/// Attack worms spawned by the hivelord +/mob/living/basic/hivelord_brood + name = "hivelord brood" + desc = "Short-lived attack form of the hivelord. One isn't much of a threat, but..." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "hivelord_brood" + icon_living = "hivelord_brood" + icon_dead = "hivelord_brood" + icon_gib = "syndicate_gib" + friendly_verb_continuous = "chirrups near" + friendly_verb_simple = "chirrup near" + mob_size = MOB_SIZE_SMALL + basic_mob_flags = DEL_ON_DEATH + pass_flags = PASSTABLE | PASSMOB + mob_biotypes = MOB_ORGANIC|MOB_BEAST + faction = list(FACTION_MINING) + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = 0 + maximum_survivable_temperature = INFINITY + speed = 1.5 + maxHealth = 1 + health = 1 + melee_damage_lower = 2 + melee_damage_upper = 2 + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + speak_emote = list("telepathically cries") + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + obj_damage = 0 + density = FALSE + ai_controller = /datum/ai_controller/basic_controller/simple_hostile + +/mob/living/basic/hivelord_brood/Initialize(mapload) + . = ..() + add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE), INNATE_TRAIT) + AddElement(/datum/element/simple_flying) + AddComponent(/datum/component/swarming) + AddComponent(/datum/component/clickbox, icon_state = "hivelord", max_scale = INFINITY) + addtimer(CALLBACK(src, PROC_REF(death)), 10 SECONDS) + +/mob/living/basic/hivelord_brood/death(gibbed) + if (!gibbed) + new /obj/effect/temp_visual/hive_spawn_wither(get_turf(src), /* copy_from = */ src) + return ..() + +/// Plays a dispersing animation on hivelord and legion minions so they don't just vanish +/obj/effect/temp_visual/hive_spawn_wither + name = "withering spawn" + duration = 1 SECONDS + +/obj/effect/temp_visual/hive_spawn_wither/Initialize(mapload, atom/copy_from) + if (isnull(copy_from)) + . = ..() + return INITIALIZE_HINT_QDEL + icon = copy_from.icon + icon_state = copy_from.icon_state + pixel_x = copy_from.pixel_x + pixel_y = copy_from.pixel_y + duration = rand(0.5 SECONDS, 1 SECONDS) + var/matrix/transformation = matrix(transform) + transformation.Turn(rand(-70, 70)) + transformation.Scale(0.7, 0.7) + animate( + src, + pixel_x = rand(-5, 5), + pixel_y = -5, + transform = transformation, + color = "#44444400", + time = duration, + flags = ANIMATION_RELATIVE, + ) + return ..() diff --git a/code/modules/mob/living/basic/lavaland/hivelord/hivelord_ai.dm b/code/modules/mob/living/basic/lavaland/hivelord/hivelord_ai.dm new file mode 100644 index 000000000000..1fb05cd7a012 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/hivelord/hivelord_ai.dm @@ -0,0 +1,14 @@ +/// Basically just keep away and shit out worms +/datum/ai_controller/basic_controller/hivelord + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_AGGRO_RANGE = 5, // Only get mad at people nearby + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/maintain_distance, + /datum/ai_planning_subtree/targeted_mob_ability, + ) diff --git a/code/modules/mob/living/basic/lavaland/hivelord/spawn_hivelord_brood.dm b/code/modules/mob/living/basic/lavaland/hivelord/spawn_hivelord_brood.dm new file mode 100644 index 000000000000..7d50806e63a0 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/hivelord/spawn_hivelord_brood.dm @@ -0,0 +1,123 @@ +/// Spawns a little worm nearby +/datum/action/cooldown/mob_cooldown/hivelord_spawn + name = "Spawn Brood" + desc = "Release an attack form to an adjacent square to attack your target or anyone nearby." + button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + button_icon_state = "hivelord_brood" + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + click_to_activate = TRUE + cooldown_time = 2 SECONDS + melee_cooldown_time = 0 + shared_cooldown = NONE + /// If a mob is not clicked directly, inherit targeting data from this blackboard key and setting it upon this target key + var/ai_target_key = BB_BASIC_MOB_CURRENT_TARGET + /// What are we actually spawning? + var/spawn_type = /mob/living/basic/hivelord_brood + /// Do we automatically fire with no cooldown when damaged? + var/trigger_on_hit = TRUE + /// Minimum time between triggering on hit + var/on_hit_delay = 1 SECONDS + /// Delay between triggering on hit + COOLDOWN_DECLARE(on_hit_cooldown) + +/datum/action/cooldown/mob_cooldown/hivelord_spawn/Grant(mob/granted_to) + . = ..() + if (isnull(owner)) + return + if (trigger_on_hit) + RegisterSignal(owner, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + +/datum/action/cooldown/mob_cooldown/hivelord_spawn/Remove(mob/removed_from) + UnregisterSignal(removed_from, COMSIG_ATOM_WAS_ATTACKED) + return ..() + +/datum/action/cooldown/mob_cooldown/hivelord_spawn/Activate(atom/target) + . = ..() + if (!spawn_brood(target, target_turf = get_turf(target))) + StartCooldown(0.5 SECONDS) + return + StartCooldown() + +/// Called when someone whacks us +/datum/action/cooldown/mob_cooldown/hivelord_spawn/proc/on_attacked(atom/victim, atom/attacker, attack_flags) + SIGNAL_HANDLER + if (!trigger_on_hit || !(attack_flags & ATTACKER_DAMAGING_ATTACK) || !COOLDOWN_FINISHED(src, on_hit_cooldown)) + return + COOLDOWN_START(src, on_hit_cooldown, on_hit_delay) + spawn_brood(attacker, target_turf = get_step_away(owner, attacker), feedback = FALSE) + +/// Spawn a funny little worm +/datum/action/cooldown/mob_cooldown/hivelord_spawn/proc/spawn_brood(target, turf/target_turf, feedback = TRUE) + var/ai_target = isliving(target) ? target : null + if (isnull(ai_target)) + ai_target = owner.ai_controller?.blackboard[ai_target_key] + + var/dir_to_target = get_dir(owner, target_turf) + var/list/target_turfs = list() + for(var/i in -1 to 1) + var/turn_amount = rand(-1, 1) * 45 + var/test_dir = turn(dir_to_target, turn_amount) + var/turf/test_turf = get_step(owner, test_dir) + if (test_turf.is_blocked_turf(exclude_mobs = TRUE)) + continue + target_turfs += test_turf + + if (!length(target_turfs)) + if (feedback) + owner.balloon_alert(owner, "no room!") + StartCooldown(0.5 SECONDS) + return FALSE + + var/turf/land_turf = pick(target_turfs) + var/obj/effect/temp_visual/hivebrood_spawn/forecast = new(land_turf) + forecast.create_from(spawn_type, get_turf(owner), CALLBACK(src, PROC_REF(complete_spawn), land_turf, ai_target)) + StartCooldown() + + return TRUE + +/// Actually create a mob +/datum/action/cooldown/mob_cooldown/hivelord_spawn/proc/complete_spawn(turf/spawn_turf, target) + var/mob/living/brood = new spawn_type(spawn_turf) + brood.faction = owner.faction + brood.ai_controller?.set_blackboard_key(ai_target_key, target) + brood.dir = get_dir(owner, spawn_turf) + +#define BROOD_ARC_Y_OFFSET 8 +#define BROOD_ARC_ROTATION 45 + +/// Fast animation to show a worm spawning +/obj/effect/temp_visual/hivebrood_spawn + name = "brood spawn" + duration = 0.3 SECONDS + alpha = 0 + +/// Set up our visuals and start a timer for a callback +/obj/effect/temp_visual/hivebrood_spawn/proc/create_from(mob/living/spawn_type, turf/spawn_from, datum/callback/on_completed) + addtimer(on_completed, duration, TIMER_DELETE_ME) + + var/turf/my_turf = get_turf(src) + dir = get_dir(spawn_from, my_turf) + var/move_x = (my_turf.x - spawn_from.x) * world.icon_size + var/move_y = (my_turf.y - spawn_from.y) * world.icon_size + pixel_x = -move_x + pixel_y = -move_y + + icon = initial(spawn_type.icon) + icon_state = initial(spawn_type.icon_state) + + + animate(src, pixel_x = 0, time = duration) + animate(src, pixel_y = BROOD_ARC_Y_OFFSET - (move_y * 0.5), time = duration * 0.5, flags = ANIMATION_PARALLEL, easing = SINE_EASING | EASE_OUT) + animate(pixel_y = 0, time = duration * 0.5, easing = SINE_EASING | EASE_IN) + animate(src, alpha = 255, time = duration * 0.5, flags = ANIMATION_PARALLEL) + + if (dir & (NORTH | EAST)) + transform = matrix().Turn(-BROOD_ARC_ROTATION) + animate(src, transform = matrix(), time = duration, flags = ANIMATION_PARALLEL) + else + transform = matrix().Turn(BROOD_ARC_ROTATION) + animate(src, transform = matrix(), time = duration, flags = ANIMATION_PARALLEL) + +#undef BROOD_ARC_Y_OFFSET +#undef BROOD_ARC_ROTATION diff --git a/code/modules/mob/living/basic/lavaland/legion/legion.dm b/code/modules/mob/living/basic/lavaland/legion/legion.dm new file mode 100644 index 000000000000..989ae0f4ff8c --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/legion/legion.dm @@ -0,0 +1,158 @@ +/** + * Avoids players while throwing skulls at them. + * Legion skulls heal allies, bite enemies, and infest dying humans to make more legions. + */ +/mob/living/basic/mining/legion + name = "legion" + desc = "You can still see what was once a human under the shifting mass of corruption." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "legion" + icon_living = "legion" + icon_dead = "legion" + icon_gib = "syndicate_gib" + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + basic_mob_flags = DEL_ON_DEATH + speed = 3 + maxHealth = 75 + health = 75 + obj_damage = 60 + melee_damage_lower = 15 + melee_damage_upper = 15 + attack_verb_continuous = "lashes out at" + attack_verb_simple = "lash out at" + speak_emote = list("gurgles") + attack_sound = 'sound/weapons/pierce.ogg' + throw_blocked_message = "bounces harmlessly off of" + crusher_loot = /obj/item/crusher_trophy/legion_skull + death_message = "wails in chorus and dissolves into quivering flesh." + ai_controller = /datum/ai_controller/basic_controller/legion + /// What kind of mob do we spawn? + var/brood_type = /mob/living/basic/legion_brood + /// What kind of corpse spawner do we leave behind on death? + var/corpse_type = /obj/effect/mob_spawn/corpse/human/legioninfested + /// Who is inside of us? + var/mob/living/stored_mob + +/mob/living/basic/mining/legion/Initialize(mapload) + . = ..() + AddElement(/datum/element/death_drops, get_loot_list()) + AddElement(/datum/element/content_barfer) + + var/datum/action/cooldown/mob_cooldown/skull_launcher/skull_launcher = new(src) + skull_launcher.Grant(src) + skull_launcher.spawn_type = brood_type + ai_controller.blackboard[BB_TARGETED_ACTION] = skull_launcher + +/// Create what we want to drop on death, in proc form so we can always return a static list +/mob/living/basic/mining/legion/proc/get_loot_list() + var/static/list/death_loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion) + return death_loot + +/mob/living/basic/mining/legion/Exited(atom/movable/gone, direction) + . = ..() + if (gone != stored_mob) + return + ai_controller.clear_blackboard_key(BB_LEGION_CORPSE) + stored_mob.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_LEGION_EATEN) + stored_mob.add_mood_event(MOOD_CATEGORY_LEGION_CORE, /datum/mood_event/healsbadman/long_term) // This will still probably mostly be gone before you are alive + stored_mob = null + +/mob/living/basic/mining/legion/death(gibbed) + if (isnull(stored_mob)) + new corpse_type(loc) + return ..() + +/// Put a corpse in this guy +/mob/living/basic/mining/legion/proc/consume(mob/living/consumed) + new /obj/effect/gibspawner/generic(consumed.loc) + gender = consumed.gender + name = consumed.real_name + consumed.investigate_log("has been killed by hivelord infestation.", INVESTIGATE_DEATHS) + consumed.death() + consumed.extinguish_mob() + consumed.fully_heal(HEAL_DAMAGE) + consumed.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_LEGION_EATEN) + consumed.forceMove(src) + ai_controller?.set_blackboard_key(BB_LEGION_CORPSE, consumed) + ai_controller?.set_blackboard_key(BB_LEGION_RECENT_LINES, consumed.copy_recent_speech(line_chance = 80)) + stored_mob = consumed + visible_message(span_warning("[src] staggers to [p_their()] feet!")) + if (prob(75)) + return + // Congratulations you have won a special prize: cancer + var/obj/item/organ/internal/legion_tumour/cancer = new() + cancer.Insert(consumed, special = TRUE, drop_if_replaced = FALSE) + +/// A Legion which only drops skeletons instead of corpses which might have fun loot, so it cannot be farmed +/mob/living/basic/mining/legion/spawner_made + corpse_type = /obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/charred + + +/// Like a Legion but it's an adorable snowman +/mob/living/basic/mining/legion/snow + name = "snow legion" + desc = "You can vaguely see what was once a human under the densely packed snow. Cute, but macabre." + icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' + icon_state = "snowlegion" + icon_living = "snowlegion" + // icon_aggro = "snowlegion_alive" + icon_dead = "snowlegion" + brood_type = /mob/living/basic/legion_brood/snow + corpse_type = /obj/effect/mob_spawn/corpse/human/legioninfested/snow + +/mob/living/basic/mining/legion/snow/Initialize(mapload) + . = ..() + AddComponent(/datum/component/appearance_on_aggro, aggro_state = "snowlegion_alive") // Surprise! I was real! + +/// As Snow Legion but spawns corpses which don't have any exciting loot +/mob/living/basic/mining/legion/snow/spawner_made + corpse_type = /obj/effect/mob_spawn/corpse/human/legioninfested/skeleton + + +/// Like a Legion but shorter and faster +/mob/living/basic/mining/legion/dwarf + name = "dwarf legion" + desc = "You can still see what was once a rather small human under the shifting mass of corruption." + icon_state = "dwarf_legion" + icon_living = "dwarf_legion" + icon_dead = "dwarf_legion" + maxHealth = 60 + health = 60 + speed = 2 + crusher_drop_chance = 20 + corpse_type = /obj/effect/mob_spawn/corpse/human/legioninfested/dwarf + + +/// Like a Legion but larger and spawns regular Legions, not currently used anywhere and very soulful +/mob/living/basic/mining/legion/large + name = "myriad" + desc = "A legion of legions, a dead end to whatever form the Necropolis was attempting to create." + icon = 'icons/mob/simple/lavaland/64x64megafauna.dmi' + icon_state = "legion" + icon_living = "legion" + icon_dead = "legion" + health_doll_icon = "legion" + speed = 5 + health = 450 + maxHealth = 450 + melee_damage_lower = 20 + melee_damage_upper = 20 + obj_damage = 30 + pixel_x = -16 + sentience_type = SENTIENCE_BOSS + +/mob/living/basic/mining/legion/large/Initialize(mapload) + . = ..() + AddComponent(\ + /datum/component/spawner,\ + spawn_types = list(/mob/living/basic/mining/legion),\ + spawn_time = 20 SECONDS,\ + max_spawned = 3,\ + spawn_text = "peels itself off from",\ + faction = faction,\ + ) + +/// Create what we want to drop on death, in proc form so we can always return a static list +/mob/living/basic/mining/legion/large/get_loot_list() + var/static/list/death_loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion = 3, /obj/effect/mob_spawn/corpse/human/legioninfested = 4) + return death_loot diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_ai.dm b/code/modules/mob/living/basic/lavaland/legion/legion_ai.dm new file mode 100644 index 000000000000..1bae1b303537 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/legion/legion_ai.dm @@ -0,0 +1,78 @@ +/// Keep away and launch skulls at every opportunity, prioritising injured allies +/datum/ai_controller/basic_controller/legion + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/legion, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + BB_AGGRO_RANGE = 5, // Unobservant + BB_BASIC_MOB_FLEE_DISTANCE = 6, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/random_speech/legion, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability, + /datum/ai_planning_subtree/flee_target/legion, + ) + +/// Chase and attack whatever we are targeting, if it's friendly we will heal them +/datum/ai_controller/basic_controller/legion_brood + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/legion, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/// Target nearby friendlies if they are hurt (and are not themselves Legions) +/datum/targeting_strategy/basic/legion + +/datum/targeting_strategy/basic/legion/faction_check(datum/ai_controller/controller, mob/living/living_mob, mob/living/the_target) + if (!living_mob.faction_check_atom(the_target, exact_match = check_factions_exactly)) + return FALSE + if (istype(the_target, living_mob.type)) + return TRUE + var/atom/created_by = living_mob.ai_controller.blackboard[BB_LEGION_BROOD_CREATOR] + if (!QDELETED(created_by) && istype(the_target, created_by.type)) + return TRUE + return the_target.stat == DEAD || the_target.health >= the_target.maxHealth + +/// Don't run away from friendlies +/datum/ai_planning_subtree/flee_target/legion + +/datum/ai_planning_subtree/flee_target/legion/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/target = controller.blackboard[target_key] + if (QDELETED(target) || target.faction_check_atom(controller.pawn)) + return // Only flee if we have a hostile target + return ..() + +/// Make spooky sounds, if we have a corpse inside then impersonate them +/datum/ai_planning_subtree/random_speech/legion + speech_chance = 1 + speak = list("Come...", "Legion...", "Why...?") + emote_hear = list("groans.", "wails.", "whimpers.") + emote_see = list("twitches.", "shudders.") + /// Stuff to specifically say into a radio + var/list/radio_speech = list("Come...", "Why...?") + +/datum/ai_planning_subtree/random_speech/legion/speak(datum/ai_controller/controller) + var/mob/living/carbon/human/victim = controller.blackboard[BB_LEGION_CORPSE] + if (QDELETED(victim) || prob(30)) + return ..() + + var/list/remembered_speech = controller.blackboard[BB_LEGION_RECENT_LINES] || list() + + if (length(remembered_speech) && prob(50)) // Don't spam the radio + controller.queue_behavior(/datum/ai_behavior/perform_speech, pick(remembered_speech)) + return + + var/obj/item/radio/mob_radio = locate() in victim.contents + if (QDELETED(mob_radio)) + return ..() // No radio, just talk funny + controller.queue_behavior(/datum/ai_behavior/perform_speech_radio, pick(radio_speech + remembered_speech), mob_radio, list(RADIO_CHANNEL_SUPPLY, RADIO_CHANNEL_COMMON)) diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm new file mode 100644 index 000000000000..5b5274a16eea --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/legion/legion_brood.dm @@ -0,0 +1,99 @@ +/// A spooky skull which heals lavaland mobs, attacks miners, and infests their bodies +/mob/living/basic/legion_brood + name = "legion" + desc = "One of many." + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "legion_head" + icon_living = "legion_head" + icon_dead = "legion_head" + icon_gib = "syndicate_gib" + basic_mob_flags = DEL_ON_DEATH + mob_size = MOB_SIZE_SMALL + pass_flags = PASSTABLE | PASSMOB + mob_biotypes = MOB_ORGANIC|MOB_BEAST + faction = list(FACTION_MINING) + unsuitable_atmos_damage = 0 + minimum_survivable_temperature = 0 + maximum_survivable_temperature = INFINITY + friendly_verb_continuous = "chatters near" + friendly_verb_simple = "chatter near" + maxHealth = 1 + health = 1 + melee_damage_lower = 12 + melee_damage_upper = 12 + obj_damage = 0 + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_vis_effect = ATTACK_EFFECT_BITE + speak_emote = list("echoes") // who the fuck speaking as this mob it dies 10 seconds after it spawns + attack_sound = 'sound/weapons/pierce.ogg' + density = FALSE + ai_controller = /datum/ai_controller/basic_controller/legion_brood + /// Reference to a guy who made us + var/mob/living/created_by + +/mob/living/basic/legion_brood/Initialize(mapload) + . = ..() + add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE), INNATE_TRAIT) + AddElement(/datum/element/simple_flying) + AddComponent(/datum/component/swarming) + AddComponent(/datum/component/clickbox, icon_state = "sphere", max_scale = 2) + addtimer(CALLBACK(src, PROC_REF(death)), 10 SECONDS) + +/mob/living/basic/legion_brood/death(gibbed) + if (!gibbed) + new /obj/effect/temp_visual/hive_spawn_wither(get_turf(src), /* copy_from = */ src) + return ..() + +/mob/living/basic/legion_brood/melee_attack(mob/living/target, list/modifiers, ignore_cooldown) + if (ishuman(target) && target.stat > SOFT_CRIT) + infest(target) + return + if (isliving(target) && faction_check_atom(target) && !istype(target, created_by?.type)) + visible_message(span_warning("[src] melds with [target]'s flesh!")) + target.apply_status_effect(/datum/status_effect/regenerative_core) + new /obj/effect/temp_visual/heal(get_turf(target), COLOR_HEALING_CYAN) + death() + return + return ..() + +/// Turn the targeted mob into one of us +/mob/living/basic/legion_brood/proc/infest(mob/living/target) + visible_message(span_warning("[name] burrows into the flesh of [target]!")) + var/spawn_type = get_legion_type(target) + var/mob/living/basic/mining/legion/new_legion = new spawn_type(loc) + new_legion.consume(target) + new_legion.faction = faction.Copy() + qdel(src) + +/// Returns the kind of legion we make out of the target +/mob/living/basic/legion_brood/proc/get_legion_type(mob/living/target) + if (HAS_TRAIT(target, TRAIT_DWARF)) + return /mob/living/basic/mining/legion/dwarf + return /mob/living/basic/mining/legion + +/// Sets someone as our creator, mostly so you can't use skulls to heal yourself +/mob/living/basic/legion_brood/proc/assign_creator(mob/living/creator, copy_full_faction = TRUE) + if (copy_full_faction) + faction = creator.faction.Copy() + else + faction |= REF(creator) + created_by = creator + ai_controller?.set_blackboard_key(BB_LEGION_BROOD_CREATOR, creator) + RegisterSignal(creator, COMSIG_PARENT_QDELETING, PROC_REF(creator_destroyed)) + +/// Reference handling +/mob/living/basic/legion_brood/proc/creator_destroyed() + SIGNAL_HANDLER + created_by = null + +/// Like the Legion's summoned skull but funnier (it's snow now) +/mob/living/basic/legion_brood/snow + name = "snow legion" + icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' + icon_state = "snowlegion_head" + icon_living = "snowlegion_head" + icon_dead = "snowlegion_head" + +/mob/living/basic/legion_brood/snow/get_legion_type(mob/living/target) + return /mob/living/basic/mining/legion/snow diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm new file mode 100644 index 000000000000..b79edb3c33c6 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm @@ -0,0 +1,159 @@ +/// Left behind when a legion infects you, for medical enrichment +/obj/item/organ/internal/legion_tumour + name = "legion tumour" + desc = "A mass of pulsing flesh and dark tendrils, containing the power to regenerate flesh at a terrible cost." + failing_desc = "pulses and writhes with horrible life, reaching towards you with its tendrils!" + icon = 'icons/obj/medical/organs/mining_organs.dmi' + icon_state = "legion_remains" + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_PARASITE_EGG + decay_factor = STANDARD_ORGAN_DECAY * 3 // About 5 minutes outside of a host + /// What stage of growth the corruption has reached. + var/stage = 0 + /// We apply this status effect periodically or when used on someone + var/applied_status = /datum/status_effect/regenerative_core + /// How long have we been in this stage? + var/elapsed_time = 0 SECONDS + /// How long does it take to advance one stage? + var/growth_time = 80 SECONDS // Long enough that if you go back to lavaland without realising it you're not totally fucked + /// What kind of mob will we transform into? + var/spawn_type = /mob/living/basic/mining/legion + /// Spooky sounds to play as you start to turn + var/static/list/spooky_sounds = list( + 'sound/voice/lowHiss1.ogg', + 'sound/voice/lowHiss2.ogg', + 'sound/voice/lowHiss3.ogg', + 'sound/voice/lowHiss4.ogg', + ) + +/obj/item/organ/internal/legion_tumour/Initialize(mapload) + . = ..() + animate_pulse() + +/obj/item/organ/internal/legion_tumour/apply_organ_damage(damage_amount, maximum, required_organtype) + var/was_failing = organ_flags & ORGAN_FAILING + . = ..() + if (was_failing != (organ_flags & ORGAN_FAILING)) + animate_pulse() + +/obj/item/organ/internal/legion_tumour/set_organ_damage(damage_amount, required_organ_flag) + . = ..() + animate_pulse() + +/// Do a heartbeat animation depending on if we're failing or not +/obj/item/organ/internal/legion_tumour/proc/animate_pulse() + animate(src, transform = matrix()) // Stop any current animation + + var/speed_divider = organ_flags & ORGAN_FAILING ? 2 : 1 + + animate(src, transform = matrix().Scale(1.1), time = 0.5 SECONDS / speed_divider, easing = SINE_EASING | EASE_OUT, loop = -1, flags = ANIMATION_PARALLEL) + animate(transform = matrix(), time = 0.5 SECONDS / speed_divider, easing = SINE_EASING | EASE_IN) + animate(transform = matrix(), time = 2 SECONDS / speed_divider) + +/obj/item/organ/internal/legion_tumour/Remove(mob/living/carbon/egg_owner, special) + . = ..() + stage = 0 + elapsed_time = 0 + +/obj/item/organ/internal/legion_tumour/attack(mob/living/target, mob/living/user, params) + if (try_apply(target, user)) + qdel(src) + return + return ..() + +/// Smear it on someone like a regen core, why not. Make sure they're alive though. +/obj/item/organ/internal/legion_tumour/proc/try_apply(mob/living/target, mob/user) + if(!user.Adjacent(target) || !isliving(target)) + return FALSE + + if (target.stat <= SOFT_CRIT && !(organ_flags & ORGAN_FAILING)) + target.add_mood_event(MOOD_CATEGORY_LEGION_CORE, /datum/mood_event/healsbadman) + target.apply_status_effect(applied_status) + + if (target != user) + target.visible_message(span_notice("[user] splatters [target] with [src]... Disgusting tendrils pull [target.p_their()] wounds shut!")) + else + to_chat(user, span_notice("You smear [src] on yourself. Disgusting tendrils pull your wounds closed.")) + return TRUE + + if (!ishuman(target)) + return FALSE + + target.visible_message(span_boldwarning("[user] splatters [target] with [src]... and it springs into horrible life!")) + var/mob/living/basic/legion_brood/skull = new(target.loc) + skull.melee_attack(target) + return TRUE + +/obj/item/organ/internal/legion_tumour/on_life(seconds_per_tick, times_fired) + . = ..() + if (QDELETED(src) || QDELETED(owner)) + return + + if (stage >= 2) + if(SPT_PROB(stage / 5, seconds_per_tick)) + to_chat(owner, span_notice("You feel a bit better.")) + owner.apply_status_effect(applied_status) // It's not all bad! + if(SPT_PROB(1, seconds_per_tick)) + owner.emote("twitch") + + switch(stage) + if(2, 3) + if(SPT_PROB(1, seconds_per_tick)) + to_chat(owner, span_danger("Your chest spasms!")) + if(SPT_PROB(1, seconds_per_tick)) + to_chat(owner, span_danger("You feel weak.")) + if(SPT_PROB(1, seconds_per_tick)) + SEND_SOUND(owner, sound(pick(spooky_sounds))) + if(SPT_PROB(2, seconds_per_tick)) + owner.vomit() + if(4, 5) + if(SPT_PROB(2, seconds_per_tick)) + to_chat(owner, span_danger("Something flexes under your skin.")) + if(SPT_PROB(2, seconds_per_tick)) + if (prob(40)) + SEND_SOUND(owner, sound('sound/voice/ghost_whisper.ogg')) + else + SEND_SOUND(owner, sound(pick(spooky_sounds))) + if(SPT_PROB(3, seconds_per_tick)) + owner.vomit(vomit_type = /obj/effect/decal/cleanable/vomit/old/black_bile) + if (prob(50)) + var/turf/check_turf = get_step(owner.loc, owner.dir) + var/atom/land_turf = (check_turf.is_blocked_turf()) ? owner.loc : check_turf + var/mob/living/basic/legion_brood/child = new(land_turf) + child.assign_creator(owner, copy_full_faction = FALSE) + + if(SPT_PROB(3, seconds_per_tick)) + to_chat(owner, span_danger("Your muscles ache.")) + owner.take_bodypart_damage(3) + + if (stage == 5) + if (SPT_PROB(10, seconds_per_tick)) + infest() + return + + elapsed_time += seconds_per_tick SECONDS * ((organ_flags & ORGAN_FAILING) ? 3 : 1) // Let's call it "matured" rather than failed + if (elapsed_time < growth_time) + return + stage++ + elapsed_time = 0 + if (stage == 5) + to_chat(owner, span_bolddanger("Something is moving under your skin!")) + +/// Consume our host +/obj/item/organ/internal/legion_tumour/proc/infest() + if (QDELETED(src) || QDELETED(owner)) + return + owner.visible_message(span_boldwarning("Black tendrils burst from [owner]'s flesh, covering them in amorphous flesh!")) + var/mob/living/basic/mining/legion/new_legion = new spawn_type(owner.loc) + new_legion.consume(owner) + qdel(src) + +/obj/item/organ/internal/legion_tumour/on_find(mob/living/finder) + . = ..() + to_chat(finder, span_warning("There's an enormous tumour in [owner]'s [zone]!")) + if(stage < 4) + to_chat(finder, span_notice("Its tendrils seem to twitch towards the light.")) + return + to_chat(finder, span_notice("Its pulsing tendrils reach all throughout the body.")) + if(prob(stage * 2)) + infest() diff --git a/code/modules/mob/living/basic/lavaland/legion/spawn_legions.dm b/code/modules/mob/living/basic/lavaland/legion/spawn_legions.dm new file mode 100644 index 000000000000..bd9b2c2aff99 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/legion/spawn_legions.dm @@ -0,0 +1,108 @@ +/// Spawns a little worm nearby +/datum/action/cooldown/mob_cooldown/skull_launcher + name = "Launch Legion" + desc = "Propel a living piece of your body to a distant location." + button_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + button_icon_state = "legion_head" + background_icon_state = "bg_demon" + overlay_icon_state = "bg_demon_border" + click_to_activate = TRUE + cooldown_time = 2 SECONDS + melee_cooldown_time = 0 + shared_cooldown = NONE + /// If a mob is not clicked directly, inherit targeting data from this blackboard key and setting it upon this target key + var/ai_target_key = BB_BASIC_MOB_CURRENT_TARGET + /// What are we actually spawning? + var/spawn_type = /mob/living/basic/legion_brood + /// How far can we fire? + var/max_range = 7 + +/datum/action/cooldown/mob_cooldown/skull_launcher/Activate(atom/target) + var/turf/target_turf = get_turf(target) + + if (get_dist(owner, target_turf) > max_range) + target_turf = get_ranged_target_turf_direct(owner, target_turf, max_range) + + if (target_turf.is_blocked_turf()) + var/list/near_turfs = RANGE_TURFS(1, target_turf) - target_turf + for (var/turf/check_turf as anything in near_turfs) + if (check_turf.is_blocked_turf()) + near_turfs -= check_turf + if (length(near_turfs)) + target_turf = pick(near_turfs) + else if(target_turf.is_blocked_turf(exclude_mobs = TRUE)) + owner.balloon_alert(owner, "no room!") + StartCooldown(0.5 SECONDS) + return + + var/ai_target = isliving(target) ? target : null + if (isnull(ai_target)) + ai_target = owner.ai_controller?.blackboard[ai_target_key] + + var/target_dir = get_dir(owner, target) + + var/obj/effect/temp_visual/legion_skull_depart/launch = new(get_turf(owner)) + launch.set_appearance(spawn_type) + launch.dir = target_dir + new /obj/effect/temp_visual/legion_brood_indicator(target_turf) + var/obj/effect/temp_visual/legion_skull_land/land = new(target_turf) + land.dir = target_dir + land.set_appearance(spawn_type, CALLBACK(src, PROC_REF(spawn_skull), target_turf, ai_target)) + StartCooldown() + +/// Actually create a mob +/datum/action/cooldown/mob_cooldown/skull_launcher/proc/spawn_skull(turf/spawn_location, target) + var/mob/living/basic/legion_brood/brood = new spawn_type(spawn_location) + if (istype(brood)) + brood.assign_creator(owner) + brood.ai_controller?.set_blackboard_key(ai_target_key, target) + brood.dir = get_dir(owner, spawn_location) + if (!isnull(target)) + brood.face_atom(target) + else + brood.dir = get_dir(owner, spawn_location) + + +/// Animation for launching a skull +/obj/effect/temp_visual/legion_skull_depart + name = "legion brood launch" + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "legion_head" + duration = 0.25 SECONDS + +/// Copy appearance from the passed atom type +/obj/effect/temp_visual/legion_skull_depart/proc/set_appearance(atom/spawned_type) + icon = initial(spawned_type.icon) + icon_state = initial(spawned_type.icon_state) + animate(src, alpha = 0, pixel_y = 72, time = duration) + +/// Animation for landing a skull +/obj/effect/temp_visual/legion_skull_land + name = "legion brood land" + duration = 0.5 SECONDS + icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' + icon_state = "legion_head" + alpha = 0 + pixel_y = 72 + +/// Copy appearance from the passed atom type and store what to do on animation complete +/obj/effect/temp_visual/legion_skull_land/proc/set_appearance(atom/spawned_type, datum/callback/on_completed) + icon = initial(spawned_type.icon) + icon_state = initial(spawned_type.icon_state) + animate(src, alpha = 0, pixel_y = 72, time = duration / 2) + animate(alpha = 255, pixel_y = 0, time = duration / 2) + addtimer(on_completed, duration, TIMER_DELETE_ME) + +/// A skull is going to be here! Oh no! +/obj/effect/temp_visual/legion_brood_indicator + name = "legion brood land" + duration = 0.75 SECONDS + layer = BELOW_MOB_LAYER + plane = GAME_PLANE + icon = 'icons/mob/telegraphing/telegraph.dmi' + icon_state = "skull" + +/obj/effect/temp_visual/legion_brood_indicator/Initialize(mapload) + . = ..() + animate(src, alpha = 255, time = 0.5 SECONDS) + animate(alpha = 0, time = 0.25 SECONDS) diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm index bc60ec88aa7d..2e5baae1e067 100644 --- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity.dm @@ -18,6 +18,7 @@ attack_verb_simple = "snip" attack_sound = 'sound/weapons/bite.ogg' attack_vis_effect = ATTACK_EFFECT_BITE // Closer than a scratch to a crustacean pinching effect + melee_attack_cooldown = 1 SECONDS butcher_results = list( /obj/item/food/meat/crab = 2, /obj/item/stack/sheet/bone = 2, @@ -27,24 +28,23 @@ ai_controller = /datum/ai_controller/basic_controller/lobstrosity /// Charging ability var/datum/action/cooldown/mob_cooldown/charge/basic_charge/lobster/charge - /// Limbs we will cut off an unconscious man - var/static/list/target_limbs = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) /// Things we will eat if we see them (arms, chiefly) var/static/list/target_foods = list(/obj/item/bodypart/arm) /mob/living/basic/mining/lobstrosity/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SNOWSTORM_IMMUNE, INNATE_TRAIT) + AddElement(/datum/element/mob_grabber) AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) AddElement(/datum/element/basic_eating, food_types = target_foods) AddElement(\ /datum/element/amputating_limbs,\ - surgery_verb = "snipping",\ - target_zones = target_limbs,\ + surgery_verb = "begins snipping",\ + target_zones = GLOB.arm_zones,\ ) charge = new(src) charge.Grant(src) - ai_controller.set_blackboard_key(BB_TARGETTED_ACTION, charge) + ai_controller.set_blackboard_key(BB_TARGETED_ACTION, charge) /mob/living/basic/mining/lobstrosity/Destroy() QDEL_NULL(charge) @@ -68,12 +68,12 @@ /datum/action/cooldown/mob_cooldown/charge/basic_charge/lobster/hit_target(atom/movable/source, atom/target, damage_dealt) . = ..() - if(!isliving(target) || !isbasicmob(source)) + if(!isbasicmob(source)) return var/mob/living/basic/basic_source = source var/mob/living/living_target = target - basic_source.melee_attack(living_target) - basic_source.ai_controller?.set_blackboard_key(BB_BASIC_MOB_FLEEING, FALSE) + basic_source.melee_attack(living_target, ignore_cooldown = TRUE) + basic_source.ai_controller?.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE) basic_source.start_pulling(living_target) /datum/action/cooldown/mob_cooldown/charge/basic_charge/lobster/do_charge(atom/movable/charger, atom/target_atom, delay, past) diff --git a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm index dcbeb1e670ca..b80d5d6b9f79 100644 --- a/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm +++ b/code/modules/mob/living/basic/lavaland/lobstrosity/lobstrosity_ai.dm @@ -1,8 +1,8 @@ /datum/ai_controller/basic_controller/lobstrosity blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/lobster, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, BB_LOBSTROSITY_EXPLOIT_TRAITS = list(TRAIT_INCAPACITATED, TRAIT_FLOORED, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT), - BB_BASIC_MOB_FLEEING = TRUE, BB_LOBSTROSITY_FINGER_LUST = 0 ) @@ -19,14 +19,11 @@ /datum/ai_planning_subtree/find_fingers, ) -/datum/targetting_datum/basic/lobster - stat_attack = HARD_CRIT - /datum/ai_planning_subtree/basic_melee_attack_subtree/lobster melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/lobster /datum/ai_planning_subtree/basic_melee_attack_subtree/lobster/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - if (controller.blackboard[BB_BASIC_MOB_FLEEING]) + if (!controller.blackboard[BB_BASIC_MOB_STOP_FLEEING]) return if (!isnull(controller.blackboard[BB_LOBSTROSITY_TARGET_LIMB])) return @@ -36,9 +33,8 @@ return ..() /datum/ai_behavior/basic_melee_attack/lobster - action_cooldown = 1 SECONDS -/datum/ai_behavior/basic_melee_attack/lobster/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) +/datum/ai_behavior/basic_melee_attack/lobster/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key) var/mob/living/target = controller.blackboard[target_key] if (isnull(target)) return ..() @@ -49,18 +45,21 @@ is_vulnerable = TRUE break if (!is_vulnerable) - controller.set_blackboard_key(BB_BASIC_MOB_FLEEING, TRUE) - if (controller.blackboard[BB_BASIC_MOB_FLEEING]) + controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, FALSE) + if (!controller.blackboard[BB_BASIC_MOB_STOP_FLEEING]) finish_action(controller = controller, succeeded = TRUE, target_key = target_key) // We don't want to clear our target return - var/mob/living/living_pawn = controller.pawn - if (target.stat != CONSCIOUS) - living_pawn.start_pulling(target) // No crawling away return ..() /datum/ai_planning_subtree/flee_target/lobster flee_behaviour = /datum/ai_behavior/run_away_from_target/lobster +/datum/ai_planning_subtree/flee_target/lobster/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/datum/action/cooldown/using_action = controller.blackboard[BB_TARGETED_ACTION] + if (using_action?.IsAvailable()) + return + return ..() + /datum/ai_behavior/run_away_from_target/lobster clear_failed_targets = FALSE @@ -68,13 +67,18 @@ var/atom/target = controller.blackboard[target_key] if(isnull(target)) return ..() + for (var/trait in controller.blackboard[BB_LOBSTROSITY_EXPLOIT_TRAITS]) if (!HAS_TRAIT(target, trait)) continue - controller.set_blackboard_key(BB_BASIC_MOB_FLEEING, FALSE) + controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE) finish_action(controller, succeeded = FALSE) return + var/mob/living/us = controller.pawn + if (us.pulling == target) + us.stop_pulling() // If we're running away from someone, best not to bring them with us + return ..() /// Don't use charge ability on an adjacent target, and make sure you're visible before you start diff --git a/code/modules/mob/living/basic/lavaland/mining.dm b/code/modules/mob/living/basic/lavaland/mining.dm index 64a445c9deed..825f36bed6b4 100644 --- a/code/modules/mob/living/basic/lavaland/mining.dm +++ b/code/modules/mob/living/basic/lavaland/mining.dm @@ -8,6 +8,10 @@ unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 maximum_survivable_temperature = INFINITY + // Pale purple, should be red enough to see stuff on lavaland + lighting_cutoff_red = 25 + lighting_cutoff_green = 15 + lighting_cutoff_blue = 35 /// Message to output if throwing damage is absorbed var/throw_blocked_message = "bounces off" /// What crusher trophy this mob drops, if any diff --git a/code/modules/mob/living/basic/lavaland/mook/mook.dm b/code/modules/mob/living/basic/lavaland/mook/mook.dm new file mode 100644 index 000000000000..e3e518833fab --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/mook/mook.dm @@ -0,0 +1,273 @@ +//Fragile but highly aggressive wanderers that pose a large threat in numbers. +//They'll attempt to leap at their target from afar using their hatchets. +/mob/living/basic/mining/mook + name = "wanderer" + desc = "This unhealthy looking primitive seems to be talented at administiring health care." + icon = 'icons/mob/simple/jungle/mook.dmi' + icon_state = "mook" + icon_living = "mook" + icon_dead = "mook_dead" + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + gender = FEMALE + maxHealth = 150 + faction = list(FACTION_MINING, FACTION_NEUTRAL) + health = 150 + move_resist = MOVE_FORCE_OVERPOWERING + melee_damage_lower = 8 + melee_damage_upper = 8 + pass_flags_self = LETPASSTHROW + attack_sound = 'sound/weapons/rapierhit.ogg' + attack_vis_effect = ATTACK_EFFECT_SLASH + death_sound = 'sound/voice/mook_death.ogg' + ai_controller = /datum/ai_controller/basic_controller/mook/support + speed = 5 + + pixel_x = -16 + base_pixel_x = -16 + pixel_y = -16 + base_pixel_y = -16 + + ///the state of combat we are in + var/attack_state = MOOK_ATTACK_NEUTRAL + ///are we a healer? + var/is_healer = TRUE + ///the ore we are holding if any + var/obj/held_ore + ///overlay for neutral stance + var/mutable_appearance/neutral_stance + ///overlay for attacking stance + var/mutable_appearance/attack_stance + ///overlay when we hold an ore + var/mutable_appearance/ore_overlay + ///commands we obey + var/list/pet_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/point_targeting/attack, + /datum/pet_command/point_targeting/fetch, + ) + +/mob/living/basic/mining/mook/Initialize(mapload) + . = ..() + AddComponent(/datum/component/ai_retaliate_advanced, CALLBACK(src, PROC_REF(attack_intruder))) + var/datum/action/cooldown/mob_cooldown/mook_ability/mook_jump/jump = new(src) + jump.Grant(src) + ai_controller.set_blackboard_key(BB_MOOK_JUMP_ABILITY, jump) + + ore_overlay = mutable_appearance(icon, "mook_ore_overlay") + + AddComponent(/datum/component/ai_listen_to_weather) + AddElement(/datum/element/wall_smasher) + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + RegisterSignal(src, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(drop_ore)) + + if(is_healer) + grant_healer_abilities() + + AddComponent(/datum/component/obeys_commands, pet_commands) + +/mob/living/basic/mining/mook/proc/grant_healer_abilities() + AddComponent(\ + /datum/component/healing_touch,\ + heal_brute = melee_damage_upper,\ + heal_burn = melee_damage_upper,\ + heal_time = 0,\ + valid_targets_typecache = typecacheof(list(/mob/living/basic/mining/mook)),\ + ) + +/mob/living/basic/mining/mook/Entered(atom/movable/mover) + if(istype(mover, /obj/item/stack/ore)) + held_ore = mover + update_appearance(UPDATE_OVERLAYS) + + return ..() + +/mob/living/basic/mining/mook/Exited(atom/movable/mover) + . = ..() + if(held_ore != mover) + return + held_ore = null + update_appearance(UPDATE_OVERLAYS) + +/mob/living/basic/mining/mook/proc/pre_attack(mob/living/attacker, atom/target) + SIGNAL_HANDLER + + return attack_sequence(target) + +/mob/living/basic/mining/mook/proc/attack_sequence(atom/target) + if(istype(target, /obj/item/stack/ore) && isnull(held_ore)) + var/obj/item/ore_target = target + ore_target.forceMove(src) + return COMPONENT_HOSTILE_NO_ATTACK + + if(istype(target, /obj/structure/ore_container/material_stand)) + if(held_ore) + held_ore.forceMove(target) + return COMPONENT_HOSTILE_NO_ATTACK + + if(istype(target, /obj/structure/bonfire)) + var/obj/structure/bonfire/fire_target = target + if(!fire_target.burning) + fire_target.start_burning() + return COMPONENT_HOSTILE_NO_ATTACK + +/mob/living/basic/mining/mook/proc/change_combatant_state(state) + attack_state = state + update_appearance() + +/mob/living/basic/mining/mook/Destroy() + QDEL_NULL(held_ore) + return ..() + +/mob/living/basic/mining/mook/update_icon_state() + . = ..() + if(stat == DEAD) + return + switch(attack_state) + if(MOOK_ATTACK_NEUTRAL) + icon_state = "mook" + if(MOOK_ATTACK_WARMUP) + icon_state = "mook_warmup" + if(MOOK_ATTACK_ACTIVE) + icon_state = "mook_leap" + if(MOOK_ATTACK_STRIKE) + icon_state = "mook_strike" + +/mob/living/basic/mining/mook/update_overlays() + . = ..() + if(stat == DEAD) + return + + if(attack_state != MOOK_ATTACK_NEUTRAL || isnull(held_ore)) + return + + . += ore_overlay + +/mob/living/basic/mining/mook/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE) + change_combatant_state(state = MOOK_ATTACK_ACTIVE) + return ..() + +/mob/living/basic/mining/mook/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + . = ..() + change_combatant_state(state = MOOK_ATTACK_NEUTRAL) + +/mob/living/basic/mining/mook/CanAllowThrough(atom/movable/mover, border_dir) + . = ..() + + if(!istype(mover, /mob/living/basic/mining/mook)) + return FALSE + + var/mob/living/basic/mining/mook/mook_moover = mover + if(mook_moover.attack_state == MOOK_ATTACK_ACTIVE) + return TRUE + +/mob/living/basic/mining/mook/proc/drop_ore(mob/living/user) + SIGNAL_HANDLER + + if(isnull(held_ore)) + return + dropItemToGround(held_ore) + return COMSIG_KB_ACTIVATED + +/mob/living/basic/mining/mook/death() + desc = "A deceased primitive. Upon closer inspection, it was suffering from severe cellular degeneration and its garments are machine made..." //Can you guess the twist + return ..() + +/mob/living/basic/mining/mook/proc/attack_intruder(mob/living/intruder) + if(istype(intruder, /mob/living/basic/mining/mook)) + return + for(var/mob/living/basic/mining/mook/villager in oview(src, 9)) + villager.ai_controller?.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, intruder) + + +/mob/living/basic/mining/mook/worker + desc = "This unhealthy looking primitive is wielding a rudimentary hatchet, swinging it with wild abandon. One isn't much of a threat, but in numbers they can quickly overwhelm a superior opponent." + gender = MALE + melee_damage_lower = 15 + melee_damage_upper = 15 + ai_controller = /datum/ai_controller/basic_controller/mook + is_healer = FALSE + +/mob/living/basic/mining/mook/worker/Initialize(mapload) + . = ..() + neutral_stance = mutable_appearance(icon, "mook_axe_overlay") + attack_stance = mutable_appearance(icon, "axe_strike_overlay") + update_appearance() + var/datum/action/cooldown/mob_cooldown/mook_ability/mook_leap/leap = new(src) + leap.Grant(src) + ai_controller.set_blackboard_key(BB_MOOK_LEAP_ABILITY, leap) + +/mob/living/basic/mining/mook/worker/attack_sequence(atom/target) + . = ..() + if(. & COMPONENT_HOSTILE_NO_ATTACK) + return + + if(attack_state == MOOK_ATTACK_STRIKE) + return COMPONENT_HOSTILE_NO_ATTACK + + change_combatant_state(state = MOOK_ATTACK_STRIKE) + addtimer(CALLBACK(src, PROC_REF(change_combatant_state), MOOK_ATTACK_NEUTRAL), 0.3 SECONDS) + +/mob/living/basic/mining/mook/worker/update_overlays() + . = ..() + if(stat == DEAD) + return + + switch(attack_state) + if(MOOK_ATTACK_STRIKE) + . += attack_stance + if(MOOK_ATTACK_NEUTRAL) + . += neutral_stance + +/mob/living/basic/mining/mook/worker/bard + desc = "It's holding a guitar?" + melee_damage_lower = 10 + melee_damage_upper = 10 + gender = MALE + attack_sound = 'sound/weapons/stringsmash.ogg' + death_sound = 'sound/voice/mook_death.ogg' + ai_controller = /datum/ai_controller/basic_controller/mook/bard + ///our guitar + var/obj/item/instrument/guitar/held_guitar + +/mob/living/basic/mining/mook/worker/bard/Initialize(mapload) + . = ..() + neutral_stance = mutable_appearance(icon, "bard_overlay") + attack_stance = mutable_appearance(icon, "bard_strike") + held_guitar = new(src) + ai_controller.set_blackboard_key(BB_SONG_INSTRUMENT, held_guitar) + update_appearance() + +/mob/living/basic/mining/mook/worker/tribal_chief + name = "tribal chief" + desc = "Acknowledge him!" + gender = MALE + melee_damage_lower = 20 + melee_damage_upper = 20 + ai_controller = /datum/ai_controller/basic_controller/mook/tribal_chief + ///overlay in our neutral state + var/static/mutable_appearance/chief_neutral = mutable_appearance('icons/mob/simple/jungle/mook.dmi', "mook_chief") + ///overlay in our striking state + var/static/mutable_appearance/chief_strike = mutable_appearance('icons/mob/simple/jungle/mook.dmi', "mook_chief_strike") + ///overlay in our active state + var/static/mutable_appearance/chief_active = mutable_appearance('icons/mob/simple/jungle/mook.dmi', "mook_chief_leap") + ///overlay in our warmup state + var/static/mutable_appearance/chief_warmup = mutable_appearance('icons/mob/simple/jungle/mook.dmi', "mook_chief_warmup") + +/mob/living/basic/mining/mook/worker/tribal_chief/Initialize(mapload) + . = ..() + update_appearance() + +/mob/living/basic/mining/mook/worker/tribal_chief/update_overlays() + . = ..() + if(stat == DEAD) + return + switch(attack_state) + if(MOOK_ATTACK_NEUTRAL) + . += chief_neutral + if(MOOK_ATTACK_WARMUP) + . += chief_warmup + if(MOOK_ATTACK_ACTIVE) + . += chief_active + if(MOOK_ATTACK_STRIKE) + . += chief_strike diff --git a/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm b/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm new file mode 100644 index 000000000000..cfc359bd54fc --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm @@ -0,0 +1,140 @@ +/datum/action/cooldown/mob_cooldown/mook_ability + ///are we a mook? + var/is_mook = FALSE + +/datum/action/cooldown/mob_cooldown/mook_ability/Grant(mob/grant_to) + . = ..() + if(isnull(owner)) + return + is_mook = istype(owner, /mob/living/basic/mining/mook) + +/datum/action/cooldown/mob_cooldown/mook_ability/IsAvailable(feedback) + . = ..() + + if(!.) + return FALSE + + if(!is_mook) + return TRUE + + var/mob/living/basic/mining/mook/mook_owner = owner + if(mook_owner.attack_state != MOOK_ATTACK_NEUTRAL) + if(feedback) + mook_owner.balloon_alert(mook_owner, "still recovering!") + return FALSE + return TRUE + +/datum/action/cooldown/mob_cooldown/mook_ability/mook_leap + name = "Mook leap" + desc = "Leap towards the enemy!" + cooldown_time = 7 SECONDS + shared_cooldown = NONE + melee_cooldown_time = 0 SECONDS + ///telegraph time before jumping + var/wind_up_time = 2 SECONDS + ///intervals between each of our attacks + var/attack_interval = 0.4 SECONDS + ///how many times do we attack if we reach the target? + var/times_to_attack = 4 + +/datum/action/cooldown/mob_cooldown/mook_ability/mook_leap/Activate(atom/target) + if(owner.CanReach(target)) + attack_combo(target) + StartCooldown() + return TRUE + + if(is_mook) + var/mob/living/basic/mining/mook/mook_owner = owner + mook_owner.change_combatant_state(state = MOOK_ATTACK_WARMUP) + + addtimer(CALLBACK(src, PROC_REF(launch_towards_target), target), wind_up_time) + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/mook_ability/mook_leap/proc/launch_towards_target(atom/target) + new /obj/effect/temp_visual/mook_dust(get_turf(owner)) + playsound(get_turf(owner), 'sound/weapons/thudswoosh.ogg', 25, TRUE) + playsound(owner, 'sound/voice/mook_leap_yell.ogg', 100, TRUE) + var/turf/target_turf = get_turf(target) + + if(!target_turf.is_blocked_turf()) + owner.throw_at(target = target_turf, range = 7, speed = 1, spin = FALSE, callback = CALLBACK(src, PROC_REF(attack_combo), target)) + return + + var/list/open_turfs = list() + + for(var/turf/possible_turf in get_adjacent_open_turfs(target)) + if(possible_turf.is_blocked_turf()) + continue + open_turfs += possible_turf + + if(!length(open_turfs)) + return + + var/turf/final_turf = get_closest_atom(/turf, open_turfs, owner) + owner.throw_at(target = final_turf, range = 7, speed = 1, spin = FALSE, callback = CALLBACK(src, PROC_REF(attack_combo), target)) + +/datum/action/cooldown/mob_cooldown/mook_ability/mook_leap/proc/attack_combo(atom/target) + if(!owner.CanReach(target)) + return FALSE + + for(var/i in 0 to (times_to_attack - 1)) + addtimer(CALLBACK(src, PROC_REF(attack_target), target), i * attack_interval) + +/datum/action/cooldown/mob_cooldown/mook_ability/mook_leap/proc/attack_target(atom/target) + if(!owner.CanReach(target) || owner.stat == DEAD) + return + var/mob/living/basic/basic_owner = owner + basic_owner.melee_attack(target, ignore_cooldown = TRUE) + +/datum/action/cooldown/mob_cooldown/mook_ability/mook_jump + name = "Mook Jump" + desc = "Soar high in the air!" + cooldown_time = 14 SECONDS + shared_cooldown = NONE + melee_cooldown_time = 0 SECONDS + click_to_activate = FALSE + +/datum/action/cooldown/mob_cooldown/mook_ability/mook_jump/Activate(atom/target) + var/obj/effect/landmark/drop_zone = locate(/obj/effect/landmark/mook_village) in GLOB.landmarks_list + if(drop_zone?.z == owner.z) + var/turf/jump_destination = get_turf(drop_zone) + jump_to_turf(jump_destination) + StartCooldown() + return TRUE + var/list/potential_turfs = list() + for(var/turf/open_turf in oview(9, owner)) + if(!open_turf.is_blocked_turf()) + potential_turfs += open_turf + if(!length(potential_turfs)) + return FALSE + jump_to_turf(pick(potential_turfs)) + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/mook_ability/mook_jump/proc/jump_to_turf(turf/target) + if(is_mook) + var/mob/living/basic/mining/mook/mook_owner = owner + mook_owner.change_combatant_state(state = MOOK_ATTACK_ACTIVE) + new /obj/effect/temp_visual/mook_dust(get_turf(owner)) + playsound(get_turf(owner), 'sound/weapons/thudswoosh.ogg', 50, TRUE) + animate(owner, pixel_y = owner.base_pixel_y + 146, time = 0.5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(land_on_turf), target), 0.5 SECONDS) + +/datum/action/cooldown/mob_cooldown/mook_ability/mook_jump/proc/land_on_turf(turf/target) + do_teleport(owner, target, precision = 3, no_effects = TRUE) + animate(owner, pixel_y = owner.base_pixel_y, time = 0.5 SECONDS) + new /obj/effect/temp_visual/mook_dust(get_turf(owner)) + if(is_mook) + addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living/basic/mining/mook, change_combatant_state), MOOK_ATTACK_NEUTRAL), 0.5 SECONDS) + +/obj/effect/temp_visual/mook_dust + name = "dust" + desc = "It's just a dust cloud!" + icon = 'icons/mob/simple/jungle/mook.dmi' + icon_state = "mook_leap_cloud" + layer = BELOW_MOB_LAYER + plane = GAME_PLANE + base_pixel_y = -16 + base_pixel_x = -16 + duration = 1 SECONDS diff --git a/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm b/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm new file mode 100644 index 000000000000..cf79eb06aa60 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm @@ -0,0 +1,427 @@ +///commands the chief can pick from +GLOBAL_LIST_INIT(mook_commands, list( + new /datum/pet_command/point_targeting/attack, + new /datum/pet_command/point_targeting/fetch, +)) + +/datum/ai_controller/basic_controller/mook + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/mook, + BB_BLACKLIST_MINERAL_TURFS = list(/turf/closed/mineral/gibtonite, /turf/closed/mineral/strong), + BB_MAXIMUM_DISTANCE_TO_VILLAGE = 7, + BB_STORM_APPROACHING = FALSE, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/look_for_village, + /datum/ai_planning_subtree/targeted_mob_ability/leap, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/find_and_hunt_target/material_stand, + /datum/ai_planning_subtree/use_mob_ability/mook_jump, + /datum/ai_planning_subtree/find_and_hunt_target/hunt_ores/mook, + /datum/ai_planning_subtree/mine_walls/mook, + /datum/ai_planning_subtree/wander_away_from_village, + ) + +///check for faction if not a ash walker, otherwise just attack +/datum/targeting_strategy/basic/mook/faction_check(datum/ai_controller/controller, mob/living/living_mob, mob/living/the_target) + if(FACTION_ASHWALKER in living_mob.faction) + return FALSE + + return ..() + +/datum/ai_planning_subtree/targeted_mob_ability/leap + ability_key = BB_MOOK_LEAP_ABILITY + +/datum/ai_planning_subtree/use_mob_ability/mook_jump + ability_key = BB_MOOK_JUMP_ABILITY + +///jump towards the village when we have found ore or there is a storm coming +/datum/ai_planning_subtree/use_mob_ability/mook_jump/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/storm_approaching = controller.blackboard[BB_STORM_APPROACHING] + var/mob/living/living_pawn = controller.pawn + var/obj/effect/home = controller.blackboard[BB_HOME_VILLAGE] + if(QDELETED(home)) + return + if(get_dist(living_pawn, home) < controller.blackboard[BB_MAXIMUM_DISTANCE_TO_VILLAGE]) + return + if(home.z != living_pawn.z) + return + if(!storm_approaching && !(locate(/obj/item/stack/ore) in living_pawn)) + return + + controller.clear_blackboard_key(BB_TARGET_MINERAL_WALL) + return ..() + +///hunt ores that we will haul off back to the village +/datum/ai_planning_subtree/find_and_hunt_target/hunt_ores/mook + +/datum/ai_planning_subtree/find_and_hunt_target/hunt_ores/mook/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + if(locate(/obj/item/stack/ore) in living_pawn) + return + return ..() + +///deposit ores into the stand! +/datum/ai_planning_subtree/find_and_hunt_target/material_stand + target_key = BB_MATERIAL_STAND_TARGET + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/material_stand + finding_behavior = /datum/ai_behavior/find_hunt_target + hunt_targets = list(/obj/structure/ore_container/material_stand) + hunt_range = 9 + +/datum/ai_planning_subtree/find_and_hunt_target/material_stand/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + if(!locate(/obj/item/stack/ore) in living_pawn) + return + return ..() + +/datum/ai_behavior/hunt_target/unarmed_attack_target/material_stand + required_distance = 0 + always_reset_target = TRUE + switch_combat_mode = TRUE + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + +///try to face the counter when depositing ores +/datum/ai_behavior/hunt_target/unarmed_attack_target/material_stand/setup(datum/ai_controller/controller, hunting_target_key, hunting_cooldown_key) + . = ..() + var/atom/hunt_target = controller.blackboard[hunting_target_key] + if (QDELETED(hunt_target)) + return FALSE + var/list/possible_turfs = list() + var/list/directions = list(SOUTH, SOUTHEAST) + + for(var/direction in directions) + var/turf/bottom_turf = get_step(hunt_target, direction) + if(!bottom_turf.is_blocked_turf()) + possible_turfs += bottom_turf + + if(!length(possible_turfs)) + return FALSE + set_movement_target(controller, pick(possible_turfs)) + +///look for our village +/datum/ai_planning_subtree/look_for_village + +/datum/ai_planning_subtree/look_for_village/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(controller.blackboard_key_exists(BB_HOME_VILLAGE)) + return + + controller.queue_behavior(/datum/ai_behavior/find_village, BB_HOME_VILLAGE) + +/datum/ai_behavior/find_village + +/datum/ai_behavior/find_village/perform(seconds_per_tick, datum/ai_controller/controller, village_key) + . = ..() + + var/obj/effect/landmark/home_marker = locate(/obj/effect/landmark/mook_village) in GLOB.landmarks_list + if(isnull(home_marker)) + finish_action(controller, FALSE) + return + + controller.set_blackboard_key(village_key, home_marker) + finish_action(controller, TRUE) + +///explore the lands away from the village to look for ore +/datum/ai_planning_subtree/wander_away_from_village + +/datum/ai_planning_subtree/wander_away_from_village/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + var/storm_approaching = controller.blackboard[BB_STORM_APPROACHING] + ///if we have ores to deposit or a storm is approaching, dont wander away + if(storm_approaching || (locate(/obj/item/stack/ore) in living_pawn)) + return + + if(controller.blackboard_key_exists(BB_HOME_VILLAGE)) + controller.queue_behavior(/datum/ai_behavior/wander, BB_HOME_VILLAGE) + +/datum/ai_behavior/wander + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + required_distance = 0 + /// distance we will wander away from the village + var/wander_distance = 9 + +/datum/ai_behavior/wander/setup(datum/ai_controller/controller, village_key) + . = ..() + var/mob/living/living_pawn = controller.pawn + var/obj/effect/target = controller.blackboard[village_key] + if(QDELETED(target)) + return FALSE + + if(target.z != living_pawn.z) + return FALSE + + var/list/angle_directions = list() + for(var/direction in GLOB.alldirs) + angle_directions += dir2angle(direction) + + var/angle_to_home = get_angle(living_pawn, target) + angle_directions -= angle_to_home + angle_directions -= (angle_to_home + 45) + angle_directions -= (angle_to_home - 45) + shuffle_inplace(angle_directions) + + var/turf/wander_destination = get_turf(living_pawn) + for(var/angle in angle_directions) + var/turf/test_turf = get_furthest_turf(living_pawn, angle, target) + if(isnull(test_turf)) + continue + var/distance_from_target = get_dist(target, test_turf) + if(distance_from_target <= get_dist(target, wander_destination)) + continue + wander_destination = test_turf + if(distance_from_target == wander_distance) + break + + set_movement_target(controller, wander_destination) + +/datum/ai_behavior/wander/proc/get_furthest_turf(atom/source, angle, atom/target) + var/turf/return_turf + for(var/i in 1 to wander_distance) + var/turf/test_destination = get_ranged_target_turf_direct(source, target, range = i, offset = angle) + if(test_destination.is_blocked_turf(source_atom = source)) + break + return_turf = test_destination + return return_turf + +/datum/ai_behavior/wander/perform(seconds_per_tick, datum/ai_controller/controller, target_key, hiding_location_key) + . = ..() + finish_action(controller, TRUE) + +/datum/ai_planning_subtree/mine_walls/mook + find_wall_behavior = /datum/ai_behavior/find_mineral_wall/mook + +/datum/ai_planning_subtree/mine_walls/mook/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + var/storm_approaching = controller.blackboard[BB_STORM_APPROACHING] + if(storm_approaching || locate(/obj/item/stack/ore) in living_pawn) + return + return ..() + +/datum/ai_behavior/find_mineral_wall/mook + +/datum/ai_behavior/find_mineral_wall/mook/check_if_mineable(datum/ai_controller/controller, turf/target_wall) + var/list/forbidden_turfs = controller.blackboard[BB_BLACKLIST_MINERAL_TURFS] + if(is_type_in_list(target_wall, forbidden_turfs)) + return FALSE + return ..() + +///bard mook plays nice music for the village +/datum/ai_controller/basic_controller/mook/bard + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/mook, + BB_MAXIMUM_DISTANCE_TO_VILLAGE = 10, + BB_STORM_APPROACHING = FALSE, + BB_SONG_LINES = MOOK_SONG, + ) + idle_behavior = /datum/idle_behavior/walk_near_target/mook_village + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/look_for_village, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/play_music_for_visitor, + /datum/ai_planning_subtree/use_mob_ability/mook_jump, + /datum/ai_planning_subtree/generic_play_instrument, + ) + + +///find an audience to follow and play music for! +/datum/ai_planning_subtree/play_music_for_visitor + +/datum/ai_planning_subtree/play_music_for_visitor/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!controller.blackboard_key_exists(BB_MOOK_MUSIC_AUDIENCE)) + controller.queue_behavior(/datum/ai_behavior/find_and_set/music_audience, BB_MOOK_MUSIC_AUDIENCE, /mob/living/carbon/human) + return + var/atom/home = controller.blackboard[BB_HOME_VILLAGE] + if(isnull(home)) + return + + var/atom/human_target = controller.blackboard[BB_MOOK_MUSIC_AUDIENCE] + if(get_dist(human_target, home) > controller.blackboard[BB_MAXIMUM_DISTANCE_TO_VILLAGE] || controller.blackboard[BB_STORM_APPROACHING]) + controller.clear_blackboard_key(BB_MOOK_MUSIC_AUDIENCE) + return + + controller.queue_behavior(/datum/ai_behavior/travel_towards, BB_MOOK_MUSIC_AUDIENCE) + +/datum/ai_behavior/find_and_set/music_audience + +/datum/ai_behavior/find_and_set/music_audience/search_tactic(datum/ai_controller/controller, locate_path, search_range) + var/atom/home = controller.blackboard[BB_HOME_VILLAGE] + for(var/mob/living/carbon/human/target in oview(search_range, controller.pawn)) + if(target.stat > UNCONSCIOUS || !target.mind) + continue + if(isnull(home) || get_dist(target, home) > controller.blackboard[BB_MAXIMUM_DISTANCE_TO_VILLAGE]) + continue + return target + +/datum/idle_behavior/walk_near_target/mook_village + target_key = BB_HOME_VILLAGE + +///healer mooks guard the village from intruders and heal the miner mooks when they come home +/datum/ai_controller/basic_controller/mook/support + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/mook, + BB_MAXIMUM_DISTANCE_TO_VILLAGE = 10, + BB_STORM_APPROACHING = FALSE, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + ) + idle_behavior = /datum/idle_behavior/walk_near_target/mook_village + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/look_for_village, + /datum/ai_planning_subtree/acknowledge_chief, + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/use_mob_ability/mook_jump, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/find_and_hunt_target/injured_mooks, + ) + +///tree to find and register our leader +/datum/ai_planning_subtree/acknowledge_chief/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(controller.blackboard_key_exists(BB_MOOK_TRIBAL_CHIEF)) + return + controller.queue_behavior(/datum/ai_behavior/find_and_set/find_chief, BB_MOOK_TRIBAL_CHIEF, /mob/living/basic/mining/mook/worker/tribal_chief) + +/datum/ai_behavior/find_and_set/find_chief/search_tactic(datum/ai_controller/controller, locate_path, search_range) + var/mob/living/chief = locate(locate_path) in oview(search_range, controller.pawn) + if(isnull(chief)) + return null + var/mob/living/living_pawn = controller.pawn + living_pawn.befriend(chief) + return chief + +///find injured miner mooks after they come home from a long day of work +/datum/ai_planning_subtree/find_and_hunt_target/injured_mooks + target_key = BB_INJURED_MOOK + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/injured_mooks + finding_behavior = /datum/ai_behavior/find_hunt_target/injured_mooks + hunt_targets = list(/mob/living/basic/mining/mook/worker) + hunt_range = 9 + +///we only heal when the mooks are home during a storm +/datum/ai_planning_subtree/find_and_hunt_target/injured_mooks/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(controller.blackboard[BB_STORM_APPROACHING]) + return ..() + + +/datum/ai_behavior/find_hunt_target/injured_mooks + +/datum/ai_behavior/find_hunt_target/injured_mooks/valid_dinner(mob/living/source, mob/living/injured_mook) + return (injured_mook.health < injured_mook.maxHealth) + +/datum/ai_behavior/hunt_target/unarmed_attack_target/injured_mooks + +/datum/ai_behavior/hunt_target/unarmed_attack_target/injured_mooks + always_reset_target = TRUE + hunt_cooldown = 10 SECONDS + + +///the chief would rather command his mooks to attack people than attack them himself +/datum/ai_controller/basic_controller/mook/tribal_chief + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/mook, + BB_STORM_APPROACHING = FALSE, + ) + idle_behavior = /datum/idle_behavior/walk_near_target/mook_village + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/look_for_village, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability/leap, + /datum/ai_planning_subtree/issue_commands, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/find_and_hunt_target/material_stand, + /datum/ai_planning_subtree/use_mob_ability/mook_jump, + /datum/ai_planning_subtree/find_and_hunt_target/bonfire, + /datum/ai_planning_subtree/find_and_hunt_target/hunt_ores/tribal_chief, + ) + +/datum/ai_planning_subtree/issue_commands + ///how far we look for a mook to command + var/command_distance = 5 + +/datum/ai_planning_subtree/issue_commands/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!locate(/mob/living/basic/mining/mook) in oview(command_distance, controller.pawn)) + return + if(controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) + controller.queue_behavior(/datum/ai_behavior/issue_commands, BB_BASIC_MOB_CURRENT_TARGET, /datum/pet_command/point_targeting/attack) + return + + var/atom/ore_target = controller.blackboard[BB_ORE_TARGET] + var/mob/living/living_pawn = controller.pawn + if(isnull(ore_target)) + return + if(get_dist(ore_target, living_pawn) <= 1) + return + + controller.queue_behavior(/datum/ai_behavior/issue_commands, BB_ORE_TARGET, /datum/pet_command/point_targeting/fetch) + +/datum/ai_behavior/issue_commands + action_cooldown = 5 SECONDS + +/datum/ai_behavior/issue_commands/perform(seconds_per_tick, datum/ai_controller/controller, target_key, command_path) + . = ..() + var/mob/living/basic/living_pawn = controller.pawn + var/atom/target = controller.blackboard[target_key] + + if(isnull(target)) + finish_action(controller, FALSE) + return + + var/datum/pet_command/to_command = locate(command_path) in GLOB.mook_commands + if(isnull(to_command)) + finish_action(controller, FALSE) + return + + var/issue_command = pick(to_command.speech_commands) + living_pawn.say(issue_command, forced = "controller") + living_pawn._pointed(target) + finish_action(controller, TRUE) + + +///find an ore, only pick it up when a mook brings it close to us +/datum/ai_planning_subtree/find_and_hunt_target/hunt_ores/tribal_chief + +/datum/ai_planning_subtree/find_and_hunt_target/hunt_ores/tribal_chief/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + if(locate(/obj/item/stack/ore) in living_pawn) + return + + var/atom/target_ore = controller.blackboard[BB_ORE_TARGET] + + if(isnull(target_ore)) + return ..() + + if(!isturf(target_ore.loc)) //picked up by someone else + controller.clear_blackboard_key(BB_ORE_TARGET) + return + + if(get_dist(target_ore, living_pawn) > 1) + return + + return ..() + +/datum/ai_planning_subtree/find_and_hunt_target/bonfire + target_key = BB_MOOK_BONFIRE_TARGET + finding_behavior = /datum/ai_behavior/find_hunt_target/bonfire + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/bonfire + hunt_targets = list(/obj/structure/bonfire) + hunt_range = 9 + + +/datum/ai_behavior/find_hunt_target/bonfire + +/datum/ai_behavior/find_hunt_target/bonfire/valid_dinner(mob/living/source, obj/structure/bonfire/fire, radius) + if(fire.burning) + return FALSE + + return can_see(source, fire, radius) + +/datum/ai_behavior/hunt_target/unarmed_attack_target/bonfire + always_reset_target = TRUE diff --git a/code/modules/mob/living/basic/lavaland/mook/mook_village.dm b/code/modules/mob/living/basic/lavaland/mook/mook_village.dm new file mode 100644 index 000000000000..ca2719ed7c67 --- /dev/null +++ b/code/modules/mob/living/basic/lavaland/mook/mook_village.dm @@ -0,0 +1,25 @@ +///unique items that spawn at the mook village +/obj/structure/ore_container/material_stand + name = "material stand" + desc = "Is everyone free to use this thing?" + icon = 'icons/mob/simple/jungle/mook.dmi' + icon_state = "material_stand" + density = TRUE + anchored = TRUE + resistance_flags = INDESTRUCTIBLE + bound_width = 64 + bound_height = 64 + +///put ore icons on the counter! +/obj/structure/ore_container/material_stand/update_overlays() + . = ..() + for(var/obj/item/stack/ore/ore_item in contents) + var/image/ore_icon = image(icon = initial(ore_item.icon), icon_state = initial(ore_item.icon_state), layer = LOW_ITEM_LAYER) + ore_icon.transform = ore_icon.transform.Scale(0.6, 0.6) + ore_icon.pixel_x = rand(9, 17) + ore_icon.pixel_y = rand(2, 4) + . += ore_icon + +/obj/effect/landmark/mook_village + name = "mook village landmark" + icon_state = "x" diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher.dm index 327c202a67db..1c2ecefc6667 100644 --- a/code/modules/mob/living/basic/lavaland/watcher/watcher.dm +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher.dm @@ -66,7 +66,8 @@ var/datum/action/cooldown/mob_cooldown/watcher_gaze/gaze = new gaze_attack(src) gaze.Grant(src) - ai_controller.set_blackboard_key(BB_WATCHER_GAZE, gaze) + ai_controller.set_blackboard_key(BB_GENERIC_ACTION, gaze) + AddComponent(/datum/component/revenge_ability, gaze, targeting = GET_TARGETING_STRATEGY(ai_controller.blackboard[BB_TARGETING_STRATEGY])) /mob/living/basic/mining/watcher/update_overlays() . = ..() diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_ai.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_ai.dm index 61099d665996..b26929777d00 100644 --- a/code/modules/mob/living/basic/lavaland/watcher/watcher_ai.dm +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_ai.dm @@ -1,17 +1,18 @@ /datum/ai_controller/basic_controller/watcher blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) + ai_traits = PAUSE_DURING_DO_AFTER ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_random_walk planning_subtrees = list( - /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/target_retaliate/check_faction, /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/maintain_distance, /datum/ai_planning_subtree/use_mob_ability/gaze, /datum/ai_planning_subtree/targeted_mob_ability/overwatch, /datum/ai_planning_subtree/ranged_skirmish/watcher, - /datum/ai_planning_subtree/maintain_distance, ) /datum/ai_planning_subtree/targeted_mob_ability/overwatch @@ -41,13 +42,10 @@ return ..() /datum/ai_planning_subtree/ranged_skirmish/watcher - attack_behavior = /datum/ai_behavior/ranged_skirmish/watcher + min_range = 0 /datum/ai_planning_subtree/ranged_skirmish/watcher/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) var/mob/living/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] if (QDELETED(target) || HAS_TRAIT(target, TRAIT_OVERWATCHED)) return // Don't bully people who are playing red light green light return ..() - -/datum/ai_behavior/ranged_skirmish/watcher - min_range = 0 diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_gaze.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_gaze.dm index 082157569609..d7c215de1278 100644 --- a/code/modules/mob/living/basic/lavaland/watcher/watcher_gaze.dm +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_gaze.dm @@ -8,10 +8,10 @@ button_icon_state = "gaze" background_icon_state = "bg_demon" overlay_icon_state = "bg_demon_border" - cooldown_time = 30 SECONDS - check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED + cooldown_time = 20 SECONDS click_to_activate = FALSE shared_cooldown = NONE + melee_cooldown_time = 0 SECONDS /// At what range do we check for vision? var/effect_radius = 7 /// How long does it take to play our various animation stages diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm index faee2fda7200..5c9cef1027d3 100644 --- a/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm @@ -9,7 +9,6 @@ background_icon_state = "bg_demon" overlay_icon_state = "bg_demon_border" cooldown_time = 20 SECONDS - check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED click_to_activate = TRUE shared_cooldown = NONE /// Furthest range we can activate ability at diff --git a/code/modules/mob/living/basic/lavaland/watcher/watcher_projectiles.dm b/code/modules/mob/living/basic/lavaland/watcher/watcher_projectiles.dm index 2680e9aa914c..40afd58c1da2 100644 --- a/code/modules/mob/living/basic/lavaland/watcher/watcher_projectiles.dm +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_projectiles.dm @@ -7,7 +7,7 @@ armor_flag = ENERGY temperature = -50 -/obj/projectile/temp/watcher/on_hit(mob/living/target, blocked = 0) +/obj/projectile/temp/watcher/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if (!isliving(target)) return diff --git a/code/modules/mob/living/basic/minebots/minebot.dm b/code/modules/mob/living/basic/minebots/minebot.dm new file mode 100644 index 000000000000..fbed972508b6 --- /dev/null +++ b/code/modules/mob/living/basic/minebots/minebot.dm @@ -0,0 +1,173 @@ +/mob/living/basic/mining_drone + name = "\improper Nanotrasen minebot" + desc = "The instructions printed on the side read: This is a small robot used to support miners, can be set to search and collect loose ore, or to help fend off wildlife. Insert any type of ore into it to make it start listening to your commands!" + gender = NEUTER + icon = 'icons/mob/silicon/aibots.dmi' + icon_state = "mining_drone" + icon_living = "mining_drone" + basic_mob_flags = DEL_ON_DEATH + status_flags = CANSTUN|CANKNOCKDOWN|CANPUSH + mouse_opacity = MOUSE_OPACITY_ICON + habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minimum_survivable_temperature = 0 + health = 125 + maxHealth = 125 + melee_damage_lower = 15 + melee_damage_upper = 15 + obj_damage = 10 + attack_verb_continuous = "drills" + attack_verb_simple = "drill" + attack_sound = 'sound/weapons/circsawhit.ogg' + sentience_type = SENTIENCE_MINEBOT + speak_emote = list("states") + mob_biotypes = MOB_ROBOTIC + death_message = "blows apart!" + light_system = MOVABLE_LIGHT + light_outer_range = 6 + light_on = FALSE + ai_controller = /datum/ai_controller/basic_controller/minebot + ///the access card we use to access mining + var/obj/item/card/id/access_card + ///the gun we use to kill + var/obj/item/gun/energy/recharge/kinetic_accelerator/minebot/stored_gun + ///the commands our owner can give us + var/list/pet_commands = list( + /datum/pet_command/idle/minebot, + /datum/pet_command/minebot_ability/light, + /datum/pet_command/minebot_ability/dump, + /datum/pet_command/automate_mining, + /datum/pet_command/free/minebot, + /datum/pet_command/follow, + /datum/pet_command/point_targeting/attack/minebot, + ) + +/mob/living/basic/mining_drone/Initialize(mapload) + . = ..() + + var/static/list/death_drops = list(/obj/effect/decal/cleanable/robot_debris/old) + AddElement(/datum/element/death_drops, death_drops) + add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE), INNATE_TRAIT) + AddElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, sound_vary = TRUE) + AddComponent(\ + /datum/component/tameable,\ + food_types = list(/obj/item/stack/ore),\ + tame_chance = 100,\ + bonus_tame_chance = 5,\ + after_tame = CALLBACK(src, PROC_REF(activate_bot)),\ + ) + + var/datum/action/cooldown/mob_cooldown/minedrone/toggle_light/toggle_light_action = new(src) + var/datum/action/cooldown/mob_cooldown/minedrone/toggle_meson_vision/toggle_meson_vision_action = new(src) + var/datum/action/cooldown/mob_cooldown/minedrone/dump_ore/dump_ore_action = new(src) + toggle_light_action.Grant(src) + toggle_meson_vision_action.Grant(src) + dump_ore_action.Grant(src) + ai_controller.set_blackboard_key(BB_MINEBOT_LIGHT_ABILITY, toggle_light_action) + ai_controller.set_blackboard_key(BB_MINEBOT_DUMP_ABILITY, dump_ore_action) + + stored_gun = new(src) + var/obj/item/implant/radio/mining/comms = new(src) + comms.implant(src) + access_card = new /obj/item/card/id/advanced/gold(src) + SSid_access.apply_trim_to_card(access_card, /datum/id_trim/job/shaft_miner) + + RegisterSignal(src, COMSIG_MOB_TRIED_ACCESS, PROC_REF(attempt_access)) + +/mob/living/basic/mining_drone/set_combat_mode(new_mode, silent = TRUE) + . = ..() + icon_state = (istate & ISTATE_HARM) ? "mining_drone_offense" : "mining_drone" + balloon_alert(src, "now [(istate & ISTATE_HARM) ? "attacking" : "collecting"]") + +/mob/living/basic/mining_drone/examine(mob/user) + . = ..() + if(health < maxHealth) + if(health >= maxHealth * 0.5) + . += span_warning("[p_They()] look slightly dented.") + else + . += span_boldwarning("[p_They()] look severely dented!") + + if(isnull(stored_gun) || !stored_gun.max_mod_capacity) + return + + . += "[stored_gun.get_remaining_mod_capacity()]% mod capacity remaining." + + for(var/obj/item/borg/upgrade/modkit/modkit as anything in stored_gun.modkits) + . += span_notice("There is \a [modkit] installed, using [modkit.cost]% capacity.") + + +/mob/living/basic/mining_drone/welder_act(mob/living/user, obj/item/welder) + if(user.istate & ISTATE_HARM) + return FALSE + if(istate & ISTATE_HARM) + user.balloon_alert(user, "can't repair in attack mode!") + return TRUE + if(maxHealth == health) + user.balloon_alert(user, "at full integrity!") + return TRUE + if(welder.use_tool(src, user, 0, volume=40)) + adjustBruteLoss(-15) + user.balloon_alert(user, "successfully repaired!") + return TRUE + +/mob/living/basic/mining_drone/attackby(obj/item/item_used, mob/user, params) + if(item_used.tool_behaviour == TOOL_CROWBAR || istype(item_used, /obj/item/borg/upgrade/modkit)) + item_used.melee_attack_chain(user, stored_gun, params) + return + + return ..() + +/mob/living/basic/mining_drone/attack_hand(mob/living/carbon/human/user, list/modifiers) + . = ..() + + if(. ||( user.istate & ISTATE_HARM)) + return + set_combat_mode(!(istate & ISTATE_HARM)) + balloon_alert(user, "now [(istate & ISTATE_HARM) ? "attacking wildlife" : "collecting loose ore"]") + +/mob/living/basic/mining_drone/RangedAttack(atom/target) + if(!(istate & ISTATE_HARM)) + return + stored_gun.afterattack(target, src) + + +/mob/living/basic/mining_drone/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) + . = ..() + + if(!. || !proximity_flag || (istate & ISTATE_HARM)) + return + + if(istype(attack_target, /obj/item/stack/ore)) + var/obj/item/target_ore = attack_target + target_ore.forceMove(src) + +/mob/living/basic/mining_drone/proc/drop_ore() + to_chat(src, span_notice("You dump your stored ore.")) + for(var/obj/item/stack/ore/dropped_item in contents) + dropped_item.forceMove(get_turf(src)) + +/mob/living/basic/mining_drone/proc/attempt_access(mob/drone, obj/door_attempt) + SIGNAL_HANDLER + + if(door_attempt.check_access(access_card)) + return ACCESS_ALLOWED + return ACCESS_DISALLOWED + +/mob/living/basic/mining_drone/proc/activate_bot() + AddComponent(/datum/component/obeys_commands, pet_commands) + +/mob/living/basic/mining_drone/death(gibbed) + drop_ore() + + if(isnull(stored_gun)) + return ..() + + for(var/obj/item/borg/upgrade/modkit/modkit as anything in stored_gun.modkits) + modkit.uninstall(stored_gun) + + return ..() + +/mob/living/basic/mining_drone/Destroy() + QDEL_NULL(stored_gun) + QDEL_NULL(access_card) + return ..() + diff --git a/code/modules/mob/living/basic/minebots/minebot_abilities.dm b/code/modules/mob/living/basic/minebots/minebot_abilities.dm new file mode 100644 index 000000000000..4f119fd9b66a --- /dev/null +++ b/code/modules/mob/living/basic/minebots/minebot_abilities.dm @@ -0,0 +1,51 @@ + +/datum/action/cooldown/mob_cooldown/minedrone + button_icon = 'icons/mob/actions/actions_mecha.dmi' + background_icon_state = "bg_default" + overlay_icon_state = "bg_default_border" + click_to_activate = FALSE + +/datum/action/cooldown/mob_cooldown/minedrone/toggle_light + name = "Toggle Light" + button_icon_state = "mech_lights_off" + +/datum/action/cooldown/mob_cooldown/minedrone/Activate() + owner.set_light_on(!owner.light_on) + owner.balloon_alert(owner, "lights [owner.light_on ? "on" : "off"]!") + +/datum/action/cooldown/mob_cooldown/minedrone/dump_ore + name = "Dump Ore" + button_icon_state = "mech_eject" + +/datum/action/cooldown/mob_cooldown/minedrone/dump_ore/IsAvailable(feedback = TRUE) + if(locate(/obj/item/stack/ore) in owner.contents) + return TRUE + + if(feedback) + owner.balloon_alert(owner, "no ore!") + return FALSE + +/datum/action/cooldown/mob_cooldown/minedrone/dump_ore/Activate() + var/mob/living/basic/mining_drone/user = owner + user.drop_ore() + +/datum/action/cooldown/mob_cooldown/minedrone/toggle_meson_vision + name = "Toggle Meson Vision" + button_icon_state = "meson" + +/datum/action/cooldown/mob_cooldown/minedrone/toggle_meson_vision/Activate() + if(owner.sight & SEE_TURFS) + owner.clear_sight(SEE_TURFS) + owner.lighting_cutoff_red += 5 + owner.lighting_cutoff_green += 15 + owner.lighting_cutoff_blue += 5 + else + owner.add_sight(SEE_TURFS) + owner.lighting_cutoff_red -= 5 + owner.lighting_cutoff_green -= 15 + owner.lighting_cutoff_blue -= 5 + + owner.sync_lighting_plane_cutoff() + + to_chat(owner, span_notice("You toggle your meson vision [(owner.sight & SEE_TURFS) ? "on" : "off"].")) + diff --git a/code/modules/mob/living/basic/minebots/minebot_ai.dm b/code/modules/mob/living/basic/minebots/minebot_ai.dm new file mode 100644 index 000000000000..91b8500300ac --- /dev/null +++ b/code/modules/mob/living/basic/minebots/minebot_ai.dm @@ -0,0 +1,218 @@ +/datum/ai_controller/basic_controller/minebot + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + BB_BLACKLIST_MINERAL_TURFS = list(/turf/closed/mineral/gibtonite), + BB_AUTOMATED_MINING = FALSE, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/minebot, + /datum/ai_planning_subtree/find_and_hunt_target/hunt_ores/minebot, + /datum/ai_planning_subtree/minebot_mining, + /datum/ai_planning_subtree/locate_dead_humans, + ) + +///find dead humans and report their location on the radio +/datum/ai_planning_subtree/locate_dead_humans/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(controller.blackboard_key_exists(BB_NEARBY_DEAD_MINER)) + controller.queue_behavior(/datum/ai_behavior/send_sos_message, BB_NEARBY_DEAD_MINER) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_and_set/unconscious_human, BB_NEARBY_DEAD_MINER, /mob/living/carbon/human) + +/datum/ai_behavior/find_and_set/unconscious_human/search_tactic(datum/ai_controller/controller, locate_path, search_range) + for(var/mob/living/carbon/human/target in oview(search_range, controller.pawn)) + if(target.stat >= UNCONSCIOUS && target.mind) + return target + +/datum/ai_behavior/send_sos_message + behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + action_cooldown = 2 MINUTES + +/datum/ai_behavior/send_sos_message/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/mob/living/carbon/target = controller.blackboard[target_key] + var/mob/living/living_pawn = controller.pawn + if(QDELETED(target) || is_station_level(target.z)) + finish_action(controller, FALSE, target_key) + return + var/turf/target_turf = get_turf(target) + var/obj/item/implant/radio/radio_implant = locate(/obj/item/implant/radio) in living_pawn.contents + if(!radio_implant) + finish_action(controller, FALSE, target_key) + return + var/message = "ALERT, [target] in need of help at coordinates: [target_turf.x], [target_turf.y], [target_turf.z]!" + radio_implant.radio.talk_into(living_pawn, message, RADIO_CHANNEL_SUPPLY) + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/send_sos_message/finish_action(datum/ai_controller/controller, success, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + +///operational datums is null because we dont use a ranged component, we use a gun in our contents +/datum/ai_planning_subtree/basic_ranged_attack_subtree/minebot + operational_datums = null + ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/minebot + +/datum/ai_behavior/basic_ranged_attack/minebot + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT + avoid_friendly_fire = TRUE + +/datum/ai_planning_subtree/basic_ranged_attack_subtree/minebot/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + if(!(living_pawn.istate & ISTATE_HARM)) //we are not on attack mode + return + return ..() + +///mine walls if we are on automated mining mode +/datum/ai_planning_subtree/minebot_mining/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!controller.blackboard[BB_AUTOMATED_MINING]) + return + if(controller.blackboard_key_exists(BB_TARGET_MINERAL_TURF)) + controller.queue_behavior(/datum/ai_behavior/minebot_mine_turf, BB_TARGET_MINERAL_TURF) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_mineral_wall/minebot, BB_TARGET_MINERAL_TURF) + +/datum/ai_behavior/find_mineral_wall/minebot + +/datum/ai_behavior/find_mineral_wall/minebot/check_if_mineable(datum/ai_controller/controller, turf/target_wall) + var/list/forbidden_turfs = controller.blackboard[BB_BLACKLIST_MINERAL_TURFS] + var/turf/previous_unreachable_wall = controller.blackboard[BB_PREVIOUS_UNREACHABLE_WALL] + if(is_type_in_list(target_wall, forbidden_turfs) || target_wall == previous_unreachable_wall) + return FALSE + controller.clear_blackboard_key(BB_PREVIOUS_UNREACHABLE_WALL) + return ..() + +/datum/ai_behavior/minebot_mine_turf + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + required_distance = 2 + action_cooldown = 3 SECONDS + +/datum/ai_behavior/minebot_mine_turf/setup(datum/ai_controller/controller, target_key) + . = ..() + var/turf/target = controller.blackboard[target_key] + if(isnull(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/minebot_mine_turf/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/mob/living/basic/living_pawn = controller.pawn + var/turf/target = controller.blackboard[target_key] + + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + + if(check_obstacles_in_path(controller, target)) + finish_action(controller, FALSE, target_key) + return + + if(!(living_pawn.istate & ISTATE_HARM)) + living_pawn.set_combat_mode(TRUE) + + living_pawn.RangedAttack(target) + finish_action(controller, TRUE, target_key) + return + +/datum/ai_behavior/minebot_mine_turf/proc/check_obstacles_in_path(datum/ai_controller/controller, turf/target) + var/mob/living/source = controller.pawn + var/list/turfs_in_path = get_line(source, target) - target + for(var/turf/turf in turfs_in_path) + if(turf.is_blocked_turf(ignore_atoms = list(source))) + controller.set_blackboard_key(BB_PREVIOUS_UNREACHABLE_WALL, target) + return TRUE + return FALSE + +/datum/ai_behavior/minebot_mine_turf/finish_action(datum/ai_controller/controller, success, target_key) + . = ..() + controller.clear_blackboard_key(target_key) + +///store ores in our body +/datum/ai_planning_subtree/find_and_hunt_target/hunt_ores/minebot + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/consume_ores/minebot + hunt_chance = 100 + +/datum/ai_planning_subtree/find_and_hunt_target/hunt_ores/minebot/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/automated_mining = controller.blackboard[BB_AUTOMATED_MINING] + var/mob/living/living_pawn = controller.pawn + + if(!automated_mining && (living_pawn.istate & ISTATE_HARM)) //are we not on automated mining or collect mode? + return + + return ..() + +/datum/ai_behavior/hunt_target/unarmed_attack_target/consume_ores/minebot + hunt_cooldown = 2 SECONDS + +/datum/ai_behavior/hunt_target/unarmed_attack_target/consume_ores/minebot/target_caught(mob/living/hunter, obj/item/stack/ore/hunted) + if(hunter.istate & ISTATE_HARM) + hunter.set_combat_mode(FALSE) + return ..() + +///pet commands +/datum/pet_command/free/minebot + +/datum/pet_command/free/minebot/execute_action(datum/ai_controller/controller) + controller.set_blackboard_key(BB_AUTOMATED_MINING, FALSE) + return ..() + +/datum/pet_command/automate_mining + command_name = "Automate mining" + command_desc = "Make your minebot automatically mine!" + radial_icon = 'icons/obj/mining.dmi' + radial_icon_state = "pickaxe" + speech_commands = list("mine") + +/datum/pet_command/automate_mining/execute_action(datum/ai_controller/controller) + controller.set_blackboard_key(BB_AUTOMATED_MINING, TRUE) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + +/datum/pet_command/minebot_ability + command_name = "Minebot ability" + command_desc = "Make your minebot use one of its abilities." + radial_icon = 'icons/mob/actions/actions_mecha.dmi' + ///the ability we will use + var/ability_key + +/datum/pet_command/minebot_ability/execute_action(datum/ai_controller/controller) + var/datum/action/cooldown/ability = controller.blackboard[ability_key] + if(!ability?.IsAvailable()) + return + controller.queue_behavior(/datum/ai_behavior/use_mob_ability, ability_key) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/pet_command/minebot_ability/light + command_name = "Toggle lights" + command_desc = "Make your minebot toggle its lights." + speech_commands = list("light") + radial_icon_state = "mech_lights_off" + ability_key = BB_MINEBOT_LIGHT_ABILITY + +/datum/pet_command/minebot_ability/dump + command_name = "Dump ore" + command_desc = "Make your minebot dump all its ore!" + speech_commands = list("dump", "ore") + radial_icon_state = "mech_eject" + ability_key = BB_MINEBOT_DUMP_ABILITY + +/datum/pet_command/point_targeting/attack/minebot + attack_behaviour = /datum/ai_behavior/basic_ranged_attack/minebot + +/datum/pet_command/point_targeting/attack/minebot/execute_action(datum/ai_controller/controller) + controller.set_blackboard_key(BB_AUTOMATED_MINING, FALSE) + var/mob/living/living_pawn = controller.pawn + if(!(living_pawn.istate & ISTATE_HARM)) + living_pawn.set_combat_mode(TRUE) + return ..() + +/datum/pet_command/idle/minebot + +/datum/pet_command/idle/minebot/execute_action(datum/ai_controller/controller) + controller.set_blackboard_key(BB_AUTOMATED_MINING, FALSE) + return ..() diff --git a/code/modules/mob/living/basic/minebots/minebot_upgrades.dm b/code/modules/mob/living/basic/minebots/minebot_upgrades.dm new file mode 100644 index 000000000000..6f5d43af1afc --- /dev/null +++ b/code/modules/mob/living/basic/minebots/minebot_upgrades.dm @@ -0,0 +1,60 @@ +/obj/item/mine_bot_upgrade + name = "minebot melee upgrade" + desc = "A minebot upgrade." + icon_state = "door_electronics" + icon = 'icons/obj/assemblies/module.dmi' + +/obj/item/mine_bot_upgrade/afterattack(mob/living/basic/mining_drone/minebot, mob/user, proximity) + . = ..() + if(!istype(minebot) || !proximity) + return + upgrade_bot(minebot, user) + +/obj/item/mine_bot_upgrade/proc/upgrade_bot(mob/living/basic/mining_drone/minebot, mob/user) + if(minebot.melee_damage_upper != initial(minebot.melee_damage_upper)) + user.balloon_alert(user, "already has armor!") + return + minebot.melee_damage_lower += 7 + minebot.melee_damage_upper += 7 + to_chat(user, span_notice("You increase the close-quarter combat abilities of [minebot].")) + qdel(src) + +//Health + +/obj/item/mine_bot_upgrade/health + name = "minebot armor upgrade" + +/obj/item/mine_bot_upgrade/health/upgrade_bot(mob/living/basic/mining_drone/minebot, mob/user) + if(minebot.maxHealth != initial(minebot.maxHealth)) + to_chat(user, span_warning("[minebot] already has reinforced armor!")) + return + minebot.maxHealth += 45 + minebot.updatehealth() + to_chat(user, span_notice("You reinforce the armor of [minebot].")) + qdel(src) + +//AI + +/obj/item/slimepotion/slime/sentience/mining + name = "minebot AI upgrade" + desc = "Can be used to grant sentience to minebots. It's incompatible with minebot armor and melee upgrades, and will override them." + icon_state = "door_electronics" + icon = 'icons/obj/assemblies/module.dmi' + sentience_type = SENTIENCE_MINEBOT + ///health boost to add + var/base_health_add = 5 + ///damage boost to add + var/base_damage_add = 1 + ///speed boost to add + var/base_speed_add = 1 + ///cooldown boost to add + var/base_cooldown_add = 10 + +/obj/item/slimepotion/slime/sentience/mining/after_success(mob/living/user, mob/living/basic_mob) + if(!istype(basic_mob, /mob/living/basic/mining_drone)) + return + var/mob/living/basic/mining_drone/minebot = basic_mob + minebot.maxHealth = initial(minebot.maxHealth) + base_health_add + minebot.melee_damage_lower = initial(minebot.melee_damage_lower) + base_damage_add + minebot.melee_damage_upper = initial(minebot.melee_damage_upper) + base_damage_add + minebot.stored_gun?.recharge_time += base_cooldown_add diff --git a/code/modules/mob/living/basic/pets/dog/_dog.dm b/code/modules/mob/living/basic/pets/dog/_dog.dm index 778c0c2a1dd4..474a092d10f7 100644 --- a/code/modules/mob/living/basic/pets/dog/_dog.dm +++ b/code/modules/mob/living/basic/pets/dog/_dog.dm @@ -7,10 +7,10 @@ speech_commands = list("good dog") // Set correct attack behaviour -/datum/pet_command/point_targetting/attack/dog +/datum/pet_command/point_targeting/attack/dog attack_behaviour = /datum/ai_behavior/basic_melee_attack/dog -/datum/pet_command/point_targetting/attack/dog/set_command_active(mob/living/parent, mob/living/commander) +/datum/pet_command/point_targeting/attack/dog/set_command_active(mob/living/parent, mob/living/commander) . = ..() parent.ai_controller.set_blackboard_key(BB_DOG_HARASS_HARM, TRUE) @@ -33,14 +33,15 @@ attack_verb_simple = "bite" attack_sound = 'sound/weapons/bite.ogg' attack_vis_effect = ATTACK_EFFECT_BITE + melee_attack_cooldown = 0.8 SECONDS /// Instructions you can give to dogs var/static/list/pet_commands = list( /datum/pet_command/idle, /datum/pet_command/free, /datum/pet_command/good_boy/dog, /datum/pet_command/follow/dog, - /datum/pet_command/point_targetting/attack/dog, - /datum/pet_command/point_targetting/fetch, + /datum/pet_command/point_targeting/attack/dog, + /datum/pet_command/point_targeting/fetch, /datum/pet_command/play_dead, ) diff --git a/code/modules/mob/living/basic/pets/dog/corgi.dm b/code/modules/mob/living/basic/pets/dog/corgi.dm index 0b92fc38a05c..c8bb4c88b4ac 100644 --- a/code/modules/mob/living/basic/pets/dog/corgi.dm +++ b/code/modules/mob/living/basic/pets/dog/corgi.dm @@ -26,6 +26,8 @@ var/is_slow = FALSE ///Item slots that are available for this corgi to equip stuff into var/list/strippable_inventory_slots = list() + ///can this mob breed? + var/can_breed = TRUE /mob/living/basic/pet/dog/corgi/Initialize(mapload) . = ..() @@ -34,6 +36,13 @@ AddElement(/datum/element/swabable, CELL_LINE_TABLE_CORGI, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) RegisterSignal(src, COMSIG_MOB_TRIED_ACCESS, PROC_REF(on_tried_access)) RegisterSignals(src, list(COMSIG_BASICMOB_LOOK_ALIVE, COMSIG_BASICMOB_LOOK_DEAD), PROC_REF(on_appearance_change)) + if(!can_breed) + return + AddComponent(\ + /datum/component/breed,\ + can_breed_with = typecacheof(list(/mob/living/basic/pet/dog/corgi)),\ + baby_path = /mob/living/basic/pet/dog/corgi/puppy,\ + ) /mob/living/basic/pet/dog/corgi/Destroy() QDEL_NULL(inventory_head) @@ -521,9 +530,11 @@ icon_dead = "puppy_dead" density = FALSE pass_flags = PASSMOB + ai_controller = /datum/ai_controller/basic_controller/dog/puppy mob_size = MOB_SIZE_SMALL collar_icon_state = "puppy" strippable_inventory_slots = list(/datum/strippable_item/pet_collar, /datum/strippable_item/corgi_id) //puppies are too small to handle hats and back slot items + can_breed = FALSE //PUPPY IAN! SQUEEEEEEEEE~ /mob/living/basic/pet/dog/corgi/puppy/ian diff --git a/code/modules/mob/living/basic/pets/fox.dm b/code/modules/mob/living/basic/pets/fox.dm index 578a64ba08dd..7d74a6a36e41 100644 --- a/code/modules/mob/living/basic/pets/fox.dm +++ b/code/modules/mob/living/basic/pets/fox.dm @@ -38,9 +38,9 @@ /datum/ai_controller/basic_controller/fox blackboard = list( - BB_BASIC_MOB_FLEEING = TRUE, - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/of_size/ours_or_smaller/ignore_faction, - BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction + BB_ALWAYS_IGNORE_FACTION = TRUE, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/of_size/ours_or_smaller, + BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance @@ -61,12 +61,6 @@ /datum/ai_planning_subtree/random_speech/fox, ) -// Foxes will attack other station pets regardless of faction. -/datum/targetting_datum/basic/of_size/ours_or_smaller/ignore_faction - -/datum/targetting_datum/basic/of_size/ours_or_smaller/ignore_faction/faction_check(mob/living/living_mob, mob/living/the_target) - return FALSE - // The captain's fox, Renault /mob/living/basic/pet/fox/renault name = "Renault" diff --git a/code/modules/mob/living/basic/pets/parrot/_parrot.dm b/code/modules/mob/living/basic/pets/parrot/_parrot.dm new file mode 100644 index 000000000000..ff83a0a27131 --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/_parrot.dm @@ -0,0 +1,458 @@ +#define FORCED_SPEECH_COOLDOWN_DURATION 5 SECONDS + +GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( + /datum/strippable_item/parrot_headset, +))) + + +/// Parrots! Klepto bastards that imitate your speech and hoard your shit. +/mob/living/basic/parrot + name = "parrot" + desc = "The parrot squawks, \"They're a Parrot! BAWWK!\"" + icon = 'icons/mob/simple/animal.dmi' + icon_state = "parrot_fly" + icon_living = "parrot_fly" + icon_dead = "parrot_dead" + density = FALSE + health = 80 + maxHealth = 80 + pass_flags = PASSTABLE | PASSMOB + + guaranteed_butcher_results = list(/obj/item/food/cracker = 1) + melee_damage_upper = 10 + melee_damage_lower = 5 + + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "gently moves aside" + response_disarm_simple = "gently move aside" + response_harm_continuous = "swats" + response_harm_simple = "swat" + istate = ISTATE_HARM + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" + attack_vis_effect = ATTACK_EFFECT_BITE + friendly_verb_continuous = "grooms" + friendly_verb_simple = "groom" + mob_size = MOB_SIZE_SMALL + gold_core_spawnable = FRIENDLY_SPAWN + + ai_controller = /datum/ai_controller/basic_controller/parrot + + /// Icon we use while sitting + var/icon_sit = "parrot_sit" + + ///Headset for Poly to yell at engineers :) + var/obj/item/radio/headset/ears = null + + ///Parrots are kleptomaniacs. This variable ... stores the item a parrot is holding. + var/obj/item/held_item = null + + /// The blackboard key we use to store the string we're repeating + var/speech_blackboard_key = BB_PARROT_REPEAT_STRING + /// The generic probability odds we have to do a speech-related action + var/speech_probability_rate = 5 + /// The generic probability odds we have to switch out our speech string + var/speech_shuffle_rate = 30 + + /// Contains all of the perches that parrots will generally sit on until something catches their eye. + var/static/list/desired_perches = typecacheof(list( + /obj/machinery/computer, + /obj/machinery/dna_scannernew, + /obj/machinery/nuclearbomb, + /obj/machinery/recharge_station, + /obj/machinery/smartfridge, + /obj/machinery/suit_storage_unit, + /obj/machinery/telecomms, + /obj/machinery/teleport, + /obj/structure/displaycase, + /obj/structure/filingcabinet, + /obj/structure/frame/computer, + )) + ///items we wont pick up + var/static/list/ignore_items = typecacheof(list(/obj/item/radio)) + + /// Food that Poly loves to eat (spoiler alert it's just crackers) + var/static/list/edibles = list( + /obj/item/food/cracker, + ) + + /// Tracks the times when we send a phrase through either being pet or attack to ensure it's not abused to flood + COOLDOWN_DECLARE(forced_speech_cooldown) + +/mob/living/basic/parrot/Initialize(mapload) + . = ..() + setup_headset() + update_speech_blackboards() + ai_controller.set_blackboard_key(BB_PARROT_PERCH_TYPES, desired_perches) + ai_controller.set_blackboard_key(BB_IGNORE_ITEMS, ignore_items) + AddElement(/datum/element/pet_bonus) // parrots will listen for the signal this element sends in order to say something in response to the pat + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/strippable, GLOB.strippable_parrot_items) + AddElement(/datum/element/simple_flying) + AddComponent(/datum/component/listen_and_repeat, desired_phrases = get_static_list_of_phrases(), blackboard_key = BB_PARROT_REPEAT_STRING) + AddComponent(\ + /datum/component/tameable,\ + food_types = edibles,\ + tame_chance = 100,\ + bonus_tame_chance = 0,\ + after_tame = CALLBACK(src, PROC_REF(tamed)),\ + ) + + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attacking)) + RegisterSignal(src, COMSIG_MOB_CLICKON, PROC_REF(on_click)) + RegisterSignal(src, COMSIG_PARENT_ATTACKBY_SECONDARY, PROC_REF(on_attacked)) // this means we could have a peaceful interaction, like getting a cracker + RegisterSignal(src, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_injured)) // this means we got hurt and it's go time + RegisterSignal(src, COMSIG_ANIMAL_PET, PROC_REF(on_pet)) + RegisterSignal(src, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(drop_item_on_signal)) + +/mob/living/basic/parrot/Destroy() + // should have cleaned these up on death, but let's be super safe in case that didn't happen + if(!QDELETED(ears)) + QDEL_NULL(ears) + if(!QDELETED(held_item)) + QDEL_NULL(held_item) + return ..() + +/mob/living/basic/parrot/death(gibbed) + if(held_item) + held_item.forceMove(drop_location()) + held_item = null + + if(ears) + ears.forceMove(drop_location()) + ears = null + + if(!isnull(buckled)) + buckled.unbuckle_mob(src, force = TRUE) + buckled = null + pixel_x = base_pixel_x + pixel_y = base_pixel_y + + return ..() + +/mob/living/basic/parrot/examine(mob/user) + . = ..() + . += "It appears to [isnull(held_item) ? "not be holding anything." : "be holding \a [held_item]."]" + + if(stat != DEAD) + return + + if(HAS_MIND_TRAIT(user, TRAIT_NAIVE)) + . += pick( + "It seems tired and shagged out after a long squawk.", + "It seems to be pining for the fjords.", + "It's resting. It's a beautiful bird. Lovely plumage.", + ) + else + . += pick( + "This is a late parrot.", + "This is an ex-parrot.", + "This parrot is no more.", + ) + +/mob/living/basic/parrot/say_dead(message) + return // this is so flarped + +/mob/living/basic/parrot/get_status_tab_items() + . = ..() + . += "Held Item: [held_item]" + +/mob/living/basic/parrot/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) + if(stat != DEAD) // parrots have evolved to let them fly in space because fucking uhhhhhhhhhh + return TRUE + return ..() + +/mob/living/basic/parrot/radio(message, list/message_mods = list(), list/spans, language) //literally copied from human/radio(), but there's no other way to do this. at least it's better than it used to be. + . = ..() + if(. != NONE) + return + + if(message_mods[MODE_HEADSET]) + if(ears) + ears.talk_into(src, message, , spans, language, message_mods) + return ITALICS | REDUCE_RANGE + else if(message_mods[RADIO_EXTENSION] == MODE_DEPARTMENT) + if(ears) + ears.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) + return ITALICS | REDUCE_RANGE + else if(message_mods[RADIO_EXTENSION] in GLOB.radiochannels) + if(ears) + ears.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) + return ITALICS | REDUCE_RANGE + + return NONE + +/mob/living/basic/parrot/update_icon_state() + . = ..() + if(HAS_TRAIT(src, TRAIT_PARROT_PERCHED)) + icon_state = icon_sit + else + icon_state = icon_living + +/// Proc that we just use to see if we're rightclicking something for perch behavior or dropping the item we currently ahve +/mob/living/basic/parrot/proc/on_click(mob/living/basic/source, atom/target, params) + SIGNAL_HANDLER + if(!LAZYACCESS(params, RIGHT_CLICK) || !CanReach(target)) + return + if(start_perching(target) && !isnull(held_item)) + drop_held_item(gently = TRUE) + +/// Proc that handles sending the signal and returning a valid phrase to say. Will not do anything if we don't have a stat or if we're cliented. +/// Will return either a string or null. +/mob/living/basic/parrot/proc/get_phrase() + if(!isnull(client) || stat != CONSCIOUS) + return null + + if(!COOLDOWN_FINISHED(src, forced_speech_cooldown)) + return null + + var/return_value = SEND_SIGNAL(src, COMSIG_NEEDS_NEW_PHRASE) + if(return_value & NO_NEW_PHRASE_AVAILABLE) + return null + + COOLDOWN_START(src, forced_speech_cooldown, FORCED_SPEECH_COOLDOWN_DURATION) + return ai_controller.blackboard[BB_PARROT_REPEAT_STRING] + +/// Proc that listens for when a parrot is pet so we can dispatch a voice line. +/mob/living/basic/parrot/proc/on_pet(mob/living/basic/source, mob/living/petter, modifiers) + SIGNAL_HANDLER + var/return_value = get_phrase() + if(isnull(return_value)) + return + + INVOKE_ASYNC(src, TYPE_PROC_REF(/atom/movable, say), message = return_value, forced = "parrot oneliner on pet") + +/// Proc that ascertains the type of perch we're dealing with and starts the perching process. +/// Returns TRUE if we started perching, FALSE otherwise. +/mob/living/basic/parrot/proc/start_perching(atom/target) + if(HAS_TRAIT(src, TRAIT_PARROT_PERCHED)) + balloon_alert(src, "already perched!") + return FALSE + + if(ishuman(target)) + return perch_on_human(target) + + if(!is_type_in_typecache(target, desired_perches)) + return FALSE + + forceMove(get_turf(target)) + drop_held_item(gently = TRUE) // comfy :) + toggle_perched(perched = TRUE) + RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(after_move)) + return TRUE + +/mob/living/basic/parrot/proc/after_move(atom/source) + SIGNAL_HANDLER + + UnregisterSignal(src, COMSIG_MOVABLE_MOVED) + toggle_perched(perched = FALSE) + +/// Proc that will perch us on a human. Returns TRUE if we perched, FALSE otherwise. +/mob/living/basic/parrot/proc/perch_on_human(mob/living/carbon/human/target) + if(LAZYLEN(target.buckled_mobs) >= target.max_buckled_mobs) + balloon_alert(src, "can't perch on them!") + return FALSE + + forceMove(get_turf(target)) + if(!target.buckle_mob(src, TRUE)) + return FALSE + + to_chat(src, span_notice("You sit on [target]'s shoulder.")) + toggle_perched(perched = TRUE) + RegisterSignal(src, COMSIG_LIVING_SET_BUCKLED, PROC_REF(on_unbuckle)) + return TRUE + +/mob/living/basic/parrot/proc/on_unbuckle(mob/living/source, atom/movable/new_buckled) + SIGNAL_HANDLER + + if(new_buckled) + return + UnregisterSignal(src, COMSIG_LIVING_SET_BUCKLED) + toggle_perched(perched = FALSE) + +/mob/living/basic/parrot/proc/toggle_perched(perched) + if(!perched) + REMOVE_TRAIT(src, TRAIT_PARROT_PERCHED, TRAIT_GENERIC) + else + ADD_TRAIT(src, TRAIT_PARROT_PERCHED, TRAIT_GENERIC) + update_appearance(UPDATE_ICON_STATE) + +/// Master proc which will determine the intent of OUR attacks on an object and summon the relevant procs accordingly. +/// This is pretty much meant for players, AI will use the task-specific procs instead. +/mob/living/basic/parrot/proc/pre_attacking(mob/living/basic/source, atom/target) + SIGNAL_HANDLER + if(stat != CONSCIOUS) + return + + if(isitem(target) && steal_from_ground(target)) + return COMPONENT_HOSTILE_NO_ATTACK + + if(iscarbon(target) && steal_from_mob(target)) + return COMPONENT_HOSTILE_NO_ATTACK + +/// Picks up an item from the ground and puts it in our claws. Returns TRUE if we picked it up, FALSE otherwise. +/mob/living/basic/parrot/proc/steal_from_ground(obj/item/target) + if(!isnull(held_item)) + balloon_alert(src, "already holding something!") + return FALSE + + if(target.w_class > WEIGHT_CLASS_SMALL) + balloon_alert(src, "too big to pick up!") + return FALSE + + pick_up_item(target) + visible_message( + span_notice("[src] grabs [held_item]!"), + span_notice("You grab [held_item]!"), + span_hear("You hear the sounds of wings flapping furiously."), + ) + return TRUE + +/// Looks for an item that we can snatch and puts it in our claws. Returns TRUE if we picked it up, FALSE otherwise. +/mob/living/basic/parrot/proc/steal_from_mob(mob/living/carbon/victim) + if(!isnull(held_item)) + balloon_alert(src, "already holding something!") + return FALSE + + for(var/obj/item/stealable in victim.held_items) + if(stealable.w_class > WEIGHT_CLASS_SMALL) + continue + + if(!victim.temporarilyRemoveItemFromInventory(stealable)) + continue + + visible_message( + span_notice("[src] grabs [held_item] out of [victim]'s hand!"), + span_notice("You snag [held_item] out of [victim]'s hand!"), + span_hear("You hear the sounds of wings flapping furiously."), + ) + pick_up_item(stealable) + return TRUE + + return FALSE + +/// If we're right-clicked on with a cracker, we eat the cracker. +/mob/living/basic/parrot/proc/on_attacked(mob/living/basic/source, obj/item/thing, mob/living/attacker, params) + SIGNAL_HANDLER + if(!istype(thing, /obj/item/food/cracker)) // Poly wants a cracker + return + + consume_cracker(thing) // potential clash with the tameable element so we'll leave it to that to handle qdeling the cracker. + return COMPONENT_NO_AFTERATTACK + +/// Eats a cracker (or anything i guess). This would be nice to eventually fold into the basic_eating element but we do too much snowflake inventory code stuff for this to be reliable presently. +/// We don't qdel the item here, we assume the invoking proc will have handled that somehow. +/// Returns TRUE if we ate the thing. +/mob/living/basic/parrot/proc/consume_cracker(obj/item/thing) + to_chat(src, span_notice("[src] eagerly devours \the [thing].")) + if(!istype(thing, /obj/item/food/cracker)) + return TRUE // we still ate it + + if(health < maxHealth) + adjustBruteLoss(-10) + speech_probability_rate *= 1.27 + speech_shuffle_rate += 10 + update_speech_blackboards() + return TRUE + +/// Handles special behavior whenever we are injured. +/mob/living/basic/parrot/proc/on_injured(mob/living/basic/source, mob/living/attacker, attack_flags) + SIGNAL_HANDLER + if(!isnull(client) || stat == CONSCIOUS) + return + + drop_held_item(gently = FALSE) + + var/return_value = get_phrase() + if(isnull(return_value)) + return + + INVOKE_ASYNC(src, TYPE_PROC_REF(/atom/movable, say), message = return_value, forced = "parrot oneliner on attack") + +/// Handles picking up the item we're holding, done in its own proc because of a snowflake edge case we need to account for. No additional logic beyond that. +/// Returns TRUE if we picked it up, FALSE otherwise. +/mob/living/basic/parrot/proc/pick_up_item(obj/item/target) + if(istype(target, /obj/item/food/cracker)) + consume_cracker(target) + qdel(target) + return + + target.forceMove(src) + held_item = target + +/// Handles dropping items we're holding. Gently is a special modifier we can use for special interactions. +/mob/living/basic/parrot/proc/drop_held_item(gently = TRUE) + if(isnull(held_item)) + balloon_alert(src, "nothing to drop!") + return + + if(stat != CONSCIOUS) // don't gotta do shit + return + + if(!gently && isgrenade(held_item)) + var/obj/item/grenade/bomb = held_item + balloon_alert(src, "bombs away!") // you'll likely die too so we can get away with the `!` here + bomb.forceMove(drop_location()) + bomb.detonate() + return + + balloon_alert(src, "dropped item") + held_item.forceMove(drop_location()) + +/mob/living/basic/parrot/Exited(atom/movable/gone, direction) + . = ..() + if(gone != held_item) + return + held_item = null + +/mob/living/basic/parrot/vv_edit_var(var_name, vval) + . = ..() // give admins an easier time when it comes to fucking with poly + switch(var_name) + if(NAMEOF(src, speech_probability_rate)) + update_speech_blackboards() + if(NAMEOF(src, speech_shuffle_rate)) + update_speech_blackboards() + +/// Updates our speech blackboards mob-side to reflect the current speech on the controller to ensure everything is synchronized. +/mob/living/basic/parrot/proc/update_speech_blackboards() + ai_controller.set_blackboard_key(BB_PARROT_REPEAT_PROBABILITY, speech_probability_rate) + ai_controller.set_blackboard_key(BB_PARROT_PHRASE_CHANGE_PROBABILITY, speech_shuffle_rate) + +/// Will simply set up the headset for the parrot to use. Stub, implemented on subtypes. +/mob/living/basic/parrot/proc/setup_headset() + return + +/// Gets a static list of phrases we wish to pass to the element. +/mob/living/basic/parrot/proc/get_static_list_of_phrases() + var/static/list/default_phrases = list( + "BAWWWWK george mellons griffing me!", + "Cracker?", + "Hello!", + "Hi!", + ) + + return default_phrases + +/// Gets the available channels that this parrot has access to. Returns a list of the channels we can use. +/mob/living/basic/parrot/proc/get_available_channels() + var/list/returnable_list = list() + if(isnull(ears)) + return returnable_list + + var/list/headset_channels = ears.channels + for(var/channel in headset_channels) + returnable_list += GLOB.channel_tokens[channel] // will return something like ":e" or ":c" y'know + + return returnable_list + +/mob/living/basic/parrot/proc/tamed() + new /obj/effect/temp_visual/heart(drop_location()) + +/mob/living/basic/parrot/proc/drop_item_on_signal(mob/living/user) + SIGNAL_HANDLER + + drop_held_item() + return COMSIG_KB_ACTIVATED + +#undef FORCED_SPEECH_COOLDOWN_DURATION diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_ai/_parrot_controller.dm b/code/modules/mob/living/basic/pets/parrot/parrot_ai/_parrot_controller.dm new file mode 100644 index 000000000000..ea0b9a710117 --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/parrot_ai/_parrot_controller.dm @@ -0,0 +1,40 @@ +/datum/ai_controller/basic_controller/parrot + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_HOARD_LOCATION_RANGE = 9, + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk/parrot + + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/perch_on_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/hoard_items, + /datum/ai_planning_subtree/parrot_as_in_repeat, // always get a witty oneliner in when you can + ) + +/datum/idle_behavior/idle_random_walk/parrot + ///chance of us moving while perched + var/walk_chance_when_perched = 5 + +/datum/idle_behavior/idle_random_walk/parrot/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller) + var/mob/living/living_pawn = controller.pawn + walk_chance = HAS_TRAIT(living_pawn, TRAIT_PARROT_PERCHED) ? walk_chance_when_perched : initial(walk_chance) + return ..() + +/datum/ai_behavior/travel_towards/and_drop + +/datum/ai_behavior/travel_towards/and_drop/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + var/mob/living/living_mob = controller.pawn + var/obj/drop_item = locate(/obj/item) in (living_mob.contents - typecache_filter_list(living_mob.contents, controller.blackboard[BB_IGNORE_ITEMS])) + drop_item?.forceMove(get_turf(living_mob)) + +/datum/ai_behavior/basic_melee_attack/interact_once/parrot + +/datum/ai_behavior/basic_melee_attack/interact_once/parrot/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.set_blackboard_key(BB_ALWAYS_IGNORE_FACTION, FALSE) diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_ai/ghost_parrot_controller.dm b/code/modules/mob/living/basic/pets/parrot/parrot_ai/ghost_parrot_controller.dm new file mode 100644 index 000000000000..58bdef408a5e --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/parrot_ai/ghost_parrot_controller.dm @@ -0,0 +1,37 @@ +/// Used for ghost poly. +/datum/ai_controller/basic_controller/parrot/ghost + planning_subtrees = list( + /datum/ai_planning_subtree/parrot_as_in_repeat, + /datum/ai_planning_subtree/possess_humans, + /datum/ai_planning_subtree/hoard_items, + ) + +///subtree to possess humans +/datum/ai_planning_subtree/possess_humans + ///chance we go possess humans + var/possess_chance = 2 + +/datum/ai_planning_subtree/possess_humans/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + + if(controller.blackboard_key_exists(BB_PERCH_TARGET)) + controller.queue_behavior(/datum/ai_behavior/perch_on_target/haunt, BB_PERCH_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + + + if(!SPT_PROB(possess_chance, seconds_per_tick)) + if(ishuman(living_pawn.loc)) + return SUBTREE_RETURN_FINISH_PLANNING + return + + if(ishuman(living_pawn.loc)) + controller.set_blackboard_key(living_pawn.loc) + return + + controller.queue_behavior(/datum/ai_behavior/find_and_set/conscious_person, BB_PERCH_TARGET) + + +/datum/ai_behavior/perch_on_target/haunt + +/datum/ai_behavior/perch_on_target/haunt/check_human_conditions(mob/living/living_human) + return (living_human.stat != DEAD) diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_hoarding.dm b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_hoarding.dm new file mode 100644 index 000000000000..7484cbfe6751 --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_hoarding.dm @@ -0,0 +1,74 @@ +///subtree to steal items +/datum/ai_planning_subtree/hoard_items + var/theft_chance = 5 + +/datum/ai_planning_subtree/hoard_items/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + + var/turf/myspace = controller.blackboard[BB_HOARD_LOCATION] + + if(isnull(myspace) || myspace.is_blocked_turf(source_atom = controller.pawn) || get_dist(myspace, controller.pawn) > controller.blackboard[BB_HOARD_LOCATION_RANGE]) + controller.queue_behavior(/datum/ai_behavior/find_and_set/hoard_location, BB_HOARD_LOCATION, /turf/open) + return + + //we have an item, go drop! + var/list/our_contents = living_pawn.contents - typecache_filter_list(living_pawn.contents, controller.blackboard[BB_IGNORE_ITEMS]) + if(length(our_contents)) + controller.queue_behavior(/datum/ai_behavior/travel_towards/and_drop, BB_HOARD_LOCATION) + return SUBTREE_RETURN_FINISH_PLANNING + + if(controller.blackboard_key_exists(BB_HOARD_ITEM_TARGET)) + controller.queue_behavior(/datum/ai_behavior/basic_melee_attack/interact_once, BB_HOARD_ITEM_TARGET, BB_TARGETING_STRATEGY) + return SUBTREE_RETURN_FINISH_PLANNING + + if(!SPT_PROB(theft_chance, seconds_per_tick)) + return + controller.queue_behavior(/datum/ai_behavior/find_and_set/hoard_item, BB_HOARD_ITEM_TARGET) + +/datum/ai_behavior/find_and_set/hoard_location + +/datum/ai_behavior/find_and_set/hoard_location/search_tactic(datum/ai_controller/controller, locate_path, search_range) + for(var/turf/open/candidate in oview(search_range, controller.pawn)) + if(isspaceturf(candidate) || isopenspaceturf(candidate)) + continue + if(candidate.is_blocked_turf(source_atom = controller.pawn)) + continue + return candidate + + return null + +/datum/ai_behavior/find_and_set/hoard_item + action_cooldown = 5 SECONDS + behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +/datum/ai_behavior/find_and_set/hoard_item/search_tactic(datum/ai_controller/controller, locate_path, search_range) + if(!controller.blackboard_key_exists(BB_HOARD_LOCATION)) + return null + var/turf/nest_turf = controller.blackboard[BB_HOARD_LOCATION] + var/mob/living/living_pawn = controller.pawn + for(var/atom/potential_victim in oview(search_range, controller.pawn)) + if(is_type_in_typecache(potential_victim, controller.blackboard[BB_IGNORE_ITEMS])) + continue + if(potential_victim.loc == nest_turf) + continue + if(isitem(potential_victim)) + var/obj/item/item_steal = potential_victim + if(item_steal.w_class <= WEIGHT_CLASS_SMALL) + return potential_victim + if(!ishuman(potential_victim)) + continue + if(living_pawn.faction.Find(REF(potential_victim))) + continue //dont steal from friends + if(holding_valuable(controller, potential_victim)) + controller.set_blackboard_key(BB_ALWAYS_IGNORE_FACTION, TRUE) + return potential_victim + + return null + +/datum/ai_behavior/find_and_set/hoard_item/proc/holding_valuable(datum/ai_controller/controller, mob/living/human_target) + for(var/obj/item/potential_item in human_target.held_items) + if(is_type_in_typecache(potential_item, controller.blackboard[BB_IGNORE_ITEMS])) + continue + if(potential_item.w_class <= WEIGHT_CLASS_SMALL) + return TRUE + return FALSE diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_perching.dm b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_perching.dm new file mode 100644 index 000000000000..1bb5c6fc960a --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parrot_perching.dm @@ -0,0 +1,78 @@ +///subtree to perch on targets +/datum/ai_planning_subtree/perch_on_target + ///perchance... + var/perch_chance = 5 + ///chance we unbuckle + var/unperch_chance = 15 + + +/datum/ai_planning_subtree/perch_on_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/living_pawn = controller.pawn + var/atom/buckled_too = living_pawn.buckled + + //do we have a current target or is chance to unbuckle has passed? then unbuckle! + if(buckled_too) + if((SPT_PROB(unperch_chance, seconds_per_tick) || controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET))) + controller.queue_behavior(/datum/ai_behavior/unbuckle_mob) + return + return SUBTREE_RETURN_FINISH_PLANNING + + //if we are perched, we can go find something else to perch too + var/final_chance = HAS_TRAIT(living_pawn, TRAIT_PARROT_PERCHED) ? unperch_chance : perch_chance + + if(!SPT_PROB(final_chance, seconds_per_tick) || controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) + return + + if(controller.blackboard_key_exists(BB_PERCH_TARGET)) + controller.queue_behavior(/datum/ai_behavior/perch_on_target, BB_PERCH_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + + //50 50 chance to look for an object, or a friend + if(prob(50)) + controller.queue_behavior(/datum/ai_behavior/find_and_set/nearby_friends, BB_PERCH_TARGET) + return + + controller.queue_behavior(/datum/ai_behavior/find_and_set/in_list, BB_PERCH_TARGET, controller.blackboard[BB_PARROT_PERCH_TYPES]) + +/// Parrot behavior that allows them to perch on a target. +/datum/ai_behavior/perch_on_target + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION + +/datum/ai_behavior/perch_on_target/setup(datum/ai_controller/controller, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + + set_movement_target(controller, target) + +/datum/ai_behavior/perch_on_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + finish_action(controller, FALSE, target_key) + return + + var/mob/living/basic/parrot/living_pawn = controller.pawn + + if(!ishuman(target)) + living_pawn.start_perching(target) + finish_action(controller, TRUE, target_key) + return + + if(!check_human_conditions(target)) + finish_action(controller, FALSE, target_key) + return + + living_pawn.start_perching(target) + finish_action(controller, TRUE, target_key) + +/datum/ai_behavior/perch_on_target/proc/check_human_conditions(mob/living/living_human) + if(living_human.stat == DEAD || LAZYLEN(living_human.buckled_mobs) >= living_human.max_buckled_mobs) + return FALSE + + return TRUE + +/datum/ai_behavior/perch_on_target/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.clear_blackboard_key(target_key) diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm new file mode 100644 index 000000000000..d1488a60b3bb --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm @@ -0,0 +1,50 @@ +/// When a parrot... parrots... +/datum/ai_planning_subtree/parrot_as_in_repeat + operational_datums = list(/datum/component/listen_and_repeat) + +/datum/ai_planning_subtree/parrot_as_in_repeat/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/atom/speaking_pawn = controller.pawn + + var/switch_up_probability = controller.blackboard[BB_PARROT_PHRASE_CHANGE_PROBABILITY] + if(SPT_PROB(switch_up_probability, seconds_per_tick) || isnull(controller.blackboard[BB_PARROT_REPEAT_STRING])) + if(SEND_SIGNAL(speaking_pawn, COMSIG_NEEDS_NEW_PHRASE) & NO_NEW_PHRASE_AVAILABLE) + return + + if(!SPT_PROB(controller.blackboard[BB_PARROT_REPEAT_PROBABILITY], seconds_per_tick)) + return + + var/potential_string = controller.blackboard[BB_PARROT_REPEAT_STRING] + if(isnull(potential_string)) + stack_trace("Parrot As In Repeat Subtree somehow is getting a null potential string while not getting `NO_NEW_PHRASE_AVAILABLE`!") + return + + controller.queue_behavior(/datum/ai_behavior/perform_speech/parrot, potential_string) + +/datum/ai_behavior/perform_speech/parrot + action_cooldown = 7.5 SECONDS // gets really annoying (moreso than usual) really fast otherwise + +/datum/ai_behavior/perform_speech/parrot/perform(seconds_per_tick, datum/ai_controller/controller, speech, speech_sound) + var/mob/living/basic/parrot/speaking_pawn = controller.pawn + var/list/available_channels = speaking_pawn.get_available_channels() + var/modified_speech = speech + var/use_radio = prob(50) // we might not even use the radio if we even have a channel + +#define HAS_CHANNEL_PREFIX (speech[1] in GLOB.department_radio_prefixes) && (copytext_char(speech, 2, 3) in GLOB.department_radio_keys) // determine if we need to crop the channel prefix + + if(!length(available_channels)) // might not even use the radio at all + if(HAS_CHANNEL_PREFIX) + modified_speech = copytext_char(speech, 3) + + else + if(HAS_CHANNEL_PREFIX) + modified_speech = "[use_radio ? pick(available_channels) : ""][copytext_char(speech, 3)]" + else + modified_speech = "[use_radio ? pick(available_channels) : ""][speech]" + + + speaking_pawn.say(modified_speech, forced = "AI Controller") + if(speech_sound) + playsound(speaking_pawn, speech_sound, 80, vary = TRUE) + finish_action(controller, TRUE) + +#undef HAS_CHANNEL_PREFIX diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_items.dm b/code/modules/mob/living/basic/pets/parrot/parrot_items.dm new file mode 100644 index 000000000000..c071bf7fdbe6 --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/parrot_items.dm @@ -0,0 +1,60 @@ +/datum/strippable_item/parrot_headset + key = STRIPPABLE_ITEM_PARROT_HEADSET + +/datum/strippable_item/parrot_headset/get_item(atom/source) + var/mob/living/basic/parrot/poly/parrot_source = source + return istype(parrot_source) ? parrot_source.ears : null + +/datum/strippable_item/parrot_headset/try_equip(atom/source, obj/item/equipping, mob/user) + . = ..() + if (!.) + return FALSE + + if (!istype(equipping, /obj/item/radio/headset)) + to_chat(user, span_warning("[equipping] won't fit!")) + return FALSE + + return TRUE + +// There is no delay for putting a headset on a parrot. +/datum/strippable_item/parrot_headset/start_equip(atom/source, obj/item/equipping, mob/user) + return TRUE + +/datum/strippable_item/parrot_headset/finish_equip(atom/source, obj/item/equipping, mob/user) + var/obj/item/radio/headset/radio = equipping + if (!istype(radio)) + return + + var/mob/living/basic/parrot/parrot_source = source + if (!istype(parrot_source)) + return + + if (!user.transferItemToLoc(radio, source)) + return + + parrot_source.ears = radio + + to_chat(user, span_notice("You fit [radio] onto [source].")) + +/datum/strippable_item/parrot_headset/start_unequip(atom/source, mob/user) + . = ..() + if (!.) + return FALSE + + var/mob/living/basic/parrot/parrot_source = source + if (!istype(parrot_source)) + return + + if (parrot_source.stat == CONSCIOUS) + var/list/list_of_channels = parrot_source.get_available_channels() + parrot_source.say("[list_of_channels ? "[pick(list_of_channels)] " : null]BAWWWWWK LEAVE THE HEADSET BAWKKKKK!", forced = "attempted headset removal") + + return TRUE + +/datum/strippable_item/parrot_headset/finish_unequip(atom/source, mob/user) + var/mob/living/basic/parrot/parrot_source = source + if (!istype(parrot_source)) + return + + parrot_source.ears.forceMove(parrot_source.drop_location()) + parrot_source.ears = null diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_subtypes.dm b/code/modules/mob/living/basic/pets/parrot/parrot_subtypes.dm new file mode 100644 index 000000000000..a0e8a4b52945 --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/parrot_subtypes.dm @@ -0,0 +1,14 @@ +// this file is for parrots that aren't poly + +/// Parrot that will just randomly spawn with a headset. Nothing too special beyond that. +/mob/living/basic/parrot/headsetted + +/mob/living/basic/parrot/headsetted/setup_headset() + var/headset = pick( + /obj/item/radio/headset/headset_cargo, + /obj/item/radio/headset/headset_eng, + /obj/item/radio/headset/headset_med, + /obj/item/radio/headset/headset_sci, + /obj/item/radio/headset/headset_sec, + ) + ears = new headset(src) diff --git a/code/modules/mob/living/basic/pets/parrot/poly.dm b/code/modules/mob/living/basic/pets/parrot/poly.dm new file mode 100644 index 000000000000..607c0e0eb26c --- /dev/null +++ b/code/modules/mob/living/basic/pets/parrot/poly.dm @@ -0,0 +1,241 @@ +/// Default poly, presumably died the last shift and has no special traits. +#define POLY_DEFAULT "default" +/// Poly has survived a number of rounds equivalent to the longest survival of his being. +#define POLY_LONGEST_SURVIVAL "longest_survival" +/// Poly has survived a number of rounds equivalent to the longest deathstreak of his being. +#define POLY_BEATING_DEATHSTREAK "longest_deathstreak" +/// Poly has only just survived a round, and is doing a consecutive one. +#define POLY_CONSECUTIVE_ROUND "consecutive_round" +/// haunt filter we apply to who we possess +#define POLY_POSSESS_FILTER +/// haunt filter color we apply to who we possess +#define POLY_POSSESS_GLOW "#522059" + +/// The classically famous compadre to the Chief Engineer, Poly. +/mob/living/basic/parrot/poly + name = "Poly" + desc = "Poly the Parrot. An expert on quantum cracker theory." + gold_core_spawnable = NO_SPAWN + speech_probability_rate = 13 + + /// Callback to save our memory at the end of the round. + var/datum/callback/roundend_callback = null + /// Did we write the memory to disk? + var/memory_saved = FALSE + /// How long has this bird been alive for? + var/rounds_survived = 0 + /// How long have we survived for at max? + var/longest_survival = 0 + /// How many rounds in a row have we been dead for? + var/longest_deathstreak = 0 + +/mob/living/basic/parrot/poly/Initialize(mapload) + . = ..() + + if(!memory_saved) + roundend_callback = CALLBACK(src, PROC_REF(Write_Memory)) + SSticker.OnRoundend(roundend_callback) + + update_appearance() + +/mob/living/basic/parrot/poly/Destroy() + LAZYREMOVE(SSticker.round_end_events, roundend_callback) // we do the memory writing stuff on death, but this is important to yeet as fast as we can if we need to destroy + roundend_callback = null + return ..() + +/mob/living/basic/parrot/poly/death(gibbed) + if(HAS_TRAIT(src, TRAIT_DONT_WRITE_MEMORY)) + return ..() // Don't read memory either. + if(!memory_saved) + Write_Memory(TRUE) + var/special_status = determine_special_poly() + if(special_status == POLY_LONGEST_SURVIVAL || special_status == POLY_BEATING_DEATHSTREAK || prob(0.666)) + var/mob/living/basic/parrot/poly/ghost/specter = new(loc) + if(mind) + mind.transfer_to(specter) + else + specter.key = key + return ..() + +/mob/living/basic/parrot/poly/get_static_list_of_phrases() // there's only one poly, so there should only be one ongoing list of phrases. i guess + var/static/list/phrases_to_return = list() + if(length(phrases_to_return)) + return phrases_to_return + + phrases_to_return += read_memory() // must come first!!! + // now add some valuable lines every poly should have + phrases_to_return += list( + ":e Check the crystal, you chucklefucks!", + ":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE", + ":e WHO TOOK THE DAMN MODSUITS?", + ":e Wire the solars, you lazy bums!", + "Poly wanna cracker!", + ) + switch(determine_special_poly()) + if(POLY_DEFAULT) + phrases_to_return += pick("...alive?", "This isn't parrot heaven!", "I live, I die, I live again!", "The void fades!") + if(POLY_LONGEST_SURVIVAL) + phrases_to_return += pick("...[longest_survival].", "The things I've seen!", "I have lived many lives!", "What are you before me?") + if(POLY_BEATING_DEATHSTREAK) + phrases_to_return += pick("What are you waiting for!", "Violence breeds violence!", "Blood! Blood!", "Strike me down if you dare!") + if(POLY_CONSECUTIVE_ROUND) + phrases_to_return += pick("...again?", "No, It was over!", "Let me out!", "It never ends!") + + return phrases_to_return + +/mob/living/basic/parrot/poly/update_desc() + . = ..() + switch(determine_special_poly()) + if(POLY_LONGEST_SURVIVAL) + desc += " Old as sin, and just as loud. Claimed to be [rounds_survived]." + if(POLY_BEATING_DEATHSTREAK) + desc += " The squawks of [-rounds_survived] dead parrots ring out in your ears..." + if(POLY_CONSECUTIVE_ROUND) + desc += " Over [rounds_survived] shifts without a \"terrible\" \"accident\"!" + +/mob/living/basic/parrot/poly/update_icon() + . = ..() + switch(determine_special_poly()) + if(POLY_LONGEST_SURVIVAL) + add_atom_colour("#EEEE22", FIXED_COLOUR_PRIORITY) + if(POLY_BEATING_DEATHSTREAK) + add_atom_colour("#BB7777", FIXED_COLOUR_PRIORITY) + +/// Reads the memory of the parrot, and updates the necessary variables. Returns a list of phrases to add to the parrot's speech buffer. +/mob/living/basic/parrot/poly/proc/read_memory() + RETURN_TYPE(/list) + var/list/returnable_list = list() + if(fexists("data/npc_saves/Poly.sav")) //legacy compatability to convert old format to new + var/savefile/legacy = new /savefile("data/npc_saves/Poly.sav") + legacy["phrases"] >> returnable_list + legacy["roundssurvived"] >> rounds_survived + legacy["longestsurvival"] >> longest_survival + legacy["longestdeathstreak"] >> longest_deathstreak + fdel("data/npc_saves/Poly.sav") + + else + var/json_file = file("data/npc_saves/Poly.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + returnable_list = json["phrases"] + rounds_survived = json["roundssurvived"] + longest_survival = json["longestsurvival"] + longest_deathstreak = json["longestdeathstreak"] + + return returnable_list + +/// Determines the type of Poly we might have here based on the statistics we got from the memory. +/mob/living/basic/parrot/poly/proc/determine_special_poly() + if(rounds_survived == longest_survival) + return POLY_LONGEST_SURVIVAL + else if(rounds_survived == longest_deathstreak) + return POLY_BEATING_DEATHSTREAK + else if(rounds_survived > 0) + return POLY_CONSECUTIVE_ROUND + else + return POLY_DEFAULT + +/mob/living/basic/parrot/poly/Write_Memory(dead, gibbed) + . = ..() + if(!. || memory_saved) // if we die, no more memory + return FALSE + + if(!dead && (stat != DEAD)) + dead = FALSE + + var/file_path = "data/npc_saves/Poly.json" + var/list/file_data = list() + + var/list/exportable_speech_buffer = ai_controller.blackboard[BB_EXPORTABLE_STRING_BUFFER_LIST] // should have been populated when we sent the signal out on parent + if(!!length(exportable_speech_buffer)) + file_data["phrases"] = exportable_speech_buffer + + if(dead) + file_data["roundssurvived"] = min(rounds_survived - 1, 0) + file_data["longestsurvival"] = longest_survival + if(rounds_survived - 1 < longest_deathstreak) + file_data["longestdeathstreak"] = rounds_survived - 1 + else + file_data["longestdeathstreak"] = longest_deathstreak + else + + file_data["roundssurvived"] = max(rounds_survived, 0) + 1 + if(rounds_survived + 1 > longest_survival) + file_data["longestsurvival"] = rounds_survived + 1 + else + file_data["longestsurvival"] = longest_survival + file_data["longestdeathstreak"] = longest_deathstreak + + var/formatted_data +#if DM_VERSION >= 515 + formatted_data = json_encode(file_data, JSON_PRETTY_PRINT) +#else + formatted_data = json_encode(file_data) +#endif + + rustg_file_write(formatted_data, file_path) + memory_saved = TRUE + return TRUE + +/mob/living/basic/parrot/poly/setup_headset() + ears = new /obj/item/radio/headset/headset_eng(src) + +/mob/living/basic/parrot/poly/ghost + name = "The Ghost of Poly" + desc = "Doomed to squawk the Earth." + color = "#FFFFFF77" + status_flags = GODMODE + sentience_type = SENTIENCE_BOSS //This is so players can't mindswap into ghost poly to become a literal god + incorporeal_move = INCORPOREAL_MOVE_BASIC + butcher_results = list(/obj/item/ectoplasm = 1) + ai_controller = /datum/ai_controller/basic_controller/parrot/ghost + speech_probability_rate = 1 + +/mob/living/basic/parrot/poly/ghost/Initialize(mapload) + // block anything and everything that could possibly happen with writing memory for ghosts + memory_saved = TRUE + ADD_TRAIT(src, TRAIT_DONT_WRITE_MEMORY, INNATE_TRAIT) + RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + return ..() + +//we perch on human souls +/mob/living/basic/parrot/poly/ghost/perch_on_human(mob/living/carbon/human/target) + if(loc == target) //dismount + forceMove(get_turf(target)) + return FALSE + if(ishuman(loc)) + balloon_alert(src, "already possessing!") + return FALSE + forceMove(target) + return TRUE + +/mob/living/basic/parrot/poly/ghost/proc/on_moved(atom/movable/movable, atom/old_loc) + SIGNAL_HANDLER + + if(ishuman(old_loc)) + var/mob/living/unpossessed_human = old_loc + unpossessed_human.remove_filter(POLY_POSSESS_FILTER) + return + + if(!ishuman(loc)) + return + + var/mob/living/possessed_human = loc + possessed_human.add_filter(POLY_POSSESS_FILTER, 2, list("type" = "outline", "color" = POLY_POSSESS_GLOW, "size" = 2)) + var/filter = possessed_human.get_filter(POLY_POSSESS_FILTER) + + if(filter) + animate(filter, alpha = 200, time = 2 SECONDS, loop = -1) + animate(alpha = 60, time = 2 SECONDS) + + var/datum/disease/parrot_possession/on_possession = new /datum/disease/parrot_possession + on_possession.set_parrot(src) + possessed_human.ForceContractDisease(on_possession, make_copy = FALSE, del_on_fail = TRUE) + +#undef POLY_DEFAULT +#undef POLY_LONGEST_SURVIVAL +#undef POLY_BEATING_DEATHSTREAK +#undef POLY_CONSECUTIVE_ROUND +#undef POLY_POSSESS_FILTER +#undef POLY_POSSESS_GLOW diff --git a/code/modules/mob/living/basic/pets/penguin.dm b/code/modules/mob/living/basic/pets/penguin.dm index 5729a8c761dd..82c46ea08321 100644 --- a/code/modules/mob/living/basic/pets/penguin.dm +++ b/code/modules/mob/living/basic/pets/penguin.dm @@ -84,7 +84,7 @@ /datum/ai_controller/basic_controller/penguin blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_traits = STOP_MOVING_WHEN_PULLED @@ -178,7 +178,7 @@ /datum/ai_controller/basic_controller/penguin/baby blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_FIND_MOM_TYPES = list(/mob/living/basic/pet/penguin), BB_IGNORE_MOM_TYPES = list(/mob/living/basic/pet/penguin/baby), ) diff --git a/code/modules/mob/living/simple_animal/friendly/sloth.dm b/code/modules/mob/living/basic/pets/sloth.dm similarity index 50% rename from code/modules/mob/living/simple_animal/friendly/sloth.dm rename to code/modules/mob/living/basic/pets/sloth.dm index 8e308c58d12d..0b1546ccf93d 100644 --- a/code/modules/mob/living/simple_animal/friendly/sloth.dm +++ b/code/modules/mob/living/basic/pets/sloth.dm @@ -1,63 +1,68 @@ -GLOBAL_DATUM(cargo_sloth, /mob/living/simple_animal/sloth) +GLOBAL_DATUM(cargo_sloth, /mob/living/basic/sloth) -/mob/living/simple_animal/sloth +/mob/living/basic/sloth name = "sloth" desc = "An adorable, sleepy creature." icon = 'icons/mob/simple/pets.dmi' icon_state = "sloth" icon_living = "sloth" icon_dead = "sloth_dead" + speak_emote = list("yawns") - emote_hear = list("snores.","yawns.") - emote_see = list("dozes off.", "looks around sleepily.") - speak_chance = 1 - turns_per_move = 5 + can_be_held = TRUE - butcher_results = list(/obj/item/food/meat/slab = 3) + held_state = "sloth" + response_help_continuous = "pets" response_help_simple = "pet" response_disarm_continuous = "gently pushes aside" response_disarm_simple = "gently push aside" response_harm_continuous = "kicks" response_harm_simple = "kick" + + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + mob_biotypes = MOB_ORGANIC|MOB_BEAST gold_core_spawnable = FRIENDLY_SPAWN + melee_damage_lower = 18 melee_damage_upper = 18 health = 50 maxHealth = 50 - speed = 10 - held_state = "sloth" - ///In the case 'melee_damage_upper' is somehow raised above 0 - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE + speed = 10 // speed is fucking weird man. they aren't fast though don't worry + butcher_results = list(/obj/item/food/meat/slab = 3) - footstep_type = FOOTSTEP_MOB_CLAW + ai_controller = /datum/ai_controller/basic_controller/sloth -/mob/living/simple_animal/sloth/Initialize(mapload) +/mob/living/basic/sloth/Initialize(mapload) . = ..() AddElement(/datum/element/pet_bonus, "slowly smiles!") + AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_CLAW) + AddElement(/datum/element/ai_retaliate) + AddComponent(/datum/component/tree_climber) + + if(!mapload || isnull(GLOB.cargo_sloth) || !is_station_level(z)) + return + // If someone adds non-cargo sloths to maps we'll have a problem but we're fine for now - if(!GLOB.cargo_sloth && mapload && is_station_level(z)) - GLOB.cargo_sloth = src + GLOB.cargo_sloth = src -/mob/living/simple_animal/sloth/Destroy() +/mob/living/basic/sloth/Destroy() if(GLOB.cargo_sloth == src) GLOB.cargo_sloth = null return ..() -//Cargo Sloth -/mob/living/simple_animal/sloth/paperwork +/mob/living/basic/sloth/paperwork name = "Paperwork" desc = "Cargo's pet sloth. About as useful as the rest of the techs." + gender = MALE gold_core_spawnable = NO_SPAWN -//Cargo Sloth 2 - -/mob/living/simple_animal/sloth/citrus +/mob/living/basic/sloth/citrus name = "Citrus" desc = "Cargo's pet sloth. She's dressed in a horrible sweater." icon_state = "cool_sloth" @@ -66,3 +71,26 @@ GLOBAL_DATUM(cargo_sloth, /mob/living/simple_animal/sloth) gender = FEMALE butcher_results = list(/obj/item/toy/spinningtoy = 1) gold_core_spawnable = NO_SPAWN + +/// They're really passive in game, so they just wanna get away if you start smacking them. No trees in space from them to use for clawing your eyes out, but they will try if desperate. +/datum/ai_controller/basic_controller/sloth + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate/to_flee, + /datum/ai_planning_subtree/flee_target/from_flee_key, + /datum/ai_planning_subtree/climb_trees, + /datum/ai_planning_subtree/random_speech/sloth, + ) + +/datum/ai_planning_subtree/random_speech/sloth + speech_chance = 1 + emote_hear = list("snores.", "yawns.") + emote_see = list("dozes off.", "looks around sleepily.") diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/basic/ruin_defender/skeleton.dm similarity index 60% rename from code/modules/mob/living/simple_animal/hostile/skeleton.dm rename to code/modules/mob/living/basic/ruin_defender/skeleton.dm index 8655f5f5a8b5..c8de723b9513 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/basic/ruin_defender/skeleton.dm @@ -1,58 +1,69 @@ -/mob/living/simple_animal/hostile/skeleton +/mob/living/basic/skeleton name = "reanimated skeleton" desc = "A real bonefied skeleton, doesn't seem like it wants to socialize." gender = NEUTER icon = 'icons/mob/simple/simple_human.dmi' mob_biotypes = MOB_UNDEAD|MOB_HUMANOID - turns_per_move = 5 speak_emote = list("rattles") - emote_see = list("rattles") - istate = ISTATE_HARM|ISTATE_BLOCKING maxHealth = 40 health = 40 - speed = 1 - harm_intent_damage = 5 + basic_mob_flags = DEL_ON_DEATH melee_damage_lower = 15 melee_damage_upper = 15 - minbodytemp = 0 - maxbodytemp = 1500 - healable = 0 //they're skeletons how would bruise packs help them?? + unsuitable_atmos_damage = 0 + unsuitable_cold_damage = 0 + unsuitable_heat_damage = 0 attack_verb_continuous = "slashes" attack_verb_simple = "slash" - attack_sound = 'sound/hallucinations/growl1.ogg' + attack_sound = 'sound/weapons/slash.ogg' attack_vis_effect = ATTACK_EFFECT_CLAW - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 5 - robust_searching = 1 - stat_attack = HARD_CRIT faction = list(FACTION_SKELETON) // Going for a sort of pale bluegreen here, shooting for boneish lighting_cutoff_red = 15 lighting_cutoff_green = 25 lighting_cutoff_blue = 35 - footstep_type = FOOTSTEP_MOB_SHOE death_message = "collapses into a pile of bones!" - del_on_death = TRUE - loot = list(/obj/effect/decal/remains/human) + ai_controller = /datum/ai_controller/basic_controller/skeleton + /// Loot this mob drops on death. + var/list/loot = list(/obj/effect/decal/remains/human) /// Path of the outfit we give to the mob's visuals. var/outfit = null /// Path of the species we give to the mob's visuals. var/species = /datum/species/skeleton /// Path of the held item we give to the mob's visuals. var/held_item + /// Types of milk skeletons like to drink + var/static/list/good_drinks = list( + /obj/item/reagent_containers/condiment/milk, + ) + /// Bad milk that skeletons hate + var/static/list/bad_drinks = list( + /obj/item/reagent_containers/condiment/soymilk, + ) -/mob/living/simple_animal/hostile/skeleton/Initialize(mapload) +/mob/living/basic/skeleton/Initialize(mapload) . = ..() apply_dynamic_human_appearance(src, outfit, species, r_hand = held_item) + AddElement(/datum/element/footstep, FOOTSTEP_MOB_SHOE) + if(LAZYLEN(loot)) + loot = string_list(loot) + AddElement(/datum/element/death_drops, loot) + AddElement(/datum/element/basic_eating, heal_amt = 50, drinking = TRUE, food_types = good_drinks) + AddElement(/datum/element/basic_eating, heal_amt = 0, damage_amount = 25, damage_type = BURN, drinking = TRUE, food_types = bad_drinks) + ADD_TRAIT(src, TRAIT_SNOWSTORM_IMMUNE, INNATE_TRAIT) + ai_controller?.set_blackboard_key(BB_BASIC_FOODS, good_drinks + bad_drinks) -/mob/living/simple_animal/hostile/skeleton/eskimo - name = "undead eskimo" - desc = "The reanimated remains of some poor traveler." +/mob/living/basic/skeleton/settler + name = "undead settler" + desc = "The reanimated remains of some poor settler." maxHealth = 55 health = 55 - weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) melee_damage_lower = 17 melee_damage_upper = 20 + attack_verb_continuous = "jabs" + attack_verb_simple = "jab" + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_SLASH death_message = "collapses into a pile of bones, its gear falling to the floor!" loot = list( /obj/effect/decal/remains/human, @@ -60,27 +71,28 @@ /obj/item/clothing/shoes/winterboots, /obj/item/clothing/suit/hooded/wintercoat, ) - outfit = /datum/outfit/eskimo + outfit = /datum/outfit/settler held_item = /obj/item/spear -/datum/outfit/eskimo - name = "Eskimo" +/datum/outfit/settler + name = "Settler" suit = /obj/item/clothing/suit/hooded/wintercoat shoes = /obj/item/clothing/shoes/winterboots -/mob/living/simple_animal/hostile/skeleton/templar +/mob/living/basic/skeleton/templar name = "undead templar" desc = "The reanimated remains of a holy templar knight." maxHealth = 150 health = 150 - weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) speed = 2 - speak_chance = 1 - speak = list("THE GODS WILL IT!","DEUS VULT!","REMOVE KABAB!") force_threshold = 10 //trying to simulate actually having armor obj_damage = 50 melee_damage_lower = 25 melee_damage_upper = 30 + attack_verb_continuous = "slices" + attack_verb_simple = "slice" + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_SLASH death_message = "collapses into a pile of bones, its gear clanging as it hits the ground!" loot = list( /obj/effect/decal/remains/human, @@ -96,17 +108,16 @@ suit = /obj/item/clothing/suit/chaplainsuit/armor/templar r_hand = /obj/item/claymore/weak -/mob/living/simple_animal/hostile/skeleton/ice +/mob/living/basic/skeleton/ice name = "ice skeleton" desc = "A reanimated skeleton protected by a thick sheet of natural ice armor. Looks slow, though." speed = 5 maxHealth = 75 health = 75 - weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) color = rgb(114,228,250) loot = list(/obj/effect/decal/remains/human{color = rgb(114,228,250)}) -/mob/living/simple_animal/hostile/skeleton/plasmaminer +/mob/living/basic/skeleton/plasmaminer name = "shambling miner" desc = "A plasma-soaked miner, their exposed limbs turned into a grossly incandescent bone seemingly made of plasma." icon_state = "plasma_miner" @@ -114,7 +125,6 @@ icon_dead = "plasma_miner" maxHealth = 150 health = 150 - harm_intent_damage = 10 melee_damage_lower = 15 melee_damage_upper = 20 light_color = LIGHT_COLOR_PURPLE @@ -124,20 +134,19 @@ outfit = /datum/outfit/plasma_miner species = /datum/species/plasmaman -/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer +/mob/living/basic/skeleton/plasmaminer/jackhammer desc = "A plasma-soaked miner, their exposed limbs turned into a grossly incandescent bone seemingly made of plasma. They seem to still have their mining tool in their hand, gripping tightly." icon_state = "plasma_miner_tool" icon_living = "plasma_miner_tool" icon_dead = "plasma_miner_tool" maxHealth = 185 health = 185 - harm_intent_damage = 15 melee_damage_lower = 20 melee_damage_upper = 25 attack_verb_continuous = "blasts" attack_verb_simple = "blast" attack_sound = 'sound/weapons/sonic_jackhammer.ogg' - attack_vis_effect = null // jackhammer moment + attack_vis_effect = null loot = list(/obj/effect/decal/remains/plasma, /obj/item/pickaxe/drill/jackhammer) held_item = /obj/item/pickaxe/drill/jackhammer @@ -146,3 +155,24 @@ uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland suit = /obj/item/clothing/suit/hooded/explorer mask = /obj/item/clothing/mask/gas/explorer + +// Skeleton AI + +/// Skeletons mostly just beat people to death, but they'll also find and drink milk. +/datum/ai_controller/basic_controller/skeleton + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + BB_EMOTE_KEY = "rattles", + BB_EMOTE_CHANCE = 20, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/run_emote, + /datum/ai_planning_subtree/find_food, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) diff --git a/code/modules/mob/living/basic/ruin_defender/stickman.dm b/code/modules/mob/living/basic/ruin_defender/stickman.dm index b0e40d9b8ad4..55776584d31c 100644 --- a/code/modules/mob/living/basic/ruin_defender/stickman.dm +++ b/code/modules/mob/living/basic/ruin_defender/stickman.dm @@ -13,6 +13,7 @@ attack_verb_simple = "punch" melee_damage_lower = 10 melee_damage_upper = 10 + melee_attack_cooldown = 1.5 SECONDS attack_sound = 'sound/weapons/punch1.ogg' istate = ISTATE_HARM|ISTATE_BLOCKING faction = list(FACTION_STICKMAN) @@ -28,22 +29,16 @@ /datum/ai_controller/basic_controller/stickman blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic() + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_random_walk planning_subtrees = list( /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/stickman + /datum/ai_planning_subtree/basic_melee_attack_subtree ) -/datum/ai_planning_subtree/basic_melee_attack_subtree/stickman - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/stickman - -/datum/ai_behavior/basic_melee_attack/stickman - action_cooldown = 1.5 SECONDS - /mob/living/basic/stickman/dog name = "Angry Stick Dog" desc = "Stickman's best friend, if he could see him at least." diff --git a/code/modules/mob/living/basic/ruin_defender/wizard/wizard.dm b/code/modules/mob/living/basic/ruin_defender/wizard/wizard.dm new file mode 100644 index 000000000000..2dfb4d41e054 --- /dev/null +++ b/code/modules/mob/living/basic/ruin_defender/wizard/wizard.dm @@ -0,0 +1,90 @@ +/mob/living/basic/wizard + name = "Space Wizard" + desc = "A wizard is never early. Nor is he late. He arrives exactly at the worst possible moment." + icon = 'icons/mob/simple/simple_human.dmi' + icon_state = "wizard" + icon_living = "wizard" + icon_dead = "wizard_dead" + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + sentience_type = SENTIENCE_HUMANOID + speed = 0 + maxHealth = 100 + health = 100 + melee_damage_lower = 5 + melee_damage_upper = 5 + attack_verb_continuous = "punches" + attack_verb_simple = "punch" + attack_sound = 'sound/weapons/punch1.ogg' + istate = ISTATE_HARM | ISTATE_BLOCKING + habitable_atmos = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + unsuitable_atmos_damage = 7.5 + faction = list(ROLE_WIZARD) + basic_mob_flags = DEL_ON_DEATH + ai_controller = /datum/ai_controller/basic_controller/wizard + + /// A list of possible wizard corpses, and therefore wizard outfits, to select from + var/static/list/wizard_outfits = list( + /obj/effect/mob_spawn/corpse/human/wizard = 5, + /obj/effect/mob_spawn/corpse/human/wizard/red = 3, + /obj/effect/mob_spawn/corpse/human/wizard/yellow = 3, + /obj/effect/mob_spawn/corpse/human/wizard/black = 3, + /obj/effect/mob_spawn/corpse/human/wizard/marisa = 1, + //The tape wizard should go here, but its hat doesn't render correctly for some reason. + ) + /// A specified wizard corpse spawner to use. If null, picks from the list above instead. + var/selected_outfit + + /// Typepath for the wizard's targeted spell. If null, selects randomly. + var/targeted_spell_path + /// List of possible targeted spells to pick from + var/static/list/targeted_spell_list = list( + /datum/action/cooldown/spell/pointed/projectile/fireball/lesser, + /datum/action/cooldown/spell/pointed/projectile/lightningbolt, + ) + + /// Typepath for the wizard's secondary spell. If null, selects randomly. + var/secondary_spell_path + /// List of possible secondary spells to pick from + var/static/list/secondary_spell_list = list( + /datum/action/cooldown/spell/aoe/magic_missile, + /datum/action/cooldown/spell/charged/beam/tesla, + /datum/action/cooldown/spell/aoe/repulse, + /datum/action/cooldown/spell/conjure/the_traps, + ) + +/mob/living/basic/wizard/Initialize(mapload) + . = ..() + if(!selected_outfit) + selected_outfit = pick_weight(wizard_outfits) + apply_dynamic_human_appearance(src, mob_spawn_path = selected_outfit, r_hand = /obj/item/staff) + var/list/remains = string_list(list( + selected_outfit, + /obj/item/staff + )) + AddElement(/datum/element/death_drops, remains) + AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_SHOE) + + if(isnull(targeted_spell_path)) + targeted_spell_path = pick(targeted_spell_list) + if(isnull(secondary_spell_path)) + secondary_spell_path = pick(secondary_spell_list) + + var/datum/action/cooldown/spell/targeted_spell = new targeted_spell_path(src) + targeted_spell.spell_requirements &= ~(SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_WIZARD_GARB|SPELL_REQUIRES_MIND) + targeted_spell.Grant(src) + ai_controller.set_blackboard_key(BB_WIZARD_TARGETED_SPELL, targeted_spell) + + var/datum/action/cooldown/spell/secondary_spell = new secondary_spell_path(src) + secondary_spell.spell_requirements &= ~(SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_WIZARD_GARB|SPELL_REQUIRES_MIND) + secondary_spell.Grant(src) + ai_controller.set_blackboard_key(BB_WIZARD_SECONDARY_SPELL, secondary_spell) + + var/datum/action/cooldown/spell/teleport/radius_turf/blink/lesser/blink_spell = new(src) + blink_spell.Grant(src) + ai_controller.set_blackboard_key(BB_WIZARD_BLINK_SPELL, blink_spell) + +/// Uses the colors and loadout of the original wizard simplemob +/mob/living/basic/wizard/classic + selected_outfit = /obj/effect/mob_spawn/corpse/human/wizard + targeted_spell_path = /datum/action/cooldown/spell/pointed/projectile/fireball/lesser + secondary_spell_path = /datum/action/cooldown/spell/aoe/magic_missile diff --git a/code/modules/mob/living/basic/ruin_defender/wizard/wizard_ai.dm b/code/modules/mob/living/basic/ruin_defender/wizard/wizard_ai.dm new file mode 100644 index 000000000000..4430b1339a74 --- /dev/null +++ b/code/modules/mob/living/basic/ruin_defender/wizard/wizard_ai.dm @@ -0,0 +1,53 @@ +#define WIZARD_SPELL_COOLDOWN (1 SECONDS) + +/** + * Wizards run away from their targets while flinging spells at them and blinking constantly. + */ +/datum/ai_controller/basic_controller/wizard + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/maintain_distance/cover_minimum_distance, + /datum/ai_planning_subtree/targeted_mob_ability/wizard_spell/primary, + /datum/ai_planning_subtree/targeted_mob_ability/wizard_spell/secondary, + /datum/ai_planning_subtree/targeted_mob_ability/wizard_spell/blink, + ) + +/** + * Cast a wizard spell. There is a minimum cooldown between spellcasts to prevent overwhelming spam. + * + * Though only the primary spell is actually targeted, all spells use targeted behavior so that they + * only get used in combat. + */ +/datum/ai_planning_subtree/targeted_mob_ability/wizard_spell + use_ability_behaviour = /datum/ai_behavior/targeted_mob_ability/wizard_spell + +/datum/ai_planning_subtree/targeted_mob_ability/wizard_spell/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if (controller.blackboard[BB_WIZARD_SPELL_COOLDOWN] > world.time) + return + return ..() + +/datum/ai_behavior/targeted_mob_ability/wizard_spell/perform(seconds_per_tick, datum/ai_controller/controller, ability_key, target_key) + . = ..() + controller.set_blackboard_key(BB_WIZARD_SPELL_COOLDOWN, world.time + WIZARD_SPELL_COOLDOWN) + +/datum/ai_planning_subtree/targeted_mob_ability/wizard_spell/primary + ability_key = BB_WIZARD_TARGETED_SPELL + +/datum/ai_planning_subtree/targeted_mob_ability/wizard_spell/secondary + ability_key = BB_WIZARD_SECONDARY_SPELL + +/datum/ai_planning_subtree/targeted_mob_ability/wizard_spell/blink + ability_key = BB_WIZARD_BLINK_SPELL + +/datum/ai_behavior/use_mob_ability/wizard_spell/perform(seconds_per_tick, datum/ai_controller/controller, ability_key) + . = ..() + controller.set_blackboard_key(BB_WIZARD_SPELL_COOLDOWN, world.time + WIZARD_SPELL_COOLDOWN) + +#undef WIZARD_SPELL_COOLDOWN diff --git a/code/modules/mob/living/basic/ruin_defender/wizard/wizard_spells.dm b/code/modules/mob/living/basic/ruin_defender/wizard/wizard_spells.dm new file mode 100644 index 000000000000..c49d87c730a5 --- /dev/null +++ b/code/modules/mob/living/basic/ruin_defender/wizard/wizard_spells.dm @@ -0,0 +1,17 @@ +// Lesser versions of wizard spells to be used by AI wizards + +/// Lesser fireball, which is slightly less "instant death" than the normal one +/datum/action/cooldown/spell/pointed/projectile/fireball/lesser + name = "Lesser Fireball" + projectile_type = /obj/projectile/magic/fireball/lesser + cooldown_time = 10 SECONDS + +/obj/projectile/magic/fireball/lesser + damage = 0 + exp_light = 1 + +/// Lesser Blink, shorter range than the normal blink spell +/datum/action/cooldown/spell/teleport/radius_turf/blink/lesser + name = "Lesser Blink" + outer_tele_radius = 3 + spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC diff --git a/code/modules/mob/living/basic/space_fauna/ant.dm b/code/modules/mob/living/basic/space_fauna/ant.dm index f38319f0d585..27aa66cb0521 100644 --- a/code/modules/mob/living/basic/space_fauna/ant.dm +++ b/code/modules/mob/living/basic/space_fauna/ant.dm @@ -45,7 +45,7 @@ /datum/ai_controller/basic_controller/ant blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm index ae039b9e2c0f..cc34f271caca 100644 --- a/code/modules/mob/living/basic/space_fauna/bear/_bear.dm +++ b/code/modules/mob/living/basic/space_fauna/bear/_bear.dm @@ -42,7 +42,7 @@ /mob/living/basic/bear/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) + add_traits(list(TRAIT_SPACEWALK, TRAIT_FENCE_CLIMBER), INNATE_TRAIT) AddElement(/datum/element/ai_retaliate) AddComponent(/datum/component/tree_climber, climbing_distance = 15) AddElement(/datum/element/swabable, CELL_LINE_TABLE_BEAR, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) diff --git a/code/modules/mob/living/basic/space_fauna/bear/bear_ai_behavior.dm b/code/modules/mob/living/basic/space_fauna/bear/bear_ai_behavior.dm index 14ab5676ead6..7ec94a9cd02d 100644 --- a/code/modules/mob/living/basic/space_fauna/bear/bear_ai_behavior.dm +++ b/code/modules/mob/living/basic/space_fauna/bear/bear_ai_behavior.dm @@ -1,6 +1,3 @@ -/datum/ai_behavior/basic_melee_attack/bear - action_cooldown = 2 SECONDS - /datum/ai_behavior/find_hunt_target/find_hive /datum/ai_behavior/find_hunt_target/find_hive/valid_dinner(mob/living/source, obj/structure/beebox/hive, radius) diff --git a/code/modules/mob/living/basic/space_fauna/bear/bear_ai_subtree.dm b/code/modules/mob/living/basic/space_fauna/bear/bear_ai_subtree.dm index 3e5d22a31afb..75746abefc80 100644 --- a/code/modules/mob/living/basic/space_fauna/bear/bear_ai_subtree.dm +++ b/code/modules/mob/living/basic/space_fauna/bear/bear_ai_subtree.dm @@ -1,6 +1,6 @@ /datum/ai_controller/basic_controller/bear blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance @@ -8,16 +8,13 @@ planning_subtrees = list( /datum/ai_planning_subtree/target_retaliate, /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/bear, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/climb_trees, /datum/ai_planning_subtree/find_and_hunt_target/find_hive, /datum/ai_planning_subtree/find_and_hunt_target/find_honeycomb, /datum/ai_planning_subtree/random_speech/bear, ) -/datum/ai_planning_subtree/basic_melee_attack_subtree/bear - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/bear - /datum/ai_planning_subtree/find_and_hunt_target/find_hive target_key = BB_FOUND_HONEY hunting_behavior = /datum/ai_behavior/hunt_target/find_hive diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp.dm b/code/modules/mob/living/basic/space_fauna/carp/carp.dm index d49fd27be6cc..b42000f27701 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp.dm @@ -32,6 +32,7 @@ attack_vis_effect = ATTACK_EFFECT_BITE attack_verb_continuous = "bites" attack_verb_simple = "bite" + melee_attack_cooldown = 1.5 SECONDS response_help_continuous = "pets" response_help_simple = "pet" response_disarm_continuous = "gently pushes aside" @@ -57,7 +58,7 @@ /datum/pet_command/idle, /datum/pet_command/free, /datum/pet_command/follow, - /datum/pet_command/point_targetting/attack/carp + /datum/pet_command/point_targeting/attack ) /// Carp want to eat raw meat var/static/list/desired_food = list(/obj/item/food/meat/slab, /obj/item/food/meat/rawcutlet) @@ -120,7 +121,7 @@ teleport = new(src) teleport.Grant(src) ai_controller.set_blackboard_key(BB_CARP_RIFT, teleport) - ai_controller.set_blackboard_key(BB_OBSTACLE_TARGETTING_WHITELIST, allowed_obstacle_targets) + ai_controller.set_blackboard_key(BB_OBSTACLE_TARGETING_WHITELIST, allowed_obstacle_targets) /mob/living/basic/carp/Destroy() @@ -129,8 +130,8 @@ /// Tell the elements and the blackboard what food we want to eat /mob/living/basic/carp/proc/setup_eating() - AddElement(/datum/element/basic_eating, 10, 0, null, desired_food) - AddElement(/datum/element/basic_eating, 0, 10, BRUTE, desired_trash) // We are killing our planet + AddElement(/datum/element/basic_eating, food_types = desired_food) + AddElement(/datum/element/basic_eating, heal_amt = 0, damage_amount = 10, damage_type = BRUTE, food_types = desired_trash) // We are killing our planet ai_controller.set_blackboard_key(BB_BASIC_FOODS, desired_food + desired_trash) /// Set a random colour on the carp, override to do something else diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_actions.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_actions.dm index c0f5143f18c2..9e767bab3af1 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_actions.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_actions.dm @@ -1,17 +1,8 @@ #define MAGICARP_SPELL_TARGET_SEEK_RANGE 4 -/datum/pet_command/point_targetting/attack/carp - attack_behaviour = /datum/ai_behavior/basic_melee_attack/carp - -/datum/pet_command/point_targetting/use_ability/magicarp +/datum/pet_command/point_targeting/use_ability/magicarp pet_ability_key = BB_MAGICARP_SPELL -/datum/ai_planning_subtree/basic_melee_attack_subtree/carp - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/carp - -/datum/ai_behavior/basic_melee_attack/carp - action_cooldown = 1.5 SECONDS - /datum/ai_planning_subtree/attack_obstacle_in_path/carp attack_behaviour = /datum/ai_behavior/attack_obstructions/carp @@ -20,40 +11,38 @@ /// As basic attack tree but interrupt if your health gets low or if your spell is off cooldown /datum/ai_planning_subtree/basic_melee_attack_subtree/magicarp - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/carp/magic + melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/magicarp /// Interrupt your attack chain if: you have a spell, it's not on cooldown, and it has a target -/datum/ai_behavior/basic_melee_attack/carp/magic +/datum/ai_behavior/basic_melee_attack/magicarp -/datum/ai_behavior/basic_melee_attack/carp/magic/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key, health_ratio_key) +/datum/ai_behavior/basic_melee_attack/magicarp/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key, health_ratio_key) var/datum/action/cooldown/using_action = controller.blackboard[BB_MAGICARP_SPELL] if (QDELETED(using_action)) return ..() - if (!controller.blackboard[BB_MAGICARP_SPELL_SPECIAL_TARGETTING] && using_action.IsAvailable()) + if (!controller.blackboard[BB_MAGICARP_SPELL_SPECIAL_TARGETING] && using_action.IsAvailable()) finish_action(controller, succeeded = FALSE) return return ..() /** * Find a target for the magicarp's spell - * This gets weird because different spells want different targetting + * This gets weird because different spells want different targeting * but I didn't want a new ai controller for every different spell */ /datum/ai_planning_subtree/find_nearest_magicarp_spell_target /datum/ai_planning_subtree/find_nearest_magicarp_spell_target/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) var/datum/action/cooldown/using_action = controller.blackboard[BB_MAGICARP_SPELL] - if (QDELETED(using_action)) - return - if (!using_action.IsAvailable()) + if (!using_action?.IsAvailable()) return - var/spell_targetting = controller.blackboard[BB_MAGICARP_SPELL_SPECIAL_TARGETTING] - if (!spell_targetting) - controller.queue_behavior(/datum/ai_behavior/find_potential_targets/nearest/magicarp, BB_MAGICARP_SPELL_TARGET, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) + var/spell_targeting = controller.blackboard[BB_MAGICARP_SPELL_SPECIAL_TARGETING] + if (!spell_targeting) + controller.queue_behavior(/datum/ai_behavior/find_potential_targets/nearest/magicarp, BB_MAGICARP_SPELL_TARGET, BB_TARGETING_STRATEGY, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION) return - switch(spell_targetting) + switch(spell_targeting) if (MAGICARP_SPELL_CORPSES) controller.queue_behavior(/datum/ai_behavior/find_and_set/friendly_corpses, BB_MAGICARP_SPELL_TARGET, MAGICARP_SPELL_TARGET_SEEK_RANGE) return diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_rift_actions.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_rift_actions.dm index 88a9f6706f2e..fc6997896b0d 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp_ai_rift_actions.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp_ai_rift_actions.dm @@ -12,9 +12,10 @@ if (!rift_behaviour) CRASH("Forgot to specify rift behaviour for [src]") - var/mob/living/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if (!controller.blackboard_key_exists(BB_BASIC_MOB_CURRENT_TARGET)) + return var/datum/action/cooldown/using_action = controller.blackboard[BB_CARP_RIFT] - if (QDELETED(target) || QDELETED(using_action) || !using_action.IsAvailable()) + if (!using_action?.IsAvailable()) return controller.queue_behavior(rift_behaviour, BB_CARP_RIFT, BB_BASIC_MOB_CURRENT_TARGET) @@ -30,7 +31,7 @@ finish_planning = TRUE /datum/ai_planning_subtree/make_carp_rift/panic_teleport/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - if (!controller.blackboard[BB_BASIC_MOB_FLEEING]) + if (controller.blackboard[BB_BASIC_MOB_STOP_FLEEING]) return return ..() diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm index 75c915c16a11..0befb20987c0 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm @@ -9,8 +9,9 @@ */ /datum/ai_controller/basic_controller/carp blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items(), - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends() + BB_BASIC_MOB_STOP_FLEEING = TRUE, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, ) ai_movement = /datum/ai_movement/basic_avoidance @@ -25,7 +26,7 @@ /datum/ai_planning_subtree/attack_obstacle_in_path/carp, /datum/ai_planning_subtree/shortcut_to_target_through_carp_rift, /datum/ai_planning_subtree/make_carp_rift/aggressive_teleport, - /datum/ai_planning_subtree/basic_melee_attack_subtree/carp, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/carp_migration, ) @@ -35,8 +36,9 @@ */ /datum/ai_controller/basic_controller/carp/pet blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction(), - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends() + BB_BASIC_MOB_STOP_FLEEING = TRUE, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, ) ai_traits = STOP_MOVING_WHEN_PULLED planning_subtrees = list( @@ -48,7 +50,7 @@ /datum/ai_planning_subtree/attack_obstacle_in_path/carp, /datum/ai_planning_subtree/shortcut_to_target_through_carp_rift, /datum/ai_planning_subtree/make_carp_rift/aggressive_teleport, - /datum/ai_planning_subtree/basic_melee_attack_subtree/carp, + /datum/ai_planning_subtree/basic_melee_attack_subtree, ) /** @@ -71,3 +73,27 @@ /datum/ai_planning_subtree/basic_melee_attack_subtree/magicarp, /datum/ai_planning_subtree/carp_migration, ) + +/** + * Carp which bites back, but doesn't look for targets and doesnt do as much damage + * Still migrate and stuff + */ +/datum/ai_controller/basic_controller/carp/passive + blackboard = list( + BB_BASIC_MOB_STOP_FLEEING = TRUE, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, + ) + ai_traits = STOP_MOVING_WHEN_PULLED + planning_subtrees = list( + /datum/ai_planning_subtree/pet_planning, + /datum/ai_planning_subtree/simple_find_nearest_target_to_flee, + /datum/ai_planning_subtree/make_carp_rift/panic_teleport, + /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/find_food, + /datum/ai_planning_subtree/attack_obstacle_in_path/carp, + /datum/ai_planning_subtree/shortcut_to_target_through_carp_rift, + /datum/ai_planning_subtree/make_carp_rift/aggressive_teleport, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/carp_migration, + ) diff --git a/code/modules/mob/living/basic/space_fauna/carp/magicarp.dm b/code/modules/mob/living/basic/space_fauna/carp/magicarp.dm index 5051335a5571..65d16cfb490d 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/magicarp.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/magicarp.dm @@ -56,8 +56,8 @@ GLOBAL_LIST_INIT(magicarp_spell_colours, list( /datum/pet_command/idle, /datum/pet_command/free, /datum/pet_command/follow, - /datum/pet_command/point_targetting/attack/carp, - /datum/pet_command/point_targetting/use_ability/magicarp, + /datum/pet_command/point_targeting/attack, + /datum/pet_command/point_targeting/use_ability/magicarp, ) /// List of all projectiles we can fire. /// Non-static, because subtypes can have their own lists. @@ -91,15 +91,15 @@ GLOBAL_LIST_INIT(magicarp_spell_colours, list( ai_controller.set_blackboard_key(BB_MAGICARP_SPELL, spell) assign_spell_ai(spell_type) -/// If you have certain spells, use a different targetting datum +/// If you have certain spells, use a different targeting strategy /mob/living/basic/carp/magic/proc/assign_spell_ai(spell_type) - var/static/list/spell_special_targetting = list( + var/static/list/spell_special_targeting = list( /obj/projectile/magic/animate = MAGICARP_SPELL_OBJECTS, /obj/projectile/magic/door = MAGICARP_SPELL_WALLS, /obj/projectile/magic/resurrection = MAGICARP_SPELL_CORPSES, ) - ai_controller.set_blackboard_key(BB_MAGICARP_SPELL_SPECIAL_TARGETTING, spell_special_targetting[spell_type]) + ai_controller.set_blackboard_key(BB_MAGICARP_SPELL_SPECIAL_TARGETING, spell_special_targeting[spell_type]) /// Shoot when you click away from you /mob/living/basic/carp/magic/RangedAttack(atom/atom_target, modifiers) diff --git a/code/modules/mob/living/basic/space_fauna/cat_surgeon.dm b/code/modules/mob/living/basic/space_fauna/cat_surgeon.dm index c896ad3152f9..b764404bd052 100644 --- a/code/modules/mob/living/basic/space_fauna/cat_surgeon.dm +++ b/code/modules/mob/living/basic/space_fauna/cat_surgeon.dm @@ -65,7 +65,7 @@ /datum/ai_controller/basic_controller/cat_butcherer blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm index d20873f0ce94..29ea1dfc352e 100644 --- a/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm +++ b/code/modules/mob/living/basic/space_fauna/eyeball/eyeball_ai_subtree.dm @@ -1,6 +1,6 @@ /datum/ai_controller/basic_controller/eyeball blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/eyeball, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/eyeball, BB_EYE_DAMAGE_THRESHOLD = 10, ) @@ -17,16 +17,12 @@ /datum/ai_planning_subtree/heal_the_blind /datum/ai_planning_subtree/heal_the_blind/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) - var/mob/living/carbon/target = controller.blackboard[BB_BLIND_TARGET] + if(controller.blackboard_key_exists(BB_BLIND_TARGET)) + controller.queue_behavior(/datum/ai_behavior/heal_eye_damage, BB_BLIND_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_the_blind, BB_BLIND_TARGET, BB_EYE_DAMAGE_THRESHOLD) - if(QDELETED(target)) - controller.queue_behavior(/datum/ai_behavior/find_the_blind, BB_BLIND_TARGET, BB_EYE_DAMAGE_THRESHOLD) - return - - controller.queue_behavior(/datum/ai_behavior/heal_eye_damage, BB_BLIND_TARGET) - return SUBTREE_RETURN_FINISH_PLANNING - -/datum/targetting_datum/basic/eyeball/can_attack(mob/living/owner, atom/target) +/datum/targeting_strategy/basic/eyeball/can_attack(mob/living/owner, atom/target, vision_range) . = ..() if(!.) return FALSE diff --git a/code/modules/mob/living/basic/space_fauna/faithless.dm b/code/modules/mob/living/basic/space_fauna/faithless.dm index b279856412c3..39f5652d1a0a 100644 --- a/code/modules/mob/living/basic/space_fauna/faithless.dm +++ b/code/modules/mob/living/basic/space_fauna/faithless.dm @@ -18,6 +18,7 @@ attack_verb_continuous = "grips" attack_verb_simple = "grip" attack_sound = 'sound/hallucinations/growl1.ogg' + melee_attack_cooldown = 1 SECONDS speak_emote = list("growls") unsuitable_atmos_damage = 0 @@ -29,15 +30,33 @@ ai_controller = /datum/ai_controller/basic_controller/faithless + /// What are the odds we paralyze a target on attack + var/paralyze_chance = 12 + /// How long do we paralyze a target for if we attack them + var/paralyze_duration = 2 SECONDS + /mob/living/basic/faithless/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) + AddElement(/datum/element/door_pryer) AddElement(/datum/element/footstep, FOOTSTEP_MOB_SHOE) - AddComponent(/datum/component/pry_open_door) + AddElement(/datum/element/mob_grabber, steal_from_others = FALSE) + +/mob/living/basic/faithless/melee_attack(atom/target, list/modifiers, ignore_cooldown) + . = ..() + if (!. || !isliving(target)) + return + + var/mob/living/living_target = target + if (prob(paralyze_chance)) + living_target.Paralyze(paralyze_duration) + living_target.visible_message(span_danger("\The [src] knocks \the [target] down!"), \ + span_userdanger("\The [src] knocks you down!")) /datum/ai_controller/basic_controller/faithless blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/faithless(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGET_MINIMUM_STAT = UNCONSCIOUS, BB_LOW_PRIORITY_HUNTING_TARGET = null, // lights ) @@ -47,37 +66,7 @@ /datum/ai_planning_subtree/simple_find_target, /datum/ai_planning_subtree/attack_obstacle_in_path, /datum/ai_planning_subtree/attack_obstacle_in_path/low_priority_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/faithless, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/find_and_hunt_target/look_for_light_fixtures, /datum/ai_planning_subtree/random_speech/faithless, ) - -/datum/targetting_datum/basic/faithless - stat_attack = UNCONSCIOUS - -/datum/ai_planning_subtree/basic_melee_attack_subtree/faithless - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/faithless - -/datum/ai_behavior/basic_melee_attack/faithless - action_cooldown = 1 SECONDS - /// What are the odds we paralyze a target - var/paralyze_chance = 12 - /// How long do we paralyze a target for if we attack them - var/paralyze_duration = 2 SECONDS - -/datum/ai_behavior/basic_melee_attack/faithless/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key) - . = ..() - var/atom/target = controller.blackboard[target_key] - var/mob/living/living_pawn = controller.pawn - - if(!isliving(target)) - return - var/mob/living/living_target = target - if(living_target.pulledby != living_pawn && !HAS_AI_CONTROLLER_TYPE(living_target.pulledby, /datum/ai_controller/basic_controller/faithless)) //Dont steal from my fellow faithless. - if(living_pawn.Adjacent(living_target) && isturf(living_target.loc) && living_target.stat == SOFT_CRIT) - living_target.grabbedby(living_pawn) //Drag their bodies around as a menace. - if(prob(paralyze_chance) && iscarbon(target)) - var/mob/living/carbon/carbon_target = target - carbon_target.Paralyze(paralyze_duration) - carbon_target.visible_message(span_danger("\The [living_pawn] knocks down \the [carbon_target]!"), \ - span_userdanger("\The [living_pawn] knocks you down!")) diff --git a/code/modules/mob/living/basic/space_fauna/garden_gnome.dm b/code/modules/mob/living/basic/space_fauna/garden_gnome.dm index 034bf0deb0fa..337a9f661f23 100644 --- a/code/modules/mob/living/basic/space_fauna/garden_gnome.dm +++ b/code/modules/mob/living/basic/space_fauna/garden_gnome.dm @@ -17,6 +17,7 @@ attack_verb_continuous = "punches" attack_verb_simple = "punch" attack_sound = 'sound/weapons/punch1.ogg' + melee_attack_cooldown = 1.2 SECONDS damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) speak_emote = list("announces") @@ -124,7 +125,7 @@ /datum/ai_controller/basic_controller/garden_gnome blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance @@ -132,12 +133,6 @@ planning_subtrees = list( /datum/ai_planning_subtree/target_retaliate, /datum/ai_planning_subtree/attack_obstacle_in_path, - /datum/ai_planning_subtree/basic_melee_attack_subtree/garden_gnome, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/random_speech/garden_gnome, ) - -/datum/ai_planning_subtree/basic_melee_attack_subtree/garden_gnome - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/garden_gnome - -/datum/ai_behavior/basic_melee_attack/garden_gnome - action_cooldown = 1.2 SECONDS diff --git a/code/modules/mob/living/basic/space_fauna/ghost.dm b/code/modules/mob/living/basic/space_fauna/ghost.dm index d53f5c9fb157..b7230710e573 100644 --- a/code/modules/mob/living/basic/space_fauna/ghost.dm +++ b/code/modules/mob/living/basic/space_fauna/ghost.dm @@ -91,7 +91,7 @@ /datum/ai_controller/basic_controller/ghost blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm index 4cdaba09759e..28cffa4ed8e3 100644 --- a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm +++ b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_behavior.dm @@ -64,6 +64,8 @@ /datum/ai_behavior/basic_ranged_attack/hivebot action_cooldown = 3 SECONDS + avoid_friendly_fire = TRUE /datum/ai_behavior/basic_ranged_attack/hivebot_rapid action_cooldown = 1.5 SECONDS + avoid_friendly_fire = TRUE diff --git a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_subtree.dm b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_subtree.dm index c5173e3d7f99..067b0a03c13c 100644 --- a/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_subtree.dm +++ b/code/modules/mob/living/basic/space_fauna/hivebot/hivebot_subtree.dm @@ -1,6 +1,6 @@ /datum/ai_controller/basic_controller/hivebot blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance @@ -32,7 +32,7 @@ /datum/ai_controller/basic_controller/hivebot/ranged/rapid planning_subtrees = list( /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_ranged_attack_subtree, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/hivebot_rapid, /datum/ai_planning_subtree/attack_obstacle_in_path, /datum/ai_planning_subtree/hive_communicate, ) @@ -54,14 +54,10 @@ if(!SPT_PROB(relay_chance, seconds_per_tick)) return - var/mob/hive_target = controller.blackboard[BB_HIVE_PARTNER] - - if(QDELETED(hive_target)) - controller.queue_behavior(/datum/ai_behavior/find_and_set/hive_partner, BB_HIVE_PARTNER, /mob/living/basic/hivebot) - return - - controller.queue_behavior(/datum/ai_behavior/relay_message, BB_HIVE_PARTNER) - return SUBTREE_RETURN_FINISH_PLANNING + if (controller.blackboard_key_exists(BB_HIVE_PARTNER)) + controller.queue_behavior(/datum/ai_behavior/relay_message, BB_HIVE_PARTNER) + return SUBTREE_RETURN_FINISH_PLANNING + controller.queue_behavior(/datum/ai_behavior/find_and_set/hive_partner, BB_HIVE_PARTNER, /mob/living/basic/hivebot) /datum/ai_planning_subtree/find_and_hunt_target/repair_machines target_key = BB_MACHINE_TARGET diff --git a/code/modules/mob/living/basic/space_fauna/killer_tomato.dm b/code/modules/mob/living/basic/space_fauna/killer_tomato.dm index a3fd64eb7986..c859289b56d7 100644 --- a/code/modules/mob/living/basic/space_fauna/killer_tomato.dm +++ b/code/modules/mob/living/basic/space_fauna/killer_tomato.dm @@ -42,7 +42,7 @@ /datum/ai_controller/basic_controller/killer_tomato blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/space_fauna/lightgeist.dm b/code/modules/mob/living/basic/space_fauna/lightgeist.dm index f75a9d90a507..7fa070ea8a76 100644 --- a/code/modules/mob/living/basic/space_fauna/lightgeist.dm +++ b/code/modules/mob/living/basic/space_fauna/lightgeist.dm @@ -21,6 +21,7 @@ health = 2 melee_damage_lower = 5 melee_damage_upper = 5 + melee_attack_cooldown = 5 SECONDS friendly_verb_continuous = "taps" friendly_verb_simple = "tap" density = FALSE @@ -65,10 +66,10 @@ complete_text = "%TARGET%'s wounds mend together.",\ ) -/mob/living/basic/lightgeist/melee_attack(atom/target, list/modifiers) - if (isliving(target)) +/mob/living/basic/lightgeist/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) + . = ..() + if (. && isliving(target)) faction |= REF(target) // Anyone we heal will treat us as a friend - return ..() /mob/living/basic/lightgeist/ghost() . = ..() @@ -77,7 +78,7 @@ /datum/ai_controller/basic_controller/lightgeist blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/lightgeist, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/lightgeist, ) ai_traits = STOP_MOVING_WHEN_PULLED @@ -86,17 +87,17 @@ planning_subtrees = list( /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/lightgeist, // We heal things by attacking them + /datum/ai_planning_subtree/basic_melee_attack_subtree, // We heal things by attacking them ) /// Attack only mobs who have damage that we can heal, I think this is specific enough not to be a generic type -/datum/targetting_datum/lightgeist +/datum/targeting_strategy/lightgeist /// Types of mobs we can heal, not in a blackboard key because there is no point changing this at runtime because the component will already exist var/heal_biotypes = MOB_ORGANIC | MOB_MINERAL /// Type of limb we can heal var/required_bodytype = BODYTYPE_ORGANIC -/datum/targetting_datum/lightgeist/can_attack(mob/living/living_mob, mob/living/target) +/datum/targeting_strategy/lightgeist/can_attack(mob/living/living_mob, mob/living/target, vision_range) if (!isliving(target) || target.stat == DEAD) return FALSE if (!(heal_biotypes & target.mob_biotypes)) @@ -111,9 +112,3 @@ continue return TRUE return FALSE - -/datum/ai_planning_subtree/basic_melee_attack_subtree/lightgeist - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/lightgeist - -/datum/ai_behavior/basic_melee_attack/lightgeist - action_cooldown = 5 SECONDS diff --git a/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart_ai.dm b/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart_ai.dm index 7684011bd667..09659956c581 100644 --- a/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart_ai.dm +++ b/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_heart_ai.dm @@ -1,7 +1,7 @@ /// A spellcasting AI which does not move /datum/ai_controller/basic_controller/meteor_heart blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_TARGETLESS_TIME = 0, ) diff --git a/code/modules/mob/living/basic/space_fauna/morph.dm b/code/modules/mob/living/basic/space_fauna/morph.dm index 342a06fb5f11..0c6b3a942837 100644 --- a/code/modules/mob/living/basic/space_fauna/morph.dm +++ b/code/modules/mob/living/basic/space_fauna/morph.dm @@ -199,7 +199,7 @@ /// Only real human-powered intelligence is capable of playing prop hunt in SS13 (until further notice). /datum/ai_controller/basic_controller/morph blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/space_fauna/mushroom.dm b/code/modules/mob/living/basic/space_fauna/mushroom.dm index 2ddf8df16c56..ed6741bd082c 100644 --- a/code/modules/mob/living/basic/space_fauna/mushroom.dm +++ b/code/modules/mob/living/basic/space_fauna/mushroom.dm @@ -57,31 +57,24 @@ /datum/ai_controller/basic_controller/mushroom blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/mushroom, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/mushroom, + BB_TARGET_MINIMUM_STAT = DEAD, ) ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_random_walk planning_subtrees = list( /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/mushroom, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/find_and_hunt_target/mushroom_food, ) -/datum/targetting_datum/basic/mushroom - stat_attack = DEAD +/datum/targeting_strategy/basic/mushroom ///we only attacked another mushrooms -/datum/targetting_datum/basic/mushroom/faction_check(mob/living/living_mob, mob/living/the_target) - return !living_mob.faction_check_mob(the_target, exact_match = check_factions_exactly) - - -/datum/ai_planning_subtree/basic_melee_attack_subtree/mushroom - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/mushroom - -/datum/ai_behavior/basic_melee_attack/mushroom - action_cooldown = 2 SECONDS +/datum/targeting_strategy/basic/mushroom/faction_check(datum/ai_controller/controller, mob/living/living_mob, mob/living/the_target) + return !living_mob.faction_check_atom(the_target, exact_match = check_factions_exactly) /datum/ai_planning_subtree/find_and_hunt_target/mushroom_food target_key = BB_LOW_PRIORITY_HUNTING_TARGET diff --git a/code/modules/mob/living/basic/space_fauna/netherworld/blankbody.dm b/code/modules/mob/living/basic/space_fauna/netherworld/blankbody.dm index 35d597e53ca9..d49932fb7046 100644 --- a/code/modules/mob/living/basic/space_fauna/netherworld/blankbody.dm +++ b/code/modules/mob/living/basic/space_fauna/netherworld/blankbody.dm @@ -14,6 +14,7 @@ attack_verb_simple = "punch" attack_sound = 'sound/weapons/bladeslice.ogg' attack_vis_effect = ATTACK_EFFECT_SLASH + melee_attack_cooldown = 1 SECONDS faction = list(FACTION_NETHER) speak_emote = list("screams") death_message = "falls apart into a fine dust." @@ -25,22 +26,9 @@ lighting_cutoff_green = 15 lighting_cutoff_blue = 40 - ai_controller = /datum/ai_controller/basic_controller/blankbody + ai_controller = /datum/ai_controller/basic_controller/simple_hostile_obstacles /mob/living/basic/blankbody/Initialize(mapload) . = ..() AddElement(/datum/element/swabable, CELL_LINE_TABLE_NETHER, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 0) AddComponent(/datum/component/health_scaling_effects, min_health_attack_modifier_lower = 8, min_health_attack_modifier_upper = 14) - -/datum/ai_controller/basic_controller/blankbody - blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), - ) - - ai_movement = /datum/ai_movement/basic_avoidance - idle_behavior = /datum/idle_behavior/idle_random_walk - planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/attack_obstacle_in_path, - /datum/ai_planning_subtree/basic_melee_attack_subtree/average_speed, - ) diff --git a/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm b/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm index 5fabbf2afb2e..cdde6ad05e4c 100644 --- a/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm +++ b/code/modules/mob/living/basic/space_fauna/netherworld/creature.dm @@ -15,6 +15,7 @@ gold_core_spawnable = HOSTILE_SPAWN attack_sound = 'sound/weapons/bite.ogg' attack_vis_effect = ATTACK_EFFECT_BITE + melee_attack_cooldown = 1 SECONDS faction = list(FACTION_NETHER) speak_emote = list("screams") death_message = "gets his head split open." @@ -26,7 +27,7 @@ lighting_cutoff_green = 25 lighting_cutoff_blue = 15 - ai_controller = /datum/ai_controller/basic_controller/creature + ai_controller = /datum/ai_controller/basic_controller/simple_hostile_obstacles /mob/living/basic/creature/Initialize(mapload) . = ..() @@ -100,16 +101,3 @@ exit_jaunt(cast_on) return enter_jaunt(cast_on) - -/datum/ai_controller/basic_controller/creature - blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), - ) - - ai_movement = /datum/ai_movement/basic_avoidance - idle_behavior = /datum/idle_behavior/idle_random_walk - planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/attack_obstacle_in_path, - /datum/ai_planning_subtree/basic_melee_attack_subtree/average_speed, - ) diff --git a/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm b/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm index 57d90da264ab..3f445ea1261b 100644 --- a/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm +++ b/code/modules/mob/living/basic/space_fauna/netherworld/migo.dm @@ -12,6 +12,7 @@ speed = 1 attack_verb_continuous = "lacerates" attack_verb_simple = "lacerate" + melee_attack_cooldown = 1 SECONDS gold_core_spawnable = HOSTILE_SPAWN attack_sound = 'sound/weapons/bladeslice.ogg' attack_vis_effect = ATTACK_EFFECT_SLASH @@ -27,7 +28,7 @@ lighting_cutoff_green = 15 lighting_cutoff_blue = 50 - ai_controller = /datum/ai_controller/basic_controller/migo + ai_controller = /datum/ai_controller/basic_controller/simple_hostile_obstacles var/static/list/migo_sounds /// Odds migo will dodge var/dodge_prob = 10 @@ -70,16 +71,3 @@ . = Move(get_step(loc,pick(cdir, ccdir))) if(!.)//Can't dodge there so we just carry on . = Move(moving_to, move_direction) - -/datum/ai_controller/basic_controller/migo - blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), - ) - - ai_movement = /datum/ai_movement/basic_avoidance - idle_behavior = /datum/idle_behavior/idle_random_walk - planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/attack_obstacle_in_path, - /datum/ai_planning_subtree/basic_melee_attack_subtree/average_speed, - ) diff --git a/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_wizard.dm b/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_wizard.dm index b99692bea9e7..972293103127 100644 --- a/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_wizard.dm +++ b/code/modules/mob/living/basic/space_fauna/paper_wizard/paper_wizard.dm @@ -53,7 +53,7 @@ /datum/ai_controller/basic_controller/paper_wizard blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_WRITING_LIST = list( "I can turn the paper into gold and ink into diamonds!", "Your fate is written and sealed!", @@ -110,8 +110,7 @@ faction = list(FACTION_STICKMAN) melee_damage_lower = 1 melee_damage_upper = 5 - - ai_controller = /datum/ai_controller/basic_controller/wizard_copy + ai_controller = /datum/ai_controller/basic_controller/simple_hostile /mob/living/basic/paper_wizard/copy/Initialize(mapload) . = ..() @@ -141,18 +140,6 @@ new /obj/effect/temp_visual/small_smoke/halfsecond(get_turf(src)) qdel(src) //I see through your ruse! -/datum/ai_controller/basic_controller/wizard_copy - blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - ) - - ai_movement = /datum/ai_movement/basic_avoidance - idle_behavior = /datum/idle_behavior/idle_random_walk - planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree, - ) - //fancy effects /obj/effect/temp_visual/paper_scatter name = "scattering paper" diff --git a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm index 98ddfdf9ca35..36d22d2637af 100644 --- a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm +++ b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat.dm @@ -53,6 +53,7 @@ AddElement(/datum/element/waddling) AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/door_pryer, pry_time = 5 SECONDS, interaction_key = REGALRAT_INTERACTION) AddComponent(\ /datum/component/ghost_direct_control,\ poll_candidates = poll_ghosts,\ @@ -80,7 +81,7 @@ return if(ismouse(user)) - if(user.faction_check_mob(src, exact_match = TRUE)) + if(user.faction_check_atom(src, exact_match = TRUE)) . += span_notice("This is your king. Long live [p_their()] majesty!") else . += span_warning("This is a false king! Strike [p_them()] down!") @@ -173,10 +174,6 @@ if(isnull(mind)) return - if(istype(target, /obj/machinery/door/airlock)) - INVOKE_ASYNC(src, PROC_REF(pry_door), target) - return COMPONENT_HOSTILE_NO_ATTACK - if(!(istate &ISTATE_HARM)) INVOKE_ASYNC(src, PROC_REF(poison_target), target) return COMPONENT_HOSTILE_NO_ATTACK @@ -194,7 +191,7 @@ balloon_alert(src, "already dead!") return FALSE - if(living_target.faction_check_mob(src, exact_match = TRUE)) + if(living_target.faction_check_atom(src, exact_match = TRUE)) balloon_alert(src, "one of your soldiers!") return FALSE @@ -234,43 +231,7 @@ heal_bodypart_damage(amount) qdel(target) -/** - * Allows rat king to pry open an airlock if it isn't locked. - * - * A proc used for letting the rat king pry open airlocks instead of just attacking them. - * This allows the rat king to traverse the station when there is a lack of vents or - * accessible doors, something which is common in certain rat king spawn points. - * - * Returns TRUE if the door opens, FALSE otherwise. - */ -/mob/living/basic/regal_rat/proc/pry_door(target) - if(DOING_INTERACTION(src, REGALRAT_INTERACTION)) - return FALSE - - var/obj/machinery/door/airlock/prying_door = target - if(!prying_door.density || prying_door.locked || prying_door.welded || prying_door.seal) - return FALSE - - visible_message( - span_warning("[src] begins prying open the airlock..."), - span_notice("You begin digging your claws into the airlock..."), - span_warning("You hear groaning metal..."), - ) - var/time_to_open = 0.5 SECONDS - - if(prying_door.hasPower()) - time_to_open = 5 SECONDS - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, vary = TRUE) - - if(!do_after(src, time_to_open, prying_door, interaction_key = REGALRAT_INTERACTION)) - return FALSE - - if(!prying_door.open(BYPASS_DOOR_CHECKS)) - balloon_alert(src, "failed to open!") - return FALSE - - return TRUE - +/// Regal rat subtype which can be possessed by ghosts /mob/living/basic/regal_rat/controlled poll_ghosts = TRUE diff --git a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm index 14f6f7fde3b2..0f90a8b2ed02 100644 --- a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm +++ b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_actions.dm @@ -53,15 +53,17 @@ var/static/list/mouse_commands = list( /datum/pet_command/idle, /datum/pet_command/free, + /datum/pet_command/protect_owner, /datum/pet_command/follow, - /datum/pet_command/point_targetting/attack/mouse + /datum/pet_command/point_targeting/attack/mouse ) /// Commands you can give to glockroaches var/static/list/glockroach_commands = list( /datum/pet_command/idle, /datum/pet_command/free, + /datum/pet_command/protect_owner/glockroach, /datum/pet_command/follow, - /datum/pet_command/point_targetting/attack/glockroach + /datum/pet_command/point_targeting/attack/glockroach ) /datum/action/cooldown/mob_cooldown/riot/Activate(atom/target) @@ -158,6 +160,7 @@ nearby_roach.melee_damage_upper += 4 nearby_roach.obj_damage += 5 nearby_roach.ai_controller = new /datum/ai_controller/basic_controller/cockroach/sewer(nearby_roach) + nearby_roach.melee_attack_cooldown = 0.8 SECONDS nearby_roach.icon_state += "_sewer" nearby_roach.maxHealth += 1 @@ -189,7 +192,7 @@ return TRUE // Command you can give to a mouse to make it kill someone -/datum/pet_command/point_targetting/attack/mouse +/datum/pet_command/point_targeting/attack/mouse speech_commands = list("attack", "sic", "kill", "cheese em") command_feedback = "squeak!" // Frogs and roaches can squeak too it's fine pointed_reaction = "and squeaks aggressively" @@ -197,7 +200,7 @@ attack_behaviour = /datum/ai_behavior/basic_melee_attack // Command you can give to a mouse to make it kill someone -/datum/pet_command/point_targetting/attack/glockroach +/datum/pet_command/point_targeting/attack/glockroach speech_commands = list("attack", "sic", "kill", "cheese em") command_feedback = "squeak!" pointed_reaction = "and cocks its gun" @@ -242,3 +245,6 @@ else if(prob(5)) C.vomit() return ..() + +/datum/pet_command/protect_owner/glockroach + protect_behavior = /datum/ai_behavior/basic_ranged_attack/glockroach diff --git a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_ai.dm b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_ai.dm index 2a1db00b0e46..073029bef3c2 100644 --- a/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_ai.dm +++ b/code/modules/mob/living/basic/space_fauna/regal_rat/regal_rat_ai.dm @@ -1,8 +1,7 @@ /datum/ai_controller/basic_controller/regal_rat blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_BASIC_MOB_FLEEING = FALSE, - BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance @@ -13,7 +12,7 @@ planning_subtrees = list( /datum/ai_planning_subtree/target_retaliate/to_flee, /datum/ai_planning_subtree/targeted_mob_ability/riot, - /datum/ai_planning_subtree/flee_target, + /datum/ai_planning_subtree/flee_target/from_flee_key, /datum/ai_planning_subtree/attack_obstacle_in_path, /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/use_mob_ability/domain, @@ -22,6 +21,7 @@ /datum/ai_planning_subtree/targeted_mob_ability/riot target_key = BB_BASIC_MOB_FLEE_TARGET // we only want to trigger this when provoked, manpower is low nowadays ability_key = BB_RAISE_HORDE_ABILITY + finish_planning = FALSE /datum/ai_planning_subtree/use_mob_ability/domain ability_key = BB_DOMAIN_ABILITY diff --git a/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm b/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm new file mode 100644 index 000000000000..b3c6935c92ef --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/revenant/_revenant.dm @@ -0,0 +1,444 @@ +/// Source for a trait we get when we're stunned +#define REVENANT_STUNNED_TRAIT "revenant_got_stunned" + +/// Revenants: "Ghosts" that are invisible and move like ghosts, cannot take damage while invisible +/// Can hear deadchat, but are NOT normal ghosts and do NOT have x-ray vision +/// Admin-spawn or random event +/mob/living/basic/revenant + name = "revenant" + desc = "A malevolent spirit." + icon = 'icons/mob/simple/mob.dmi' + icon_state = "revenant_idle" + mob_biotypes = MOB_SPIRIT + incorporeal_move = INCORPOREAL_MOVE_JAUNT + invisibility = INVISIBILITY_REVENANT + health = INFINITY //Revenants don't use health, they use essence instead + maxHealth = INFINITY + plane = GHOST_PLANE + sight = SEE_SELF + throwforce = 0 + + // Going for faint purple spoopy ghost + lighting_cutoff_red = 20 + lighting_cutoff_green = 15 + lighting_cutoff_blue = 35 + + friendly_verb_continuous = "touches" + friendly_verb_simple = "touch" + response_help_continuous = "passes through" + response_help_simple = "pass through" + response_disarm_continuous = "swings through" + response_disarm_simple = "swing through" + response_harm_continuous = "punches through" + response_harm_simple = "punch through" + unsuitable_atmos_damage = 0 + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) //I don't know how you'd apply those, but revenants no-sell them anyway. + habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minimum_survivable_temperature = 0 + maximum_survivable_temperature = INFINITY + + status_flags = NONE + density = FALSE + move_resist = MOVE_FORCE_OVERPOWERING + mob_size = MOB_SIZE_TINY + pass_flags = PASSTABLE | PASSGRILLE | PASSMOB + speed = 1 + unique_name = TRUE + hud_possible = list(ANTAG_HUD) + hud_type = /datum/hud/revenant + + /// The icon we use while just floating around. + var/icon_idle = "revenant_idle" + /// The icon we use while in a revealed state. + var/icon_reveal = "revenant_revealed" + /// The icon we use when stunned (temporarily frozen) + var/icon_stun = "revenant_stun" + /// The icon we use while draining someone. + var/icon_drain = "revenant_draining" + + /// Are we currently dormant (ectoplasm'd)? + var/dormant = FALSE + /// Are we currently draining someone? + var/draining = FALSE + /// Have we already given this revenant abilities? + var/generated_objectives_and_spells = FALSE + + /// Lazylist of drained mobs to ensure that we don't steal a soul from someone twice + var/list/drained_mobs = null + /// List of action ability datums to grant on Initialize. Keep in mind that anything with the `/aoe/revenant` subtype starts locked by default. + var/static/list/datum/action/abilities = list( + /datum/action/cooldown/spell/aoe/revenant/blight, + /datum/action/cooldown/spell/aoe/revenant/defile, + /datum/action/cooldown/spell/aoe/revenant/haunt_object, + /datum/action/cooldown/spell/aoe/revenant/malfunction, + /datum/action/cooldown/spell/aoe/revenant/overload, + /datum/action/cooldown/spell/list_target/telepathy/revenant, + ) + + /// The resource, and health, of revenants. + var/essence = 75 + /// The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount. + var/max_essence = 75 + /// If the revenant regenerates essence or not + var/essence_regenerating = TRUE + /// How much essence regenerates per second + var/essence_regen_amount = 2.5 + /// How much essence the revenant has stolen + var/essence_accumulated = 0 + /// How much stolen essence is available for unlocks + var/essence_excess = 0 + /// How long the revenant is revealed for, is about 2 seconds times this var. + var/unreveal_time = 0 + /// How many perfect, regen-cap increasing souls the revenant has. //TODO, add objective for getting a perfect soul(s?) + var/perfectsouls = 0 + +/mob/living/basic/revenant/Initialize(mapload) + . = ..() + AddElement(/datum/element/simple_flying) + add_traits(list(TRAIT_SPACEWALK, TRAIT_SIXTHSENSE, TRAIT_FREE_HYPERSPACE_MOVEMENT), INNATE_TRAIT) + + for(var/ability in abilities) + var/datum/action/spell = new ability(src) + spell.Grant(src) + + RegisterSignal(src, COMSIG_LIVING_BANED, PROC_REF(on_baned)) + RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move)) + RegisterSignal(src, COMSIG_LIVING_LIFE, PROC_REF(on_life)) + set_random_revenant_name() + + GLOB.revenant_relay_mobs |= src + +/mob/living/basic/revenant/Destroy() + GLOB.revenant_relay_mobs -= src + return ..() + +/mob/living/basic/revenant/Login() + . = ..() + if(!. || isnull(client)) + return FALSE + + var/static/cached_string = null + if(isnull(cached_string)) + cached_string = examine_block(jointext(create_login_string(), "\n")) + + to_chat(src, cached_string, type = MESSAGE_TYPE_INFO) + + if(generated_objectives_and_spells) + return TRUE + + generated_objectives_and_spells = TRUE + mind.set_assigned_role(SSjob.GetJobType(/datum/job/revenant)) + mind.special_role = ROLE_REVENANT + SEND_SOUND(src, sound('sound/effects/ghost.ogg')) + mind.add_antag_datum(/datum/antagonist/revenant) + return TRUE + +/// Signal Handler Injection to handle Life() stuff for revenants +/mob/living/basic/revenant/proc/on_life(seconds_per_tick = SSMOBS_DT, times_fired) + SIGNAL_HANDLER + + if(dormant) + return COMPONENT_LIVING_CANCEL_LIFE_PROCESSING + + if(HAS_TRAIT(src, TRAIT_REVENANT_REVEALED) && essence <= 0) + death() + return COMPONENT_LIVING_CANCEL_LIFE_PROCESSING + + if(essence_regenerating && !HAS_TRAIT(src, TRAIT_REVENANT_INHIBITED) && essence < max_essence) //While inhibited, essence will not regenerate + var/change_in_time = DELTA_WORLD_TIME(SSmobs) + essence = min(essence + (essence_regen_amount * change_in_time), max_essence) + update_mob_action_buttons() //because we update something required by our spells in life, we need to update our buttons + + update_appearance(UPDATE_ICON) + update_health_hud() + +/mob/living/basic/revenant/get_status_tab_items() + . = ..() + . += "Current Essence: [essence >= max_essence ? essence : "[essence] / [max_essence]"] E" + . += "Total Essence Stolen: [essence_accumulated] SE" + . += "Unused Stolen Essence: [essence_excess] SE" + . += "Perfect Souls Stolen: [perfectsouls]" + +/mob/living/basic/revenant/update_health_hud() + if(isnull(hud_used)) + return + + var/essencecolor = "#8F48C6" + if(essence > max_essence) + essencecolor = "#9A5ACB" //oh boy you've got a lot of essence + else if(essence <= 0) + essencecolor = "#1D2953" //oh jeez you're dying + hud_used.healths.maptext = MAPTEXT("
[essence]E
") + +/mob/living/basic/revenant/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) + if(!message) + return + + if(client) + if(client.prefs.muted & MUTE_IC) + to_chat(src, span_boldwarning("You cannot send IC messages (muted).")) + return + if (!(ignore_spam || forced) && client.handle_spam_prevention(message, MUTE_IC)) + return + + if(sanitize) + message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) + + log_talk(message, LOG_SAY) + var/rendered = span_deadsay("UNDEAD: [src] says, \"[message]\"") + relay_to_list_and_observers(rendered, GLOB.revenant_relay_mobs, src) + +/mob/living/basic/revenant/ClickOn(atom/A, params) //revenants can't interact with the world directly, so we gotta do some wacky override stuff + var/list/modifiers = params2list(params) + if(LAZYACCESS(modifiers, SHIFT_CLICK)) + ShiftClickOn(A) + return + if(LAZYACCESS(modifiers, ALT_CLICK)) + AltClickNoInteract(src, A) + return + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + ranged_secondary_attack(A, modifiers) + return + + if(ishuman(A) && in_range(src, A)) + attempt_harvest(A) + +/mob/living/basic/revenant/ranged_secondary_attack(atom/target, modifiers) + if(HAS_TRAIT(src, TRAIT_REVENANT_INHIBITED) || HAS_TRAIT(src, TRAIT_REVENANT_REVEALED) || HAS_TRAIT(src, TRAIT_NO_TRANSFORM) || !Adjacent(target) || !incorporeal_move_check(target)) + return + + var/list/icon_dimensions = get_icon_dimensions(target.icon) + var/orbitsize = (icon_dimensions["width"] + icon_dimensions["height"]) * 0.5 + orbitsize -= (orbitsize / world.icon_size) * (world.icon_size * 0.25) + orbit(target, orbitsize) + +/mob/living/basic/revenant/adjust_health(amount, updating_health = TRUE, forced = FALSE) + if(!forced && !HAS_TRAIT(src, TRAIT_REVENANT_REVEALED)) + return 0 + + . = amount + + essence = max(0, essence - amount) + if(updating_health) + update_health_hud() + if(essence == 0) + death() + + return . + +/mob/living/basic/revenant/orbit(atom/target) + setDir(SOUTH) // reset dir so the right directional sprites show up + return ..() + +/mob/living/basic/revenant/update_icon_state() + . = ..() + + if(HAS_TRAIT(src, TRAIT_REVENANT_REVEALED)) + icon_state = icon_reveal + return + + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) + if(draining) + icon_state = icon_drain + else + icon_state = icon_stun + + return + + icon_state = icon_idle + +/mob/living/basic/revenant/med_hud_set_health() + return //we use no hud + +/mob/living/basic/revenant/med_hud_set_status() + return //we use no hud + +/mob/living/basic/revenant/dust(just_ash, drop_items, force) + death() + +/mob/living/basic/revenant/gib() + death() + +/mob/living/basic/revenant/can_perform_action(atom/movable/target, action_bitflags) + return FALSE + +/mob/living/basic/revenant/ex_act(severity, target) + return FALSE //Immune to the effects of explosions. + +/mob/living/basic/revenant/blob_act(obj/structure/blob/attacking_blob) + return //blah blah blobs aren't in tune with the spirit world, or something. + +/mob/living/basic/revenant/singularity_act() + return //don't walk into the singularity expecting to find corpses, okay? + +/mob/living/basic/revenant/narsie_act() + return //most humans will now be either bones or harvesters, but we're still un-alive. + +/mob/living/basic/revenant/bullet_act() + if(!HAS_TRAIT(src, TRAIT_REVENANT_REVEALED) || dormant) + return BULLET_ACT_FORCE_PIERCE + return ..() + +/mob/living/basic/revenant/death() + if(!HAS_TRAIT(src, TRAIT_REVENANT_REVEALED) || dormant) //Revenants cannot die if they aren't revealed //or are already dead + return + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, REVENANT_STUNNED_TRAIT) + dormant = TRUE + + visible_message( + span_warning("[src] lets out a waning screech as violet mist swirls around its dissolving body!"), + span_revendanger("NO! No... it's too late, you can feel your essence [pick("breaking apart", "drifting away")]..."), + ) + + invisibility = 0 + icon_state = "revenant_draining" + playsound(src, 'sound/effects/screech.ogg', 100, TRUE) + + animate(src, alpha = 0, time = 3 SECONDS) + addtimer(CALLBACK(src, PROC_REF(move_to_ectoplasm)), 3 SECONDS) + +/// Forces the mob, once dormant, to move inside ectoplasm until it can regenerate. +/mob/living/basic/revenant/proc/move_to_ectoplasm() + if(QDELETED(src) || !dormant) // something fucky happened, abort. we MUST be dormant to go inside the ectoplasm. + return + + visible_message(span_danger("[src]'s body breaks apart into a fine pile of blue dust.")) + + var/obj/item/ectoplasm/revenant/goop = new(get_turf(src)) // the ectoplasm will handle moving us out of dormancy + goop.old_ckey = client.ckey + goop.revenant = src + forceMove(goop) + +/mob/living/basic/revenant/proc/on_move(datum/source, atom/entering_loc) + SIGNAL_HANDLER + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) // just in case it occurs, need to provide some feedback + balloon_alert(src, "can't move!") + return + + if(isnull(orbiting) || incorporeal_move_check(entering_loc)) + return + + // we're about to go somewhere we aren't meant to, end the orbit and block the move. feedback will be given in `incorporeal_move_check()` + orbiting.end_orbit(src) + return COMPONENT_MOVABLE_BLOCK_PRE_MOVE + +/// Generates the information the player needs to know how to play their role, and returns it as a list. +/mob/living/basic/revenant/proc/create_login_string() + RETURN_TYPE(/list) + var/list/returnable_list = list() + returnable_list += span_deadsay(span_boldbig("You are a revenant.")) + returnable_list += span_bold("Your formerly mundane spirit has been infused with alien energies and empowered into a revenant.") + returnable_list += span_bold("You are not dead, not alive, but somewhere in between. You are capable of limited interaction with both worlds.") + returnable_list += span_bold("You are invincible and invisible to everyone but other ghosts. Most abilities will reveal you, rendering you vulnerable.") + returnable_list += span_bold("To function, you are to drain the life essence from humans. This essence is a resource, as well as your health, and will power all of your abilities.") + returnable_list += span_bold("You do not remember anything of your past lives, nor will you remember anything about this one after your death.") + returnable_list += span_bold("Be sure to read the wiki page to learn more.") + return returnable_list + +/mob/living/basic/revenant/proc/set_random_revenant_name() + var/list/built_name_strings = list() + built_name_strings += pick(strings(REVENANT_NAME_FILE, "spirit_type")) + built_name_strings += " of " + built_name_strings += pick(strings(REVENANT_NAME_FILE, "adverb")) + built_name_strings += pick(strings(REVENANT_NAME_FILE, "theme")) + name = built_name_strings.Join("") + +/mob/living/basic/revenant/proc/on_baned(obj/item/weapon, mob/living/user) + SIGNAL_HANDLER + visible_message( + span_warning("[src] violently flinches!"), + span_revendanger("As [weapon] passes through you, you feel your essence draining away!"), + ) + apply_status_effect(/datum/status_effect/revenant/inhibited, 3 SECONDS) + +/// Incorporeal move check: blocked by holy-watered tiles and salt piles. +/mob/living/basic/revenant/proc/incorporeal_move_check(atom/destination) + var/turf/open/floor/step_turf = get_turf(destination) + if(isnull(step_turf)) + return TRUE // what? whatever let it happen + + if(step_turf.turf_flags & NOJAUNT) + to_chat(src, span_warning("Some strange aura is blocking the way.")) + return FALSE + + if(locate(/obj/effect/decal/cleanable/food/salt) in step_turf) + balloon_alert(src, "blocked by salt!") + apply_status_effect(/datum/status_effect/revenant/revealed, 2 SECONDS) + apply_status_effect(/datum/status_effect/incapacitating/paralyzed/revenant, 2 SECONDS) + return FALSE + + if(locate(/obj/effect/blessing) in step_turf) + to_chat(src, span_warning("Holy energies block your path!")) + return FALSE + + return TRUE + +/mob/living/basic/revenant/proc/cast_check(essence_cost) + if(QDELETED(src)) + return + + var/turf/current = get_turf(src) + + if(isclosedturf(current)) + to_chat(src, span_revenwarning("You cannot use abilities from inside of a wall.")) + return FALSE + + for(var/obj/thing in current) + if(!thing.density || thing.CanPass(src, get_dir(current, src))) + continue + to_chat(src, span_revenwarning("You cannot use abilities inside of a dense object.")) + return FALSE + + if(HAS_TRAIT(src, TRAIT_REVENANT_INHIBITED)) + to_chat(src, span_revenwarning("Your powers have been suppressed by a nullifying energy!")) + return FALSE + + if(!change_essence_amount(essence_cost, TRUE)) + to_chat(src, span_revenwarning("You lack the essence to use that ability.")) + return FALSE + + return TRUE + +/mob/living/basic/revenant/proc/unlock(essence_cost) + if(essence_excess < essence_cost) + return FALSE + essence_excess -= essence_cost + update_mob_action_buttons() + return TRUE + +/mob/living/basic/revenant/proc/death_reset() + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, REVENANT_STUNNED_TRAIT) + forceMove(get_turf(src)) + // clean slate, so no more debilitating effects + remove_status_effect(/datum/status_effect/revenant/revealed) + remove_status_effect(/datum/status_effect/incapacitating/paralyzed/revenant) + remove_status_effect(/datum/status_effect/revenant/inhibited) + draining = FALSE + dormant = FALSE + incorporeal_move = INCORPOREAL_MOVE_JAUNT + invisibility = INVISIBILITY_REVENANT + alpha = 255 + +/mob/living/basic/revenant/proc/change_essence_amount(essence_to_change_by, silent = FALSE, source = null) + if(QDELETED(src)) + return FALSE + + if((essence + essence_to_change_by) < 0) + return FALSE + + essence = max(0, essence + essence_to_change_by) + update_health_hud() + + if(essence_to_change_by > 0) + essence_accumulated = max(0, essence_accumulated + essence_to_change_by) + essence_excess = max(0, essence_excess + essence_to_change_by) + + update_mob_action_buttons() + if(!silent) + if(essence_to_change_by > 0) + to_chat(src, span_revennotice("Gained [essence_to_change_by]E [source ? "from [source]":""].")) + else + to_chat(src, span_revenminor("Lost [essence_to_change_by]E [source ? "from [source]":""].")) + return TRUE + +#undef REVENANT_STUNNED_TRAIT diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm similarity index 63% rename from code/modules/antagonists/revenant/revenant_abilities.dm rename to code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm index 51979f2ec1db..93e61e6cb826 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/mob/living/basic/space_fauna/revenant/revenant_abilities.dm @@ -1,122 +1,6 @@ #define REVENANT_DEFILE_MIN_DAMAGE 30 #define REVENANT_DEFILE_MAX_DAMAGE 50 - -/mob/living/simple_animal/revenant/ClickOn(atom/A, params) //revenants can't interact with the world directly. - var/list/modifiers = params2list(params) - if(LAZYACCESS(modifiers, SHIFT_CLICK)) - ShiftClickOn(A) - return - if(LAZYACCESS(modifiers, ALT_CLICK)) - AltClickNoInteract(src, A) - return - if((istate & ISTATE_SECONDARY)) - ranged_secondary_attack(A, modifiers) - return - - if(ishuman(A)) - //Humans are tagged, so this is fine - if(REF(A) in drained_mobs) - to_chat(src, span_revenwarning("[A]'s soul is dead and empty.") ) - else if(in_range(src, A)) - Harvest(A) - -/mob/living/simple_animal/revenant/ranged_secondary_attack(atom/target, modifiers) - if(revealed || notransform || inhibited || !Adjacent(target) || !incorporeal_move_check(target)) - return - var/icon/I = icon(target.icon,target.icon_state,target.dir) - var/orbitsize = (I.Width()+I.Height())*0.5 - orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) - orbit(target, orbitsize) - -//Harvest; activated by clicking the target, will try to drain their essence. -/mob/living/simple_animal/revenant/proc/Harvest(mob/living/carbon/human/target) - if(!castcheck(0)) - return - if(draining) - to_chat(src, span_revenwarning("You are already siphoning the essence of a soul!")) - return - if(!target.stat) - to_chat(src, span_revennotice("[target.p_their(TRUE)] soul is too strong to harvest.")) - if(prob(10)) - to_chat(target, span_revennotice("You feel as if you are being watched.")) - return - log_combat(src, target, "started to harvest") - face_atom(target) - draining = TRUE - essence_drained += rand(15, 20) - to_chat(src, span_revennotice("You search for the soul of [target].")) - if(do_after(src, rand(10, 20), target, timed_action_flags = IGNORE_HELD_ITEM)) //did they get deleted in that second? - if(target.ckey) - to_chat(src, span_revennotice("[target.p_their(TRUE)] soul burns with intelligence.")) - essence_drained += rand(20, 30) - if(target.stat != DEAD && !HAS_TRAIT(target, TRAIT_WEAK_SOUL)) - to_chat(src, span_revennotice("[target.p_their(TRUE)] soul blazes with life!")) - essence_drained += rand(40, 50) - if(HAS_TRAIT(target, TRAIT_WEAK_SOUL) && !target.ckey) - to_chat(src, span_revennotice("[target.p_their(TRUE)] soul is weak and underdeveloped. They won't be worth very much.")) - essence_drained = 5 - else - to_chat(src, span_revennotice("[target.p_their(TRUE)] soul is weak and faltering.")) - if(do_after(src, rand(15, 20), target, timed_action_flags = IGNORE_HELD_ITEM)) //did they get deleted NOW? - switch(essence_drained) - if(1 to 30) - to_chat(src, span_revennotice("[target] will not yield much essence. Still, every bit counts.")) - if(30 to 70) - to_chat(src, span_revennotice("[target] will yield an average amount of essence.")) - if(70 to 90) - to_chat(src, span_revenboldnotice("Such a feast! [target] will yield much essence to you.")) - if(90 to INFINITY) - to_chat(src, span_revenbignotice("Ah, the perfect soul. [target] will yield massive amounts of essence to you.")) - if(do_after(src, rand(15, 25), target, timed_action_flags = IGNORE_HELD_ITEM)) //how about now - if(!target.stat) - to_chat(src, span_revenwarning("[target.p_theyre(TRUE)] now powerful enough to fight off your draining.")) - to_chat(target, span_boldannounce("You feel something tugging across your body before subsiding.")) - draining = 0 - essence_drained = 0 - return //hey, wait a minute... - to_chat(src, span_revenminor("You begin siphoning essence from [target]'s soul.")) - if(target.stat != DEAD) - to_chat(target, span_warning("You feel a horribly unpleasant draining sensation as your grip on life weakens...")) - if(target.stat == SOFT_CRIT) - target.Stun(46) - reveal(46) - stun(46) - target.visible_message(span_warning("[target] suddenly rises slightly into the air, [target.p_their()] skin turning an ashy gray.")) - if(target.can_block_magic(MAGIC_RESISTANCE_HOLY)) - to_chat(src, span_revenminor("Something's wrong! [target] seems to be resisting the siphoning, leaving you vulnerable!")) - target.visible_message(span_warning("[target] slumps onto the ground."), \ - span_revenwarning("Violet lights, dancing in your vision, receding--")) - draining = FALSE - return - var/datum/beam/B = Beam(target,icon_state="drain_life") - if(do_after(src, 46, target, timed_action_flags = IGNORE_HELD_ITEM)) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining. - change_essence_amount(essence_drained, FALSE, target) - if(essence_drained <= 90 && target.stat != DEAD && !HAS_TRAIT(target, TRAIT_WEAK_SOUL)) - essence_regen_cap += 5 - to_chat(src, span_revenboldnotice("The absorption of [target]'s living soul has increased your maximum essence level. Your new maximum essence is [essence_regen_cap].")) - if(essence_drained > 90) - essence_regen_cap += 15 - perfectsouls++ - to_chat(src, span_revenboldnotice("The perfection of [target]'s soul has increased your maximum essence level. Your new maximum essence is [essence_regen_cap].")) - to_chat(src, span_revennotice("[target]'s soul has been considerably weakened and will yield no more essence for the time being.")) - target.visible_message(span_warning("[target] slumps onto the ground."), \ - span_revenwarning("Violets lights, dancing in your vision, getting clo--")) - drained_mobs += REF(target) - if(target.stat != DEAD) - target.investigate_log("has died from revenant harvest.", INVESTIGATE_DEATHS) - target.death(FALSE) - else - to_chat(src, span_revenwarning("[target ? "[target] has":"[target.p_theyve(TRUE)]"] been drawn out of your grasp. The link has been broken.")) - if(target) //Wait, target is WHERE NOW? - target.visible_message(span_warning("[target] slumps onto the ground."), \ - span_revenwarning("Violets lights, dancing in your vision, receding--")) - qdel(B) - else - to_chat(src, span_revenwarning("You are not close enough to siphon [target ? "[target]'s":"[target.p_their()]"] soul. The link has been broken.")) - draining = FALSE - essence_drained = 0 - //Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob /datum/action/cooldown/spell/list_target/telepathy/revenant name = "Revenant Transmit" @@ -170,8 +54,8 @@ stack_trace("[type] was owned by a non-revenant mob, please don't.") return FALSE - var/mob/living/simple_animal/revenant/ghost = owner - if(ghost.inhibited) + var/mob/living/basic/revenant/ghost = owner + if(ghost.dormant || HAS_TRAIT(ghost, TRAIT_REVENANT_INHIBITED)) return FALSE if(locked && ghost.essence_excess <= unlock_amount) return FALSE @@ -187,7 +71,7 @@ return things -/datum/action/cooldown/spell/aoe/revenant/before_cast(mob/living/simple_animal/revenant/cast_on) +/datum/action/cooldown/spell/aoe/revenant/before_cast(mob/living/basic/revenant/cast_on) . = ..() if(. & SPELL_CANCEL_CAST) return @@ -205,16 +89,16 @@ reset_spell_cooldown() return . | SPELL_CANCEL_CAST - if(!cast_on.castcheck(-cast_amount)) + if(!cast_on.cast_check(-cast_amount)) reset_spell_cooldown() return . | SPELL_CANCEL_CAST -/datum/action/cooldown/spell/aoe/revenant/after_cast(mob/living/simple_animal/revenant/cast_on) +/datum/action/cooldown/spell/aoe/revenant/after_cast(mob/living/basic/revenant/cast_on) . = ..() if(reveal_duration > 0 SECONDS) - cast_on.reveal(reveal_duration) + cast_on.apply_status_effect(/datum/status_effect/revenant/revealed, reveal_duration) if(stun_duration > 0 SECONDS) - cast_on.stun(stun_duration) + cast_on.apply_status_effect(/datum/status_effect/incapacitating/paralyzed/revenant, stun_duration) //Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people. /datum/action/cooldown/spell/aoe/revenant/overload @@ -230,10 +114,10 @@ /// The range the shocks from the lights go var/shock_range = 2 - /// The damage the shcoskf rom the lgihts do + /// The damage the shocks from the lights do var/shock_damage = 15 -/datum/action/cooldown/spell/aoe/revenant/overload/cast_on_thing_in_aoe(turf/victim, mob/living/simple_animal/revenant/caster) +/datum/action/cooldown/spell/aoe/revenant/overload/cast_on_thing_in_aoe(turf/victim, mob/living/basic/revenant/caster) for(var/obj/machinery/light/light in victim) if(!light.on) continue @@ -245,7 +129,7 @@ new /obj/effect/temp_visual/revenant(get_turf(light)) addtimer(CALLBACK(src, PROC_REF(overload_shock), light, caster), 20) -/datum/action/cooldown/spell/aoe/revenant/overload/proc/overload_shock(obj/machinery/light/to_shock, mob/living/simple_animal/revenant/caster) +/datum/action/cooldown/spell/aoe/revenant/overload/proc/overload_shock(obj/machinery/light/to_shock, mob/living/basic/revenant/caster) flick("[to_shock.base_state]2", to_shock) for(var/mob/living/carbon/human/human_mob in view(shock_range, to_shock)) if(human_mob == caster) @@ -270,7 +154,7 @@ reveal_duration = 4 SECONDS stun_duration = 2 SECONDS -/datum/action/cooldown/spell/aoe/revenant/defile/cast_on_thing_in_aoe(turf/victim, mob/living/simple_animal/revenant/caster) +/datum/action/cooldown/spell/aoe/revenant/defile/cast_on_thing_in_aoe(turf/victim, mob/living/basic/revenant/caster) for(var/obj/effect/blessing/blessing in victim) qdel(blessing) new /obj/effect/temp_visual/revenant(victim) @@ -319,7 +203,7 @@ unlock_amount = 125 // A note to future coders: do not replace this with an EMP because it will wreck malf AIs and everyone will hate you. -/datum/action/cooldown/spell/aoe/revenant/malfunction/cast_on_thing_in_aoe(turf/victim, mob/living/simple_animal/revenant/caster) +/datum/action/cooldown/spell/aoe/revenant/malfunction/cast_on_thing_in_aoe(turf/victim, mob/living/basic/revenant/caster) for(var/mob/living/simple_animal/bot/bot in victim) if(!(bot.bot_cover_flags & BOT_COVER_EMAGGED)) new /obj/effect/temp_visual/revenant(bot.loc) @@ -360,7 +244,7 @@ cast_amount = 50 unlock_amount = 75 -/datum/action/cooldown/spell/aoe/revenant/blight/cast_on_thing_in_aoe(turf/victim, mob/living/simple_animal/revenant/caster) +/datum/action/cooldown/spell/aoe/revenant/blight/cast_on_thing_in_aoe(turf/victim, mob/living/basic/revenant/caster) for(var/mob/living/mob in victim) if(mob == caster) continue @@ -433,7 +317,7 @@ return things -/datum/action/cooldown/spell/aoe/revenant/haunt_object/cast_on_thing_in_aoe(obj/item/victim, mob/living/simple_animal/revenant/caster) +/datum/action/cooldown/spell/aoe/revenant/haunt_object/cast_on_thing_in_aoe(obj/item/victim, mob/living/basic/revenant/caster) var/distance_from_caster = get_dist(get_turf(victim), get_turf(caster)) var/chance_of_haunting = 150 * (1 / distance_from_caster) if(!prob(chance_of_haunting)) diff --git a/code/modules/mob/living/basic/space_fauna/revenant/revenant_effects.dm b/code/modules/mob/living/basic/space_fauna/revenant/revenant_effects.dm new file mode 100644 index 000000000000..0eeec231973e --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/revenant/revenant_effects.dm @@ -0,0 +1,73 @@ +/// Parent type for all unique revenant status effects +/datum/status_effect/revenant + +/datum/status_effect/revenant/on_creation(mob/living/new_owner, duration) + if(isnum(duration)) + src.duration = duration + return ..() + +/datum/status_effect/revenant/revealed + id = "revenant_revealed" + +/datum/status_effect/revenant/revealed/on_apply() + . = ..() + if(!.) + return FALSE + owner.orbiting?.end_orbit(src) + + ADD_TRAIT(owner, TRAIT_REVENANT_REVEALED, TRAIT_STATUS_EFFECT(id)) + owner.invisibility = 0 + owner.incorporeal_move = FALSE + owner.update_appearance(UPDATE_ICON) + owner.update_mob_action_buttons() + +/datum/status_effect/revenant/revealed/on_remove() + REMOVE_TRAIT(owner, TRAIT_REVENANT_REVEALED, TRAIT_STATUS_EFFECT(id)) + + owner.incorporeal_move = INCORPOREAL_MOVE_JAUNT + owner.invisibility = INVISIBILITY_REVENANT + owner.update_appearance(UPDATE_ICON) + owner.update_mob_action_buttons() + return ..() + +/datum/status_effect/revenant/inhibited + id = "revenant_inhibited" + +/datum/status_effect/revenant/inhibited/on_apply() + . = ..() + if(!.) + return FALSE + owner.orbiting?.end_orbit(src) + + ADD_TRAIT(owner, TRAIT_REVENANT_INHIBITED, TRAIT_STATUS_EFFECT(id)) + owner.update_appearance(UPDATE_ICON) + + owner.balloon_alert(owner, "inhibited!") + +/datum/status_effect/revenant/inhibited/on_remove() + REMOVE_TRAIT(owner, TRAIT_REVENANT_INHIBITED, TRAIT_STATUS_EFFECT(id)) + owner.update_appearance(UPDATE_ICON) + + owner.balloon_alert(owner, "uninhibited") + return ..() + +/datum/status_effect/incapacitating/paralyzed/revenant + id = "revenant_paralyzed" + +/datum/status_effect/incapacitating/paralyzed/revenant/on_apply() + . = ..() + if(!.) + return FALSE + owner.orbiting?.end_orbit(src) + + ADD_TRAIT(owner, TRAIT_NO_TRANSFORM, TRAIT_STATUS_EFFECT(id)) + owner.balloon_alert(owner, "can't move!") + owner.update_mob_action_buttons() + owner.update_appearance(UPDATE_ICON) + +/datum/status_effect/incapacitating/paralyzed/revenant/on_remove() + REMOVE_TRAIT(owner, TRAIT_NO_TRANSFORM, TRAIT_STATUS_EFFECT(id)) + owner.update_mob_action_buttons() + owner.balloon_alert(owner, "can move again") + + return ..() diff --git a/code/modules/mob/living/basic/space_fauna/revenant/revenant_harvest.dm b/code/modules/mob/living/basic/space_fauna/revenant/revenant_harvest.dm new file mode 100644 index 000000000000..b8bb05db4841 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/revenant/revenant_harvest.dm @@ -0,0 +1,143 @@ +// This file contains the proc we use for revenant harvesting because it is a very long and bulky proc that takes up a lot of space elsewhere + +/// Container proc for `harvest()`, handles the pre-checks as well as potential early-exits for any reason. +/// Will return FALSE if we can't execute `harvest()`, or will otherwise the result of `harvest()`: a boolean value. +/mob/living/basic/revenant/proc/attempt_harvest(mob/living/carbon/human/target) + if(LAZYFIND(drained_mobs, REF(target))) + to_chat(src, span_revenwarning("[target]'s soul is dead and empty.")) + return FALSE + + if(!cast_check(0)) + return FALSE + + if(draining) + to_chat(src, span_revenwarning("You are already siphoning the essence of a soul!")) + return FALSE + + draining = TRUE + var/value_to_return = harvest_soul(target) + if(!value_to_return) + log_combat(src, target, "stopped the harvest of") + draining = FALSE + + return value_to_return + +/// Harvest; activated by clicking a target, will try to drain their essence. Handles all messages and handling of the target. +/// Returns FALSE if we exit out of the harvest, TRUE if it is fully done. +/mob/living/basic/revenant/proc/harvest_soul(mob/living/carbon/human/target) // this isn't in the main revenant code file because holyyyy shit it's long + if(QDELETED(target)) // what + return FALSE + + // cache pronouns in case they get deleted as well as be a nice micro-opt due to the multiple times we use them + var/target_their = target.p_their() + var/target_Their = target.p_Their() + var/target_Theyre = target.p_Theyre() + var/target_They_have = "[target.p_They()] [target.p_have()]" + + if(target.stat == CONSCIOUS) + to_chat(src, span_revennotice("[target_Their] soul is too strong to harvest.")) + if(prob(10)) + to_chat(target, span_revennotice("You feel as if you are being watched.")) + return FALSE + + log_combat(src, target, "started to harvest") + face_atom(target) + var/essence_drained = rand(15, 20) + + to_chat(src, span_revennotice("You search for the soul of [target].")) + + if(!do_after(src, (rand(10, 20) DECISECONDS), target, timed_action_flags = IGNORE_HELD_ITEM)) //did they get deleted in that second? + return FALSE + + var/target_has_client = !isnull(target.client) + if(target_has_client || target.ckey) // any target that has been occupied with a ckey is considered "intelligent" + to_chat(src, span_revennotice("[target_Their] soul burns with intelligence.")) + essence_drained += rand(20, 30) + + if(target.stat != DEAD && !HAS_TRAIT(target, TRAIT_WEAK_SOUL)) + to_chat(src, span_revennotice("[target_Their] soul blazes with life!")) + essence_drained += rand(40, 50) + + if(!target_has_client && HAS_TRAIT(target, TRAIT_WEAK_SOUL)) + to_chat(src, span_revennotice("[target_Their] soul is weak and underdeveloped. They won't be worth very much.")) + essence_drained = 5 + + to_chat(src, span_revennotice("[target_Their] soul is weak and faltering. It's time to harvest.")) + + if(!do_after(src, (rand(15, 20) DECISECONDS), target, timed_action_flags = IGNORE_HELD_ITEM)) + to_chat(src, span_revennotice("The harvest is abandoned.")) + return FALSE + + switch(essence_drained) + if(1 to 30) + to_chat(src, span_revennotice("[target] will not yield much essence. Still, every bit counts.")) + if(30 to 70) + to_chat(src, span_revennotice("[target] will yield an average amount of essence.")) + if(70 to 90) + to_chat(src, span_revenboldnotice("Such a feast! [target] will yield much essence to you.")) + if(90 to INFINITY) + to_chat(src, span_revenbignotice("Ah, the perfect soul. [target] will yield massive amounts of essence to you.")) + + if(!do_after(src, (rand(15, 25) DECISECONDS), target, timed_action_flags = IGNORE_HELD_ITEM)) //how about now + to_chat(src, span_revenwarning("You are not close enough to siphon [target ? "[target]'s" : "[target_their]"] soul. The link has been broken.")) + return FALSE + + if(target.stat == CONSCIOUS) + to_chat(src, span_revenwarning("[target_Theyre] now powerful enough to fight off your draining!")) + to_chat(target, span_boldannounce("You feel something tugging across your body before subsiding.")) //hey, wait a minute... + return FALSE + + to_chat(src, span_revenminor("You begin siphoning essence from [target]'s soul.")) + if(target.stat != DEAD) + to_chat(target, span_warning("You feel a horribly unpleasant draining sensation as your grip on life weakens...")) + if(target.stat == SOFT_CRIT) + target.Stun(46) + + apply_status_effect(/datum/status_effect/revenant/revealed, 5 SECONDS) + apply_status_effect(/datum/status_effect/incapacitating/paralyzed/revenant, 5 SECONDS) + + target.visible_message(span_warning("[target] suddenly rises slightly into the air, [target_their] skin turning an ashy gray.")) + + if(target.can_block_magic(MAGIC_RESISTANCE_HOLY)) + to_chat(src, span_revenminor("Something's wrong! [target] seems to be resisting the siphoning, leaving you vulnerable!")) + target.visible_message( + span_warning("[target] slumps onto the ground."), + span_revenwarning("Violet lights, dancing in your vision, receding--"), + ) + return FALSE + + var/datum/beam/draining_beam = Beam(target, icon_state = "drain_life") + if(!do_after(src, 4.6 SECONDS, target, timed_action_flags = (IGNORE_HELD_ITEM | IGNORE_INCAPACITATED))) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining. + to_chat(src, span_revenwarning("[target ? "[target]'s soul has" : "[target_They_have]"] been drawn out of your grasp. The link has been broken.")) + if(target) + target.visible_message( + span_warning("[target] slumps onto the ground."), + span_revenwarning("Violet lights, dancing in your vision, receding--"), + ) + qdel(draining_beam) + return FALSE + + change_essence_amount(essence_drained, FALSE, target) + + if(essence_drained <= 90 && target.stat != DEAD && !HAS_TRAIT(target, TRAIT_WEAK_SOUL)) + max_essence += 5 + to_chat(src, span_revenboldnotice("The absorption of [target]'s living soul has increased your maximum essence level. Your new maximum essence is [max_essence].")) + + if(essence_drained > 90) + max_essence += 15 + perfectsouls++ + to_chat(src, span_revenboldnotice("The perfection of [target]'s soul has increased your maximum essence level. Your new maximum essence is [max_essence].")) + + to_chat(src, span_revennotice("[target]'s soul has been considerably weakened and will yield no more essence for the time being.")) + target.visible_message( + span_warning("[target] slumps onto the ground."), + span_revenwarning("Violet lights, dancing in your vision, getting clo--"), + ) + + LAZYADD(drained_mobs, REF(target)) + if(target.stat != DEAD) + target.investigate_log("has died from revenant harvest.", INVESTIGATE_DEATHS) + target.death(FALSE) + + qdel(draining_beam) + return TRUE diff --git a/code/modules/mob/living/basic/space_fauna/revenant/revenant_items.dm b/code/modules/mob/living/basic/space_fauna/revenant/revenant_items.dm new file mode 100644 index 000000000000..a9e17a9b305f --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/revenant/revenant_items.dm @@ -0,0 +1,106 @@ +//reforming +/obj/item/ectoplasm/revenant + name = "glimmering residue" + desc = "A pile of fine blue dust. Small tendrils of violet mist swirl around it." + icon = 'icons/effects/effects.dmi' + icon_state = "revenantEctoplasm" + w_class = WEIGHT_CLASS_SMALL + /// Are we currently reforming? + var/reforming = TRUE + /// Are we inert (aka distorted such that we can't reform)? + var/inert = FALSE + /// The key of the revenant that we started the reform as + var/old_ckey + /// The revenant we're currently storing + var/mob/living/basic/revenant/revenant + +/obj/item/ectoplasm/revenant/Initialize(mapload) + . = ..() + addtimer(CALLBACK(src, PROC_REF(try_reform)), 1 MINUTES) + +/obj/item/ectoplasm/revenant/Destroy() + if(!QDELETED(revenant)) + qdel(revenant) + return ..() + +/obj/item/ectoplasm/revenant/attack_self(mob/user) + if(!reforming || inert) + return ..() + user.visible_message( + span_notice("[user] scatters [src] in all directions."), + span_notice("You scatter [src] across the area. The particles slowly fade away."), + ) + user.dropItemToGround(src) + qdel(src) + +/obj/item/ectoplasm/revenant/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + . = ..() + if(inert) + return + visible_message(span_notice("[src] breaks into particles upon impact, which fade away to nothingness.")) + qdel(src) + +/obj/item/ectoplasm/revenant/examine(mob/user) + . = ..() + if(inert) + . += span_revennotice("It seems inert.") + else if(reforming) + . += span_revenwarning("It is shifting and distorted. It would be wise to destroy this.") + +/obj/item/ectoplasm/revenant/suicide_act(mob/living/user) + user.visible_message(span_suicide("[user] is inhaling [src]! It looks like [user.p_theyre()] trying to visit the shadow realm!")) + qdel(src) + return OXYLOSS + +/obj/item/ectoplasm/revenant/proc/try_reform() + if(reforming) + reforming = FALSE + reform() + else + inert = TRUE + visible_message(span_warning("[src] settles down and seems lifeless.")) + +/// Actually moves the revenant out of ourself +/obj/item/ectoplasm/revenant/proc/reform() + if(QDELETED(src) || QDELETED(revenant) || inert) + return + + message_admins("Revenant ectoplasm was left undestroyed for 1 minute and is reforming into a new revenant.") + forceMove(drop_location()) //In case it's in a backpack or someone's hand + + var/user_name = old_ckey + if(isnull(revenant.client)) + var/mob/potential_user = get_new_user() + revenant.key = potential_user.key + user_name = potential_user.ckey + qdel(potential_user) + + message_admins("[user_name] has been [old_ckey == user_name ? "re":""]made into a revenant by reforming ectoplasm.") + revenant.log_message("was [old_ckey == user_name ? "re":""]made as a revenant by reforming ectoplasm.", LOG_GAME) + visible_message(span_revenboldnotice("[src] suddenly rises into the air before fading away.")) + + revenant.death_reset() + revenant = null + qdel(src) + +/// Handles giving the revenant a new client to control it +/obj/item/ectoplasm/revenant/proc/get_new_user() + message_admins("The new revenant's old client either could not be found or is in a new, living mob - grabbing a random candidate instead...") + var/list/candidates = poll_candidates_for_mob("Do you want to be [revenant.name] (reforming)?", ROLE_REVENANT, ROLE_REVENANT, 5 SECONDS, revenant) + + if(!LAZYLEN(candidates)) + message_admins("No candidates were found for the new revenant.") + inert = TRUE + visible_message(span_revenwarning("[src] settles down and seems lifeless.")) + qdel(revenant) + return null + + var/mob/dead/observer/potential_client = pick(candidates) + if(isnull(potential_client)) + qdel(revenant) + message_admins("No candidate was found for the new revenant. Oh well!") + inert = TRUE + visible_message(span_revenwarning("[src] settles down and seems lifeless.")) + return null + + return potential_client diff --git a/code/modules/mob/living/basic/space_fauna/revenant/revenant_objectives.dm b/code/modules/mob/living/basic/space_fauna/revenant/revenant_objectives.dm new file mode 100644 index 000000000000..7dd391c17e47 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/revenant/revenant_objectives.dm @@ -0,0 +1,37 @@ +/datum/objective/revenant + +/datum/objective/revenant/New() + target_amount = rand(350, 600) + explanation_text = "Absorb [target_amount] points of essence from humans." + return ..() + +/datum/objective/revenant/check_completion() + if(!isrevenant(owner.current)) + return FALSE + var/mob/living/basic/revenant/owner_mob = owner.current + if(QDELETED(owner_mob) || owner_mob.stat == DEAD) + return FALSE + var/essence_stolen = owner_mob.essence_accumulated + return essence_stolen >= target_amount + +/datum/objective/revenant_fluff + +/datum/objective/revenant_fluff/New() + var/list/explanation_texts = list( + "Assist and exacerbate existing threats at critical moments.", + "Cause as much chaos and anger as you can without being killed.", + "Damage and render as much of the station rusted and unusable as possible.", + "Disable and cause malfunctions in as many machines as possible.", + "Ensure that any holy weapons are rendered unusable.", + "Heed and obey the requests of the dead, provided that carrying them out wouldn't be too inconvenient or self-destructive.", + "Impersonate or be worshipped as a God.", + "Make the captain as miserable as possible.", + "Make the clown as miserable as possible.", + "Make the crew as miserable as possible.", + "Prevent the use of energy weapons where possible.", + ) + explanation_text = pick(explanation_texts) + return ..() + +/datum/objective/revenant_fluff/check_completion() + return TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/robot_customer.dm b/code/modules/mob/living/basic/space_fauna/robot_customer.dm similarity index 63% rename from code/modules/mob/living/simple_animal/friendly/robot_customer.dm rename to code/modules/mob/living/basic/space_fauna/robot_customer.dm index baa09c0eb86e..e084e11f403c 100644 --- a/code/modules/mob/living/simple_animal/friendly/robot_customer.dm +++ b/code/modules/mob/living/basic/space_fauna/robot_customer.dm @@ -1,45 +1,56 @@ ///Robot customers -/mob/living/simple_animal/robot_customer - name = "space-tourist bot" +/mob/living/basic/robot_customer + name = "tourist bot" maxHealth = 150 health = 150 desc = "I wonder what they'll order..." gender = NEUTER + icon = 'icons/mob/simple/tourists.dmi' icon_state = "amerifat" icon_living = "amerifat" - ///Override so it uses datum ai - can_have_ai = FALSE - AIStatus = AI_OFF - del_on_death = TRUE + + basic_mob_flags = DEL_ON_DEATH mob_biotypes = MOB_ROBOTIC|MOB_HUMANOID sentience_type = SENTIENCE_ARTIFICIAL - ai_controller = /datum/ai_controller/robot_customer + unsuitable_atmos_damage = 0 - minbodytemp = 0 - maxbodytemp = 1000 + minimum_survivable_temperature = TCMB + maximum_survivable_temperature = T0C + 1000 + + ai_controller = /datum/ai_controller/robot_customer + + /// The clothes that we draw on this tourist. var/clothes_set = "amerifat_clothes" + /// Reference to the hud that we show when the player hovers over us. var/datum/atom_hud/hud_to_show_on_hover - -/mob/living/simple_animal/robot_customer/Initialize(mapload, datum/customer_data/customer_data = /datum/customer_data/american, datum/venue/attending_venue = SSrestaurant.all_venues[/datum/venue/restaurant]) - ADD_TRAIT(src, list(TRAIT_NOMOBSWAP, TRAIT_NO_TELEPORT, TRAIT_STRONG_GRABBER), INNATE_TRAIT) // never suffer a bitch to fuck with you - AddElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, sound_vary = TRUE) +/mob/living/basic/robot_customer/Initialize( + mapload, + datum/customer_data/customer_data = /datum/customer_data/american, + datum/venue/attending_venue = SSrestaurant.all_venues[/datum/venue/restaurant], +) var/datum/customer_data/customer_info = SSrestaurant.all_customers[customer_data] - clothes_set = pick(customer_info.clothing_sets) ai_controller = customer_info.ai_controller_used + . = ..() + + ADD_TRAIT(src, list(TRAIT_NOMOBSWAP, TRAIT_NO_TELEPORT, TRAIT_STRONG_GRABBER), INNATE_TRAIT) // never suffer a bitch to fuck with you + AddElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, sound_vary = TRUE) + ai_controller.set_blackboard_key(BB_CUSTOMER_CUSTOMERINFO, customer_info) ai_controller.set_blackboard_key(BB_CUSTOMER_ATTENDING_VENUE, attending_venue) ai_controller.set_blackboard_key(BB_CUSTOMER_PATIENCE, customer_info.total_patience) + icon = customer_info.base_icon icon_state = customer_info.base_icon_state name = "[pick(customer_info.name_prefixes)]-bot" color = rgb(rand(80,255), rand(80,255), rand(80,255)) - update_icon() + clothes_set = pick(customer_info.clothing_sets) + update_appearance(UPDATE_ICON) ///Clean up on the mobs seat etc when its deleted (Either by murder or because it left) -/mob/living/simple_animal/robot_customer/Destroy() +/mob/living/basic/robot_customer/Destroy() var/datum/venue/attending_venue = ai_controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] var/obj/structure/holosign/robot_seat/our_seat = ai_controller.blackboard[BB_CUSTOMER_MY_SEAT] attending_venue.current_visitors -= src @@ -49,18 +60,18 @@ return ..() ///Robots need robot gibs...! -/mob/living/simple_animal/robot_customer/spawn_gibs() +/mob/living/basic/robot_customer/spawn_gibs() new /obj/effect/gibspawner/robot(drop_location(), src) -/mob/living/simple_animal/robot_customer/MouseEntered(location, control, params) +/mob/living/basic/robot_customer/MouseEntered(location, control, params) . = ..() hud_to_show_on_hover?.show_to(usr) -/mob/living/simple_animal/robot_customer/MouseExited(location, control, params) +/mob/living/basic/robot_customer/MouseExited(location, control, params) . = ..() hud_to_show_on_hover?.hide_from(usr) -/mob/living/simple_animal/robot_customer/update_overlays() +/mob/living/basic/robot_customer/update_overlays() . = ..() var/datum/customer_data/customer_info = ai_controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] @@ -82,21 +93,24 @@ if(bonus_overlays) . += bonus_overlays -/mob/living/simple_animal/robot_customer/send_speech(message, message_range, obj/source, bubble_type, list/spans, datum/language/message_language, list/message_mods, forced) +/mob/living/basic/robot_customer/send_speech(message, message_range, obj/source, bubble_type, list/spans, datum/language/message_language, list/message_mods, forced, tts_message, list/tts_filter) . = ..() var/datum/customer_data/customer_info = ai_controller.blackboard[BB_CUSTOMER_CUSTOMERINFO] playsound(src, customer_info.speech_sound, 30, extrarange = MEDIUM_RANGE_SOUND_EXTRARANGE, falloff_distance = 5) -/mob/living/simple_animal/robot_customer/examine(mob/user) +/mob/living/basic/robot_customer/examine(mob/user) . = ..() - // this should be handled by the ai controller - if(ai_controller.blackboard[BB_CUSTOMER_CURRENT_ORDER]) - var/datum/venue/attending_venue = ai_controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] - var/wanted_item = ai_controller.blackboard[BB_CUSTOMER_CURRENT_ORDER] - var/order - if(istype(wanted_item, /datum/custom_order)) - var/datum/custom_order/custom_order = wanted_item - order = custom_order.get_order_line(attending_venue) - else - order = attending_venue.order_food_line(wanted_item) - . += span_notice("Their order was: \"[order].\"") + if(isnull(ai_controller.blackboard[BB_CUSTOMER_CURRENT_ORDER])) + return + + var/datum/venue/attending_venue = ai_controller.blackboard[BB_CUSTOMER_ATTENDING_VENUE] + var/wanted_item = ai_controller.blackboard[BB_CUSTOMER_CURRENT_ORDER] + var/order = "nothing" + + if(istype(wanted_item, /datum/custom_order)) + var/datum/custom_order/custom_order = wanted_item + order = custom_order.get_order_line(attending_venue) + else + order = attending_venue.order_food_line(wanted_item) + + . += span_notice("Their order was: \"[order].\"") diff --git a/code/modules/mob/living/basic/space_fauna/snake/snake.dm b/code/modules/mob/living/basic/space_fauna/snake/snake.dm new file mode 100644 index 000000000000..135402a5b441 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/snake/snake.dm @@ -0,0 +1,86 @@ + +/mob/living/basic/snake + name = "snake" + desc = "A slithery snake. These legless reptiles are the bane of mice and adventurers alike." + icon_state = "snake" + icon_living = "snake" + icon_dead = "snake_dead" + speak_emote = list("hisses") + + health = 20 + maxHealth = 20 + melee_damage_lower = 5 + melee_damage_upper = 6 + obj_damage = 0 + environment_smash = ENVIRONMENT_SMASH_NONE + + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/weapons/bite.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + + response_help_continuous = "pets" + response_help_simple = "pet" + response_disarm_continuous = "shoos" + response_disarm_simple = "shoo" + response_harm_continuous = "steps on" + response_harm_simple = "step on" + + density = FALSE + pass_flags = PASSTABLE | PASSMOB + mob_size = MOB_SIZE_SMALL + + faction = list(FACTION_HOSTILE) + mob_biotypes = MOB_ORGANIC | MOB_BEAST | MOB_REPTILE + gold_core_spawnable = FRIENDLY_SPAWN + + ai_controller = /datum/ai_controller/basic_controller/snake + + /// List of stuff (mice) that we want to eat + var/static/list/edibles = list( + /mob/living/basic/mouse, + /obj/item/food/deadmouse, + ) + +/mob/living/basic/snake/Initialize(mapload, special_reagent) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/swabable, CELL_LINE_TABLE_SNAKE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + + AddElement(/datum/element/basic_eating, heal_amt = 2, food_types = edibles) + ai_controller.set_blackboard_key(BB_BASIC_FOODS, edibles) + + AddComponent(\ + /datum/component/tameable,\ + food_types = list(/obj/item/food/deadmouse),\ + tame_chance = 75,\ + bonus_tame_chance = 10,\ + ) // snakes are really fond of food, especially in the cold darkness of space :) + + if(isnull(special_reagent)) + special_reagent = /datum/reagent/toxin + + AddElement(/datum/element/venomous, special_reagent, 4) + +/mob/living/basic/snake/befriend(mob/living/new_friend) + . = ..() + visible_message("[src] hisses happily as it seems to bond with [new_friend].") + +/// Snakes are primarily concerned with getting those tasty, tasty mice, but aren't afraid to strike back at those who attack them +/datum/ai_controller/basic_controller/snake + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends/allow_items, + ) + + ai_traits = STOP_MOVING_WHEN_PULLED + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/find_food, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/random_speech/snake, + ) diff --git a/code/modules/mob/living/basic/space_fauna/snake/snake_ai.dm b/code/modules/mob/living/basic/space_fauna/snake/snake_ai.dm new file mode 100644 index 000000000000..3eb404761c52 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/snake/snake_ai.dm @@ -0,0 +1,6 @@ +/datum/ai_planning_subtree/random_speech/snake + speech_chance = 5 + speak = list("hsssss","sssSSsssss...","hiisssss") + sound = list('sound/creatures/snake_hissing1.ogg', 'sound/creatures/snake_hissing2.ogg') + emote_hear = list("hisses.") + emote_see = list("slithers around.", "glances.", "stares.") diff --git a/code/modules/mob/living/basic/space_fauna/space_dragon/dragon_breath.dm b/code/modules/mob/living/basic/space_fauna/space_dragon/dragon_breath.dm new file mode 100644 index 000000000000..5be5038b3a41 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/space_dragon/dragon_breath.dm @@ -0,0 +1,32 @@ +/// A space dragon's fire breath, toasts lunch AND buffs your friends +/datum/action/cooldown/mob_cooldown/fire_breath/carp + desc = "A Space Dragon's burning breath not only chars its foes, but invigorates Space Carp as well." + fire_damage = 30 + mech_damage = 50 + fire_range = 20 + fire_temperature = 700 // Even hotter than a megafauna for some reason + shared_cooldown = NONE + melee_cooldown_time = 0 SECONDS + +/datum/action/cooldown/mob_cooldown/fire_breath/carp/on_burn_mob(mob/living/barbecued, mob/living/source) + if (!source.faction_check_atom(barbecued)) + return ..() + to_chat(barbecued, span_notice("[source]'s fiery breath fills you with energy!")) + barbecued.apply_status_effect(/datum/status_effect/carp_invigoration) + +/// Makes you run faster for the duration +/datum/status_effect/carp_invigoration + id = "carp_invigorated" + alert_type = null + duration = 8 SECONDS + +/datum/status_effect/carp_invigoration/on_apply() + . = ..() + if (!.) + return + owner.add_filter("anger_glow", 3, list("type" = "outline", "color" = COLOR_CARP_RIFT_RED, "size" = 2)) + owner.add_movespeed_modifier(/datum/movespeed_modifier/dragon_rage) + +/datum/status_effect/carp_invigoration/on_remove() + owner.remove_filter("anger_glow") + owner.remove_movespeed_modifier(/datum/movespeed_modifier/dragon_rage) diff --git a/code/modules/mob/living/basic/space_fauna/space_dragon/dragon_gust.dm b/code/modules/mob/living/basic/space_fauna/space_dragon/dragon_gust.dm new file mode 100644 index 000000000000..074804de86c9 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/space_dragon/dragon_gust.dm @@ -0,0 +1,94 @@ +/// Default additional time to spend stunned per usage of ability +#define DEFAULT_ACTIVATED_ENDLAG 3 DECISECONDS + +/// Rise into the air and slam down, knocking people away. No real cooldown but has escalating endlag if used in quick succession. +/datum/action/cooldown/mob_cooldown/wing_buffet + name = "Wing Buffet" + desc = "Rise into the air and release a powerful gust from your wings, blowing attackers away. Becomes more tiring if used in quick succession." + button_icon = 'icons/effects/magic.dmi' + button_icon_state = "tornado" + cooldown_time = 1 SECONDS + melee_cooldown_time = 0 + click_to_activate = FALSE + shared_cooldown = NONE + /// Timer we use to track our current action + var/active_timer + /// How far away can we reach people? + var/gust_distance = 4 + /// How long to animate for before we start? + var/windup_time = 1.2 SECONDS + /// Minimum amount of stun time following use of wing buffet + var/minimum_endlag = 4 DECISECONDS + /// Amount of extra time to stay stunned after the end of the ability + var/additional_endlag = 0 DECISECONDS + /// Amount of time to add to endlag after each successful use of the ability + var/endlag_per_activation = DEFAULT_ACTIVATED_ENDLAG + /// How much accumulated stun time do we subtract every second? Takes a full minute to regen off a single use :( + var/endlag_decay_per_second = DEFAULT_ACTIVATED_ENDLAG / 60 + /// Increase the effect of our accumulated additional stun time by this much if space dragon has lost some rifts + var/exhaustion_multiplier = 5 + /// List of traits we apply while the ability is ongoing, stops us from moving around and such + var/static/list/applied_traits = list( + TRAIT_IMMOBILIZED, + TRAIT_INCAPACITATED, + TRAIT_NO_FLOATING_ANIM, + TRAIT_WING_BUFFET, + ) + +/datum/action/cooldown/mob_cooldown/wing_buffet/Grant(mob/granted_to) + . = ..() + RegisterSignal(granted_to, COMSIG_LIVING_LIFE, PROC_REF(on_life)) + +/datum/action/cooldown/mob_cooldown/wing_buffet/Remove(mob/removed_from) + . = ..() + deltimer(active_timer) + UnregisterSignal(removed_from, COMSIG_LIVING_LIFE) + removed_from.remove_traits(applied_traits + TRAIT_WING_BUFFET_TIRED, REF(src)) + +/// Decay our accumulated additional tiredness +/datum/action/cooldown/mob_cooldown/wing_buffet/proc/on_life(mob/living/liver, seconds_per_tick, times_fired) + SIGNAL_HANDLER + if (liver.stat == DEAD) + return // not so life now buddy + additional_endlag = max(0, additional_endlag - (endlag_decay_per_second * seconds_per_tick)) + +/datum/action/cooldown/mob_cooldown/wing_buffet/Activate(atom/target) + begin_sequence() + StartCooldown() + return TRUE + +/// Rise up into the air +/datum/action/cooldown/mob_cooldown/wing_buffet/proc/begin_sequence() + owner.add_traits(applied_traits, REF(src)) // No moving till we're done + owner.update_appearance(UPDATE_ICON) + animate(owner, pixel_y = 20, time = windup_time) + active_timer = addtimer(CALLBACK(src, PROC_REF(ground_pound)), windup_time, TIMER_DELETE_ME | TIMER_STOPPABLE) + +/// Slam into the ground +/datum/action/cooldown/mob_cooldown/wing_buffet/proc/ground_pound() + if (QDELETED(owner)) + return + owner.pixel_y = 0 + playsound(owner, 'sound/effects/gravhit.ogg', 100, TRUE) + for (var/mob/living/candidate in view(gust_distance, owner)) + if(candidate == owner || candidate.faction_check_atom(owner)) + continue + owner.visible_message(span_boldwarning("[candidate] is knocked back by the gust!")) + to_chat(candidate, span_userdanger("You're knocked back by the gust!")) + var/dir_to_target = get_dir(get_turf(owner), get_turf(candidate)) + var/throwtarget = get_edge_target_turf(target, dir_to_target) + candidate.safe_throw_at(throwtarget, range = 10, speed = 1, thrower = owner) + candidate.Paralyze(5 SECONDS) + + var/endlag_multiplier = HAS_TRAIT(owner, TRAIT_RIFT_FAILURE) ? exhaustion_multiplier : 1 + var/stun_time = minimum_endlag + (additional_endlag * endlag_multiplier) + additional_endlag += endlag_per_activation * endlag_multiplier // double dips, rough + ADD_TRAIT(owner, TRAIT_WING_BUFFET_TIRED, REF(src)) + owner.update_appearance(UPDATE_ICON) + active_timer = addtimer(CALLBACK(src, PROC_REF(complete_ability)), stun_time, TIMER_DELETE_ME | TIMER_STOPPABLE) + +/datum/action/cooldown/mob_cooldown/wing_buffet/proc/complete_ability() + owner.remove_traits(applied_traits + TRAIT_WING_BUFFET_TIRED, REF(src)) + owner.update_appearance(UPDATE_ICON) + +#undef DEFAULT_ACTIVATED_ENDLAG diff --git a/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm b/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm new file mode 100644 index 000000000000..549f352b990a --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm @@ -0,0 +1,230 @@ +/// You can't make a dragon darker than this, it'd be hard to see +#define REJECT_DARK_COLOUR_THRESHOLD 50 +/// Any interactions executed by the space dragon +#define DOAFTER_SOURCE_SPACE_DRAGON_INTERACTION "space dragon interaction" + +/** + * Advanced stage of the space carp life cycle, spawned as a midround antagonist or via traitor transformation. + * Can eat corpses to heal, blow people back with its wings, and obviously as a dragon it breathes fire. It can even tear through walls. + * The midround even version also creates rifts which summon carp, and heals when near them. + */ +/mob/living/basic/space_dragon + name = "Space Dragon" + desc = "A serpentine leviathan whose flight defies all modern understanding of physics. Said to be the ultimate stage in the life cycle of the Space Carp." + icon = 'icons/mob/nonhuman-player/spacedragon.dmi' + icon_state = "spacedragon" + icon_living = "spacedragon" + icon_dead = "spacedragon_dead" + health_doll_icon = "spacedragon" + faction = list(FACTION_CARP) + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 + gender = NEUTER + maxHealth = 400 + health = 400 + unsuitable_cold_damage = 0 + unsuitable_heat_damage = 0 + unsuitable_atmos_damage = 0 + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0.5, OXY = 1) + istate = ISTATE_HARM + speed = 0 + movement_type = FLYING + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" + attack_sound = 'sound/magic/demon_attack1.ogg' + attack_vis_effect = ATTACK_EFFECT_BITE + obj_damage = 50 + melee_damage_upper = 35 + melee_damage_lower = 35 + melee_attack_cooldown = CLICK_CD_MELEE + mob_size = MOB_SIZE_LARGE + armour_penetration = 30 + pixel_x = -16 + base_pixel_x = -16 + maptext_height = 64 + maptext_width = 64 + mouse_opacity = MOUSE_OPACITY_ICON + death_sound = 'sound/creatures/space_dragon_roar.ogg' + death_message = "screeches in agony as it collapses to the floor, its life extinguished." + butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30) + + /// The colour of the space dragon + var/chosen_colour + /// Minimum devastation damage dealt coefficient based on max health + var/devastation_damage_min_percentage = 0.4 + /// Maximum devastation damage dealt coefficient based on max health + var/devastation_damage_max_percentage = 0.75 + /// Our fire breath action + var/datum/action/cooldown/mob_cooldown/fire_breath/carp/fire_breath + /// Our wing flap action + var/datum/action/cooldown/mob_cooldown/wing_buffet/buffet + +/mob/living/basic/space_dragon/Initialize(mapload) + . = ..() + add_traits(list(TRAIT_SPACEWALK, TRAIT_FREE_HYPERSPACE_MOVEMENT, TRAIT_NO_FLOATING_ANIM, TRAIT_HEALS_FROM_CARP_RIFTS), INNATE_TRAIT) + AddElement(/datum/element/simple_flying) + AddElement(/datum/element/content_barfer) + AddElement(/datum/element/wall_tearer, do_after_key = DOAFTER_SOURCE_SPACE_DRAGON_INTERACTION) + AddElement(/datum/element/door_pryer, pry_time = 4 SECONDS, interaction_key = DOAFTER_SOURCE_SPACE_DRAGON_INTERACTION) + AddComponent(/datum/component/seethrough_mob) + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) + RegisterSignal(src, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_changed)) + RegisterSignal(src, COMSIG_ATOM_PRE_EX_ACT, PROC_REF(on_exploded)) + + fire_breath = new(src) + fire_breath.Grant(src) + + buffet = new(src) + buffet.Grant(src) + +/mob/living/basic/space_dragon/Destroy() + QDEL_NULL(fire_breath) + QDEL_NULL(buffet) + return ..() + +/mob/living/basic/space_dragon/Login() + . = ..() + if(!isnull(chosen_colour)) + return + rename_dragon() + select_colour() + +/// Allows the space dragon to pick a funny name +/mob/living/basic/space_dragon/proc/rename_dragon() + var/chosen_name = sanitize_name(reject_bad_text(tgui_input_text(src, "What would you like your name to be?", "Choose Your Name", real_name, MAX_NAME_LEN))) + if(!chosen_name) // Null or empty or rejected + to_chat(src, span_warning("Not a valid name, please try again.")) + rename_dragon() + return + to_chat(src, span_notice("Your name is now [span_name("[chosen_name]")], the feared Space Dragon.")) + fully_replace_character_name(null, chosen_name) + +/// Select scale colour with the colour picker +/mob/living/basic/space_dragon/proc/select_colour() + chosen_colour = input(src, "What colour would you like to be?" ,"Colour Selection", COLOR_WHITE) as color|null + if(!chosen_colour) // Redo proc until we get a color + to_chat(src, span_warning("Not a valid colour, please try again.")) + select_colour() + return + var/temp_hsv = RGBtoHSV(chosen_colour) + if(ReadHSV(temp_hsv)[3] < REJECT_DARK_COLOUR_THRESHOLD) + to_chat(src, span_danger("Invalid colour. Your colour is not bright enough.")) + select_colour() + return + add_atom_colour(chosen_colour, FIXED_COLOUR_PRIORITY) + update_appearance(UPDATE_OVERLAYS) + +/mob/living/basic/space_dragon/update_icon_state() + . = ..() + if (stat == DEAD) + return + if (!HAS_TRAIT(src, TRAIT_WING_BUFFET)) + icon_state = icon_living + return + if (HAS_TRAIT(src, TRAIT_WING_BUFFET_TIRED)) + icon_state = "spacedragon_gust_2" + return + icon_state = "spacedragon_gust" + +/mob/living/basic/space_dragon/update_overlays() + . = ..() + var/overlay_state = "overlay_base" + if (stat == DEAD) + overlay_state = "overlay_dead" + else if (HAS_TRAIT(src, TRAIT_WING_BUFFET_TIRED)) + overlay_state = "overlay_gust_2" + else if (HAS_TRAIT(src, TRAIT_WING_BUFFET)) + overlay_state = "overlay_gust" + + var/mutable_appearance/overlay = mutable_appearance(icon, overlay_state) + overlay.appearance_flags = RESET_COLOR + . += overlay + +/mob/living/basic/space_dragon/melee_attack(obj/vehicle/sealed/mecha/target, list/modifiers, ignore_cooldown) + . = ..() + if (!. || !ismecha(target)) + return + target.take_damage(obj_damage, BRUTE, MELEE) + +/// Before we attack something, check if we want to do something else instead +/mob/living/basic/space_dragon/proc/pre_attack(mob/living/source, atom/target) + SIGNAL_HANDLER + if (target == src) + return COMPONENT_HOSTILE_NO_ATTACK // Easy to misclick yourself, let's not + if (DOING_INTERACTION(source, DOAFTER_SOURCE_SPACE_DRAGON_INTERACTION)) + balloon_alert(source, "busy!") + return COMPONENT_HOSTILE_NO_ATTACK + if (!isliving(target)) + return + var/mob/living/living_target = target + if (living_target.stat != DEAD) + return + INVOKE_ASYNC(src, PROC_REF(try_eat), living_target) + return COMPONENT_HOSTILE_NO_ATTACK + +/// Try putting something inside us +/mob/living/basic/space_dragon/proc/try_eat(mob/living/food) + balloon_alert(src, "swallowing...") + if (do_after(src, 3 SECONDS, target = food)) + eat(food) + +/// Succeed in putting something inside us +/mob/living/basic/space_dragon/proc/eat(mob/living/food) + adjust_health(-food.maxHealth * 0.25) + if (QDELETED(food) || food.loc == src) + return FALSE + playsound(src, 'sound/magic/demon_attack1.ogg', 60, TRUE) + visible_message(span_boldwarning("[src] swallows [food] whole!")) + food.extinguish_mob() // It's wet in there, and our food is likely to be on fire. Let's be decent and not husk them. + food.forceMove(src) + return TRUE + +/mob/living/basic/space_dragon/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + . = ..() + if (isliving(arrived)) + RegisterSignal(arrived, COMSIG_MOB_STATCHANGE, PROC_REF(eaten_stat_changed)) + +/mob/living/basic/space_dragon/Exited(atom/movable/gone, direction) + . = ..() + if (isliving(gone)) + UnregisterSignal(gone, COMSIG_MOB_STATCHANGE) + +/// Release consumed mobs if they transition from dead to alive +/mob/living/basic/space_dragon/proc/eaten_stat_changed(mob/living/eaten) + SIGNAL_HANDLER + if (eaten.stat == DEAD) + return + new /obj/effect/decal/cleanable/vomit(loc) + playsound(src, 'sound/effects/splat.ogg', vol = 50, vary = TRUE) + visible_message(span_danger("[src] vomits up [eaten]!")) + eaten.forceMove(loc) + eaten.Paralyze(5 SECONDS) + +/mob/living/basic/space_dragon/RangedAttack(atom/target, modifiers) + fire_breath.Trigger(target = target) + +/mob/living/basic/space_dragon/ranged_secondary_attack(atom/target, modifiers) + buffet.Trigger() + +/// When our stat changes, make sure we are using the correct overlay +/mob/living/basic/space_dragon/proc/on_stat_changed() + SIGNAL_HANDLER + update_appearance(UPDATE_OVERLAYS) + +/// We take devastating bomb damage as a random percentage of our maximum health instead of being gibbed +/mob/living/basic/space_dragon/proc/on_exploded(mob/living/source, severity, target, origin) + SIGNAL_HANDLER + if (severity != EXPLODE_DEVASTATE) + return + var/damage_coefficient = rand(devastation_damage_min_percentage, devastation_damage_max_percentage) + adjustBruteLoss(initial(maxHealth)*damage_coefficient) + return COMPONENT_CANCEL_EX_ACT // we handled it + +/// Subtype used by the midround/event +/mob/living/basic/space_dragon/spawn_with_antag + +/mob/living/basic/space_dragon/spawn_with_antag/mind_initialize() + . = ..() + mind.add_antag_datum(/datum/antagonist/space_dragon) + +#undef REJECT_DARK_COLOUR_THRESHOLD +#undef DOAFTER_SOURCE_SPACE_DRAGON_INTERACTION diff --git a/code/modules/mob/living/basic/space_fauna/spaceman.dm b/code/modules/mob/living/basic/space_fauna/spaceman.dm index d89574dfca3b..417b2feda89f 100644 --- a/code/modules/mob/living/basic/space_fauna/spaceman.dm +++ b/code/modules/mob/living/basic/space_fauna/spaceman.dm @@ -32,7 +32,7 @@ /datum/ai_controller/basic_controller/spaceman blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_ai.dm b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_ai.dm index 24148e7c071a..25fcb3b7a4cf 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_ai.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spider_ai.dm @@ -1,10 +1,10 @@ /// Attacks people it can see, spins webs if it can't see anything to attack. /datum/ai_controller/basic_controller/giant_spider blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) - ai_traits = STOP_MOVING_WHEN_PULLED + ai_traits = STOP_MOVING_WHEN_PULLED | PAUSE_DURING_DO_AFTER ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking @@ -30,7 +30,7 @@ /// Used by Araneus, who only attacks those who attack first. He is house-trained and will not web up the HoS office. /datum/ai_controller/basic_controller/giant_spider/retaliate blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) planning_subtrees = list( @@ -43,9 +43,8 @@ /// Retaliates, hunts other maintenance creatures, runs away from larger attackers, and spins webs. /datum/ai_controller/basic_controller/giant_spider/pest blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/of_size/ours_or_smaller(), // Hunt mobs our size - BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic/of_size/larger(), // Run away from mobs bigger than we are - BB_BASIC_MOB_FLEEING = TRUE, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/of_size/ours_or_smaller, // Hunt mobs our size + BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic/of_size/larger, // Run away from mobs bigger than we are ) idle_behavior = /datum/idle_behavior/idle_random_walk diff --git a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm index 6189a084a5c2..d436e69b1af9 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/giant_spider/giant_spiders.dm @@ -225,7 +225,6 @@ heal_brute = 15,\ heal_burn = 15,\ heal_time = 3 SECONDS,\ - self_targetting = HEALING_TOUCH_SELF_ONLY,\ interaction_key = DOAFTER_SOURCE_SPIDER,\ valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/growing/young/tangle, /mob/living/basic/spider/giant/tangle)),\ extra_checks = CALLBACK(src, PROC_REF(can_mend)),\ @@ -497,7 +496,6 @@ AddComponent(/datum/component/healing_touch,\ heal_brute = 45,\ heal_burn = 45,\ - self_targetting = HEALING_TOUCH_SELF_ONLY,\ interaction_key = DOAFTER_SOURCE_SPIDER,\ valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/giant/hunter/flesh)),\ extra_checks = CALLBACK(src, PROC_REF(can_mend)),\ diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider.dm b/code/modules/mob/living/basic/space_fauna/spider/spider.dm index 91b823eac1da..817520fdd308 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider.dm @@ -48,7 +48,7 @@ /mob/living/basic/spider/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_WEB_SURFER, INNATE_TRAIT) + add_traits(list(TRAIT_WEB_SURFER, TRAIT_FENCE_CLIMBER), INNATE_TRAIT) AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) AddElement(/datum/element/nerfed_pulling, GLOB.typecache_general_bad_things_to_easily_move) AddElement(/datum/element/prevent_attacking_of_types, GLOB.typecache_general_bad_hostile_attack_targets, "this tastes awful!") diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/lay_eggs.dm b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/lay_eggs.dm index 28a543be3acf..01477cd84354 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/lay_eggs.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/lay_eggs.dm @@ -5,7 +5,6 @@ button_icon_state = "lay_eggs" background_icon_state = "bg_alien" overlay_icon_state = "bg_alien_border" - check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED cooldown_time = 0 melee_cooldown_time = 0 shared_cooldown = NONE diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web.dm b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web.dm index b7062a2dc17c..d4f587c93864 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/web.dm @@ -6,7 +6,6 @@ button_icon_state = "lay_web" background_icon_state = "bg_alien" overlay_icon_state = "bg_alien_border" - check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED cooldown_time = 0 SECONDS melee_cooldown_time = 0 shared_cooldown = NONE diff --git a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/wrap.dm b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/wrap.dm index 536f09cef8d1..e7771f075a87 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/wrap.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spider_abilities/wrap.dm @@ -8,7 +8,6 @@ overlay_icon_state = "bg_alien_border" button_icon = 'icons/mob/actions/actions_animal.dmi' button_icon_state = "wrap_0" - check_flags = AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED click_to_activate = TRUE ranged_mousepointer = 'icons/effects/mouse_pointers/wrap_target.dmi' shared_cooldown = NONE diff --git a/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling.dm b/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling.dm index a09107aebf41..56ffded6d3cd 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/spiderlings/spiderling.dm @@ -59,8 +59,7 @@ /// Opportunistically hops in and out of vents, if it can find one. We aren't interested in attacking due to how weak we are, we gotta be quick and hidey. /datum/ai_controller/basic_controller/spiderling blackboard = list( - BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic/of_size/larger, // Run away from mobs bigger than we are - BB_BASIC_MOB_FLEEING = TRUE, + BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic/of_size/larger, // Run away from mobs bigger than we are BB_VENTCRAWL_COOLDOWN = 20 SECONDS, // enough time to get splatted while we're out in the open. BB_TIME_TO_GIVE_UP_ON_VENT_PATHING = 30 SECONDS, ) diff --git a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm index 57b9da542b70..43a31df366be 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider.dm @@ -29,7 +29,8 @@ /// Used by all young spiders if they ever appear. /datum/ai_controller/basic_controller/young_spider blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_BASIC_MOB_FLEE_DISTANCE = 6, ) ai_traits = STOP_MOVING_WHEN_PULLED @@ -46,6 +47,3 @@ /datum/ai_planning_subtree/find_unwebbed_turf, /datum/ai_planning_subtree/spin_web, ) - -/datum/ai_behavior/run_away_from_target/young_spider - run_distance = 6 diff --git a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm index 4e100fc0af49..8eaa92b58fc2 100644 --- a/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm +++ b/code/modules/mob/living/basic/space_fauna/spider/young_spider/young_spider_subtypes.dm @@ -122,7 +122,6 @@ heal_brute = 10,\ heal_burn = 10,\ heal_time = 3 SECONDS,\ - self_targetting = HEALING_TOUCH_SELF_ONLY,\ interaction_key = DOAFTER_SOURCE_SPIDER,\ valid_targets_typecache = typecacheof(list(/mob/living/basic/spider/growing/young/tangle, /mob/living/basic/spider/giant/tangle)),\ extra_checks = CALLBACK(src, PROC_REF(can_mend)),\ diff --git a/code/modules/mob/living/basic/space_fauna/statue/statue.dm b/code/modules/mob/living/basic/space_fauna/statue/statue.dm index 938914a7f64a..f906044cdab6 100644 --- a/code/modules/mob/living/basic/space_fauna/statue/statue.dm +++ b/code/modules/mob/living/basic/space_fauna/statue/statue.dm @@ -27,6 +27,7 @@ attack_verb_simple = "claw" attack_sound = 'sound/hallucinations/growl1.ogg' attack_vis_effect = ATTACK_EFFECT_CLAW + melee_attack_cooldown = 1 SECONDS faction = list(FACTION_STATUE) speak_emote = list("screams") @@ -144,14 +145,14 @@ /datum/ai_controller/basic_controller/statue blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_LOW_PRIORITY_HUNTING_TARGET = null, // lights ) ai_movement = /datum/ai_movement/basic_avoidance planning_subtrees = list( /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/statue, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/find_and_hunt_target/look_for_light_fixtures, ) @@ -160,3 +161,20 @@ /datum/ai_behavior/basic_melee_attack/statue action_cooldown = 1 SECONDS + +/mob/living/basic/statue/frosty + name = "Frosty" + desc = "Just a snowman. Just a snowman. Oh god, it's just a snowman." + icon_dead = "snowman" + icon_living = "snowman" + icon_state = "snowman" + health = 5000 + maxHealth = 5000 + melee_damage_lower = 65 + melee_damage_upper = 65 + faction = list("statue","mining") + +/mob/living/basic/statue/frosty/Initialize(mapload) + . = ..() + var/static/list/death_loot = list(/obj/item/dnainjector/geladikinesis) + AddElement(/datum/element/death_drops, death_loot) diff --git a/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm b/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm new file mode 100644 index 000000000000..02fd9ed1bcf1 --- /dev/null +++ b/code/modules/mob/living/basic/space_fauna/supermatter_spider.dm @@ -0,0 +1,102 @@ +/// A nasty little robotic bug that dusts people on attack. Jeepers. This should be a very, very, very rare spawn. +/mob/living/basic/supermatter_spider + name = "supermatter spider" + desc= "A sliver of supermatter placed upon a robotically enhanced pedestal." + + icon = 'icons/mob/simple/smspider.dmi' + icon_state = "smspider" + icon_living = "smspider" + icon_dead = "smspider_dead" + + gender = NEUTER + mob_biotypes = MOB_BUG|MOB_ROBOTIC + speak_emote = list("vibrates") + + + attack_verb_continuous = "slices" + attack_verb_simple = "slice" + attack_sound = 'sound/effects/supermatter.ogg' + attack_vis_effect = ATTACK_EFFECT_CLAW + + maxHealth = 10 + health = 10 + minimum_survivable_temperature = TCMB + maximum_survivable_temperature = T0C + 1250 + habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + death_message = "falls to the ground, its shard dulling to a miserable grey!" + + faction = list(FACTION_HOSTILE) + + // Gold, supermatter tinted + lighting_cutoff_red = 30 + lighting_cutoff_green = 30 + lighting_cutoff_blue = 10 + + ai_controller = /datum/ai_controller/basic_controller/supermatter_spider + + /// If we successfully dust something, should we die? + var/single_use = TRUE + +/mob/living/basic/supermatter_spider/Initialize(mapload) + . = ..() + AddComponent(/datum/component/swarming) + + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/footstep, FOOTSTEP_MOB_CLAW) + + RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_attack)) + +/// Proc that we call on attacking something to dust 'em. +/mob/living/basic/supermatter_spider/proc/on_attack(mob/living/basic/source, atom/target) + SIGNAL_HANDLER + + if(isliving(target)) + var/mob/living/victim = target + victim.investigate_log("has been dusted by [src].", INVESTIGATE_DEATHS) + dust_feedback(target) + victim.dust() + if(single_use) + death() + return COMPONENT_HOSTILE_NO_ATTACK + + if(!isturf(target)) + dust_feedback(target) + qdel(target) + if(single_use) + death() + return COMPONENT_HOSTILE_NO_ATTACK + +/// Simple proc that plays the supermatter dusting sound and sends a visible message. +/mob/living/basic/supermatter_spider/proc/dust_feedback(atom/target) + playsound(get_turf(src), 'sound/effects/supermatter.ogg', 10, TRUE) + visible_message(span_danger("[src] knocks into [target], turning [target.p_them()] to dust in a brilliant flash of light!")) + +/mob/living/basic/supermatter_spider/overcharged + name = "overcharged supermatter spider" + desc = "A sliver of overcharged supermatter placed upon a robotically enhanced pedestal. This one seems especially dangerous." + icon_state = "smspideroc" + icon_living = "smspideroc" + maxHealth = 25 + health = 25 + single_use = FALSE + +/datum/ai_controller/basic_controller/supermatter_spider + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/random_speech/supermatter_spider, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + ) + +/datum/ai_planning_subtree/random_speech/supermatter_spider + speech_chance = 7 + emote_hear = list("clinks", "clanks") + emote_see = list("vibrates") diff --git a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm index 485343c0a496..72226ec3e5de 100644 --- a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm +++ b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/fugu_gland.dm @@ -15,7 +15,7 @@ if(fugu_blacklist) return fugu_blacklist = typecacheof(list( - /mob/living/simple_animal/hostile/guardian, + /mob/living/basic/guardian, )) /obj/item/fugu_gland/afterattack(atom/target, mob/user, proximity_flag) @@ -32,6 +32,7 @@ return ADD_TRAIT(animal, TRAIT_FUGU_GLANDED, type) + animal.AddComponent(/datum/component/seethrough_mob) animal.maxHealth *= 1.5 animal.health = min(animal.maxHealth, animal.health * 1.5) animal.melee_damage_lower = max((animal.melee_damage_lower * 2), 10) diff --git a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/inflation.dm b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/inflation.dm index d459648892b0..a9e2b538bdd7 100644 --- a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/inflation.dm +++ b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/inflation.dm @@ -65,7 +65,7 @@ fugu.melee_damage_upper = 20 fugu.status_flags |= GODMODE fugu.obj_damage = 60 - fugu.ai_controller.set_blackboard_key(BB_BASIC_MOB_FLEEING, FALSE) + fugu.ai_controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, TRUE) fugu.ai_controller.CancelActions() /datum/status_effect/inflated/on_remove() @@ -84,7 +84,7 @@ if (fugu.stat != DEAD) fugu.icon_state = "Fugu0" fugu.obj_damage = 0 - fugu.ai_controller.set_blackboard_key(BB_BASIC_MOB_FLEEING, TRUE) + fugu.ai_controller.set_blackboard_key(BB_BASIC_MOB_STOP_FLEEING, FALSE) fugu.ai_controller.CancelActions() /// Remove status effect if we die diff --git a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_ai.dm b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_ai.dm index f632a38dc1b2..1b4e2cdd6201 100644 --- a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_ai.dm +++ b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_ai.dm @@ -1,10 +1,7 @@ -#define WUMBO_ATTACK_COOLDOWN 2.5 SECONDS - /// Cowardly when small, aggressive when big. Tries to transform whenever possible. /datum/ai_controller/basic_controller/wumborian_fugu blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), - BB_BASIC_MOB_FLEEING = TRUE, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance @@ -15,23 +12,15 @@ /datum/ai_planning_subtree/targeted_mob_ability/inflate, /datum/ai_planning_subtree/flee_target, /datum/ai_planning_subtree/attack_obstacle_in_path/wumborian_fugu, - /datum/ai_planning_subtree/basic_melee_attack_subtree/wumborian_fugu, + /datum/ai_planning_subtree/basic_melee_attack_subtree, ) -/datum/ai_planning_subtree/basic_melee_attack_subtree/wumborian_fugu - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/wumborian_fugu - -/datum/ai_behavior/basic_melee_attack/wumborian_fugu - action_cooldown = WUMBO_ATTACK_COOLDOWN - /datum/ai_planning_subtree/attack_obstacle_in_path/wumborian_fugu attack_behaviour = /datum/ai_behavior/attack_obstructions/wumborian_fugu /datum/ai_behavior/attack_obstructions/wumborian_fugu can_attack_turfs = TRUE - action_cooldown = WUMBO_ATTACK_COOLDOWN + action_cooldown = 2.5 SECONDS /datum/ai_planning_subtree/targeted_mob_ability/inflate ability_key = BB_FUGU_INFLATE - -#undef WUMBO_ATTACK_COOLDOWN diff --git a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_fugu.dm b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_fugu.dm index 76334fe22fee..d963bdf41016 100644 --- a/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_fugu.dm +++ b/code/modules/mob/living/basic/space_fauna/wumborian_fugu/wumborian_fugu.dm @@ -29,6 +29,7 @@ melee_damage_upper = 0 attack_sound = 'sound/weapons/punch1.ogg' attack_vis_effect = ATTACK_EFFECT_BITE + melee_attack_cooldown = 2.5 SECONDS attack_verb_continuous = "chomps" attack_verb_simple = "chomp" friendly_verb_continuous = "floats near" @@ -49,7 +50,9 @@ /mob/living/basic/wumborian_fugu/Initialize(mapload) . = ..() - AddElement(/datum/element/death_drops, loot = list(/obj/item/fugu_gland)) + AddComponent(/datum/component/seethrough_mob) + var/static/list/death_loot = list(/obj/item/fugu_gland) + AddElement(/datum/element/death_drops, death_loot) add_traits(list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE), ROUNDSTART_TRAIT) expand = new(src) expand.Grant(src) diff --git a/code/modules/mob/living/basic/syndicate/syndicate_ai.dm b/code/modules/mob/living/basic/syndicate/syndicate_ai.dm deleted file mode 100644 index 9e2c86e36023..000000000000 --- a/code/modules/mob/living/basic/syndicate/syndicate_ai.dm +++ /dev/null @@ -1,71 +0,0 @@ -/datum/ai_controller/basic_controller/syndicate - blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/syndicate() - ) - - ai_movement = /datum/ai_movement/basic_avoidance - idle_behavior = /datum/idle_behavior/idle_random_walk - planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/attack_obstacle_in_path/syndicate, - /datum/ai_planning_subtree/basic_melee_attack_subtree/syndicate - ) - -/datum/targetting_datum/basic/syndicate - stat_attack = HARD_CRIT - -/datum/ai_planning_subtree/basic_melee_attack_subtree/syndicate - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/syndicate - -/datum/ai_behavior/basic_melee_attack/syndicate - action_cooldown = 1.2 SECONDS - -/datum/ai_planning_subtree/attack_obstacle_in_path/syndicate - attack_behaviour = /datum/ai_behavior/attack_obstructions/syndicate - -/datum/ai_behavior/attack_obstructions/syndicate - action_cooldown = 1.2 SECONDS - -/datum/ai_controller/basic_controller/syndicate/ranged - planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_ranged_attack_subtree/syndicate - ) -/datum/ai_planning_subtree/basic_ranged_attack_subtree/syndicate - ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/syndicate - -/datum/ai_behavior/basic_ranged_attack/syndicate - required_distance = 5 - -/datum/ai_controller/basic_controller/syndicate/ranged/burst - planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_ranged_attack_subtree/syndicate_burst - ) - -/datum/ai_planning_subtree/basic_ranged_attack_subtree/syndicate_burst - ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/syndicate_burst - -/datum/ai_behavior/basic_ranged_attack/syndicate_burst - shots = 3 - action_cooldown = 3 SECONDS - -/datum/ai_controller/basic_controller/syndicate/ranged/shotgunner - planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_ranged_attack_subtree/syndicate_shotgun - ) - -/datum/ai_planning_subtree/basic_ranged_attack_subtree/syndicate_shotgun - ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/syndicate_shotgun - -/datum/ai_behavior/basic_ranged_attack/syndicate_shotgun - shots = 2 - burst_interval = 0.6 SECONDS - action_cooldown = 3 SECONDS - required_distance = 1 - -/datum/ai_controller/basic_controller/syndicate/viscerator - blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic() - ) diff --git a/code/modules/mob/living/basic/trader/trader.dm b/code/modules/mob/living/basic/trader/trader.dm new file mode 100644 index 000000000000..52b1ab5ab711 --- /dev/null +++ b/code/modules/mob/living/basic/trader/trader.dm @@ -0,0 +1,78 @@ +/mob/living/basic/trader + name = "Trader" + desc = "Come buy some!" + unique_name = FALSE + icon = 'icons/mob/simple/simple_human.dmi' + maxHealth = 200 + health = 200 + melee_damage_lower = 10 + melee_damage_upper = 10 + attack_verb_continuous = "punches" + attack_verb_simple = "punch" + attack_sound = 'sound/weapons/punch1.ogg' + basic_mob_flags = DEL_ON_DEATH + unsuitable_atmos_damage = 2.5 + move_resist = MOVE_FORCE_STRONG + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + sentience_type = SENTIENCE_HUMANOID + speed = 0 + + ai_controller = /datum/ai_controller/basic_controller/trader + + ///Sound used when item sold/bought + var/sell_sound = 'sound/effects/cashregister.ogg' + ///The currency name + var/currency_name = "credits" + ///The spawner we use to create our look + var/spawner_path = /obj/effect/mob_spawn/corpse/human/generic_assistant + ///Our species to create our look + var/species_path = /datum/species/human + ///The loot we drop when we die + var/loot = list(/obj/effect/mob_spawn/corpse/human/generic_assistant) + ///Casing used to shoot during retaliation + var/ranged_attack_casing = /obj/item/ammo_casing/shotgun/buckshot + ///Sound to make while doing a retalitory attack + var/ranged_attack_sound = 'sound/weapons/gun/pistol/shot.ogg' + ///Weapon path, for visuals + var/held_weapon_visual = /obj/item/gun/ballistic/shotgun + + ///Type path for the trader datum to use for retrieving the traders wares, speech, etc + var/trader_data_path = /datum/trader_data + + +/mob/living/basic/trader/Initialize(mapload) + . = ..() + apply_dynamic_human_appearance(src, species_path = species_path, mob_spawn_path = spawner_path, r_hand = held_weapon_visual) + + var/datum/trader_data/trader_data = new trader_data_path + AddComponent(/datum/component/trader, trader_data = trader_data) + AddComponent(/datum/component/ranged_attacks, casing_type = ranged_attack_casing, projectile_sound = ranged_attack_sound, cooldown_time = 3 SECONDS) + AddElement(/datum/element/ai_retaliate) + AddElement(/datum/element/ai_swap_combat_mode, BB_BASIC_MOB_CURRENT_TARGET, string_list(trader_data.say_phrases[TRADER_BATTLE_START_PHRASE]), string_list(trader_data.say_phrases[TRADER_BATTLE_END_PHRASE])) + if(LAZYLEN(loot)) + loot = string_list(loot) + AddElement(/datum/element/death_drops, loot) + + var/datum/action/setup_shop/setup_shop = new (src, trader_data.shop_spot_type, trader_data.sign_type, trader_data.sell_sound, trader_data.say_phrases[TRADER_SHOP_OPENING_PHRASE]) + setup_shop.Grant(src) + ai_controller.set_blackboard_key(BB_SETUP_SHOP, setup_shop) + +/mob/living/basic/trader/mrbones + name = "Mr. Bones" + desc = "A skeleton merchant, he seems very humerus." + speak_emote = list("rattles") + speech_span = SPAN_SANS + mob_biotypes = MOB_UNDEAD|MOB_HUMANOID + icon_state = "mrbones" + gender = MALE + + ai_controller = /datum/ai_controller/basic_controller/trader/jumpscare + + sell_sound = 'sound/voice/hiss2.ogg' + species_path = /datum/species/skeleton + spawner_path = /obj/effect/mob_spawn/corpse/human/skeleton/mrbones + loot = list(/obj/effect/decal/remains/human) + ranged_attack_casing = /obj/item/ammo_casing/energy/bolt/halloween + held_weapon_visual = /obj/item/gun/ballistic/revolver + + trader_data_path = /datum/trader_data/mr_bones diff --git a/code/modules/mob/living/basic/trader/trader_actions.dm b/code/modules/mob/living/basic/trader/trader_actions.dm new file mode 100644 index 000000000000..ded9fbd46d0d --- /dev/null +++ b/code/modules/mob/living/basic/trader/trader_actions.dm @@ -0,0 +1,72 @@ +/datum/action/setup_shop + name = "Setup shop" + desc = "Summons a wacky sales sign, and a comfy sitting spot to conduct your business from." + button_icon = 'icons/mob/actions/actions_trader.dmi' + button_icon_state = "setup_shop" + /// The shop spot + var/datum/weakref/shop_spot_ref + /// The server this console is connected to. + var/datum/weakref/sign_ref + /// The type of the chair we sit on + var/shop_spot_type + /// The type of our advertising sign + var/sign_type + /// The sound we make when we summon our shop gear + var/shop_sound + /// Lines we say when we open our shop + var/opening_lines + +/datum/action/setup_shop/IsAvailable(feedback = FALSE) + . = ..() + if (!.) + return FALSE + if(shop_spot_ref?.resolve()) + if(feedback) + owner.balloon_alert(owner, "already set up!") + return FALSE + return TRUE + +/datum/action/setup_shop/New(Target, shop_spot_type = /obj/structure/chair/plastic, sign_type = /obj/structure/trader_sign, sell_sound = 'sound/effects/cashregister.ogg', opening_lines = list("Welcome to my shop, friend!")) + . = ..() + + src.shop_spot_type = shop_spot_type + src.sign_type = sign_type + src.shop_sound = sell_sound + src.opening_lines = opening_lines + +/datum/action/setup_shop/Trigger(trigger_flags) + . = ..() + if(!.) + return + + owner.say(pick(opening_lines)) + var/obj/shop_spot = new shop_spot_type(owner.loc) + shop_spot.dir = owner.dir + shop_spot_ref = WEAKREF(shop_spot) + owner.ai_controller?.set_blackboard_key(BB_SHOP_SPOT, shop_spot) + + playsound(owner, shop_sound, 50, TRUE) + + var/turf/sign_turf + + sign_turf = try_find_valid_spot(owner.loc, turn(shop_spot.dir, -90)) + if(isnull(sign_turf)) //No space to my left, lets try right + sign_turf = try_find_valid_spot(owner.loc, turn(shop_spot.dir, 90)) + + if(isnull(sign_turf)) + return + + var/obj/sign = sign_ref?.resolve() + if(QDELETED(sign)) + var/obj/new_sign = new sign_type(sign_turf) + sign_ref = WEAKREF(sign) + do_sparks(3, FALSE, new_sign) + else + do_teleport(sign,sign_turf) + +///Look for a spot we can place our sign on +/datum/action/setup_shop/proc/try_find_valid_spot(origin_turf, direction_to_check) + var/turf/sign_turf = get_step(origin_turf, direction_to_check) + if(sign_turf && !isgroundlessturf(sign_turf) && !isclosedturf(sign_turf) && !sign_turf.is_blocked_turf()) + return sign_turf + return null diff --git a/code/modules/mob/living/basic/trader/trader_ai.dm b/code/modules/mob/living/basic/trader/trader_ai.dm new file mode 100644 index 000000000000..5f447ab3229a --- /dev/null +++ b/code/modules/mob/living/basic/trader/trader_ai.dm @@ -0,0 +1,95 @@ +/datum/ai_controller/basic_controller/trader + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk/not_while_on_target/trader + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/trader, + /datum/ai_planning_subtree/prepare_travel_to_destination/trader, + /datum/ai_planning_subtree/travel_to_point/and_clear_target, + /datum/ai_planning_subtree/setup_shop, + ) + +/datum/ai_controller/basic_controller/trader/jumpscare + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/trader, + /datum/ai_planning_subtree/prepare_travel_to_destination/trader, + /datum/ai_planning_subtree/travel_to_point/and_clear_target, + /datum/ai_planning_subtree/setup_shop/jumpscare, + ) + +/datum/ai_planning_subtree/basic_ranged_attack_subtree/trader + ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/trader + +/datum/ai_behavior/basic_ranged_attack/trader + action_cooldown = 3 SECONDS + avoid_friendly_fire = TRUE + +///Subtree to find our very first customer and set up our shop after walking right into their face +/datum/ai_planning_subtree/setup_shop + ///What do we do in order to offer our deals? + var/datum/ai_behavior/setup_shop/setup_shop_behavior = /datum/ai_behavior/setup_shop + +/datum/ai_planning_subtree/setup_shop/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + + //If we don't have our ability, return + if(!controller.blackboard_key_exists(BB_SETUP_SHOP)) + return + + //If we already have a shop spot, return + if(controller.blackboard_key_exists(BB_SHOP_SPOT)) + return + + //If we don't have a costurmer to greet, look for one + if(!controller.blackboard_key_exists(BB_FIRST_CUSTOMER)) + controller.queue_behavior(/datum/ai_behavior/find_and_set/conscious_person, BB_FIRST_CUSTOMER, /mob/living/carbon/human) + return + + //We have our first customer, time to tell them about incredible deals + controller.queue_behavior(setup_shop_behavior, BB_FIRST_CUSTOMER) + return SUBTREE_RETURN_FINISH_PLANNING + +///The ai will create a shop the moment they see a potential costumer +/datum/ai_behavior/setup_shop + +/datum/ai_behavior/setup_shop/setup(datum/ai_controller/controller, target_key) + var/obj/target = controller.blackboard[target_key] + return !QDELETED(target) + +/datum/ai_behavior/setup_shop/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + + //We lost track of our costumer or our ability, abort + if(!controller.blackboard_key_exists(target_key) || !controller.blackboard_key_exists(BB_SETUP_SHOP)) + finish_action(controller, FALSE, target_key) + return + + var/datum/action/setup_shop/shop = controller.blackboard[BB_SETUP_SHOP] + shop.Trigger() + + controller.clear_blackboard_key(BB_FIRST_CUSTOMER) + + finish_action(controller, TRUE, target_key) + +/datum/idle_behavior/idle_random_walk/not_while_on_target/trader + target_key = BB_SHOP_SPOT + +///Version of setup show where the trader will run at you to assault you with incredible deals +/datum/ai_planning_subtree/setup_shop/jumpscare + setup_shop_behavior = /datum/ai_behavior/setup_shop/jumpscare + +/datum/ai_behavior/setup_shop/jumpscare + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_REQUIRE_REACH + +/datum/ai_behavior/setup_shop/jumpscare/setup(datum/ai_controller/controller, target_key) + . = ..() + if(.) + set_movement_target(controller, controller.blackboard[target_key]) + +/datum/ai_behavior/setup_shop/finish_action(datum/ai_controller/controller, succeeded, target_key) + . = ..() + controller.clear_blackboard_key(target_key) diff --git a/code/modules/mob/living/basic/trader/trader_data.dm b/code/modules/mob/living/basic/trader/trader_data.dm new file mode 100644 index 000000000000..9762dc02be50 --- /dev/null +++ b/code/modules/mob/living/basic/trader/trader_data.dm @@ -0,0 +1,156 @@ +///Used to contain the traders initial wares, and speech +/datum/trader_data + + ///The item that marks the shopkeeper will sit on + var/shop_spot_type = /obj/structure/chair/plastic + ///The sign that will greet the customers + var/sign_type = /obj/structure/trader_sign + ///Sound used when item sold/bought + var/sell_sound = 'sound/effects/cashregister.ogg' + ///The currency name + var/currency_name = "credits" + ///The initial products that the trader offers + var/list/initial_products = list( + /obj/item/food/burger/ghost = list(PAYCHECK_CREW * 4, INFINITY), + ) + ///The initial products that the trader buys + var/list/initial_wanteds = list( + /obj/item/ectoplasm = list(PAYCHECK_CREW * 2, INFINITY, ""), + ) + ///The speech data of the trader + var/list/say_phrases = list( + ITEM_REJECTED_PHRASE = list( + "Sorry, I'm not a fan of anything you're showing me. Give me something better and we'll talk.", + ), + ITEM_SELLING_CANCELED_PHRASE = list( + "What a shame, tell me if you changed your mind.", + ), + ITEM_SELLING_ACCEPTED_PHRASE = list( + "Pleasure doing business with you.", + ), + INTERESTED_PHRASE = list( + "Hey, you've got an item that interests me, I'd like to buy it, I'll give you some cash for it, deal?", + ), + BUY_PHRASE = list( + "Pleasure doing business with you.", + ), + NO_CASH_PHRASE = list( + "Sorry adventurer, I can't give credit! Come back when you're a little mmmmm... richer!", + ), + NO_STOCK_PHRASE = list( + "Sorry adventurer, but that item is not in stock at the moment.", + ), + NOT_WILLING_TO_BUY_PHRASE = list( + "I don't want to buy that item for the time being, check back another time.", + ), + ITEM_IS_WORTHLESS_PHRASE = list( + "This item seems to be worthless on a closer look, I won't buy this.", + ), + TRADER_HAS_ENOUGH_ITEM_PHRASE = list( + "I already bought enough of this for the time being.", + ), + TRADER_LORE_PHRASE = list( + "Hello! I am the test trader.", + "Oooooooo~!", + ), + TRADER_NOT_BUYING_ANYTHING = list( + "I'm currently buying nothing at the moment.", + ), + TRADER_NOT_SELLING_ANYTHING = list( + "I'm currently selling nothing at the moment.", + ), + TRADER_BATTLE_START_PHRASE = list( + "Thief!", + ), + TRADER_BATTLE_END_PHRASE = list( + "That is a discount I call death.", + ), + TRADER_SHOP_OPENING_PHRASE = list( + "Welcome to my shop, friend!", + ), + ) + +/** + * Depending on the passed parameter/override, returns a randomly picked string out of a list + * + * Do note when overriding this argument, you will need to ensure pick(the list) doesn't get supplied with a list of zero length + * Arguments: + * * say_text - (String) a define that matches the key of a entry in say_phrases + */ +/datum/trader_data/proc/return_trader_phrase(say_text) + if(!length(say_phrases[say_text])) + return + return pick(say_phrases[say_text]) + +/datum/trader_data/mr_bones + shop_spot_type = /obj/structure/chair/wood/wings + sign_type = /obj/structure/trader_sign/mrbones + sell_sound = 'sound/voice/hiss2.ogg' + + initial_products = list( + /obj/item/clothing/head/helmet/skull = list(PAYCHECK_CREW * 3, INFINITY), + /obj/item/clothing/mask/bandana/skull/black = list(PAYCHECK_CREW, INFINITY), + /obj/item/food/cookie/sugar/spookyskull = list(PAYCHECK_CREW * 0.2, INFINITY), + /obj/item/instrument/trombone/spectral = list(PAYCHECK_CREW * 200, INFINITY), + /obj/item/shovel/serrated = list(PAYCHECK_CREW * 3, INFINITY), + ) + + initial_wanteds = list( + /obj/item/reagent_containers/condiment/milk = list(PAYCHECK_CREW * 20, INFINITY, ""), + /obj/item/stack/sheet/bone = list(PAYCHECK_CREW * 8.4, INFINITY, ", per sheet of bone"), + ) + + say_phrases = list( + ITEM_REJECTED_PHRASE = list( + "Sorry, I'm not a fan of anything you're showing me. Give me something better and we'll talk.", + ), + ITEM_SELLING_CANCELED_PHRASE = list( + "What a shame, tell me if you changed your mind.", + ), + ITEM_SELLING_ACCEPTED_PHRASE = list( + "Pleasure doing business with you.", + ), + INTERESTED_PHRASE = list( + "Hey, you've got an item that interests me, I'd like to buy it, I'll give you some cash for it, deal?", + ), + BUY_PHRASE = list( + "Bone appetit!", + ), + NO_CASH_PHRASE = list( + "Sorry adventurer, I can't give credit! Come back when you're a little mmmmm... richer!", + ), + NO_STOCK_PHRASE = list( + "Sorry adventurer, but that item is not in stock at the moment.", + ), + NOT_WILLING_TO_BUY_PHRASE = list( + "I don't want to buy that item for the time being, check back another time.", + ), + ITEM_IS_WORTHLESS_PHRASE = list( + "This item seems to be worthless on a closer look, I won't buy this.", + ), + TRADER_HAS_ENOUGH_ITEM_PHRASE = list( + "I already bought enough of this for the time being.", + ), + TRADER_LORE_PHRASE = list( + "Hello, I am Mr. Bones!", + "The ride never ends!", + "I'd really like a refreshing carton of milk!", + "I'm willing to play big prices for BONES! Need materials to make merch, eh?", + "It's a beautiful day outside. Birds are singing, Flowers are blooming... On days like these, kids like you... Should be buying my wares!", + ), + TRADER_NOT_BUYING_ANYTHING = list( + "I'm currently buying nothing at the moment.", + ), + TRADER_NOT_SELLING_ANYTHING = list( + "I'm currently selling nothing at the moment.", + ), + TRADER_BATTLE_START_PHRASE = list( + "The ride ends for you!", + ), + TRADER_BATTLE_END_PHRASE = list( + "Mr. Bones never misses!", + ), + TRADER_SHOP_OPENING_PHRASE = list( + "My wild ride is open!", + ), + ) diff --git a/code/modules/mob/living/basic/trader/trader_items.dm b/code/modules/mob/living/basic/trader/trader_items.dm new file mode 100644 index 000000000000..173e33d4c2f6 --- /dev/null +++ b/code/modules/mob/living/basic/trader/trader_items.dm @@ -0,0 +1,36 @@ +///Sale signs +/obj/structure/trader_sign + name = "holographic store sign" + desc = "A holographic sign that promises great deals." + icon = 'icons/obj/trader_signs.dmi' + icon_state = "faceless" + anchored = TRUE + armor_type = /datum/armor/trader_sign + max_integrity = 15 + layer = FLY_LAYER + +/datum/armor/trader_sign + bullet = 50 + laser = 50 + energy = 50 + fire = 20 + acid = 20 + +/obj/structure/trader_sign/Initialize(mapload) + . = ..() + add_overlay("sign") + makeHologram() + + +/obj/structure/trader_sign/mrbones + icon_state = "mrbones" + + +///Spawners for outfits +/obj/effect/mob_spawn/corpse/human/skeleton/mrbones + mob_species = /datum/species/skeleton + outfit = /datum/outfit/mrbonescorpse + +/datum/outfit/mrbonescorpse + name = "Mr Bones' Corpse" + head = /obj/item/clothing/head/hats/tophat diff --git a/code/modules/mob/living/basic/tree.dm b/code/modules/mob/living/basic/tree.dm index f26685c1cd4a..5d20a877e9f7 100644 --- a/code/modules/mob/living/basic/tree.dm +++ b/code/modules/mob/living/basic/tree.dm @@ -54,8 +54,10 @@ /mob/living/basic/tree/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) AddElement(/datum/element/swabable, CELL_LINE_TABLE_PINE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - AddElement(/datum/element/death_drops, list(/obj/item/stack/sheet/mineral/wood)) + var/list/death_loot = string_list(list(/obj/item/stack/sheet/mineral/wood)) + AddElement(/datum/element/death_drops, death_loot) AddComponent(/datum/component/aggro_emote, emote_list = string_list(list("growls")), emote_chance = 20) /mob/living/basic/tree/Life(seconds_per_tick = SSMOBS_DT, times_fired) @@ -72,7 +74,7 @@ our_turf.air.gases[/datum/gas/carbon_dioxide][MOLES] -= amt our_turf.atmos_spawn_air("o2=[amt]") -/mob/living/basic/tree/melee_attack(atom/target, list/modifiers) +/mob/living/basic/tree/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) . = ..() if(!.) @@ -98,19 +100,13 @@ /datum/ai_controller/basic_controller/tree blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_random_walk/less_walking planning_subtrees = list( /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/tree, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/random_speech/tree, ) - -/datum/ai_planning_subtree/basic_melee_attack_subtree/tree - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/tree - -/datum/ai_behavior/basic_melee_attack/tree - action_cooldown = 2 SECONDS diff --git a/code/modules/mob/living/basic/trooper/nanotrasen.dm b/code/modules/mob/living/basic/trooper/nanotrasen.dm new file mode 100644 index 000000000000..6da3d2d9fb21 --- /dev/null +++ b/code/modules/mob/living/basic/trooper/nanotrasen.dm @@ -0,0 +1,99 @@ +/// Nanotrasen Private Security forces +/mob/living/basic/trooper/nanotrasen + name = "\improper Nanotrasen Private Security Officer" + desc = "An officer of Nanotrasen's private security force. Seems rather unpleased to meet you." + speed = 0 + melee_damage_lower = 10 + melee_damage_upper = 15 + faction = list(ROLE_DEATHSQUAD) + loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasensoldier) + mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasensoldier + +/// A variant that calls for reinforcements on spotting a target +/mob/living/basic/trooper/nanotrasen/screaming + ai_controller = /datum/ai_controller/basic_controller/trooper/calls_reinforcements + +/mob/living/basic/trooper/nanotrasen/ranged + ai_controller = /datum/ai_controller/basic_controller/trooper/ranged + r_hand = /obj/item/gun/ballistic/automatic/pistol/m1911 + /// Type of bullet we use + var/casingtype = /obj/item/ammo_casing/c45 + /// Sound to play when firing weapon + var/projectilesound = 'sound/weapons/gun/pistol/shot_alt.ogg' + /// number of burst shots + var/burst_shots + /// Time between taking shots + var/ranged_cooldown = 1 SECONDS + +/mob/living/basic/trooper/nanotrasen/ranged/Initialize(mapload) + . = ..() + AddComponent(\ + /datum/component/ranged_attacks,\ + casing_type = casingtype,\ + projectile_sound = projectilesound,\ + cooldown_time = ranged_cooldown,\ + burst_shots = burst_shots,\ + ) + if (ranged_cooldown <= 1 SECONDS) + AddComponent(/datum/component/ranged_mob_full_auto) + +/mob/living/basic/trooper/nanotrasen/ranged/smg + ai_controller = /datum/ai_controller/basic_controller/trooper/ranged/burst + casingtype = /obj/item/ammo_casing/c46x30mm + projectilesound = 'sound/weapons/gun/smg/shot.ogg' + r_hand = /obj/item/gun/ballistic/automatic/wt550 + burst_shots = 3 + ranged_cooldown = 3 SECONDS + +/mob/living/basic/trooper/nanotrasen/ranged/assault + name = "Nanotrasen Assault Officer" + desc = "Nanotrasen Assault Officer. Contact CentCom if you saw him on your station. Prepare to die, if you've been found near Syndicate property." + + casingtype = /obj/item/ammo_casing/a223/weak + burst_shots = 4 + ranged_cooldown = 3 SECONDS + projectilesound = 'sound/weapons/gun/smg/shot.ogg' + r_hand = /obj/item/gun/ballistic/automatic/ar + loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier) + mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier + +/mob/living/basic/trooper/nanotrasen/ranged/elite + name = "Nanotrasen Elite Assault Officer" + desc = "Pray for your life, syndicate. Run while you can." + maxHealth = 150 + health = 150 + habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + unsuitable_cold_damage = 0 + casingtype = /obj/item/ammo_casing/energy/laser + burst_shots = 3 + projectilesound = 'sound/weapons/laser.ogg' + ranged_cooldown = 5 SECONDS + faction = list(ROLE_DEATHSQUAD) + loot = list(/obj/effect/gibspawner/human) + mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasenelitesoldier + r_hand = /obj/item/gun/energy/pulse/carbine/lethal + +/// A more peaceful variant that will only attack when attacked, or when another Nanotrasen officer calls for help. +/mob/living/basic/trooper/nanotrasen/peaceful + desc = "An officer of Nanotrasen's private security force." + ai_controller = /datum/ai_controller/basic_controller/trooper/peaceful + +/mob/living/basic/trooper/nanotrasen/peaceful/Initialize(mapload) + . = ..() + var/datum/callback/retaliate_callback = CALLBACK(src, PROC_REF(ai_retaliate_behaviour)) + AddComponent(/datum/component/ai_retaliate_advanced, retaliate_callback) + +/mob/living/basic/trooper/nanotrasen/ranged/smg/peaceful + desc = "An officer of Nanotrasen's private security force." + ai_controller = /datum/ai_controller/basic_controller/trooper/ranged/burst/peaceful + +/mob/living/basic/trooper/nanotrasen/ranged/smg/peaceful/Initialize(mapload) + . = ..() + var/datum/callback/retaliate_callback = CALLBACK(src, PROC_REF(ai_retaliate_behaviour)) + AddComponent(/datum/component/ai_retaliate_advanced, retaliate_callback) + +/mob/living/basic/trooper/nanotrasen/proc/ai_retaliate_behaviour(mob/living/attacker) + if (!istype(attacker)) + return + for (var/mob/living/basic/trooper/nanotrasen/potential_trooper in oview(src, 7)) + potential_trooper.ai_controller.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, attacker) diff --git a/code/modules/mob/living/basic/syndicate/russian.dm b/code/modules/mob/living/basic/trooper/russian.dm similarity index 66% rename from code/modules/mob/living/basic/syndicate/russian.dm rename to code/modules/mob/living/basic/trooper/russian.dm index 8bf11eecded7..6e5e34d16b92 100644 --- a/code/modules/mob/living/basic/syndicate/russian.dm +++ b/code/modules/mob/living/basic/trooper/russian.dm @@ -1,8 +1,5 @@ -/** - * Russian subtype of Syndicate troops - * We're a subtype because we are nearly the same mob with a different Faction. - */ -/mob/living/basic/syndicate/russian +/// Russian trooper subtype +/mob/living/basic/trooper/russian name = "Russian Mobster" desc = "For the Motherland!" speed = 0 @@ -11,6 +8,10 @@ unsuitable_cold_damage = 1 unsuitable_heat_damage = 1 faction = list(FACTION_RUSSIAN) + attack_verb_continuous = "slashes" + attack_verb_simple = "slash" + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_SLASH mob_spawner = /obj/effect/mob_spawn/corpse/human/russian r_hand = /obj/item/knife/kitchen @@ -19,8 +20,8 @@ /obj/item/knife/kitchen, ) -/mob/living/basic/syndicate/russian/ranged - ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged +/mob/living/basic/trooper/russian/ranged + ai_controller = /datum/ai_controller/basic_controller/trooper/ranged mob_spawner = /obj/effect/mob_spawn/corpse/human/russian/ranged r_hand = /obj/item/gun/ballistic/automatic/pistol loot = list( @@ -30,8 +31,9 @@ var/casingtype = /obj/item/ammo_casing/n762 var/projectilesound = 'sound/weapons/gun/revolver/shot.ogg' -/mob/living/basic/syndicate/russian/ranged/Initialize(mapload) +/mob/living/basic/trooper/russian/ranged/Initialize(mapload) . = ..() AddComponent(/datum/component/ranged_attacks, casing_type = casingtype, projectile_sound = projectilesound, cooldown_time = 1 SECONDS) -/mob/living/basic/syndicate/russian/ranged/lootless + +/mob/living/basic/trooper/russian/ranged/lootless loot = list() diff --git a/code/modules/mob/living/basic/syndicate/syndicate.dm b/code/modules/mob/living/basic/trooper/syndicate.dm similarity index 64% rename from code/modules/mob/living/basic/syndicate/syndicate.dm rename to code/modules/mob/living/basic/trooper/syndicate.dm index ccd6f386b310..2c6923a63f9a 100644 --- a/code/modules/mob/living/basic/syndicate/syndicate.dm +++ b/code/modules/mob/living/basic/trooper/syndicate.dm @@ -1,43 +1,15 @@ -///////////////Base Mob//////////// - -/mob/living/basic/syndicate +/// Syndicate troopers +/mob/living/basic/trooper/syndicate name = "Syndicate Operative" desc = "Death to Nanotrasen." - icon = 'icons/mob/simple/simple_human.dmi' - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - sentience_type = SENTIENCE_HUMANOID - maxHealth = 100 - health = 100 - basic_mob_flags = DEL_ON_DEATH speed = 1.1 melee_damage_lower = 10 melee_damage_upper = 10 - attack_verb_continuous = "punches" - attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' - istate = ISTATE_HARM|ISTATE_BLOCKING - unsuitable_atmos_damage = 7.5 - unsuitable_cold_damage = 7.5 - unsuitable_heat_damage = 7.5 faction = list(ROLE_SYNDICATE) - ai_controller = /datum/ai_controller/basic_controller/syndicate - /// Loot this mob drops on death. - var/loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier) - /// Path of the mob spawner we base the mob's visuals off of. - var/mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatesoldier - /// Path of the right hand held item we give to the mob's visuals. - var/r_hand - /// Path of the left hand held item we give to the mob's visuals. - var/l_hand - -/mob/living/basic/syndicate/Initialize(mapload) - . = ..() - apply_dynamic_human_appearance(src, mob_spawn_path = mob_spawner, r_hand = r_hand, l_hand = l_hand) - if(LAZYLEN(loot)) - AddElement(/datum/element/death_drops, loot) - AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_SHOE) + loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier) + mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatesoldier -/mob/living/basic/syndicate/space +/mob/living/basic/trooper/syndicate/space name = "Syndicate Commando" maxHealth = 170 health = 170 @@ -46,18 +18,18 @@ minimum_survivable_temperature = 0 mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando -/mob/living/basic/syndicate/space/Initialize(mapload) +/mob/living/basic/trooper/syndicate/space/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) set_light(4) -/mob/living/basic/syndicate/space/stormtrooper +/mob/living/basic/trooper/syndicate/space/stormtrooper name = "Syndicate Stormtrooper" maxHealth = 250 health = 250 mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper -/mob/living/basic/syndicate/melee //dude with a knife and no shields +/mob/living/basic/trooper/syndicate/melee //dude with a knife and no shields melee_damage_lower = 15 melee_damage_upper = 15 loot = list(/obj/effect/gibspawner/human) @@ -68,13 +40,13 @@ r_hand = /obj/item/knife/combat/survival var/projectile_deflect_chance = 0 -/mob/living/basic/syndicate/melee/bullet_act(obj/projectile/projectile) +/mob/living/basic/trooper/syndicate/melee/bullet_act(obj/projectile/projectile) if(prob(projectile_deflect_chance)) visible_message(span_danger("[src] blocks [projectile] with its shield!")) return BULLET_ACT_BLOCK return ..() -/mob/living/basic/syndicate/melee/space +/mob/living/basic/trooper/syndicate/melee/space name = "Syndicate Commando" maxHealth = 170 health = 170 @@ -82,18 +54,18 @@ minimum_survivable_temperature = 0 mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando -/mob/living/basic/syndicate/melee/space/Initialize(mapload) +/mob/living/basic/trooper/syndicate/melee/space/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) set_light(4) -/mob/living/basic/syndicate/melee/space/stormtrooper +/mob/living/basic/trooper/syndicate/melee/space/stormtrooper name = "Syndicate Stormtrooper" maxHealth = 250 health = 250 mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper -/mob/living/basic/syndicate/melee/sword +/mob/living/basic/trooper/syndicate/melee/sword melee_damage_lower = 30 melee_damage_upper = 30 attack_verb_continuous = "slashes" @@ -107,7 +79,7 @@ r_hand = /obj/item/melee/energy/sword/saber/red l_hand = /obj/item/shield/energy -/mob/living/basic/syndicate/melee/sword/space +/mob/living/basic/trooper/syndicate/melee/sword/space name = "Syndicate Commando" maxHealth = 170 health = 170 @@ -116,11 +88,11 @@ projectile_deflect_chance = 50 mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando -/mob/living/basic/syndicate/melee/sword/space/Initialize(mapload) +/mob/living/basic/trooper/syndicate/melee/sword/space/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) -/mob/living/basic/syndicate/melee/sword/space/stormtrooper +/mob/living/basic/trooper/syndicate/melee/sword/space/stormtrooper name = "Syndicate Stormtrooper" maxHealth = 250 health = 250 @@ -129,26 +101,36 @@ ///////////////Guns//////////// -/mob/living/basic/syndicate/ranged +/mob/living/basic/trooper/syndicate/ranged loot = list(/obj/effect/gibspawner/human) - ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged + ai_controller = /datum/ai_controller/basic_controller/trooper/ranged r_hand = /obj/item/gun/ballistic/automatic/pistol /// Type of bullet we use var/casingtype = /obj/item/ammo_casing/c9mm /// Sound to play when firing weapon var/projectilesound = 'sound/weapons/gun/pistol/shot.ogg' + /// number of burst shots + var/burst_shots /// Time between taking shots var/ranged_cooldown = 1 SECONDS -/mob/living/basic/syndicate/ranged/Initialize(mapload) +/mob/living/basic/trooper/syndicate/ranged/Initialize(mapload) . = ..() - AddComponent(/datum/component/ranged_attacks, casing_type = casingtype, projectile_sound = projectilesound, cooldown_time = ranged_cooldown) - -/mob/living/basic/syndicate/ranged/infiltrator //shuttle loan event + AddComponent(\ + /datum/component/ranged_attacks,\ + casing_type = casingtype,\ + projectile_sound = projectilesound,\ + cooldown_time = ranged_cooldown,\ + burst_shots = burst_shots,\ + ) + if (ranged_cooldown <= 1 SECONDS) + AddComponent(/datum/component/ranged_mob_full_auto) + +/mob/living/basic/trooper/syndicate/ranged/infiltrator //shuttle loan event projectilesound = 'sound/weapons/gun/smg/shot_suppressed.ogg' loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier) -/mob/living/basic/syndicate/ranged/space +/mob/living/basic/trooper/syndicate/ranged/space name = "Syndicate Commando" maxHealth = 170 health = 170 @@ -156,30 +138,31 @@ minimum_survivable_temperature = 0 mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando -/mob/living/basic/syndicate/ranged/space/Initialize(mapload) +/mob/living/basic/trooper/syndicate/ranged/space/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) set_light(4) -/mob/living/basic/syndicate/ranged/space/stormtrooper +/mob/living/basic/trooper/syndicate/ranged/space/stormtrooper name = "Syndicate Stormtrooper" maxHealth = 250 health = 250 mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper -/mob/living/basic/syndicate/ranged/smg +/mob/living/basic/trooper/syndicate/ranged/smg casingtype = /obj/item/ammo_casing/c45 projectilesound = 'sound/weapons/gun/smg/shot.ogg' - ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged/burst + ai_controller = /datum/ai_controller/basic_controller/trooper/ranged/burst + burst_shots = 3 ranged_cooldown = 3 SECONDS r_hand = /obj/item/gun/ballistic/automatic/c20r -/mob/living/basic/syndicate/ranged/smg/pilot //caravan ambush ruin +/mob/living/basic/trooper/syndicate/ranged/smg/pilot //caravan ambush ruin name = "Syndicate Salvage Pilot" loot = list(/obj/effect/mob_spawn/corpse/human/syndicatepilot) mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatepilot -/mob/living/basic/syndicate/ranged/smg/space +/mob/living/basic/trooper/syndicate/ranged/smg/space name = "Syndicate Commando" maxHealth = 170 health = 170 @@ -187,24 +170,25 @@ minimum_survivable_temperature = 0 mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando -/mob/living/basic/syndicate/ranged/smg/space/Initialize(mapload) +/mob/living/basic/trooper/syndicate/ranged/smg/space/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) set_light(4) -/mob/living/basic/syndicate/ranged/smg/space/stormtrooper +/mob/living/basic/trooper/syndicate/ranged/smg/space/stormtrooper name = "Syndicate Stormtrooper" maxHealth = 250 health = 250 mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatestormtrooper -/mob/living/basic/syndicate/ranged/shotgun +/mob/living/basic/trooper/syndicate/ranged/shotgun casingtype = /obj/item/ammo_casing/shotgun/buckshot //buckshot (up to 72.5 brute) fired in a two-round burst - ai_controller = /datum/ai_controller/basic_controller/syndicate/ranged/shotgunner + ai_controller = /datum/ai_controller/basic_controller/trooper/ranged/shotgunner ranged_cooldown = 3 SECONDS + burst_shots = 2 r_hand = /obj/item/gun/ballistic/shotgun/bulldog -/mob/living/basic/syndicate/ranged/shotgun/space +/mob/living/basic/trooper/syndicate/ranged/shotgun/space name = "Syndicate Commando" maxHealth = 170 health = 170 @@ -213,12 +197,12 @@ speed = 1 mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando -/mob/living/basic/syndicate/ranged/shotgun/space/Initialize(mapload) +/mob/living/basic/trooper/syndicate/ranged/shotgun/space/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) set_light(4) -/mob/living/basic/syndicate/ranged/shotgun/space/stormtrooper +/mob/living/basic/trooper/syndicate/ranged/shotgun/space/stormtrooper name = "Syndicate Stormtrooper" maxHealth = 250 health = 250 @@ -258,7 +242,7 @@ bubble_icon = "syndibot" gold_core_spawnable = HOSTILE_SPAWN death_message = "is smashed into pieces!" - ai_controller = /datum/ai_controller/basic_controller/syndicate/viscerator + ai_controller = /datum/ai_controller/basic_controller/trooper/viscerator /mob/living/basic/viscerator/Initialize(mapload) . = ..() diff --git a/code/modules/mob/living/basic/trooper/trooper.dm b/code/modules/mob/living/basic/trooper/trooper.dm new file mode 100644 index 000000000000..e13c517a3c41 --- /dev/null +++ b/code/modules/mob/living/basic/trooper/trooper.dm @@ -0,0 +1,36 @@ +/mob/living/basic/trooper + icon = 'icons/mob/simple/simple_human.dmi' + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + sentience_type = SENTIENCE_HUMANOID + maxHealth = 100 + health = 100 + basic_mob_flags = DEL_ON_DEATH + speed = 1.1 + melee_damage_lower = 10 + melee_damage_upper = 10 + attack_verb_continuous = "punches" + attack_verb_simple = "punch" + attack_sound = 'sound/weapons/punch1.ogg' + melee_attack_cooldown = 1.2 SECONDS + istate = ISTATE_HARM + unsuitable_atmos_damage = 7.5 + unsuitable_cold_damage = 7.5 + unsuitable_heat_damage = 7.5 + ai_controller = /datum/ai_controller/basic_controller/trooper + + /// Loot this mob drops on death. + var/loot = list(/obj/effect/mob_spawn/corpse/human) + /// Path of the mob spawner we base the mob's visuals off of. + var/mob_spawner = /obj/effect/mob_spawn/corpse/human + /// Path of the right hand held item we give to the mob's visuals. + var/r_hand + /// Path of the left hand held item we give to the mob's visuals. + var/l_hand + +/mob/living/basic/trooper/Initialize(mapload) + . = ..() + apply_dynamic_human_appearance(src, mob_spawn_path = mob_spawner, r_hand = r_hand, l_hand = l_hand) + if(LAZYLEN(loot)) + loot = string_list(loot) + AddElement(/datum/element/death_drops, loot) + AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_SHOE) diff --git a/code/modules/mob/living/basic/trooper/trooper_ai.dm b/code/modules/mob/living/basic/trooper/trooper_ai.dm new file mode 100644 index 000000000000..1f762bb7ba87 --- /dev/null +++ b/code/modules/mob/living/basic/trooper/trooper_ai.dm @@ -0,0 +1,99 @@ +/datum/ai_controller/basic_controller/trooper + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_TARGET_MINIMUM_STAT = HARD_CRIT, + BB_REINFORCEMENTS_SAY = "411 in progress, requesting backup!" + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path/trooper, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/travel_to_point/and_clear_target/reinforce, + ) + +/datum/ai_planning_subtree/basic_melee_attack_subtree/trooper + melee_attack_behavior = /datum/ai_behavior/basic_melee_attack + +/datum/ai_planning_subtree/attack_obstacle_in_path/trooper + attack_behaviour = /datum/ai_behavior/attack_obstructions/trooper + +/datum/ai_behavior/attack_obstructions/trooper + action_cooldown = 1.2 SECONDS + +/datum/ai_controller/basic_controller/trooper/calls_reinforcements + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/call_reinforcements, + /datum/ai_planning_subtree/attack_obstacle_in_path/trooper, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/travel_to_point/and_clear_target/reinforce, + ) + +/datum/ai_controller/basic_controller/trooper/peaceful + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/call_reinforcements, + /datum/ai_planning_subtree/attack_obstacle_in_path/trooper, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/travel_to_point/and_clear_target/reinforce, + ) + +/datum/ai_controller/basic_controller/trooper/ranged + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/trooper, + /datum/ai_planning_subtree/travel_to_point/and_clear_target/reinforce, + ) + +/datum/ai_planning_subtree/basic_ranged_attack_subtree/trooper + ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/trooper + +/datum/ai_behavior/basic_ranged_attack/trooper + action_cooldown = 1 SECONDS + required_distance = 5 + avoid_friendly_fire = TRUE + +/datum/ai_controller/basic_controller/trooper/ranged/burst + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/trooper_burst, + /datum/ai_planning_subtree/travel_to_point/and_clear_target/reinforce, + ) + +/datum/ai_planning_subtree/basic_ranged_attack_subtree/trooper_burst + ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/trooper_burst + +/datum/ai_behavior/basic_ranged_attack/trooper_burst + action_cooldown = 3 SECONDS + avoid_friendly_fire = TRUE + +/datum/ai_controller/basic_controller/trooper/ranged/burst/peaceful + planning_subtrees = list( + /datum/ai_planning_subtree/target_retaliate, + /datum/ai_planning_subtree/call_reinforcements, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/trooper_burst, + /datum/ai_planning_subtree/travel_to_point/and_clear_target/reinforce, + ) + +/datum/ai_controller/basic_controller/trooper/ranged/shotgunner + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/basic_ranged_attack_subtree/trooper_shotgun, + /datum/ai_planning_subtree/travel_to_point/and_clear_target/reinforce, + ) + +/datum/ai_planning_subtree/basic_ranged_attack_subtree/trooper_shotgun + ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/trooper_shotgun + +/datum/ai_behavior/basic_ranged_attack/trooper_shotgun + action_cooldown = 3 SECONDS + required_distance = 1 + avoid_friendly_fire = TRUE + +/datum/ai_controller/basic_controller/trooper/viscerator + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) diff --git a/code/modules/mob/living/basic/vermin/cockroach.dm b/code/modules/mob/living/basic/vermin/cockroach.dm index a535e25f495a..c55b94cd0182 100644 --- a/code/modules/mob/living/basic/vermin/cockroach.dm +++ b/code/modules/mob/living/basic/vermin/cockroach.dm @@ -52,8 +52,8 @@ /datum/ai_controller/basic_controller/cockroach blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, ) ai_traits = STOP_MOVING_WHEN_PULLED @@ -85,10 +85,21 @@ faction = list(FACTION_HOSTILE, FACTION_MAINT_CREATURES) ai_controller = /datum/ai_controller/basic_controller/cockroach/glockroach cockroach_cell_line = CELL_LINE_TABLE_GLOCKROACH + ///number of burst shots + var/burst_shots + ///cooldown between attacks + var/ranged_cooldown = 1 SECONDS /mob/living/basic/cockroach/glockroach/Initialize(mapload) . = ..() - AddComponent(/datum/component/ranged_attacks, casing_type = /obj/item/ammo_casing/glockroach, cooldown_time = 1 SECONDS) + AddComponent(\ + /datum/component/ranged_attacks,\ + casing_type = /obj/item/ammo_casing/glockroach,\ + burst_shots = burst_shots,\ + cooldown_time = ranged_cooldown,\ + ) + if (ranged_cooldown <= 1 SECONDS) + AddComponent(/datum/component/ranged_mob_full_auto) /datum/ai_controller/basic_controller/cockroach/glockroach planning_subtrees = list( @@ -114,6 +125,7 @@ melee_damage_lower = 2.5 melee_damage_upper = 10 obj_damage = 10 + melee_attack_cooldown = 1 SECONDS gold_core_spawnable = HOSTILE_SPAWN attack_sound = 'sound/weapons/bladeslice.ogg' attack_vis_effect = ATTACK_EFFECT_SLASH @@ -141,36 +153,26 @@ /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/random_speech/insect, /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/hauberoach, //If we are attacking someone, this will prevent us from hunting + /datum/ai_planning_subtree/basic_melee_attack_subtree, //If we are attacking someone, this will prevent us from hunting /datum/ai_planning_subtree/find_and_hunt_target/roach, ) -/datum/ai_planning_subtree/basic_melee_attack_subtree/hauberoach - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/hauberoach - -/datum/ai_behavior/basic_melee_attack/hauberoach //Slightly slower, as this is being made in feature freeze ;) - action_cooldown = 1 SECONDS - /datum/ai_controller/basic_controller/cockroach/sewer planning_subtrees = list( /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/random_speech/insect, /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/sewer, + /datum/ai_planning_subtree/basic_melee_attack_subtree, /datum/ai_planning_subtree/find_and_hunt_target/roach, ) -/datum/ai_planning_subtree/basic_melee_attack_subtree/sewer - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/sewer - -/datum/ai_behavior/basic_melee_attack/sewer - action_cooldown = 0.8 SECONDS - /mob/living/basic/cockroach/glockroach/mobroach name = "mobroach" desc = "WE'RE FUCKED, THAT GLOCKROACH HAS A TOMMYGUN!" icon_state = "mobroach" ai_controller = /datum/ai_controller/basic_controller/cockroach/mobroach + burst_shots = 4 + ranged_cooldown = 2 SECONDS /datum/ai_controller/basic_controller/cockroach/mobroach planning_subtrees = list( @@ -185,5 +187,4 @@ ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/mobroach /datum/ai_behavior/basic_ranged_attack/mobroach - shots = 4 action_cooldown = 2 SECONDS diff --git a/code/modules/mob/living/basic/vermin/crab.dm b/code/modules/mob/living/basic/vermin/crab.dm index abe5c25117b6..2a4ce7bb912e 100644 --- a/code/modules/mob/living/basic/vermin/crab.dm +++ b/code/modules/mob/living/basic/vermin/crab.dm @@ -77,9 +77,9 @@ ///The basic ai controller for crabs /datum/ai_controller/basic_controller/crab blackboard = list( - BB_BASIC_MOB_FLEEING = FALSE, - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/of_size/ours_or_smaller, - BB_FLEE_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction, + BB_ALWAYS_IGNORE_FACTION = TRUE, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/of_size/ours_or_smaller, + BB_FLEE_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_traits = STOP_MOVING_WHEN_PULLED diff --git a/code/modules/mob/living/basic/vermin/frog.dm b/code/modules/mob/living/basic/vermin/frog.dm index 282ed17b00c2..5ec6a15a6bfd 100644 --- a/code/modules/mob/living/basic/vermin/frog.dm +++ b/code/modules/mob/living/basic/vermin/frog.dm @@ -17,6 +17,7 @@ obj_damage = 10 attack_verb_continuous = "bites" attack_verb_simple = "bite" + melee_attack_cooldown = 2.5 SECONDS response_help_continuous = "pets" response_help_simple = "pet" response_disarm_continuous = "pokes" @@ -76,8 +77,8 @@ /datum/ai_controller/basic_controller/frog blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, ) ai_movement = /datum/ai_movement/basic_avoidance @@ -85,19 +86,13 @@ planning_subtrees = list( /datum/ai_planning_subtree/target_retaliate, /datum/ai_planning_subtree/random_speech/frog, - /datum/ai_planning_subtree/basic_melee_attack_subtree/frog, + /datum/ai_planning_subtree/basic_melee_attack_subtree, ) -/datum/ai_planning_subtree/basic_melee_attack_subtree/frog - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/frog - -/datum/ai_behavior/basic_melee_attack/frog - action_cooldown = 2.5 SECONDS - /datum/ai_controller/basic_controller/frog/trash planning_subtrees = list( /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/random_speech/frog, /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/frog, + /datum/ai_planning_subtree/basic_melee_attack_subtree, ) diff --git a/code/modules/mob/living/basic/vermin/lizard.dm b/code/modules/mob/living/basic/vermin/lizard.dm index 4038e8486921..780ed6ee981e 100644 --- a/code/modules/mob/living/basic/vermin/lizard.dm +++ b/code/modules/mob/living/basic/vermin/lizard.dm @@ -45,12 +45,12 @@ . = ..() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) AddElement(/datum/element/pet_bonus, "sticks its tongue out contentedly!") - AddElement(/datum/element/basic_eating, 5, 0, null, edibles) + AddElement(/datum/element/basic_eating, heal_amt = 5, food_types = edibles) ai_controller.set_blackboard_key(BB_BASIC_FOODS, edibles) /datum/ai_controller/basic_controller/lizard blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic/allow_items, ) ai_traits = STOP_MOVING_WHEN_PULLED diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm index 53922a92e466..bd9bb8fb3b2d 100644 --- a/code/modules/mob/living/basic/vermin/mouse.dm +++ b/code/modules/mob/living/basic/vermin/mouse.dm @@ -74,7 +74,7 @@ /mob/living/basic/mouse/examine(mob/user) . = ..() - var/sameside = user.faction_check_mob(src, exact_match = TRUE) + var/sameside = user.faction_check_atom(src, exact_match = TRUE) if(isregalrat(user)) if(sameside) . += span_notice("This rat serves under you.") @@ -381,11 +381,11 @@ /// The mouse AI controller /datum/ai_controller/basic_controller/mouse - blackboard = list( - BB_BASIC_MOB_FLEEING = TRUE, // Always cowardly + blackboard = list( // Always cowardly BB_CURRENT_HUNTING_TARGET = null, // cheese BB_LOW_PRIORITY_HUNTING_TARGET = null, // cable - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), // Use this to find people to run away from + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, // Use this to find people to run away from + BB_BASIC_MOB_FLEE_DISTANCE = 3, ) ai_traits = STOP_MOVING_WHEN_PULLED @@ -405,9 +405,6 @@ ) /// Don't look for anything to run away from if you are distracted by being adjacent to cheese -/datum/ai_planning_subtree/flee_target/mouse - flee_behaviour = /datum/ai_behavior/run_away_from_target/mouse - /datum/ai_planning_subtree/flee_target/mouse /datum/ai_planning_subtree/flee_target/mouse/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) @@ -416,16 +413,11 @@ return // We see some cheese, which is more important than our life return ..() -/datum/ai_planning_subtree/flee_target/mouse/select - -/datum/ai_behavior/run_away_from_target/mouse - run_distance = 3 // Mostly exists in small tunnels, don't get ahead of yourself - /// AI controller for rats, slightly more complex than mice becuase they attack people /datum/ai_controller/basic_controller/mouse/rat blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_PET_TARGETING_STRATEGY = /datum/targeting_strategy/basic/not_friends, BB_BASIC_MOB_CURRENT_TARGET = null, // heathen BB_CURRENT_HUNTING_TARGET = null, // cheese BB_LOW_PRIORITY_HUNTING_TARGET = null, // cable diff --git a/code/modules/mob/living/basic/vermin/space_bat.dm b/code/modules/mob/living/basic/vermin/space_bat.dm index 6fa1fd7aed5f..dc3c1b85aede 100644 --- a/code/modules/mob/living/basic/vermin/space_bat.dm +++ b/code/modules/mob/living/basic/vermin/space_bat.dm @@ -42,7 +42,7 @@ ///Controller for space bats, has nothing unique, just retaliation. /datum/ai_controller/basic_controller/space_bat blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/ignore_faction(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_traits = STOP_MOVING_WHEN_PULLED diff --git a/code/modules/mob/living/brain/life.dm b/code/modules/mob/living/brain/life.dm index 1cbc979d365c..57d73d126e2f 100644 --- a/code/modules/mob/living/brain/life.dm +++ b/code/modules/mob/living/brain/life.dm @@ -1,8 +1,6 @@ /mob/living/brain/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if (notransform) - return - if(!loc) + if(isnull(loc) || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return . = ..() handle_emp_damage(seconds_per_tick, times_fired) diff --git a/code/modules/mob/living/carbon/alien/adult/adult_update_icons.dm b/code/modules/mob/living/carbon/alien/adult/adult_update_icons.dm index 4ca4f12b977e..5a4fd7c20ff2 100644 --- a/code/modules/mob/living/carbon/alien/adult/adult_update_icons.dm +++ b/code/modules/mob/living/carbon/alien/adult/adult_update_icons.dm @@ -76,7 +76,7 @@ //Royals have bigger sprites, so inhand things must be handled differently. /mob/living/carbon/alien/adult/royal/update_held_items() - ..() + . = ..() remove_overlay(HANDS_LAYER) var/list/hands = list() diff --git a/code/modules/mob/living/carbon/alien/adult/queen.dm b/code/modules/mob/living/carbon/alien/adult/queen.dm index 1f344a98fb2d..b21a921ae066 100644 --- a/code/modules/mob/living/carbon/alien/adult/queen.dm +++ b/code/modules/mob/living/carbon/alien/adult/queen.dm @@ -19,6 +19,7 @@ . = ..() // as a wise man once wrote: "pull over that ass too fat" REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + AddComponent(/datum/component/seethrough_mob) /mob/living/carbon/alien/adult/royal/on_lying_down(new_lying_angle) . = ..() @@ -54,9 +55,6 @@ var/datum/action/cooldown/spell/aoe/repulse/xeno/tail_whip = new(src) tail_whip.Grant(src) - var/datum/action/small_sprite/queen/smallsprite = new(src) - smallsprite.Grant(src) - var/datum/action/cooldown/alien/promote/promotion = new(src) promotion.Grant(src) diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 325e2b10742b..2e2674e14e76 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -1,7 +1,7 @@ /mob/living/carbon/alien/larva/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(!..() || IS_IN_STASIS(src) || (amount_grown >= max_grown)) return // We're dead, in stasis, or already grown. diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 333e318f9e0a..7d07f1c20224 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -111,8 +111,7 @@ var/mob/living/carbon/alien/larva/new_xeno = new(xeno_loc) new_xeno.key = ghost.key SEND_SOUND(new_xeno, sound('sound/voice/hiss5.ogg',0,0,0,100)) //To get the player's attention - new_xeno.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), type) //so we don't move during the bursting animation - new_xeno.notransform = 1 + new_xeno.add_traits(list(TRAIT_HANDS_BLOCKED, TRAIT_IMMOBILIZED, TRAIT_NO_TRANSFORM), type) //so we don't move during the bursting animation new_xeno.invisibility = INVISIBILITY_MAXIMUM sleep(0.6 SECONDS) @@ -121,10 +120,8 @@ qdel(new_xeno) CRASH("AttemptGrow failed due to the early qdeletion of source or owner.") - if(new_xeno) - REMOVE_TRAIT(new_xeno, TRAIT_IMMOBILIZED, type) - REMOVE_TRAIT(new_xeno, TRAIT_HANDS_BLOCKED, type) - new_xeno.notransform = 0 + if(!isnull(new_xeno)) + new_xeno.remove_traits(list(TRAIT_HANDS_BLOCKED, TRAIT_IMMOBILIZED, TRAIT_NO_TRANSFORM), type) new_xeno.invisibility = 0 if(gib_on_success) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index ff046dc87b4e..1ab1a779e681 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -25,6 +25,7 @@ plane = GAME_PLANE_FOV_HIDDEN max_integrity = 100 item_flags = XENOMORPH_HOLDABLE + supports_variations_flags = CLOTHING_SNOUTED_VARIATION var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case var/sterile = FALSE @@ -103,7 +104,7 @@ if(CanHug(AM) && Adjacent(AM)) return Leap(AM) -/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, quickstart = TRUE) +/obj/item/clothing/mask/facehugger/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, gentle, quickstart = TRUE) . = ..() if(!.) return diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 337c7e0d7e10..3800b3499ec4 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -11,6 +11,7 @@ COMSIG_CARBON_DISARM_COLLIDE = PROC_REF(disarm_collision), ) AddElement(/datum/element/connect_loc, loc_connections) + ADD_TRAIT(src, TRAIT_CAN_HOLD_ITEMS, INNATE_TRAIT) // Carbons are assumed to be innately capable of having arms, we check their arms count instead /mob/living/carbon/Destroy() //This must be done first, so the mob ghosts correctly before DNA etc is nulled @@ -28,63 +29,13 @@ QDEL_NULL(dna) GLOB.carbon_list -= src -/mob/living/carbon/perform_hand_swap(held_index) - . = ..() - if(!.) - return - - if(!held_index) - held_index = (active_hand_index % held_items.len)+1 - - if(!isnum(held_index)) - CRASH("You passed [held_index] into swap_hand instead of a number. WTF man") - - var/oindex = active_hand_index - active_hand_index = held_index - if(hud_used) - var/atom/movable/screen/inventory/hand/H - H = hud_used.hand_slots["[oindex]"] - if(H) - H.update_appearance() - H = hud_used.hand_slots["[held_index]"] - if(H) - H.update_appearance() - - -/mob/living/carbon/activate_hand(selhand) //l/r OR 1-held_items.len - if(!selhand) - selhand = (active_hand_index % held_items.len)+1 - - if(istext(selhand)) - selhand = lowertext(selhand) - if(selhand == "right" || selhand == "r") - selhand = 2 - if(selhand == "left" || selhand == "l") - selhand = 1 - - if(selhand != active_hand_index) - swap_hand(selhand) - else - mode() // Activate held item - -/mob/living/carbon/attackby(obj/item/I, mob/living/user, params) - for(var/datum/surgery/operations as anything in surgeries) - if((user.istate & ISTATE_HARM)) - break - if(body_position != LYING_DOWN && (operations.surgery_flags & SURGERY_REQUIRE_RESTING)) - continue - if(!(operations.surgery_flags & SURGERY_SELF_OPERABLE) && (user == src)) - continue - var/list/modifiers = params2list(params) - if(operations.next_step(user, modifiers)) - return TRUE - +/mob/living/carbon/attackby(obj/item/item, mob/living/user, params) if(!all_wounds || !(!(user.istate & ISTATE_HARM) || user == src)) return ..() for(var/i in shuffle(all_wounds)) var/datum/wound/W = i - if(W.try_treating(I, user)) + if(W.try_treating(item, user)) return 1 return ..() @@ -164,6 +115,9 @@ return FALSE var/atom/movable/thrown_thing var/obj/item/held_item = get_active_held_item() + var/verb_text = pick("throw", "toss", "hurl", "chuck", "fling") + if(prob(0.5)) + verb_text = "yeet" var/neckgrab_throw = FALSE // we can't check for if it's a neckgrab throw when totaling up power_throw since we've already stopped pulling them by then, so get it early if(!held_item) if(pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE) @@ -194,8 +148,12 @@ power_throw++ if(neckgrab_throw) power_throw++ - visible_message(span_danger("[src] throws [thrown_thing][power_throw ? " really hard!" : "."]"), \ - span_danger("You throw [thrown_thing][power_throw ? " really hard!" : "."]")) + if(isitem(thrown_thing)) + var/obj/item/thrown_item = thrown_thing + if(thrown_item.throw_verb) + verb_text = thrown_item.throw_verb + visible_message(span_danger("[src] [plural_s(verb_text)] [thrown_thing][power_throw ? " really hard!" : "."]"), \ + span_danger("You [verb_text] [thrown_thing][power_throw ? " really hard!" : "."]")) log_message("has thrown [thrown_thing] [power_throw > 0 ? "really hard" : ""]", LOG_ATTACK) var/extra_throw_range = HAS_TRAIT(src, TRAIT_THROWINGARM) ? 2 : 0 newtonian_move(get_dir(target, src)) @@ -1253,12 +1211,17 @@ else wound_type = forced_type else - wound_type = pick(GLOB.global_all_wound_types) + for (var/datum/wound/path as anything in shuffle(GLOB.all_wound_pregen_data)) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[path] + if (pregen_data.can_be_applied_to(scar_part, random_roll = TRUE)) + wound_type = path + break - var/datum/wound/phantom_wound = new wound_type - scaries.generate(scar_part, phantom_wound) - scaries.fake = TRUE - QDEL_NULL(phantom_wound) + if (wound_type) // can feasibly happen, if its an inorganic limb/cant be wounded/scarred + var/datum/wound/phantom_wound = new wound_type + scaries.generate(scar_part, phantom_wound) + scaries.fake = TRUE + QDEL_NULL(phantom_wound) /mob/living/carbon/is_face_visible() return !(wear_mask?.flags_inv & HIDEFACE) && !(head?.flags_inv & HIDEFACE) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index ae8f529b62f4..116e3efea6bc 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -99,8 +99,8 @@ send_item_attack_message(I, user, affecting.plaintext_zone, affecting) if(I.force) var/attack_direction = get_dir(user, src) - apply_damage(I.force, I.damtype, affecting, wound_bonus = I.wound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness(), attack_direction = attack_direction) - if(I.damtype == BRUTE && (IS_ORGANIC_LIMB(affecting) || HAS_TRAIT(affecting.owner, TRAIT_ROBOT_CAN_BLEED))) + apply_damage(I.force, I.damtype, affecting, wound_bonus = I.wound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness(), attack_direction = attack_direction, attacking_item = I) + if(I.damtype == BRUTE && affecting.can_bleed()) if(prob(33)) I.add_mob_blood(src) var/turf/location = get_turf(src) @@ -127,22 +127,35 @@ var/message_verb_simple = length(I.attack_verb_simple) ? "[pick(I.attack_verb_simple)]" : "attack" var/extra_wound_details = "" + if(I.damtype == BRUTE && hit_bodypart.can_dismember()) + var/mangled_state = hit_bodypart.get_mangled_state() - var/bio_state = hit_bodypart.biological_state - if((mangled_state & BODYPART_MANGLED_FLESH) && (mangled_state & BODYPART_MANGLED_BONE)) + + var/bio_status = hit_bodypart.get_bio_state_status() + + var/has_exterior = ((bio_status & ANATOMY_EXTERIOR)) + var/has_interior = ((bio_status & ANATOMY_INTERIOR)) + + var/exterior_ready_to_dismember = (!has_exterior || ((mangled_state & BODYPART_MANGLED_EXTERIOR))) + var/interior_ready_to_dismember = (!has_interior || ((mangled_state & BODYPART_MANGLED_INTERIOR))) + + var/dismemberable = ((hit_bodypart.dismemberable_by_wound()) || hit_bodypart.dismemberable_by_total_damage()) + if (dismemberable) extra_wound_details = ", threatening to sever it entirely" - else if((mangled_state & BODYPART_MANGLED_FLESH && I.get_sharpness()) || ((mangled_state & BODYPART_MANGLED_BONE) && (bio_state & BIO_BONE) && !(bio_state & BIO_FLESH))) - extra_wound_details = ", [I.get_sharpness() == SHARP_EDGED ? "slicing" : "piercing"] through to the bone" - else if((mangled_state & BODYPART_MANGLED_BONE && I.get_sharpness()) || ((mangled_state & BODYPART_MANGLED_FLESH) && (bio_state & BIO_FLESH) && !(bio_state & BIO_BONE))) - extra_wound_details = ", [I.get_sharpness() == SHARP_EDGED ? "slicing" : "piercing"] at the remaining tissue" + else if((has_interior && (has_exterior && exterior_ready_to_dismember) && I.get_sharpness())) + var/bone_text = hit_bodypart.get_internal_description() + extra_wound_details = ", [I.get_sharpness() == SHARP_EDGED ? "slicing" : "piercing"] through to the [bone_text]" + else if(has_exterior && ((has_interior && interior_ready_to_dismember) && I.get_sharpness())) + var/tissue_text = hit_bodypart.get_external_description() + extra_wound_details = ", [I.get_sharpness() == SHARP_EDGED ? "slicing" : "piercing"] at the remaining [tissue_text]" var/message_hit_area = "" if(hit_area) message_hit_area = " in the [hit_area]" var/attack_message_spectator = "[src] [message_verb_continuous][message_hit_area] with [I][extra_wound_details]!" var/attack_message_victim = "You're [message_verb_continuous][message_hit_area] with [I][extra_wound_details]!" - var/attack_message_attacker = "You [message_verb_simple] [src][message_hit_area] with [I]!" + var/attack_message_attacker = "You [message_verb_simple] [src][message_hit_area] with [I][extra_wound_details]!" if(user in viewers(src, null)) attack_message_spectator = "[user] [message_verb_continuous] [src][message_hit_area] with [I][extra_wound_details]!" attack_message_victim = "[user] [message_verb_continuous] you[message_hit_area] with [I][extra_wound_details]!" @@ -155,10 +168,10 @@ return TRUE -/mob/living/carbon/attack_drone(mob/living/simple_animal/drone/user) +/mob/living/carbon/attack_drone(mob/living/basic/drone/user) return //so we don't call the carbon's attack_hand(). -/mob/living/carbon/attack_drone_secondary(mob/living/simple_animal/drone/user) +/mob/living/carbon/attack_drone_secondary(mob/living/basic/drone/user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN //ATTACK HAND IGNORING PARENT RETURN VALUE @@ -693,14 +706,16 @@ return ..() var/obj/item/bodypart/grasped_part = get_bodypart(zone_selected) - if(!grasped_part?.get_modified_bleed_rate()) + if(!grasped_part?.can_be_grasped()) return var/starting_hand_index = active_hand_index if(starting_hand_index == grasped_part.held_index) to_chat(src, span_danger("You can't grasp your [grasped_part.name] with itself!")) return - to_chat(src, span_warning("You try grasping at your [grasped_part.name], trying to stop the bleeding...")) + var/bleed_rate = grasped_part.get_modified_bleed_rate() + var/bleeding_text = (bleed_rate ? ", trying to stop the bleeding" : "") + to_chat(src, span_warning("You try grasping at your [grasped_part.name][bleeding_text]...")) if(!do_after(src, 0.75 SECONDS)) to_chat(src, span_danger("You fail to grasp your [grasped_part.name].")) return @@ -712,6 +727,17 @@ return grasp.grasp_limb(grasped_part) +/// If TRUE, the owner of this bodypart can try grabbing it to slow bleeding, as well as various other effects. +/obj/item/bodypart/proc/can_be_grasped() + if (get_modified_bleed_rate()) + return TRUE + + for (var/datum/wound/iterated_wound as anything in wounds) + if (iterated_wound.wound_flags & CAN_BE_GRASPED) + return TRUE + + return FALSE + /// an abstract item representing you holding your own limb to staunch the bleeding, see [/mob/living/carbon/proc/grabbedby] will probably need to find somewhere else to put this. /obj/item/hand_item/self_grasp name = "self-grasp" @@ -756,7 +782,9 @@ RegisterSignal(user, COMSIG_PARENT_QDELETING, PROC_REF(qdel_void)) RegisterSignals(grasped_part, list(COMSIG_CARBON_REMOVE_LIMB, COMSIG_PARENT_QDELETING), PROC_REF(qdel_void)) - user.visible_message(span_danger("[user] grasps at [user.p_their()] [grasped_part.name], trying to stop the bleeding."), span_notice("You grab hold of your [grasped_part.name] tightly."), vision_distance=COMBAT_MESSAGE_RANGE) + var/bleed_rate = grasped_part.get_modified_bleed_rate() + var/bleeding_text = (bleed_rate ? ", trying to stop the bleeding" : "") + user.visible_message(span_danger("[user] grasps at [user.p_their()] [grasped_part.name][bleeding_text]."), span_notice("You grab hold of your [grasped_part.name] tightly."), vision_distance=COMBAT_MESSAGE_RANGE) playsound(get_turf(src), 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) return TRUE diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index f5cee1ec422c..84dc1029808b 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -101,6 +101,9 @@ /// All of the scars a carbon has afflicted throughout their limbs var/list/all_scars + /// Assoc list of BODY_ZONE -> wounding_type. Set when a limb is dismembered, unset when one is attached. Used for determining what scar to add when it comes time to generate them. + var/list/body_zone_dismembered_by + /// Simple modifier for whether this mob can handle greater or lesser skillchip complexity. See /datum/mutation/human/biotechcompat/ for example. var/skillchip_complexity_modifier = 0 @@ -113,6 +116,11 @@ /// Stores the result of our last known top_offset generation for optimisation purposes when drawing limb icons. var/last_top_offset + /// A bitfield of "bodytypes", updated by /obj/item/bodypart/proc/synchronize_bodytypes() + var/bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC + + var/is_leaning = FALSE + COOLDOWN_DECLARE(bleeding_message_cd) var/next_smell = 0 /// Cooldown for the next smell diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index b6aad62e1072..5363d4c5d11a 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -259,8 +259,8 @@ #undef NEXT_PARENT_COMMAND /mob/living/carbon/regenerate_icons() - if(notransform) - return 1 + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) + return icon_render_keys = list() //Clear this bad larry out update_held_items() update_worn_handcuffs() @@ -269,11 +269,17 @@ update_body() /mob/living/carbon/update_held_items() + . = ..() remove_overlay(HANDS_LAYER) if (handcuffed) drop_all_held_items() return + overlays_standing[HANDS_LAYER] = get_held_overlays() + apply_overlay(HANDS_LAYER) + +/// Generate held item overlays +/mob/living/carbon/proc/get_held_overlays() var/list/hands = list() for(var/obj/item/I in held_items) if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) @@ -294,9 +300,7 @@ icon_file = I.righthand_file hands += I.build_worn_icon(default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) - - overlays_standing[HANDS_LAYER] = hands - apply_overlay(HANDS_LAYER) + return hands /mob/living/carbon/update_fire_overlay(stacks, on_fire, last_icon_state, suffix = "") var/fire_icon = "[dna?.species.fire_overlay || "human"]_[stacks > MOB_BIG_FIRE_STACK_THRESHOLD ? "big_fire" : "small_fire"][suffix]" diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 0505c47fdc89..ab8130933229 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -1,43 +1,79 @@ -/mob/living/carbon/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null) - SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMAGE, damage, damagetype, def_zone) - var/hit_percent = (100-blocked)/100 - if(!damage || (!forced && hit_percent <= 0)) - return 0 +/mob/living/carbon/apply_damage( + damage = 0, + damagetype = BRUTE, + def_zone = null, + blocked = 0, + forced = FALSE, + spread_damage = FALSE, + wound_bonus = 0, + bare_wound_bonus = 0, + sharpness = NONE, + attack_direction = null, + attacking_item, +) + // Spread damage should always have def zone be null + if(spread_damage) + def_zone = null + + // Otherwise if def zone is null, we'll get a random bodypart / zone to hit. + // ALso we'll automatically covnert string def zones into bodyparts to pass into parent call. + else if(!isbodypart(def_zone)) + var/random_zone = check_zone(def_zone || get_random_valid_zone(def_zone)) + def_zone = get_bodypart(random_zone) || bodyparts[1] + + . = ..() + // Taking brute or burn to bodyparts gives a damage flash + if(def_zone && (damagetype == BRUTE || damagetype == BURN)) + damageoverlaytemp += . + + return . + +/mob/living/carbon/human/apply_damage( + damage = 0, + damagetype = BRUTE, + def_zone = null, + blocked = 0, + forced = FALSE, + spread_damage = FALSE, + wound_bonus = 0, + bare_wound_bonus = 0, + sharpness = NONE, + attack_direction = null, + attacking_item, +) + + // Add relevant DR modifiers into blocked value to pass to parent + blocked += physiology?.damage_resistance + blocked += dna?.species?.damage_modifier + return ..() - var/obj/item/bodypart/BP = null - if(!spread_damage) - if(isbodypart(def_zone)) //we specified a bodypart object - BP = def_zone - else - if(!def_zone) - def_zone = get_random_valid_zone(def_zone) - BP = get_bodypart(check_zone(def_zone)) - if(!BP) - BP = bodyparts[1] +/mob/living/carbon/human/get_incoming_damage_modifier( + damage = 0, + damagetype = BRUTE, + def_zone = null, + sharpness = NONE, + attack_direction = null, + attacking_item, +) + var/final_mod = ..() - var/damage_amount = forced ? damage : damage * hit_percent switch(damagetype) if(BRUTE) - if(BP) - if(BP.receive_damage(damage_amount, 0, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness, attack_direction = attack_direction)) - update_damage_overlays() - else //no bodypart, we deal damage with a more general method. - adjustBruteLoss(damage_amount, forced = forced) + final_mod *= physiology.brute_mod if(BURN) - if(BP) - if(BP.receive_damage(0, damage_amount, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness, attack_direction = attack_direction)) - update_damage_overlays() - else - adjustFireLoss(damage_amount, forced = forced) + final_mod *= physiology.burn_mod if(TOX) - adjustToxLoss(damage_amount, forced = forced) + final_mod *= physiology.tox_mod if(OXY) - adjustOxyLoss(damage_amount, forced = forced) + final_mod *= physiology.oxy_mod if(CLONE) - adjustCloneLoss(damage_amount, forced = forced) + final_mod *= physiology.clone_mod if(STAMINA) - stamina.adjust(-damage_amount, forced = forced) - return TRUE + final_mod *= physiology.stamina_mod + if(BRAIN) + final_mod *= physiology.brain_mod + + return final_mod //These procs fetch a cumulative total damage from all bodyparts /mob/living/carbon/getBruteLoss() @@ -59,11 +95,8 @@ if(target_area) if((target_area.area_flags & PASSIVE_AREA) && amount > 0) return FALSE - - if(amount < 0 && HAS_TRAIT(src, TRAIT_NO_HEALS)) - return FALSE - if(!forced && (status_flags & GODMODE)) - return FALSE + if(!can_adjust_brute_loss(amount, forced, required_bodytype)) + return 0 if(amount > 0) take_overall_damage(brute = amount, updating_health = updating_health, required_bodytype = required_bodytype) else @@ -82,11 +115,8 @@ if(target_area) if((target_area.area_flags & PASSIVE_AREA) && amount > 0) return FALSE - - if(amount < 0 && HAS_TRAIT(src, TRAIT_NO_HEALS)) - return FALSE - if(!forced && (status_flags & GODMODE)) - return FALSE + if(!can_adjust_fire_loss(amount, forced, required_bodytype)) + return 0 if(amount > 0) take_overall_damage(burn = amount, updating_health = updating_health, required_bodytype = required_bodytype) else @@ -100,16 +130,13 @@ return adjustFireLoss(diff, updating_health, forced, required_bodytype) -/mob/living/carbon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = MOB_ORGANIC) +/mob/living/carbon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) var/area/target_area = get_area(src) if(target_area) if((target_area.area_flags & PASSIVE_AREA) && amount > 0) return FALSE - - if(amount < 0 && HAS_TRAIT(src, TRAIT_NO_HEALS)) - return FALSE - if(!forced && !(mob_biotypes & required_biotype)) - return + if(!can_adjust_tox_loss(amount, forced, required_biotype)) + return 0 if(!forced && HAS_TRAIT(src, TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage amount = -amount if(HAS_TRAIT(src, TRAIT_TOXIMMUNE)) //Prevents toxin damage, but not healing diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index bc9384de23b6..76d0d6dc87fa 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -11,7 +11,36 @@ key_third_person = "blinks" message = "blinks." -/datum/emote/living/carbon/blink_r +/datum/emote/living/carbon/blink/run_emote(mob/living/carbon/human, params, type_override, intentional) + . = ..() + + var/obj/item/bodypart/head/head = human.get_bodypart(BODY_ZONE_HEAD) + + if(!head) + // This implies you have no neck to snap. You're making Peanut sad! + return + + if(prob(99)) + // Peanut has spared you--for the moment. + return + + // Don't blink. Not even for a second. + for(var/obj/structure/statue/peanut in view(8, get_turf(human))) + // Security guards go here to die. + if(do_teleport(peanut, human, channel = TELEPORT_CHANNEL_MAGIC)) + human.log_message("blinked and had their neck snapped by [peanut]!") + human.visible_message(span_danger("[human] blinks, and [peanut] snaps [human.p_their()] neck in a flash!"), \ + span_userdanger("The instant you close your eyes, [peanut] snaps your neck!")) + + playsound(peanut, 'sound/creatures/statue_horror_sting.ogg', 100, TRUE) + + head.receive_damage(brute=200) + + new /obj/effect/gibspawner/human/bodypartless(get_turf(human)) + + break + +/datum/emote/living/carbon/blink/blink_r key = "blink_r" message = "blinks rapidly." diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/_species.dm similarity index 94% rename from code/modules/mob/living/carbon/human/species.dm rename to code/modules/mob/living/carbon/human/_species.dm index 0551edf90cb6..f7449b28c0bb 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -42,7 +42,8 @@ GLOBAL_LIST_EMPTY(features_by_species) OFFSET_SUIT = list(0,0), OFFSET_NECK = list(0,0), ) - + ///If this species needs special 'fallback' sprites, what is the path to the file that contains them? + var/fallback_clothing_path ///The maximum number of bodyparts this species can have. var/max_bodypart_count = 6 ///This allows races to have specific hair colors. If null, it uses the H's hair/facial hair colors. If "mutcolor", it uses the H's mutant_color. If "fixedmutcolor", it uses fixedmutcolor @@ -111,28 +112,6 @@ GLOBAL_LIST_EMPTY(features_by_species) var/brutemod = 1 ///multiplier for burn damage var/burnmod = 1 - ///multiplier for damage from cold temperature - var/coldmod = 1 - ///multiplier for damage from hot temperature - var/heatmod = 1 - ///multiplier for stun durations - var/stunmod = 1 - ///multiplier for money paid at payday - var/payday_modifier = 1 - ///Base electrocution coefficient. Basically a multiplier for damage from electrocutions. - var/siemens_coeff = 1 - ///To use MUTCOLOR with a fixed color that's independent of the mcolor feature in DNA. - var/fixed_mut_color = "" - ///Special mutation that can be found in the genepool exclusively in this species. Dont leave empty or changing species will be a headache - var/inert_mutation = /datum/mutation/human/dwarfism - ///Used to set the mob's death_sound upon species change - var/death_sound - ///Sounds to override barefeet walking - var/list/special_step_sounds - ///Special sound for grabbing - var/grab_sound - /// A path to an outfit that is important for species life e.g. plasmaman outfit - var/datum/outfit/outfit_important_for_life //Used for metabolizing reagents. We're going to assume you're a meatbag unless you say otherwise. var/reagent_tag = PROCESS_ORGANIC @@ -163,7 +142,8 @@ GLOBAL_LIST_EMPTY(features_by_species) ///What gas does this species breathe? Used by suffocation screen alerts, most of actual gas breathing is handled by mutantlungs. See [life.dm][code/modules/mob/living/carbon/human/life.dm] var/breathid = "o2" - + ///are we a furry little guy? + var/uses_fur = FALSE ///What anim to use for dusting var/dust_anim = "dust-h" ///What anim to use for gibbing @@ -203,6 +183,33 @@ GLOBAL_LIST_EMPTY(features_by_species) ///Replaces default bladder with a different organ var/obj/item/organ/internal/bladder/mutantbladder = /obj/item/organ/internal/bladder + /// Flat modifier on all damage taken via [apply_damage][/mob/living/proc/apply_damage] (so being punched, shot, etc.) + /// IE: 10 = 10% less damage taken. + var/damage_modifier = 0 + ///multiplier for damage from cold temperature + var/coldmod = 1 + ///multiplier for damage from hot temperature + var/heatmod = 1 + ///multiplier for stun durations + var/stunmod = 1 + ///multiplier for money paid at payday + var/payday_modifier = 1.0 + ///Base electrocution coefficient. Basically a multiplier for damage from electrocutions. + var/siemens_coeff = 1 + ///To use MUTCOLOR with a fixed color that's independent of the mcolor feature in DNA. + var/fixed_mut_color = "" + ///A fixed hair color that's independent of the mcolor feature in DNA. + var/fixed_hair_color = "" + ///Special mutation that can be found in the genepool exclusively in this species. Dont leave empty or changing species will be a headache + var/inert_mutation = /datum/mutation/human/dwarfism + ///Used to set the mob's death_sound upon species change + var/death_sound + ///Sounds to override barefeet walking + var/list/special_step_sounds + ///Special sound for grabbing + var/grab_sound + /// A path to an outfit that is important for species life e.g. plasmaman outfit + var/datum/outfit/outfit_important_for_life ///Bitflag that controls what in game ways something can select this species as a spawnable source, such as magic mirrors. See [mob defines][code/__DEFINES/mobs.dm] for possible sources. var/changesource_flags = NONE @@ -237,8 +244,10 @@ GLOBAL_LIST_EMPTY(features_by_species) /// Was on_species_gain ever actually called? /// Species code is really odd... var/properly_gained = FALSE - ///are we furry little creatures - var/use_fur = FALSE + + ///A list containing outfits that will be overridden in the species_equip_outfit proc. [Key = Typepath passed in] [Value = Typepath of outfit you want to equip for this specific species instead]. + var/list/outfit_override_registry = list() + ///health mod of a species var/maxhealthmod = 1 ///Path to BODYTYPE_CUSTOM species worn icons. An assoc list of ITEM_SLOT_X => /icon @@ -758,7 +767,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/datum/sprite_accessory/undershirt/undershirt = GLOB.undershirt_list[species_human.undershirt] if(undershirt) var/mutable_appearance/working_shirt - if(species_human.dna.species.sexes && species_human.physique == FEMALE) + if(species_human.dna.species.sexes && species_human.physique == FEMALE && species_human.get_bodypart(BODY_ZONE_CHEST)?.is_dimorphic) working_shirt = wear_female_version(undershirt.icon_state, undershirt.icon, BODY_LAYER) else working_shirt = mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER) @@ -1154,9 +1163,6 @@ GLOBAL_LIST_EMPTY(features_by_species) chem.overdose_start(H) H.log_message("has started overdosing on [chem.name] at [chem.volume] units.", LOG_GAME) -/datum/species/proc/check_species_weakness(obj/item, mob/living/attacker) - return 1 //This is not a boolean, it's the multiplier for the damage that the user takes from the item. The force of the item is multiplied by this value - /** * Equip the outfit required for life. Replaces items currently worn. */ @@ -1404,28 +1410,36 @@ GLOBAL_LIST_EMPTY(features_by_species) span_userdanger("You block [weapon]!")) return FALSE - var/hit_area - if(!affecting) //Something went wrong. Maybe the limb is missing? - affecting = human.bodyparts[1] - - hit_area = affecting.plaintext_zone - var/def_zone = affecting.body_zone - - var/armor_block = human.run_armor_check(affecting, MELEE, span_notice("Your armor has protected your [hit_area]!"), span_warning("Your armor has softened a hit to your [hit_area]!"),weapon.armour_penetration, weak_against_armour = weapon.weak_against_armour) - armor_block = min(ARMOR_MAX_BLOCK, armor_block) //cap damage reduction at 90% - var/Iwound_bonus = weapon.wound_bonus - + affecting ||= human.bodyparts[1] //Something went wrong. Maybe the limb is missing? + var/hit_area = affecting.plaintext_zone + var/armor_block = min(human.run_armor_check( + def_zone = affecting, + attack_flag = MELEE, + absorb_text = span_notice("Your armor has protected your [hit_area]!"), + soften_text = span_warning("Your armor has softened a hit to your [hit_area]!"), + armour_penetration = weapon.armour_penetration, + weak_against_armour = weapon.weak_against_armour, + ), ARMOR_MAX_BLOCK) //cap damage reduction at 90% + + var/modified_wound_bonus = weapon.wound_bonus // this way, you can't wound with a surgical tool on help intent if they have a surgery active and are lying down, so a misclick with a circular saw on the wrong limb doesn't bleed them dry (they still get hit tho) if((weapon.item_flags & SURGICAL_TOOL) && !(user.istate & ISTATE_HARM) && human.body_position == LYING_DOWN && (LAZYLEN(human.surgeries) > 0)) - Iwound_bonus = CANT_WOUND - - var/weakness = check_species_weakness(weapon, user) + modified_wound_bonus = CANT_WOUND human.send_item_attack_message(weapon, user, hit_area, affecting) + human.apply_damage( + damage = weapon.force, + damagetype = weapon.damtype, + def_zone = affecting, + blocked = armor_block, + wound_bonus = modified_wound_bonus, + bare_wound_bonus = weapon.bare_wound_bonus, + sharpness = weapon.get_sharpness(), + attack_direction = get_dir(user, human), + attacking_item = weapon, + ) - var/attack_direction = get_dir(user, human) - apply_damage(weapon.force * weakness, weapon.damtype, def_zone, armor_block, human, wound_bonus = Iwound_bonus, bare_wound_bonus = weapon.bare_wound_bonus, sharpness = weapon.get_sharpness(), attack_direction = attack_direction) if(!weapon.force) return FALSE //item force is zero @@ -1435,7 +1449,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if(!(prob(25 + (weapon.force * 2)))) return TRUE - if(IS_ORGANIC_LIMB(affecting)) + if(affecting.can_bleed()) weapon.add_mob_blood(human) //Make the weapon bloody, not the person. if(prob(weapon.force * 2)) //blood spatter! bloody = TRUE @@ -1497,73 +1511,6 @@ GLOBAL_LIST_EMPTY(features_by_species) return TRUE -/datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null) - SEND_SIGNAL(H, COMSIG_MOB_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction) - var/hit_percent = (100-(blocked+armor))/100 - hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100 - if(!damage || (!forced && hit_percent <= 0)) - return 0 - - var/obj/item/bodypart/BP = null - if(!spread_damage) - if(isbodypart(def_zone)) - BP = def_zone - else - if(!def_zone) - def_zone = H.get_random_valid_zone(def_zone) - BP = H.get_bodypart(check_zone(def_zone)) - if(!BP) - BP = H.bodyparts[1] - - switch(damagetype) - if(BRUTE) - H.damageoverlaytemp = 20 - var/damage_amount = forced ? damage : damage * hit_percent * brutemod * H.physiology.brute_mod - if(BP) - if(BP.receive_damage(damage_amount, 0, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness, attack_direction = attack_direction)) - H.update_damage_overlays() - else//no bodypart, we deal damage with a more general method. - H.adjustBruteLoss(damage_amount) - if(BURN) - H.damageoverlaytemp = 20 - var/damage_amount = forced ? damage : damage * hit_percent * burnmod * H.physiology.burn_mod - if(BP) - if(BP.receive_damage(0, damage_amount, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness, attack_direction = attack_direction)) - H.update_damage_overlays() - else - H.adjustFireLoss(damage_amount) - if(TOX) - var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.tox_mod - H.adjustToxLoss(damage_amount) - if(OXY) - var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.oxy_mod - H.adjustOxyLoss(damage_amount) - if(CLONE) - var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.clone_mod - H.adjustCloneLoss(damage_amount) - if(STAMINA) - var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.stamina_mod - H.stamina.adjust(-damage_amount) - if(BRAIN) - var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.brain_mod - H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount) - SEND_SIGNAL(H, COMSIG_MOB_AFTER_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction) - return 1 - -/datum/species/proc/on_hit(obj/projectile/P, mob/living/carbon/human/H) - // called when hit by a projectile - switch(P.type) - if(/obj/projectile/energy/floramut) // overwritten by plants/pods - H.show_message(span_notice("The radiation beam dissipates harmlessly through your body.")) - if(/obj/projectile/energy/florayield) - H.show_message(span_notice("The radiation beam dissipates harmlessly through your body.")) - if(/obj/projectile/energy/florarevolution) - H.show_message(span_notice("The radiation beam dissipates harmlessly through your body.")) - -/datum/species/proc/bullet_act(obj/projectile/P, mob/living/carbon/human/H) - // called before a projectile hit - return 0 - ////////////////////////// // ENVIRONMENT HANDLERS // ////////////////////////// @@ -1804,19 +1751,26 @@ GLOBAL_LIST_EMPTY(features_by_species) // Lets pick a random body part and check for an existing burn var/obj/item/bodypart/bodypart = pick(humi.bodyparts) - var/datum/wound/burn/existing_burn = locate(/datum/wound/burn) in bodypart.wounds - + var/datum/wound/existing_burn + for (var/datum/wound/iterated_wound as anything in bodypart.wounds) + var/datum/wound_pregen_data/pregen_data = iterated_wound.get_pregen_data() + if (pregen_data.wound_series in GLOB.wounding_types_to_series[WOUND_BURN]) + existing_burn = iterated_wound + break // If we have an existing burn try to upgrade it + var/severity if(existing_burn) switch(existing_burn.severity) if(WOUND_SEVERITY_MODERATE) if(humi.bodytemperature > BODYTEMP_HEAT_WOUND_LIMIT + 400) // 800k - bodypart.force_wound_upwards(/datum/wound/burn/severe) + severity = WOUND_SEVERITY_SEVERE if(WOUND_SEVERITY_SEVERE) if(humi.bodytemperature > BODYTEMP_HEAT_WOUND_LIMIT + 2800) // 3200k - bodypart.force_wound_upwards(/datum/wound/burn/critical) + severity = WOUND_SEVERITY_CRITICAL else // If we have no burn apply the lowest level burn - bodypart.force_wound_upwards(/datum/wound/burn/moderate) + severity = WOUND_SEVERITY_MODERATE + + humi.cause_wound_of_type_and_severity(WOUND_BURN, bodypart, severity, wound_source = "hot temperatures") // always take some burn damage var/burn_damage = HEAT_DAMAGE_LEVEL_1 @@ -1836,11 +1790,12 @@ GLOBAL_LIST_EMPTY(features_by_species) switch(adjusted_pressure) // Very high pressure, show an alert and take damage if(HAZARD_HIGH_PRESSURE to INFINITY) - if(!HAS_TRAIT(H, TRAIT_RESISTHIGHPRESSURE)) - H.adjustBruteLoss(min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) - 1) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * H.physiology.pressure_mod * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) - H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/highpressure, 2) - else + if(HAS_TRAIT(H, TRAIT_RESISTHIGHPRESSURE)) H.clear_alert(ALERT_PRESSURE) + else + var/pressure_damage = min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) - 1) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * H.physiology.pressure_mod * H.physiology.brute_mod * seconds_per_tick + H.adjustBruteLoss(pressure_damage, required_bodytype = BODYTYPE_ORGANIC) + H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/highpressure, 2) // High pressure, show an alert if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) @@ -1864,7 +1819,8 @@ GLOBAL_LIST_EMPTY(features_by_species) if(HAS_TRAIT(H, TRAIT_RESISTLOWPRESSURE)) H.clear_alert(ALERT_PRESSURE) else - H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod * seconds_per_tick) + var/pressure_damage = LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod * H.physiology.brute_mod * seconds_per_tick + H.adjustBruteLoss(pressure_damage, required_bodytype = BODYTYPE_ORGANIC) H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/lowpressure, 2) @@ -2319,9 +2275,9 @@ GLOBAL_LIST_EMPTY(features_by_species) new_species ||= target.dna.species //If no new species is provided, assume its src. //Note for future: Potentionally add a new C.dna.species() to build a template species for more accurate limb replacement + var/is_digitigrade = FALSE if((new_species.digitigrade_customization == DIGITIGRADE_OPTIONAL && target.dna.features["legs"] == DIGITIGRADE_LEGS) || new_species.digitigrade_customization == DIGITIGRADE_FORCED) - new_species.bodypart_overrides[BODY_ZONE_R_LEG] = /obj/item/bodypart/leg/right/digitigrade - new_species.bodypart_overrides[BODY_ZONE_L_LEG] = /obj/item/bodypart/leg/left/digitigrade + is_digitigrade = TRUE for(var/obj/item/bodypart/old_part as anything in target.bodyparts) if((old_part.change_exempt_flags & BP_BLOCK_CHANGE_SPECIES) || (old_part.bodypart_flags & BODYPART_IMPLANTED)) @@ -2331,6 +2287,8 @@ GLOBAL_LIST_EMPTY(features_by_species) var/obj/item/bodypart/new_part if(path) new_part = new path() + if(istype(new_part, /obj/item/bodypart/leg) && is_digitigrade) + new_part:set_digitigrade(TRUE) new_part.replace_limb(target, TRUE) new_part.update_limb(is_creating = TRUE) qdel(old_part) diff --git a/code/modules/mob/living/carbon/human/damage_procs.dm b/code/modules/mob/living/carbon/human/damage_procs.dm deleted file mode 100644 index a3d47d496adc..000000000000 --- a/code/modules/mob/living/carbon/human/damage_procs.dm +++ /dev/null @@ -1,4 +0,0 @@ - -/// depending on the species, it will run the corresponding apply_damage code there -/mob/living/carbon/human/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null) - return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, forced, spread_damage, wound_bonus, bare_wound_bonus, sharpness, attack_direction) diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 68b2694deca6..1949da4353c0 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -109,6 +109,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) target.dna.features["arachnid_appendages"] = "Long" //Monkestation Addition target.dna.features["arachnid_chelicerae"] = "Basic" //Monkestation Addition target.dna.features["goblin_ears"] = "Normal" //Monkestation Addition + target.dna.features["floran_leaves"] = "Furnivour" //Monkestation Addition /// Provides a dummy that is consistently bald, white, naked, etc. /mob/living/carbon/human/dummy/consistent diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 1736ea531837..f893404cab6f 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -237,7 +237,7 @@ msg += "[t_He] look[p_s()] extremely disgusted.\n" var/apparent_blood_volume = blood_volume - if((dna.species.use_skintones || dna.species.use_fur)&& skin_tone == "albino") + if((dna.species.use_skintones)&& skin_tone == "albino") apparent_blood_volume -= 150 // enough to knock you down one tier switch(apparent_blood_volume) if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d6f8a875abe5..797d34e56bca 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -199,7 +199,7 @@ return if(href_list["quirk"]) - var/quirkstring = get_quirk_string(TRUE, CAT_QUIRK_ALL) + var/quirkstring = get_quirk_string(TRUE, CAT_QUIRK_ALL, from_scan = TRUE) if(quirkstring) to_chat(human_user, "Detected physiological traits:\n[quirkstring]") else diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index cf71bec52b7b..2660d5e3196f 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -10,7 +10,7 @@ var/obj/item/bodypart/affecting = get_bodypart(check_zone(def_zone)) if(affecting) return checkarmor(affecting, type) - //If a specific bodypart is targetted, check how that bodypart is protected and return the value. + //If a specific bodypart is targeted, 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) @@ -44,55 +44,43 @@ covering_part += C return covering_part -/mob/living/carbon/human/on_hit(obj/projectile/P) - if(dna?.species) - dna.species.on_hit(P, src) - - /mob/living/carbon/human/bullet_act(obj/projectile/P, def_zone, piercing_hit = FALSE) - if(dna?.species) - var/spec_return = dna.species.bullet_act(P, src) - if(spec_return) - return spec_return - //MARTIAL ART STUFF - if(mind) - if(mind.martial_art && mind.martial_art.can_use(src)) //Some martial arts users can deflect projectiles! - var/martial_art_result = mind.martial_art.on_projectile_hit(src, P, def_zone) - if(!(martial_art_result == BULLET_ACT_HIT)) - return martial_art_result - - if(!(P.original == src && P.firer == src)) //can't block or reflect when shooting yourself - if(P.reflectable & REFLECT_NORMAL) - if(check_reflect(def_zone)) // Checks if you've passed a reflection% check - visible_message(span_danger("The [P.name] gets reflected by [src]!"), \ - span_userdanger("The [P.name] gets reflected by [src]!")) - // Find a turf near or on the original location to bounce to - if(!isturf(loc)) //Open canopy mech (ripley) check. if we're inside something and still got hit - P.force_hit = TRUE //The thing we're in passed the bullet to us. Pass it back, and tell it to take the damage. - loc.bullet_act(P, def_zone, piercing_hit) - return BULLET_ACT_HIT - if(P.starting) - var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/turf/curloc = get_turf(src) - - // redirect the projectile - P.original = locate(new_x, new_y, P.z) - P.starting = curloc - P.firer = src - P.yo = new_y - curloc.y - P.xo = new_x - curloc.x - var/new_angle_s = P.Angle + rand(120,240) - while(new_angle_s > 180) // Translate to regular projectile degrees - new_angle_s -= 360 - P.set_angle(new_angle_s) - - return BULLET_ACT_FORCE_PIERCE // complete projectile permutation - - if(check_shields(P, P.damage, "the [P.name]", PROJECTILE_ATTACK, P.armour_penetration)) - P.on_hit(src, 100, def_zone, piercing_hit) - return BULLET_ACT_HIT + if(P.firer == src && P.original == src) //can't block or reflect when shooting yourself + return ..() + + if(P.reflectable & REFLECT_NORMAL) + if(check_reflect(def_zone)) // Checks if you've passed a reflection% check + visible_message( + span_danger("The [P.name] gets reflected by [src]!"), + span_userdanger("The [P.name] gets reflected by [src]!"), + ) + // Find a turf near or on the original location to bounce to + if(!isturf(loc)) //Open canopy mech (ripley) check. if we're inside something and still got hit + P.force_hit = TRUE //The thing we're in passed the bullet to us. Pass it back, and tell it to take the damage. + loc.bullet_act(P, def_zone, piercing_hit) + return BULLET_ACT_HIT + if(P.starting) + var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/turf/curloc = get_turf(src) + + // redirect the projectile + P.original = locate(new_x, new_y, P.z) + P.starting = curloc + P.firer = src + P.yo = new_y - curloc.y + P.xo = new_x - curloc.x + var/new_angle_s = P.Angle + rand(120,240) + while(new_angle_s > 180) // Translate to regular projectile degrees + new_angle_s -= 360 + P.set_angle(new_angle_s) + + return BULLET_ACT_FORCE_PIERCE // complete projectile permutation + + if(check_shields(P, P.damage, "the [P.name]", PROJECTILE_ATTACK, P.armour_penetration, P.damage_type)) + P.on_hit(src, 100, def_zone, piercing_hit) + return BULLET_ACT_HIT return ..() diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 091a219b872a..80fd5ade9649 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -65,7 +65,11 @@ var/list/datum/bioware = list() /// What types of mobs are allowed to ride/buckle to this mob - var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot)) + var/static/list/can_ride_typecache = typecacheof(list( + /mob/living/basic/parrot, + /mob/living/carbon/human, + /mob/living/simple_animal/slime, + )) var/lastpuke = 0 var/account_id diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 6637b6174ca3..ccd30def5fce 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -171,13 +171,15 @@ if(LAZYLEN(scar_data) != SCAR_SAVE_LENGTH) return // invalid, should delete var/version = text2num(scar_data[SCAR_SAVE_VERS]) - if(!version || version < SCAR_CURRENT_VERSION) // get rid of old scars + if(!version || version != SCAR_CURRENT_VERSION) // get rid of scars using a incompatable version return if(specified_char_index && (mind?.original_character_slot_index != specified_char_index)) return + if (isnull(text2num(scar_data[SCAR_SAVE_BIOLOGY]))) + return var/obj/item/bodypart/the_part = get_bodypart("[scar_data[SCAR_SAVE_ZONE]]") var/datum/scar/scaries = new - return scaries.load(the_part, scar_data[SCAR_SAVE_VERS], scar_data[SCAR_SAVE_DESC], scar_data[SCAR_SAVE_PRECISE_LOCATION], text2num(scar_data[SCAR_SAVE_SEVERITY]), text2num(scar_data[SCAR_SAVE_BIOLOGY]), text2num(scar_data[SCAR_SAVE_CHAR_SLOT])) + return scaries.load(the_part, scar_data[SCAR_SAVE_VERS], scar_data[SCAR_SAVE_DESC], scar_data[SCAR_SAVE_PRECISE_LOCATION], text2num(scar_data[SCAR_SAVE_SEVERITY]), text2num(scar_data[SCAR_SAVE_BIOLOGY]), text2num(scar_data[SCAR_SAVE_CHAR_SLOT]), text2num(scar_data[SCAR_SAVE_CHECK_ANY_BIO])) /// Read all the scars we have for the designated character/scar slots, verify they're good/dump them if they're old/wrong format, create them on the user, and write the scars that passed muster back to the file /mob/living/carbon/human/proc/load_persistent_scars() diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index 2c371e78b7ff..b7c5018e6db8 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -105,7 +105,11 @@ There are several things that need to be remembered: if((dna?.species.bodytype & BODYTYPE_MONKEY) && (uniform.supports_variations_flags & CLOTHING_MONKEY_VARIATION)) icon_file = MONKEY_UNIFORM_FILE else if((dna?.species.bodytype & BODYTYPE_DIGITIGRADE) && (uniform.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) - icon_file = DIGITIGRADE_UNIFORM_FILE + icon_file = uniform.worn_icon_digitigrade || DIGITIGRADE_UNIFORM_FILE + if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(uniform)))) //if the digitigrade icon doesn't exist + var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_UNIFORM, uniform) + if(species_icon_file) + icon_file = species_icon_file //Female sprites have lower priority than digitigrade sprites else if(dna.species.bodytype & BODYTYPE_CUSTOM) icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_UNIFORM, w_uniform) @@ -124,7 +128,7 @@ There are several things that need to be remembered: isinhands = FALSE, female_uniform = woman ? uniform.female_sprite_flags : null, override_state = target_overlay, - override_file = handled_by_bodytype ? icon_file : null, + override_file = handled_by_bodytype ? icon_file : null ) if(OFFSET_UNIFORM in dna.species.offset_features) @@ -324,12 +328,25 @@ There are several things that need to be remembered: var/icon_file = DEFAULT_SHOES_FILE var/mutant_override = FALSE - if(dna.species.bodytype & BODYTYPE_CUSTOM) + if((dna.species.bodytype & BODYTYPE_DIGITIGRADE) && (worn_item.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) + var/obj/item/bodypart/leg/leg = src.get_bodypart(BODY_ZONE_L_LEG) + if(leg.limb_id == leg.digitigrade_id) //make sure our legs are visually digitigrade + icon_file = shoes.worn_icon_digitigrade || DIGITIGRADE_SHOES_FILE + if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(worn_item)))) //if the digitigrade icon doesn't exist + var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_SHOES, shoes) + if(species_icon_file) + icon_file = species_icon_file + mutant_override = TRUE + else if(dna.species.bodytype & BODYTYPE_CUSTOM) var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_SHOES, shoes) if(species_icon_file) icon_file = species_icon_file mutant_override = TRUE + if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(worn_item)))) + mutant_override = FALSE + icon_file = DEFAULT_SHOES_FILE + var/mutable_appearance/shoes_overlay = shoes.build_worn_icon(default_layer = SHOES_LAYER, default_icon_file = icon_file, override_file = mutant_override ? icon_file : null) if(!shoes_overlay) return @@ -380,12 +397,22 @@ There are several things that need to be remembered: var/icon_file = 'icons/mob/clothing/head/default.dmi' var/mutant_override = FALSE - if(dna.species.bodytype & BODYTYPE_CUSTOM) + + if(dna.species.bodytype & BODYTYPE_SNOUTED) + if(worn_item.supports_variations_flags & CLOTHING_SNOUTED_VARIATION) + if((icon_exists(head.worn_icon_snouted || SNOUTED_HEAD_FILE, RESOLVE_ICON_STATE(worn_item)))) //make sure the icon we're about to switch to exists + icon_file = head.worn_icon_snouted || SNOUTED_HEAD_FILE + mutant_override = TRUE + else if(dna.species.bodytype & BODYTYPE_CUSTOM) var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_HEAD, head) if(species_icon_file) icon_file = species_icon_file mutant_override = TRUE + if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(worn_item)))) + mutant_override = FALSE + icon_file = 'icons/mob/clothing/head/default.dmi' + var/mutable_appearance/head_overlay = head.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = icon_file, override_file = mutant_override ? icon_file : null) if(!mutant_override &&(OFFSET_HEAD in dna.species.offset_features)) head_overlay.pixel_x += dna.species.offset_features[OFFSET_HEAD][1] @@ -439,13 +466,22 @@ There are several things that need to be remembered: var/icon_file = DEFAULT_SUIT_FILE var/mutant_override = FALSE - if(dna.species.bodytype & BODYTYPE_CUSTOM) + if((dna?.species.bodytype & BODYTYPE_DIGITIGRADE) && (wear_suit.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) + icon_file = wear_suit.worn_icon_digitigrade || DIGITIGRADE_SUIT_FILE + mutant_override = TRUE + else if(dna.species.bodytype & BODYTYPE_CUSTOM) var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_SUIT, wear_suit) if(species_icon_file) icon_file = species_icon_file mutant_override = TRUE + if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(worn_item)))) + mutant_override = FALSE + icon_file = DEFAULT_SUIT_FILE + var/mutable_appearance/suit_overlay = wear_suit.build_worn_icon(default_layer = SUIT_LAYER, default_icon_file = icon_file, override_file = mutant_override ? icon_file : null) + if(!suit_overlay) + return if(!mutant_override && (OFFSET_SUIT in dna.species.offset_features)) suit_overlay.pixel_x += dna.species.offset_features[OFFSET_SUIT][1] suit_overlay.pixel_y += dna.species.offset_features[OFFSET_SUIT][2] @@ -497,12 +533,20 @@ There are several things that need to be remembered: var/icon_file = 'icons/mob/clothing/mask.dmi' var/mutant_override = FALSE - if(dna.species.bodytype & BODYTYPE_CUSTOM) + if(dna.species.bodytype & BODYTYPE_SNOUTED) + if(worn_item.supports_variations_flags & CLOTHING_SNOUTED_VARIATION) + icon_file = wear_mask.worn_icon_snouted || SNOUTED_MASK_FILE + mutant_override = TRUE + else if(dna.species.bodytype & BODYTYPE_CUSTOM) var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_MASK, wear_mask) if(species_icon_file) icon_file = species_icon_file mutant_override = TRUE + if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(worn_item)))) + icon_file = 'icons/mob/clothing/mask.dmi' + mutant_override = FALSE + var/mutable_appearance/mask_overlay = wear_mask.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = icon_file, override_file = mutant_override ? icon_file : null) if(!mutant_override &&(OFFSET_FACEMASK in dna.species.offset_features)) mask_overlay.pixel_x += dna.species.offset_features[OFFSET_FACEMASK][1] @@ -550,12 +594,7 @@ There are several things that need to be remembered: apply_overlay(LEGCUFF_LAYER) throw_alert("legcuffed", /atom/movable/screen/alert/restrained/legcuffed, new_master = src.legcuffed) -/mob/living/carbon/human/update_held_items() - remove_overlay(HANDS_LAYER) - if (handcuffed) - drop_all_held_items() - return - +/mob/living/carbon/human/get_held_overlays() var/list/hands = list() for(var/obj/item/worn_item in held_items) if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) @@ -589,10 +628,7 @@ There are several things that need to be remembered: hand_overlay.pixel_y += dna.species.offset_features[OFFSET_HANDS][2] hands += hand_overlay - - - overlays_standing[HANDS_LAYER] = hands - apply_overlay(HANDS_LAYER) + return hands /proc/wear_female_version(t_color, icon, layer, type, greyscale_colors) var/index = "[t_color]-[greyscale_colors]" @@ -610,7 +646,6 @@ There are several things that need to be remembered: out += overlays_standing[i] return out - //human HUD updates for items in our inventory /mob/living/carbon/human/proc/update_hud_uniform(obj/item/worn_item) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 467bf69a6171..8583a5beb56e 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -386,6 +386,22 @@ return O.equip(src, visualsOnly) +///A version of equipOutfit that overrides passed in outfits with their entry on the species' outfit override registry +/mob/living/carbon/human/proc/equip_species_outfit(outfit, visualsOnly = FALSE) + var/datum/outfit/outfit_to_equip + + var/override_outfit_path = dna?.species.outfit_override_registry[outfit] + if(override_outfit_path) + outfit_to_equip = new override_outfit_path + else + outfit_to_equip = new outfit + + if(isnull(outfit_to_equip)) + return FALSE + + return outfit_to_equip.equip(src, visualsOnly) + + //delete all equipment without dropping anything /mob/living/carbon/human/proc/delete_equipment() for(var/slot in get_all_worn_items())//order matters, dependant slots go first diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 214451c1cbec..678442bd79d3 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -19,7 +19,7 @@ #define THERMAL_PROTECTION_HAND_RIGHT 0.025 /mob/living/carbon/human/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return . = ..() diff --git a/code/modules/mob/living/carbon/human/physiology.dm b/code/modules/mob/living/carbon/human/physiology.dm index f83cc5e6203c..3d52aab08928 100644 --- a/code/modules/mob/living/carbon/human/physiology.dm +++ b/code/modules/mob/living/carbon/human/physiology.dm @@ -1,19 +1,34 @@ //Stores several modifiers in a way that isn't cleared by changing species /datum/physiology - var/brute_mod = 1 // % of brute damage taken from all sources - var/burn_mod = 1 // % of burn damage taken from all sources - var/tox_mod = 1 // % of toxin damage taken from all sources - var/oxy_mod = 1 // % of oxygen damage taken from all sources - var/clone_mod = 1 // % of clone damage taken from all sources - var/stamina_mod = 1 // % of stamina damage taken from all sources - var/brain_mod = 1 // % of brain damage taken from all sources + /// Multiplier to brute damage received. + /// IE: A brute mod of 0.9 = 10% less brute damage. + /// Only applies to damage dealt via [apply_damage][/mob/living/proc/apply_damage] unless factored in manually. + var/brute_mod = 1 + /// Multiplier to burn damage received + var/burn_mod = 1 + /// Multiplier to toxin damage received + var/tox_mod = 1 + /// Multiplier to oxygen damage received + var/oxy_mod = 1 + /// Multiplier to clone damage received + var/clone_mod = 1 + /// Multiplier to stamina damage received + var/stamina_mod = 1 + /// Multiplier to brain damage received + var/brain_mod = 1 - var/pressure_mod = 1 // % of brute damage taken from low or high pressure (stacks with brute_mod) - var/heat_mod = 1 // % of burn damage taken from heat (stacks with burn_mod) - var/cold_mod = 1 // % of burn damage taken from cold (stacks with burn_mod) + /// Multiplier to damage taken from high / low pressure exposure, stacking with the brute modifier + var/pressure_mod = 1 + /// Multiplier to damage taken from high temperature exposure, stacking with the burn modifier + var/heat_mod = 1 + /// Multiplier to damage taken from low temperature exposure, stacking with the toxin modifier + var/cold_mod = 1 - var/damage_resistance = 0 // %damage reduction from all sources + /// Flat damage reduction from taking damage + /// Unlike the other modifiers, this is not a multiplier. + /// IE: DR of 10 = 10% less damage. + var/damage_resistance = 0 var/siemens_coeff = 1 // resistance to shocks 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 3706d1144570..ad38e3331f93 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -11,6 +11,8 @@ TRAIT_NOHUNGER, TRAIT_VIRUSIMMUNE, TRAIT_NOBLOOD, + TRAIT_NODISMEMBER, + TRAIT_NEVER_WOUNDED ) mutanttongue = /obj/item/organ/internal/tongue/abductor mutantstomach = null diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index c70567af7e95..86897dec5cfb 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -35,17 +35,19 @@ BODY_ZONE_CHEST = /obj/item/bodypart/chest/fly, ) -/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, seconds_per_tick, times_fired) - if(chem.type == /datum/reagent/toxin/pestkiller) - H.adjustToxLoss(3 * REM * seconds_per_tick) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * seconds_per_tick) - return TRUE - return ..() +/datum/species/fly/on_species_gain(mob/living/carbon/human/human_who_gained_species, datum/species/old_species, pref_load) + . = ..() + RegisterSignal(human_who_gained_species, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, PROC_REF(damage_weakness)) -/datum/species/fly/check_species_weakness(obj/item/weapon, mob/living/attacker) - if(istype(weapon, /obj/item/melee/flyswatter)) - return 30 //Flyswatters deal 30x damage to flypeople. - return 1 +/datum/species/fly/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) + . = ..() + UnregisterSignal(C, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS) + +/datum/species/fly/proc/damage_weakness(datum/source, list/damage_mods, damage_amount, damagetype, def_zone, sharpness, attack_direction, obj/item/attacking_item) + SIGNAL_HANDLER + + if(istype(attacking_item, /obj/item/melee/flyswatter)) + damage_mods += 30 // Yes, a 30x damage modifier /datum/species/fly/get_species_description() return "With no official documentation or knowledge of the origin of \ 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 ff0ad9078547..45d36076c6f6 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -11,15 +11,14 @@ inherent_traits = list( TRAIT_GENELESS, TRAIT_NOBREATH, - TRAIT_NODISMEMBER, + TRAIT_NOBLOOD, TRAIT_NOFIRE, TRAIT_PIERCEIMMUNE, TRAIT_RADIMMUNE, - TRAIT_RESISTCOLD, - TRAIT_RESISTHEAT, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_NOBLOOD, + TRAIT_NO_DNA_COPY, + TRAIT_NO_TRANSFORMATION_STING, + TRAIT_NODISMEMBER, + TRAIT_NEVER_WOUNDED ) mutantheart = null mutantlungs = null @@ -404,11 +403,6 @@ if(COOLDOWN_FINISHED(src, radiation_emission_cooldown) && user != H) radiation_emission(H) -/datum/species/golem/uranium/on_hit(obj/projectile/P, mob/living/carbon/human/H) - ..() - if(COOLDOWN_FINISHED(src, radiation_emission_cooldown)) - radiation_emission(H) - //Immune to physical bullets and resistant to brute, but very vulnerable to burn damage. Dusts on death. /datum/species/golem/sand name = "Sand Golem" @@ -431,6 +425,7 @@ new /obj/item/stack/ore/glass(get_turf(H)) qdel(H) +/* /datum/species/golem/sand/bullet_act(obj/projectile/P, mob/living/carbon/human/H) if(!(P.original == H && P.firer == H)) if(P.armor_flag == BULLET || P.armor_flag == BOMB) @@ -439,6 +434,7 @@ span_userdanger("The [P.name] sinks harmlessly in [H]'s sandy body!")) return BULLET_ACT_BLOCK return ..() +*/ //Reflects lasers and resistant to burn damage, but very vulnerable to brute damage. Shatters on death. /datum/species/golem/glass @@ -463,6 +459,7 @@ new /obj/item/shard(get_turf(H)) qdel(H) +/* /datum/species/golem/glass/bullet_act(obj/projectile/P, mob/living/carbon/human/H) if(!(P.original == H && P.firer == H)) //self-shots don't reflect if(P.armor_flag == LASER || P.armor_flag == ENERGY) @@ -476,6 +473,7 @@ P.preparePixelProjectile(locate(clamp(new_x, 1, world.maxx), clamp(new_y, 1, world.maxy), H.z), H) return BULLET_ACT_FORCE_PIERCE return ..() +*/ //Teleports when hit or when it wants to /datum/species/golem/bluespace @@ -519,11 +517,6 @@ if(world.time > last_teleport + teleport_cooldown && user != H) reactive_teleport(H) -/datum/species/golem/bluespace/on_hit(obj/projectile/P, mob/living/carbon/human/H) - ..() - if(world.time > last_teleport + teleport_cooldown) - reactive_teleport(H) - /datum/species/golem/bluespace/on_species_gain(mob/living/carbon/C, datum/species/old_species) ..() if(ishuman(C)) @@ -635,12 +628,6 @@ new /obj/item/grown/bananapeel/specialpeel(get_turf(H)) COOLDOWN_START(src, banana_cooldown, banana_delay) -/datum/species/golem/bananium/on_hit(obj/projectile/P, mob/living/carbon/human/H) - ..() - if(COOLDOWN_FINISHED(src, banana_cooldown)) - new /obj/item/grown/bananapeel/specialpeel(get_turf(H)) - COOLDOWN_START(src, banana_cooldown, banana_delay) - /datum/species/golem/bananium/spec_hitby(atom/movable/AM, mob/living/carbon/human/H) ..() var/obj/item/I @@ -962,12 +949,14 @@ var/last_gong_time = 0 var/gong_cooldown = 150 +/* /datum/species/golem/bronze/bullet_act(obj/projectile/P, mob/living/carbon/human/H) if(!(world.time > last_gong_time + gong_cooldown)) return ..() if(P.armor_flag == BULLET || P.armor_flag == BOMB) gong(H) return ..() +*/ /datum/species/golem/bronze/spec_hitby(atom/movable/AM, mob/living/carbon/human/H) ..() @@ -984,10 +973,6 @@ if(world.time > last_gong_time + gong_cooldown) gong(H) -/datum/species/golem/bronze/on_hit(obj/projectile/P, mob/living/carbon/human/H) - ..() - if(world.time > last_gong_time + gong_cooldown) - gong(H) /datum/species/golem/bronze/proc/gong(mob/living/carbon/human/H) last_gong_time = world.time 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 8378976261fa..ac9265606ba2 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -272,12 +272,12 @@ if(!isslimeperson(H)) return CHECK_DNA_AND_SPECIES(H) - H.visible_message("[owner] gains a look of \ - concentration while standing perfectly still.", - "You focus intently on moving your body while \ - standing perfectly still...") + H.visible_message( + span_notice("[owner] gains a look of concentration while standing perfectly still."), + span_notice("You focus intently on moving your body while standing perfectly still..."), + ) - H.notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, REF(src)) if(do_after(owner, delay = 6 SECONDS, target = owner, timed_action_flags = IGNORE_HELD_ITEM)) if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT) @@ -287,7 +287,7 @@ else to_chat(H, span_warning("...but fail to stand perfectly still!")) - H.notransform = FALSE + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, REF(src)) /datum/action/innate/split_body/proc/make_dupe() var/mob/living/carbon/human/H = owner @@ -313,7 +313,7 @@ SEND_SIGNAL(spare, COMSIG_NANITE_SYNC, owner_nanites, TRUE, TRUE) //The trues are to copy activation as well H.blood_volume *= 0.45 - H.notransform = 0 + REMOVE_TRAIT(H, TRAIT_NO_TRANSFORM, REF(src)) var/datum/species/jelly/slime/origin_datum = H.dna.species origin_datum.bodies |= spare @@ -323,10 +323,10 @@ H.transfer_quirk_datums(spare) H.mind.transfer_to(spare) - spare.visible_message("[H] distorts as a new body \ - \"steps out\" of [H.p_them()].", - "...and after a moment of disorentation, \ - you're besides yourself!") + spare.visible_message( + span_warning("[H] distorts as a new body \"steps out\" of [H.p_them()]."), + span_notice("...and after a moment of disorentation, you're besides yourself!"), + ) /datum/action/innate/swap_body 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 7c89d711bc41..518132aed5e4 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -51,16 +51,19 @@ return randname -/datum/species/moth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, seconds_per_tick, times_fired) +/datum/species/moth/on_species_gain(mob/living/carbon/human/human_who_gained_species, datum/species/old_species, pref_load) . = ..() - if(chem.type == /datum/reagent/toxin/pestkiller) - H.adjustToxLoss(3 * REM * seconds_per_tick) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * seconds_per_tick) - -/datum/species/moth/check_species_weakness(obj/item/weapon, mob/living/attacker) - if(istype(weapon, /obj/item/melee/flyswatter)) - return 10 //flyswatters deal 10x damage to moths - return 1 + RegisterSignal(human_who_gained_species, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, PROC_REF(damage_weakness)) + +/datum/species/moth/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) + . = ..() + UnregisterSignal(C, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS) + +/datum/species/moth/proc/damage_weakness(datum/source, list/damage_mods, damage_amount, damagetype, def_zone, sharpness, attack_direction, obj/item/attacking_item) + SIGNAL_HANDLER + + if(istype(attacking_item, /obj/item/melee/flyswatter)) + damage_mods += 10 // Yes, a 10x damage modifier /datum/species/moth/randomize_features(mob/living/carbon/human/human_mob) 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 16cb62941e6a..2b83f8455e69 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -56,6 +56,13 @@ ass_image = 'icons/ass/assplasma.png' + outfit_override_registry = list( + /datum/outfit/syndicate = /datum/outfit/syndicate/plasmaman, + /datum/outfit/syndicate/full = /datum/outfit/syndicate/full/plasmaman, + /datum/outfit/syndicate/leader = /datum/outfit/syndicate/leader/plasmaman, + /datum/outfit/syndicate/reinforcement = /datum/outfit/syndicate/reinforcement/plasmaman, + ) + /// If the bones themselves are burning clothes won't help you much var/internal_fire = FALSE diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index a1812d845ec6..9812b2fad673 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -13,6 +13,8 @@ TRAIT_RADIMMUNE, TRAIT_VIRUSIMMUNE, TRAIT_NOBLOOD, + TRAIT_NODISMEMBER, + TRAIT_NEVER_WOUNDED ) inherent_factions = list(FACTION_FAITHLESS) changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 1b21c8620134..49c8a32db086 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -45,6 +45,11 @@ new_vampire.skin_tone = "albino" new_vampire.update_body(0) new_vampire.set_safe_hunger_level() + RegisterSignal(new_vampire, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, PROC_REF(damage_weakness)) + +/datum/species/vampire/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) + . = ..() + UnregisterSignal(C, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS) /datum/species/vampire/spec_life(mob/living/carbon/human/vampire, seconds_per_tick, times_fired) . = ..() @@ -66,10 +71,11 @@ vampire.adjust_fire_stacks(3 * seconds_per_tick) vampire.ignite_mob() -/datum/species/vampire/check_species_weakness(obj/item/weapon, mob/living/attacker) - if(istype(weapon, /obj/item/nullrod/whip)) - return 2 //Whips deal 2x damage to vampires. Vampire killer. - return 1 +/datum/species/vampire/proc/damage_weakness(datum/source, list/damage_mods, damage_amount, damagetype, def_zone, sharpness, attack_direction, obj/item/attacking_item) + SIGNAL_HANDLER + + if(istype(attacking_item, /obj/item/nullrod/whip)) + damage_mods += 2 /datum/species/vampire/get_species_description() return "A classy Vampire! They descend upon Space Station Thirteen Every year to spook the crew! \"Bleeg!!\"" diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index a859d6fd0f0d..b7f9b81de523 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -131,11 +131,6 @@ /datum/species/zombie/infectious/spec_stun(mob/living/carbon/human/H,amount) . = min(20, amount) -/datum/species/zombie/infectious/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, spread_damage = FALSE, forced = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null) - . = ..() - if(.) - COOLDOWN_START(src, regen_cooldown, REGENERATION_DELAY) - /datum/species/zombie/infectious/spec_life(mob/living/carbon/C, seconds_per_tick, times_fired) . = ..() C.set_combat_mode(TRUE) // THE SUFFERING MUST FLOW diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 9f167ad038a6..7aa38d0e373f 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -1,6 +1,5 @@ /mob/living/carbon/Life(seconds_per_tick = SSMOBS_DT, times_fired) - - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(isopenturf(loc)) diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index 91230207fccf..190885e1b48e 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -13,6 +13,8 @@ return /mob/living/carbon/stamina_stun() + if(HAS_TRAIT(src, TRAIT_BATON_RESISTANCE)) + return //baton resistance can't stam crit but can still be non sprinted if(HAS_TRAIT_FROM(src, TRAIT_INCAPACITATED, STAMINA)) //Already in stamcrit return if(check_stun_immunity(CANKNOCKDOWN)) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index b005a2db66ca..bb0b71635fae 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -1,59 +1,148 @@ /** - * Applies damage to this mob + * Applies damage to this mob. * * Sends [COMSIG_MOB_APPLY_DAMAGE] * * Arguuments: - * * damage - amount of damage - * * damagetype - one of [BRUTE], [BURN], [TOX], [OXY], [CLONE], [STAMINA] - * * def_zone - zone that is being hit if any - * * blocked - armor value applied - * * forced - bypass hit percentage - * * spread_damage - used in overrides + * * damage - Amount of damage + * * damagetype - What type of damage to do. one of [BRUTE], [BURN], [TOX], [OXY], [CLONE], [STAMINA], [BRAIN]. + * * def_zone - What body zone is being hit. Or a reference to what bodypart is being hit. + * * blocked - Percent modifier to damage. 100 = 100% less damage dealt, 50% = 50% less damage dealt. + * * forced - "Force" exactly the damage dealt. This means it skips damage modifier from blocked. + * * spread_damage - For carbons, spreads the damage across all bodyparts rather than just the targeted zone. + * * wound_bonus - Bonus modifier for wound chance. + * * bare_wound_bonus - Bonus modifier for wound chance on bare skin. + * * sharpness - Sharpness of the weapon. + * * attack_direction - Direction of the attack from the attacker to [src]. + * * attacking_item - Item that is attacking [src]. * - * Returns TRUE if damage applied + * Returns the amount of damage dealt. */ -/mob/living/proc/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null) - SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMAGE, damage, damagetype, def_zone) - var/hit_percent = (100-blocked)/100 - if(!damage || (!forced && hit_percent <= 0)) - return FALSE - var/damage_amount = forced ? damage : damage * hit_percent +/mob/living/proc/apply_damage( + damage = 0, + damagetype = BRUTE, + def_zone = null, + blocked = 0, + forced = FALSE, + spread_damage = FALSE, + wound_bonus = 0, + bare_wound_bonus = 0, + sharpness = NONE, + attack_direction = null, + attacking_item, +) + SHOULD_CALL_PARENT(TRUE) + var/damage_amount = damage + if(!forced) + damage_amount *= ((100 - blocked) / 100) + damage_amount *= get_incoming_damage_modifier(damage_amount, damagetype, def_zone, sharpness, attack_direction, attacking_item) + if(damage_amount <= 0) + return 0 + + SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMAGE, damage_amount, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) + + var/damage_dealt = 0 switch(damagetype) if(BRUTE) - adjustBruteLoss(damage_amount, forced = forced) + if(isbodypart(def_zone)) + var/obj/item/bodypart/actual_hit = def_zone + var/delta = actual_hit.get_damage() + if(actual_hit.receive_damage( + brute = damage_amount, + burn = 0, + forced = forced, + wound_bonus = wound_bonus, + bare_wound_bonus = bare_wound_bonus, + sharpness = sharpness, + attack_direction = attack_direction, + damage_source = attacking_item, + )) + update_damage_overlays() + damage_dealt = actual_hit.get_damage() - delta // Unfortunately bodypart receive_damage doesn't return damage dealt so we do it manually + else + damage_dealt = adjustBruteLoss(damage_amount, forced = forced) if(BURN) - adjustFireLoss(damage_amount, forced = forced) + if(isbodypart(def_zone)) + var/obj/item/bodypart/actual_hit = def_zone + var/delta = actual_hit.get_damage() + if(actual_hit.receive_damage( + brute = 0, + burn = damage_amount, + forced = forced, + wound_bonus = wound_bonus, + bare_wound_bonus = bare_wound_bonus, + sharpness = sharpness, + attack_direction = attack_direction, + damage_source = attacking_item, + )) + update_damage_overlays() + damage_dealt = delta - actual_hit.get_damage() // See above + else + damage_dealt = adjustFireLoss(damage_amount, forced = forced) if(TOX) - adjustToxLoss(damage_amount, forced = forced) + damage_dealt = adjustToxLoss(damage_amount, forced = forced) if(OXY) - adjustOxyLoss(damage_amount, forced = forced) + damage_dealt = adjustOxyLoss(damage_amount, forced = forced) if(CLONE) - adjustCloneLoss(damage_amount, forced = forced) + damage_dealt = adjustCloneLoss(damage_amount, forced = forced) if(STAMINA) - stamina.adjust(-damage_amount, forced = forced) - SEND_SIGNAL(src, COMSIG_MOB_AFTER_APPLY_DAMAGE, damage, damagetype, def_zone) - return TRUE + damage_dealt = stamina.adjust(-damage) + if(BRAIN) + damage_dealt = adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount) + + SEND_SIGNAL(src, COMSIG_MOB_AFTER_APPLY_DAMAGE, damage_dealt, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) + return damage_dealt + +/** + * Used in tandem with [/mob/living/proc/apply_damage] to calculate modifier applied into incoming damage + */ +/mob/living/proc/get_incoming_damage_modifier( + damage = 0, + damagetype = BRUTE, + def_zone = null, + sharpness = NONE, + attack_direction = null, + attacking_item, +) + SHOULD_CALL_PARENT(TRUE) + SHOULD_BE_PURE(TRUE) + + var/list/damage_mods = list() + SEND_SIGNAL(src, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, damage_mods, damage, damagetype, def_zone, sharpness, attack_direction, attacking_item) + + var/final_mod = 1 + for(var/new_mod in damage_mods) + final_mod *= new_mod + return final_mod + +/** + * Simply a wrapper for calling mob adjustXLoss() procs to heal a certain damage type, + * when you don't know what damage type you're healing exactly. + */ +/mob/living/proc/heal_damage_type(heal_amount = 0, damagetype = BRUTE) + heal_amount = abs(heal_amount) * -1 -///like [apply_damage][/mob/living/proc/apply_damage] except it always uses the damage procs -/mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE) switch(damagetype) if(BRUTE) - return adjustBruteLoss(damage) + return adjustBruteLoss(heal_amount) if(BURN) - return adjustFireLoss(damage) + return adjustFireLoss(heal_amount) if(TOX) - return adjustToxLoss(damage) + return adjustToxLoss(heal_amount) if(OXY) - return adjustOxyLoss(damage) + return adjustOxyLoss(heal_amount) if(CLONE) - return adjustCloneLoss(damage) + return adjustCloneLoss(heal_amount) if(STAMINA) - return stamina.adjust(-damage) + return stamina.adjust(heal_amount) /// return the damage amount for the type given -/mob/living/proc/get_damage_amount(damagetype = BRUTE) +/** + * Simply a wrapper for calling mob getXLoss() procs to get a certain damage type, + * when you don't know what damage type you're getting exactly. + */ +/mob/living/proc/get_current_damage_of_type(damagetype = BRUTE) switch(damagetype) if(BRUTE) return getBruteLoss() @@ -68,26 +157,34 @@ if(STAMINA) return stamina.loss -/// applies multiple damages at once via [/mob/living/proc/apply_damage] -/mob/living/proc/apply_damages(brute = 0, burn = 0, tox = 0, oxy = 0, clone = 0, def_zone = null, blocked = FALSE, stamina = 0, brain = 0) - if(blocked >= 100) - return 0 +/// Applies multiple damages at once via [apply_damage][/mob/living/proc/apply_damage] +/mob/living/proc/apply_damages( + brute = 0, + burn = 0, + tox = 0, + oxy = 0, + clone = 0, + def_zone = null, + blocked = 0, + stamina = 0, + brain = 0, +) + var/total_damage = 0 if(brute) - apply_damage(brute, BRUTE, def_zone, blocked) + total_damage += apply_damage(brute, BRUTE, def_zone, blocked) if(burn) - apply_damage(burn, BURN, def_zone, blocked) + total_damage += apply_damage(burn, BURN, def_zone, blocked) if(tox) - apply_damage(tox, TOX, def_zone, blocked) + total_damage += apply_damage(tox, TOX, def_zone, blocked) if(oxy) - apply_damage(oxy, OXY, def_zone, blocked) + total_damage += apply_damage(oxy, OXY, def_zone, blocked) if(clone) - apply_damage(clone, CLONE, def_zone, blocked) + total_damage += apply_damage(clone, CLONE, def_zone, blocked) if(stamina) - apply_damage(stamina, STAMINA, def_zone, blocked) + total_damage += apply_damage(stamina, STAMINA, def_zone, blocked) if(brain) - apply_damage(brain, BRAIN, def_zone, blocked) - return 1 - + total_damage += apply_damage(brain, BRAIN, def_zone, blocked) + return total_damage /// applies various common status effects or common hardcoded mob effects /mob/living/proc/apply_effect(effect = 0,effecttype = EFFECT_STUN, blocked = 0) @@ -159,21 +256,39 @@ return TRUE +/// Returns a multiplier to apply to a specific kind of damage +/mob/living/proc/get_damage_mod(damage_type) + switch(damage_type) + if (OXY) + return HAS_TRAIT(src, TRAIT_NOBREATH) ? 0 : 1 + if (TOX) + if (HAS_TRAIT(src, TRAIT_TOXINLOVER)) + return -1 + return HAS_TRAIT(src, TRAIT_TOXIMMUNE) ? 0 : 1 + return 1 /mob/living/proc/getBruteLoss() return bruteloss -/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) +/mob/living/proc/can_adjust_brute_loss(amount, forced, required_bodytype) var/area/target_area = get_area(src) if(target_area) if((target_area.area_flags & PASSIVE_AREA) && amount > 0) return FALSE - - if(amount < 0 && HAS_TRAIT(src, TRAIT_NO_HEALS)) - return FALSE if(!forced && (status_flags & GODMODE)) return FALSE + if(SEND_SIGNAL(src, COMSIG_LIVING_ADJUST_BRUTE_DAMAGE, BRUTE, amount, forced) & COMPONENT_IGNORE_CHANGE) + return FALSE + return TRUE + +/mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) + if (!can_adjust_brute_loss(amount, forced, required_bodytype)) + return 0 + . = bruteloss bruteloss = clamp((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + . -= bruteloss + if(!.) // no change, no need to update + return 0 if(updating_health) updatehealth() return amount @@ -189,18 +304,29 @@ /mob/living/proc/getOxyLoss() return oxyloss -/mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype, required_respiration_type = ALL) +/mob/living/proc/can_adjust_oxy_loss(amount, forced, required_biotype, required_respiration_type) + var/area/target_area = get_area(src) + if(target_area) + if((target_area.area_flags & PASSIVE_AREA) && amount > 0) + return FALSE if(!forced) if(status_flags & GODMODE) - return + return FALSE + if (required_respiration_type) + var/obj/item/organ/internal/lungs/affected_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) + if(isnull(affected_lungs)) + if(!(mob_respiration_type & required_respiration_type)) // if the mob has no lungs, use mob_respiration_type + return FALSE + else + if(!(affected_lungs.respiration_type & required_respiration_type)) // otherwise use the lungs' respiration_type + return FALSE + if(SEND_SIGNAL(src, COMSIG_LIVING_ADJUST_OXY_DAMAGE, OXY, amount, forced) & COMPONENT_IGNORE_CHANGE) + return FALSE + return TRUE - var/obj/item/organ/internal/lungs/affected_lungs = get_organ_slot(ORGAN_SLOT_LUNGS) - if(isnull(affected_lungs)) - if(!(mob_respiration_type & required_respiration_type)) // if the mob has no lungs, use mob_respiration_type - return - else - if(!(affected_lungs.respiration_type & required_respiration_type)) // otherwise use the lungs' respiration_type - return +/mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL, required_respiration_type = ALL) + if(!can_adjust_oxy_loss(amount, forced, required_biotype, required_respiration_type)) + return 0 . = oxyloss oxyloss = clamp((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) if(updating_health) @@ -228,11 +354,27 @@ /mob/living/proc/getToxLoss() return toxloss -/mob/living/proc/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) +/mob/living/proc/can_adjust_tox_loss(amount, forced, required_biotype) + if(!forced && ((status_flags & GODMODE) || !(mob_biotypes & required_biotype))) + return FALSE + if(SEND_SIGNAL(src, COMSIG_LIVING_ADJUST_TOX_DAMAGE, TOX, amount, forced) & COMPONENT_IGNORE_CHANGE) + return FALSE + return TRUE + +/mob/living/proc/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) var/area/target_area = get_area(src) if(target_area) if((target_area.area_flags & PASSIVE_AREA) && amount > 0) return FALSE + if(!can_adjust_tox_loss(amount, forced, required_biotype)) + return 0 + . = toxloss + toxloss = clamp((toxloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + . -= toxloss + if(!.) // no change, no need to update + return FALSE + if(updating_health) + updatehealth() if(amount < 0 && HAS_TRAIT(src, TRAIT_NO_HEALS)) return FALSE @@ -258,43 +400,62 @@ /mob/living/proc/getFireLoss() return fireloss -/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) +/mob/living/proc/can_adjust_fire_loss(amount, forced, required_bodytype) + if(!forced && (status_flags & GODMODE)) + return FALSE + if(SEND_SIGNAL(src, COMSIG_LIVING_ADJUST_BURN_DAMAGE, BURN, amount, forced) & COMPONENT_IGNORE_CHANGE) + return FALSE + return TRUE + +/mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype = ALL) var/area/target_area = get_area(src) if(target_area) if((target_area.area_flags & PASSIVE_AREA) && amount > 0) return FALSE - - if(amount < 0 && HAS_TRAIT(src, TRAIT_NO_HEALS)) - return FALSE - if(!forced && (status_flags & GODMODE)) - return FALSE + if(!can_adjust_fire_loss(amount, forced, required_bodytype)) + return 0 + . = fireloss fireloss = clamp((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + . -= fireloss + if(. == 0) // no change, no need to update + return if(updating_health) updatehealth() return amount /mob/living/proc/setFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) if(!forced && (status_flags & GODMODE)) - return + return 0 . = fireloss fireloss = amount + . -= fireloss + if(. == 0) // no change, no need to update + return 0 if(updating_health) updatehealth() /mob/living/proc/getCloneLoss() return cloneloss -/mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) +/mob/living/proc/can_adjust_clone_loss(amount, forced, required_biotype) + if(!forced && (!(mob_biotypes & required_biotype) || status_flags & GODMODE || HAS_TRAIT(src, TRAIT_NOCLONELOSS))) + return FALSE + if(SEND_SIGNAL(src, COMSIG_LIVING_ADJUST_CLONE_DAMAGE, CLONE, amount, forced) & COMPONENT_IGNORE_CHANGE) + return FALSE + return TRUE + +/mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype = ALL) var/area/target_area = get_area(src) if(target_area) if((target_area.area_flags & PASSIVE_AREA) && amount > 0) return FALSE - - if(amount < 0 && HAS_TRAIT(src, TRAIT_NO_HEALS)) - return FALSE - if(!forced && ( (status_flags & GODMODE) || HAS_TRAIT(src, TRAIT_NOCLONELOSS)) ) - return FALSE + if(!can_adjust_clone_loss(amount, forced, required_biotype)) + return 0 + . = cloneloss cloneloss = clamp((cloneloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + . -= cloneloss + if(. == 0) // no change, no need to update + return 0 if(updating_health) updatehealth() return amount @@ -357,11 +518,11 @@ ///heal up to amount damage, in a given order /mob/living/proc/heal_ordered_damage(amount, list/damage_types) - . = amount //we'll return the amount of damage healed - for(var/i in damage_types) - var/amount_to_heal = min(amount, get_damage_amount(i)) //heal only up to the amount of damage we have + . = 0 //we'll return the amount of damage healed + for(var/damagetype in damage_types) + var/amount_to_heal = min(abs(amount), get_current_damage_of_type(damagetype)) //heal only up to the amount of damage we have if(amount_to_heal) - apply_damage_type(-amount_to_heal, i) + . += heal_damage_type(amount_to_heal, damagetype) amount -= amount_to_heal //remove what we healed from our current amount if(!amount) break diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index a4c331267820..55b97ff38ed4 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -55,6 +55,7 @@ dust_animation() spawn_dust(just_ash) + ghostize() QDEL_IN(src,5) // since this is sometimes called in the middle of movement, allow half a second for movement to finish, ghosting to happen and animation to play. Looks much nicer and doesn't cause multiple runtimes. /mob/living/proc/dust_animation() diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index c2b7e27c2487..e12f690813bd 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -224,6 +224,16 @@ message = "jumps!" hands_use_check = TRUE +/datum/emote/living/jump/run_emote(mob/living/user, params, type_override, intentional) + . = ..() + if(!.) + return FALSE + animate(user, pixel_y = user.pixel_y + 4, time = 0.1 SECONDS) + animate(pixel_y = user.pixel_y - 4, time = 0.1 SECONDS) + +/datum/emote/living/jump/get_sound(mob/living/user) + return 'sound/weapons/thudswoosh.ogg' + /datum/emote/living/kiss key = "kiss" key_third_person = "kisses" @@ -347,6 +357,18 @@ key_third_person = "shiver" message = "shivers." +#define SHIVER_LOOP_DURATION (1 SECONDS) +/datum/emote/living/shiver/run_emote(mob/living/user, params, type_override, intentional) + . = ..() + if(!.) + return FALSE + animate(user, pixel_x = user.pixel_x + 1, time = 0.1 SECONDS) + for(var/i in 1 to SHIVER_LOOP_DURATION / (0.2 SECONDS)) //desired total duration divided by the iteration duration to give the necessary iteration count + animate(pixel_x = user.pixel_x - 1, time = 0.1 SECONDS) + animate(pixel_x = user.pixel_x + 1, time = 0.1 SECONDS) + animate(pixel_x = user.pixel_x - 1, time = 0.1 SECONDS) +#undef SHIVER_LOOP_DURATION + /datum/emote/living/sigh key = "sigh" key_third_person = "sighs" @@ -437,6 +459,16 @@ key_third_person = "sways" message = "sways around dizzily." +/datum/emote/living/sway/run_emote(mob/living/user, params, type_override, intentional) + . = ..() + if(!.) + return FALSE + animate(user, pixel_x = user.pixel_x + 2, time = 0.5 SECONDS) + for(var/i in 1 to 2) + animate(pixel_x = user.pixel_x - 4, time = 1.0 SECONDS) + animate(pixel_x = user.pixel_x + 4, time = 1.0 SECONDS) + animate(pixel_x = user.pixel_x - 2, time = 0.5 SECONDS) + /datum/emote/living/tilt key = "tilt" key_third_person = "tilts" @@ -447,15 +479,44 @@ key_third_person = "trembles" message = "trembles in fear!" +#define TREMBLE_LOOP_DURATION (4.4 SECONDS) +/datum/emote/living/tremble/run_emote(mob/living/user, params, type_override, intentional) + . = ..() + if(!.) + return FALSE + animate(user, pixel_x = user.pixel_x + 2, time = 0.2 SECONDS) + for(var/i in 1 to TREMBLE_LOOP_DURATION / (0.4 SECONDS)) //desired total duration divided by the iteration duration to give the necessary iteration count + animate(pixel_x = user.pixel_x - 2, time = 0.2 SECONDS) + animate(pixel_x = user.pixel_x + 2, time = 0.2 SECONDS) + animate(pixel_x = user.pixel_x - 2, time = 0.2 SECONDS) +#undef TREMBLE_LOOP_DURATION + /datum/emote/living/twitch key = "twitch" key_third_person = "twitches" message = "twitches violently." +/datum/emote/living/twitch/run_emote(mob/living/user, params, type_override, intentional) + . = ..() + if(!.) + return FALSE + animate(user, pixel_x = user.pixel_x - 1, time = 0.1 SECONDS) + animate(pixel_x = user.pixel_x + 1, time = 0.1 SECONDS) + animate(time = 0.1 SECONDS) + animate(pixel_x = user.pixel_x - 1, time = 0.1 SECONDS) + animate(pixel_x = user.pixel_x + 1, time = 0.1 SECONDS) + /datum/emote/living/twitch_s key = "twitch_s" message = "twitches." +/datum/emote/living/twitch_s/run_emote(mob/living/user, params, type_override, intentional) + . = ..() + if(!.) + return FALSE + animate(user, pixel_x = user.pixel_x - 1, time = 0.1 SECONDS) + animate(pixel_x = user.pixel_x + 1, time = 0.1 SECONDS) + /datum/emote/living/wave key = "wave" key_third_person = "waves" diff --git a/code/modules/mob/living/inhand_holder.dm b/code/modules/mob/living/inhand_holder.dm index c018b3c029bf..b4c9fbd34aa1 100644 --- a/code/modules/mob/living/inhand_holder.dm +++ b/code/modules/mob/living/inhand_holder.dm @@ -114,11 +114,11 @@ desc = "This drone is scared and has curled up into a ball!" /obj/item/clothing/head/mob_holder/drone/update_visuals(mob/living/L) - var/mob/living/simple_animal/drone/D = L - if(!D) + var/mob/living/basic/drone/drone = L + if(!drone) return ..() icon = 'icons/mob/silicon/drone.dmi' - icon_state = "[D.visualAppearance]_hat" + icon_state = "[drone.visualAppearance]_hat" /obj/item/clothing/head/mob_holder/destructible diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm index 6c4d59f93df1..fae78c27fc86 100644 --- a/code/modules/mob/living/init_signals.dm +++ b/code/modules/mob/living/init_signals.dm @@ -44,6 +44,7 @@ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_SKITTISH), PROC_REF(on_skittish_trait_gain)) RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_SKITTISH), PROC_REF(on_skittish_trait_loss)) + RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_UNDENSE), SIGNAL_REMOVETRAIT(TRAIT_UNDENSE)), PROC_REF(undense_changed)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_NEGATES_GRAVITY), SIGNAL_REMOVETRAIT(TRAIT_NEGATES_GRAVITY)), PROC_REF(on_negate_gravity)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_IGNORING_GRAVITY), SIGNAL_REMOVETRAIT(TRAIT_IGNORING_GRAVITY)), PROC_REF(on_ignore_gravity)) RegisterSignals(src, list(SIGNAL_ADDTRAIT(TRAIT_FORCED_GRAVITY), SIGNAL_REMOVETRAIT(TRAIT_FORCED_GRAVITY)), PROC_REF(on_force_gravity)) @@ -245,3 +246,8 @@ /mob/living/proc/on_loc_force_gravity(datum/source) SIGNAL_HANDLER refresh_gravity() + +/// Called when [TRAIT_UNDENSE] is gained or lost +/mob/living/proc/undense_changed(datum/source) + SIGNAL_HANDLER + update_density() diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 8508b1c2ca8f..27995ce1ce00 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -12,7 +12,10 @@ /mob/living/proc/Life(seconds_per_tick = SSMOBS_DT, times_fired) set waitfor = FALSE - SEND_SIGNAL(src, COMSIG_LIVING_LIFE, seconds_per_tick, times_fired) + var/signal_result = SEND_SIGNAL(src, COMSIG_LIVING_LIFE, seconds_per_tick, times_fired) + + if(signal_result & COMPONENT_LIVING_CANCEL_LIFE_PROCESSING) // mmm less work + return if (client) var/turf/T = get_turf(src) @@ -34,9 +37,7 @@ log_game("Z-TRACKING: [src] of type [src.type] has a Z-registration despite not having a client.") update_z(null) - if (notransform) - return - if(!loc) + if(isnull(loc) || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(!IS_IN_STASIS(src)) @@ -51,8 +52,6 @@ handle_diseases(seconds_per_tick, times_fired)// DEAD check is in the proc itself; we want it to spread even if the mob is dead, but to handle its disease-y properties only if you're not. - handle_wounds(seconds_per_tick, times_fired) - if (QDELETED(src)) // diseases can qdel the mob via transformations return @@ -67,6 +66,8 @@ handle_gravity(seconds_per_tick, times_fired) + handle_wounds(seconds_per_tick, times_fired) + if(machine) machine.check_eye(src) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 34155f199a1f..1d9d1f40a46d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -504,6 +504,9 @@ * * IGNORE_GRAB - mob that is agressively grabbed is not considered incapacitated **/ /mob/living/incapacitated(flags) + if((flags & IGNORE_CRIT) && ((stat >= SOFT_CRIT && (stat != DEAD && stat != UNCONSCIOUS)) && !src.pulledby)) + return FALSE + if(HAS_TRAIT(src, TRAIT_INCAPACITATED)) return TRUE @@ -572,6 +575,15 @@ if(held_item) . = held_item.GetID() +/** + * Returns the access list for this mob + */ +/mob/living/proc/get_access() + var/obj/item/card/id/id = get_idcard() + if(isnull(id)) + return list() + return id.GetAccess() + /mob/living/proc/get_id_in_hand() var/obj/item/held_item = get_active_held_item() if(!held_item) @@ -660,8 +672,7 @@ /mob/living/proc/on_lying_down(new_lying_angle) if(layer == initial(layer)) //to avoid things like hiding larvas. layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs - add_traits(list(TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED), LYING_DOWN_TRAIT) - set_density(FALSE) // We lose density and stop bumping passable dense things. + add_traits(list(TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED, TRAIT_UNDENSE), LYING_DOWN_TRAIT) if(HAS_TRAIT(src, TRAIT_FLOORED) && !(dir & (NORTH|SOUTH))) setDir(pick(NORTH, SOUTH)) // We are and look helpless. body_position_pixel_y_offset = PIXEL_Y_OFFSET_LYING @@ -672,9 +683,15 @@ /mob/living/proc/on_standing_up() if(layer == LYING_MOB_LAYER) layer = initial(layer) - set_density(initial(density)) // We were prone before, so we become dense and things can bump into us again. - remove_traits(list(TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED), LYING_DOWN_TRAIT) - body_position_pixel_y_offset = 0 + remove_traits(list(TRAIT_UI_BLOCKED, TRAIT_PULL_BLOCKED, TRAIT_UNDENSE), LYING_DOWN_TRAIT) + // Make sure it doesn't go out of the southern bounds of the tile when standing. + body_position_pixel_y_offset = (resize-1) * world.icon_size/2 + +/mob/living/proc/update_density() + if(HAS_TRAIT(src, TRAIT_UNDENSE)) + set_density(FALSE) + else + set_density(TRUE) //Recursive function to find everything a mob is holding. Really shitty proc tbh. /mob/living/get_contents() @@ -1242,7 +1259,7 @@ return /mob/living/can_hold_items(obj/item/I) - return usable_hands && ..() + return ..() && HAS_TRAIT(src, TRAIT_CAN_HOLD_ITEMS) && usable_hands /mob/living/can_perform_action(atom/movable/target, action_bitflags) if(!istype(target)) @@ -1324,14 +1341,13 @@ * Returns a mob (what our mob turned into) or null (if we failed). */ /mob/living/proc/wabbajack(what_to_randomize, change_flags = WABBAJACK) - if(stat == DEAD || notransform || (GODMODE & status_flags)) + if(stat == DEAD || (GODMODE & status_flags) || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(SEND_SIGNAL(src, COMSIG_LIVING_PRE_WABBAJACKED, what_to_randomize) & STOP_WABBAJACK) return - notransform = TRUE - add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), MAGIC_TRAIT) + add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED, TRAIT_NO_TRANSFORM), MAGIC_TRAIT) icon = null cut_overlays() invisibility = INVISIBILITY_ABSTRACT @@ -1374,7 +1390,7 @@ if(WABBAJACK_ROBOT) var/static/list/robot_options = list( /mob/living/silicon/robot = 200, - /mob/living/simple_animal/drone/polymorphed = 200, + /mob/living/basic/drone/polymorphed = 200, /mob/living/silicon/robot/model/syndicate = 1, /mob/living/silicon/robot/model/syndicate/medical = 1, /mob/living/silicon/robot/model/syndicate/saboteur = 1, @@ -1415,6 +1431,7 @@ var/picked_animal = pick( /mob/living/basic/bat, /mob/living/basic/bear, + /mob/living/basic/blob_minion/blobbernaut, /mob/living/basic/butterfly, /mob/living/basic/carp, /mob/living/basic/carp/magic, @@ -1422,9 +1439,8 @@ /mob/living/basic/chicken, /mob/living/basic/cow, /mob/living/basic/crab, - /mob/living/basic/spider/giant, - /mob/living/basic/spider/giant/hunter, - /mob/living/basic/mining/goliath, + /mob/living/basic/goat, + /mob/living/basic/gorilla, /mob/living/basic/headslug, /mob/living/basic/killer_tomato, /mob/living/basic/lizard, @@ -1433,6 +1449,7 @@ /mob/living/basic/morph, /mob/living/basic/mouse, /mob/living/basic/mushroom, + /mob/living/basic/parrot, /mob/living/basic/pet/dog/breaddog, /mob/living/basic/pet/dog/corgi, /mob/living/basic/pet/dog/pug, @@ -1442,14 +1459,7 @@ /mob/living/basic/statue, /mob/living/basic/stickman, /mob/living/basic/stickman/dog, - /mob/living/simple_animal/hostile/blob/blobbernaut/independent, - /mob/living/simple_animal/hostile/gorilla, - /mob/living/simple_animal/hostile/megafauna/dragon/lesser, - /mob/living/simple_animal/hostile/retaliate/goat, - /mob/living/simple_animal/hostile/blob/blobbernaut/independent, /mob/living/simple_animal/hostile/megafauna/dragon/lesser, - /mob/living/simple_animal/hostile/gorilla, - /mob/living/simple_animal/parrot, /mob/living/simple_animal/pet/cat, /mob/living/simple_animal/pet/cat/cak, ) @@ -1747,10 +1757,10 @@ GLOBAL_LIST_EMPTY(fire_appearances) return//dont open the mobs inventory if you are picking them up . = ..() -/mob/living/proc/mob_pickup(mob/living/L) +/mob/living/proc/mob_pickup(mob/living/user) var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, held_state, head_icon, held_lh, held_rh, worn_slot_flags) - L.visible_message(span_warning("[L] scoops up [src]!")) - L.put_in_hands(holder) + user.visible_message(span_warning("[user] scoops up [src]!")) + user.put_in_hands(holder) /mob/living/proc/set_name() numba = rand(1, 1000) @@ -2117,26 +2127,26 @@ GLOBAL_LIST_EMPTY(fire_appearances) if(CONSCIOUS) if(. >= UNCONSCIOUS) REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT) - remove_traits(list(TRAIT_HANDS_BLOCKED, TRAIT_INCAPACITATED, TRAIT_FLOORED, TRAIT_CRITICAL_CONDITION), STAT_TRAIT) + remove_traits(list(TRAIT_HANDS_BLOCKED, TRAIT_INCAPACITATED, TRAIT_FLOORED, TRAIT_CRITICAL_CONDITION, TRAIT_POOR_AIM), STAT_TRAIT) if(SOFT_CRIT) if(pulledby) ADD_TRAIT(src, TRAIT_IMMOBILIZED, PULLED_WHILE_SOFTCRIT_TRAIT) //adding trait sources should come before removing to avoid unnecessary updates if(. >= UNCONSCIOUS) REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT) - ADD_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT) + add_traits(list(TRAIT_CRITICAL_CONDITION, TRAIT_POOR_AIM), STAT_TRAIT) if(UNCONSCIOUS) if(. != HARD_CRIT) become_blind(UNCONSCIOUS_TRAIT) if(health <= crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT)) - ADD_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT) + add_traits( list(TRAIT_CRITICAL_CONDITION, TRAIT_POOR_AIM), STAT_TRAIT) else - REMOVE_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT) + remove_traits(list(TRAIT_CRITICAL_CONDITION, TRAIT_POOR_AIM), STAT_TRAIT) if(HARD_CRIT) if(. != UNCONSCIOUS) become_blind(UNCONSCIOUS_TRAIT) - ADD_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT) + add_traits(list(TRAIT_CRITICAL_CONDITION, TRAIT_POOR_AIM), STAT_TRAIT) if(DEAD) - REMOVE_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT) + remove_traits(list(TRAIT_CRITICAL_CONDITION, TRAIT_POOR_AIM), STAT_TRAIT) remove_from_alive_mob_list() add_to_dead_mob_list() @@ -2482,7 +2492,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) /mob/living/proc/compare_sentience_type(compare_type) return FALSE -/// Proc called when targetted by a lazarus injector +/// Proc called when targeted by a lazarus injector /mob/living/proc/lazarus_revive(mob/living/reviver, malfunctioning) revive(HEAL_ALL) befriend(reviver) @@ -2490,7 +2500,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) if (malfunctioning) reviver.log_message("has revived mob [key_name(src)] with a malfunctioning lazarus injector.", LOG_GAME) -/// Proc for giving a mob a new 'friend', generally used for AI control and targetting. Returns false if already friends. +/// Proc for giving a mob a new 'friend', generally used for AI control and targeting. Returns false if already friends. /mob/living/proc/befriend(mob/living/new_friend) SHOULD_CALL_PARENT(TRUE) var/friend_ref = REF(new_friend) @@ -2550,14 +2560,10 @@ GLOBAL_LIST_EMPTY(fire_appearances) return var/del_mob = FALSE var/mob/old_mob - var/ai_control = FALSE - var/list/possible_players = list("None", "Poll Ghosts") + sort_list(GLOB.clients) + var/list/possible_players = list("Poll Ghosts") + sort_list(GLOB.clients) var/client/guardian_client = tgui_input_list(admin, "Pick the player to put in control.", "Guardian Controller", possible_players) - if(!guardian_client) + if(isnull(guardian_client)) return - else if(guardian_client == "None") - guardian_client = null - ai_control = (tgui_alert(admin, "Do you want to give the spirit AI control?", "Guardian Controller", list("Yes", "No")) == "Yes") else if(guardian_client == "Poll Ghosts") var/list/candidates = poll_ghost_candidates("Do you want to play as an admin created Guardian Spirit of [real_name]?", ROLE_PAI, FALSE, 100, POLL_IGNORE_HOLOPARASITE) if(LAZYLEN(candidates)) @@ -2570,7 +2576,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) old_mob = guardian_client.mob if(isobserver(old_mob) || tgui_alert(admin, "Do you want to delete [guardian_client]'s old mob?", "Guardian Controller", list("Yes"," No")) == "Yes") del_mob = TRUE - var/picked_type = tgui_input_list(admin, "Pick the guardian type.", "Guardian Controller", subtypesof(/mob/living/simple_animal/hostile/guardian)) + var/picked_type = tgui_input_list(admin, "Pick the guardian type.", "Guardian Controller", subtypesof(/mob/living/basic/guardian)) var/picked_theme = tgui_input_list(admin, "Pick the guardian theme.", "Guardian Controller", list(GUARDIAN_THEME_TECH, GUARDIAN_THEME_MAGIC, GUARDIAN_THEME_CARP, GUARDIAN_THEME_MINER, "Random")) if(picked_theme == "Random") picked_theme = null //holopara code handles not having a theme by giving a random one @@ -2578,20 +2584,16 @@ GLOBAL_LIST_EMPTY(fire_appearances) var/picked_color = input(admin, "Set the guardian's color, cancel to let player set it.", "Guardian Controller", "#ffffff") as color|null if(tgui_alert(admin, "Confirm creation.", "Guardian Controller", list("Yes", "No")) != "Yes") return - var/mob/living/simple_animal/hostile/guardian/summoned_guardian = new picked_type(src, picked_theme) + var/mob/living/basic/guardian/summoned_guardian = new picked_type(src, picked_theme) summoned_guardian.set_summoner(src, different_person = TRUE) if(picked_name) summoned_guardian.fully_replace_character_name(null, picked_name) if(picked_color) - summoned_guardian.set_guardian_color(picked_color) + summoned_guardian.set_guardian_colour(picked_color) summoned_guardian.key = guardian_client?.key guardian_client?.init_verbs() if(del_mob) qdel(old_mob) - if(ai_control) - summoned_guardian.can_have_ai = TRUE - summoned_guardian.toggle_ai(AI_ON) - summoned_guardian.manifest() message_admins(span_adminnotice("[key_name_admin(admin)] gave a guardian spirit controlled by [guardian_client || "AI"] to [src].")) log_admin("[key_name(admin)] gave a guardian spirit controlled by [guardian_client] to [src].") SSblackbox.record_feedback("tally", "admin_verb", 1, "Give Guardian Spirit") diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 63356d481827..d96ea66e9268 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -86,24 +86,49 @@ /mob/living/proc/is_pepper_proof(check_flags = ALL) return null -/mob/living/proc/on_hit(obj/projectile/P) - return BULLET_ACT_HIT +/// Checks if the mob's ears (BOTH EARS, BOWMANS NEED NOT APPLY) are covered by something. +/// Returns the atom covering the mob's ears, or null if their ears are uncovered. +/mob/living/proc/is_ears_covered() + return null -/mob/living/bullet_act(obj/projectile/P, def_zone, piercing_hit = FALSE) +/mob/living/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) . = ..() - if(P.is_hostile_projectile() && (. != BULLET_ACT_BLOCK)) - var/attack_direction = get_dir(P.starting, src) - // we need a second, silent armor check to actually know how much to reduce damage taken, as opposed to - // on [/atom/proc/bullet_act] where it's just to pass it to the projectile's on_hit(). - var/armor_check = check_projectile_armor(def_zone, P, is_silent = TRUE) - armor_check = min(ARMOR_MAX_BLOCK, armor_check) //cap damage reduction at 90% - apply_damage(P.damage, P.damage_type, def_zone, armor_check, wound_bonus=P.wound_bonus, bare_wound_bonus=P.bare_wound_bonus, sharpness = P.sharpness, attack_direction = attack_direction) - apply_effects(P.stun, P.knockdown, P.unconscious, P.slur, P.stutter, P.eyeblur, P.drowsy, armor_check, P.stamina, P.jitter, P.paralyze, P.immobilize) - if(P.paralyze_timer) - Disorient(6 SECONDS, 1, paralyze = 5 SECONDS, stack_status = FALSE) - if(P.dismemberment) - check_projectile_dismemberment(P, def_zone) - return . ? BULLET_ACT_HIT : BULLET_ACT_BLOCK + if(. != BULLET_ACT_HIT) + return . + if(!hitting_projectile.is_hostile_projectile()) + return BULLET_ACT_HIT + + // we need a second, silent armor check to actually know how much to reduce damage taken, as opposed to + // on [/atom/proc/bullet_act] where it's just to pass it to the projectile's on_hit(). + var/armor_check = check_projectile_armor(def_zone, hitting_projectile, is_silent = TRUE) + + apply_damage( + damage = hitting_projectile.damage, + damagetype = hitting_projectile.damage_type, + def_zone = def_zone, + blocked = min(ARMOR_MAX_BLOCK, armor_check), //cap damage reduction at 90% + wound_bonus = hitting_projectile.wound_bonus, + bare_wound_bonus = hitting_projectile.bare_wound_bonus, + sharpness = hitting_projectile.sharpness, + attack_direction = get_dir(hitting_projectile.starting, src), + ) + apply_effects( + stun = hitting_projectile.stun, + knockdown = hitting_projectile.knockdown, + unconscious = hitting_projectile.unconscious, + slur = (mob_biotypes & MOB_ROBOTIC) ? 0 SECONDS : hitting_projectile.slur, // Don't want your cyborgs to slur from being ebow'd + stutter = (mob_biotypes & MOB_ROBOTIC) ? 0 SECONDS : hitting_projectile.stutter, // Don't want your cyborgs to stutter from being tazed + eyeblur = hitting_projectile.eyeblur, + drowsy = hitting_projectile.drowsy, + blocked = armor_check, + stamina = hitting_projectile.stamina, + jitter = (mob_biotypes & MOB_ROBOTIC) ? 0 SECONDS : hitting_projectile.jitter, // Cyborgs can jitter but not from being shot + paralyze = hitting_projectile.paralyze, + immobilize = hitting_projectile.immobilize, + ) + if(hitting_projectile.dismemberment) + check_projectile_dismemberment(hitting_projectile, def_zone) + return BULLET_ACT_HIT /mob/living/check_projectile_armor(def_zone, obj/projectile/impacting_projectile, is_silent) return run_armor_check(def_zone, impacting_projectile.armor_flag, "","",impacting_projectile.armour_penetration, "", is_silent, impacting_projectile.weak_against_armour) @@ -157,6 +182,7 @@ return ..() /mob/living/fire_act() + . = ..() adjust_fire_stacks(3) ignite_mob() @@ -289,10 +315,23 @@ /mob/living/attack_hand(mob/living/carbon/human/user, list/modifiers) . = ..() + if(.) + return TRUE + + for(var/datum/surgery/operations as anything in surgeries) + if(user.istate & ISTATE_HARM) + break + if(IS_IN_INVALID_SURGICAL_POSITION(src, operations)) + continue + if(operations.next_step(user, modifiers)) + return TRUE + var/martial_result = user.apply_martial_art(src, modifiers) if (martial_result != MARTIAL_ATTACK_INVALID) return martial_result + return FALSE + /mob/living/attack_paw(mob/living/carbon/human/user, list/modifiers) if(isturf(loc) && istype(loc.loc, /area/misc/start)) to_chat(user, "No attacking people at spawn, you jackass.") @@ -414,8 +453,8 @@ . = ..() if(. & EMP_PROTECT_CONTENTS) return - for(var/obj/O in contents) - O.emp_act(severity) + for(var/obj/inside in contents) + inside.emp_act(severity) ///Logs, gibs and returns point values of whatever mob is unfortunate enough to get eaten. /mob/living/singularity_act() @@ -437,17 +476,17 @@ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(cult_ending_helper), CULT_VICTORY_MASS_CONVERSION), 120) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(ending_helper)), 270) if(client) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, src, cultoverride = TRUE) + makeNewConstruct(/mob/living/basic/construct/harvester, src, cultoverride = TRUE) else switch(rand(1, 4)) if(1) - new /mob/living/simple_animal/hostile/construct/juggernaut/hostile(get_turf(src)) + new /mob/living/basic/construct/juggernaut/hostile(get_turf(src)) if(2) - new /mob/living/simple_animal/hostile/construct/wraith/hostile(get_turf(src)) + new /mob/living/basic/construct/wraith/hostile(get_turf(src)) if(3) - new /mob/living/simple_animal/hostile/construct/artificer/hostile(get_turf(src)) + new /mob/living/basic/construct/artificer/hostile(get_turf(src)) if(4) - new /mob/living/simple_animal/hostile/construct/proteon/hostile(get_turf(src)) + new /mob/living/basic/construct/proteon/hostile(get_turf(src)) spawn_dust() investigate_log("has been gibbed by Nar'Sie.", INVESTIGATE_DEATHS) gib() diff --git a/code/modules/mob/living/living_fov.dm b/code/modules/mob/living/living_fov.dm index 0c5acb7b40e4..279e8bebe328 100644 --- a/code/modules/mob/living/living_fov.dm +++ b/code/modules/mob/living/living_fov.dm @@ -57,6 +57,8 @@ if(fov_type > highest_fov) highest_fov = fov_type fov_view = highest_fov + if(HAS_TRAIT(src, TRAIT_EXPANDED_FOV)) + fov_view += 30 update_fov_client() /// Updates the FOV for the client. diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index 9430586a406b..57f6ebcf5457 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -261,6 +261,8 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( return TRUE /mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range=0) + if((SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_HEAR, args) & COMSIG_MOVABLE_CANCEL_HEARING) || !GET_CLIENT(src)) + return FALSE if(!GET_CLIENT(src)) return //monkestation edit @@ -473,7 +475,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( I.talk_into(src, message, , spans, language, message_mods) return ITALICS | REDUCE_RANGE - return 0 + return NONE /mob/living/say_mod(input, list/message_mods = list()) if(message_mods[WHISPER_MODE] == MODE_WHISPER) diff --git a/code/modules/mob/living/navigation.dm b/code/modules/mob/living/navigation.dm index b97a01b55926..df2e5806631e 100644 --- a/code/modules/mob/living/navigation.dm +++ b/code/modules/mob/living/navigation.dm @@ -63,7 +63,7 @@ stack_trace("Navigate target ([navigate_target]) is not an atom, somehow.") return - var/list/path = get_path_to(src, navigate_target, MAX_NAVIGATE_RANGE, mintargetdist = 1, id = get_idcard(), skip_first = FALSE) + var/list/path = get_path_to(src, navigate_target, MAX_NAVIGATE_RANGE, mintargetdist = 1, access = get_access(), skip_first = FALSE) if(!length(path)) balloon_alert(src, "no valid path with current access!") return diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index c343e677f21d..ed69f00e1233 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -54,10 +54,6 @@ -/mob/living/silicon/ai/bullet_act(obj/projectile/Proj) - . = ..(Proj) - updatehealth() - /mob/living/silicon/ai/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash, length = 25) return // no eyes, no flashing diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index f4da9925fb2f..8dbecfff49b7 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -1,17 +1,3 @@ - -/mob/living/silicon/apply_damage(damage = 0,damagetype = BRUTE, def_zone = null, blocked = FALSE, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null) - var/hit_percent = (100-blocked)/100 - if((!damage || (!forced && hit_percent <= 0))) - return 0 - var/damage_amount = forced ? damage : damage * hit_percent - switch(damagetype) - if(BRUTE) - adjustBruteLoss(damage_amount, forced = forced) - if(BURN) - adjustFireLoss(damage_amount, forced = forced) - return 1 - - /mob/living/silicon/apply_effect(effect = 0,effecttype = EFFECT_STUN, blocked = FALSE) return FALSE //The only effect that can hit them atm is flashes and they still directly edit so this works for now. (This was written in at least 2016. Help) diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 7df2e7d33906..be713b429a6b 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -401,6 +401,7 @@ /mob/living/silicon/robot/perform_hand_swap() cycle_modules() + return TRUE /mob/living/silicon/robot/can_hold_items(obj/item/I) return (I && (I in model.modules)) //Only if it's part of our model. diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 0f3dde4b3592..ae56f65b0cdf 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -1,5 +1,5 @@ /mob/living/silicon/robot/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if (src.notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return ..() diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index cf3eb6f03dca..9c4bd6c05c05 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -423,8 +423,14 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real if (stat != DEAD) adjustBruteLoss(30) -/mob/living/silicon/robot/bullet_act(obj/projectile/Proj, def_zone) + return TRUE + +/mob/living/silicon/robot/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) . = ..() - updatehealth() - if(prob(75) && Proj.damage > 0) - spark_system.start() + if(prob(25) || . != BULLET_ACT_HIT) + return + if(hitting_projectile.damage_type != BRUTE && hitting_projectile.damage_type != BURN) + return + if(!hitting_projectile.is_hostile_projectile() || hitting_projectile.damage <= 0) + return + spark_system.start() diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index bbc4890dd69c..71a52382a115 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -226,6 +226,7 @@ var/mob/living/silicon/robot/cyborg = loc var/obj/item/robot_model/new_model = new new_config_type(cyborg) new_model.robot = cyborg + cyborg.icon = 'icons/mob/silicon/robots.dmi' //reset our icon to default, but before a new custom icon may be applied by be_transformed_to if(!new_model.be_transformed_to(src, forced)) qdel(new_model) return @@ -238,6 +239,7 @@ cyborg.diag_hud_set_status() cyborg.diag_hud_set_borgcell() cyborg.diag_hud_set_aishell() + cyborg.update_icons() log_silicon("CYBORG: [key_name(cyborg)] has transformed into the [new_model] model.") INVOKE_ASYNC(new_model, PROC_REF(do_transform_animation)) @@ -245,6 +247,9 @@ return new_model /obj/item/robot_model/proc/be_transformed_to(obj/item/robot_model/old_model, forced = FALSE) + if(HAS_TRAIT(robot, TRAIT_NO_TRANSFORM)) + robot.balloon_alert(robot, "can't transform right now!") + return FALSE if(islist(borg_skins) && !forced) var/mob/living/silicon/robot/cyborg = loc var/list/reskin_icons = list() @@ -286,7 +291,7 @@ var/mob/living/silicon/robot/cyborg = loc sleep(0.1 SECONDS) flick("[cyborg_base_icon]_transform", cyborg) - cyborg.notransform = TRUE + ADD_TRAIT(cyborg, TRAIT_NO_TRANSFORM, REF(src)) if(locked_transform) cyborg.SetLockdown(TRUE) cyborg.set_anchored(TRUE) @@ -298,7 +303,7 @@ cyborg.SetLockdown(FALSE) cyborg.setDir(SOUTH) cyborg.set_anchored(FALSE) - cyborg.notransform = FALSE + REMOVE_TRAIT(cyborg, TRAIT_NO_TRANSFORM, REF(src)) cyborg.updatehealth() cyborg.update_icons() cyborg.notify_ai(AI_NOTIFICATION_NEW_MODEL) diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index c6ba84897b91..b0c7b8cc3e03 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -80,13 +80,13 @@ user.add_mood_event("pet_borg", /datum/mood_event/pet_borg) -/mob/living/silicon/attack_drone(mob/living/simple_animal/drone/M) - if((M.istate & ISTATE_HARM)) +/mob/living/silicon/attack_drone(mob/living/basic/drone/user) + if((user.istate & ISTATE_HARM)) return return ..() -/mob/living/silicon/attack_drone_secondary(mob/living/simple_animal/drone/M) - if((M.istate & ISTATE_HARM)) +/mob/living/silicon/attack_drone_secondary(mob/living/basic/drone/user) + if((user.istate & ISTATE_HARM)) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN return ..() @@ -115,21 +115,22 @@ M.visible_message(span_boldwarning("[M] is thrown off of [src]!")) flash_act(affect_silicon = 1) -/mob/living/silicon/bullet_act(obj/projectile/Proj, def_zone, piercing_hit = FALSE) - SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, Proj, def_zone) - if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - adjustBruteLoss(Proj.damage) - if(prob(Proj.damage*1.5)) - for(var/mob/living/M in buckled_mobs) - M.visible_message(span_boldwarning("[M] is knocked off of [src]!")) - unbuckle_mob(M) - M.Paralyze(40) - if(Proj.stun || Proj.knockdown || Proj.paralyze) - for(var/mob/living/M in buckled_mobs) - unbuckle_mob(M) - M.visible_message(span_boldwarning("[M] is knocked off of [src] by the [Proj]!")) - Proj.on_hit(src, 0, piercing_hit) - return BULLET_ACT_HIT +/mob/living/silicon/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) + . = ..() + if(. != BULLET_ACT_HIT) + return . + + var/prob_of_knocking_dudes_off = 0 + if(hitting_projectile.damage_type == BRUTE || hitting_projectile.damage_type == BURN) + prob_of_knocking_dudes_off = hitting_projectile.damage * 1.5 + if(hitting_projectile.stun || hitting_projectile.knockdown || hitting_projectile.paralyze) + prob_of_knocking_dudes_off = 100 + + if(prob(prob_of_knocking_dudes_off)) + for(var/mob/living/buckled in buckled_mobs) + buckled.visible_message(span_boldwarning("[buckled] is knocked off of [src] by [hitting_projectile]!")) + unbuckle_mob(buckled) + buckled.Paralyze(4 SECONDS) /mob/living/silicon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash/static, length = 25) if(affect_silicon) diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 4ef8e75e9f22..78322167a80c 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -98,20 +98,20 @@ var/damage = rand(user.melee_damage_lower, user.melee_damage_upper) return attack_threshold_check(damage, user.melee_damage_type) -/mob/living/simple_animal/attack_slime(mob/living/simple_animal/slime/M, list/modifiers) +/mob/living/simple_animal/attack_slime(mob/living/simple_animal/slime/user, list/modifiers) if(..()) //successful slime attack var/damage = rand(15, 25) - if(M.is_adult) + if(user.is_adult) damage = rand(20, 35) return attack_threshold_check(damage) -/mob/living/simple_animal/attack_drone(mob/living/simple_animal/drone/M) - if((M.istate & ISTATE_HARM)) //No kicking dogs even as a rogue drone. Use a weapon. +/mob/living/simple_animal/attack_drone(mob/living/basic/drone/user) + if(user.istate & ISTATE_HARM) //No kicking dogs even as a rogue drone. Use a weapon. return return ..() -/mob/living/simple_animal/attack_drone_secondary(mob/living/simple_animal/drone/M) - if((M.istate & ISTATE_HARM)) +/mob/living/simple_animal/attack_drone_secondary(mob/living/basic/drone/user) + if(user.istate & ISTATE_HARM) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN return ..() diff --git a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm index 828be3deebcb..f2a2f9fbb65b 100644 --- a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm +++ b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm @@ -12,6 +12,9 @@ var/block_chance = 50 +/mob/living/simple_animal/bot/secbot/grievous/Initialize(mapload) + . = ..() + RegisterSignal(src, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(block_bullets)) /mob/living/simple_animal/bot/secbot/grievous/toy //A toy version of general beepsky! name = "Genewul Bweepskee" @@ -21,10 +24,15 @@ baton_type = /obj/item/toy/sword weapon_force = 0 -/mob/living/simple_animal/bot/secbot/grievous/bullet_act(obj/projectile/P) - visible_message(span_warning("[src] deflects [P] with its energy swords!")) - playsound(src, 'sound/weapons/blade1.ogg', 50, TRUE) - return BULLET_ACT_BLOCK +/mob/living/simple_animal/bot/secbot/grievous/proc/block_bullets(datum/source, obj/projectile/hitting_projectile) + SIGNAL_HANDLER + + if(stat != CONSCIOUS) + return NONE + + visible_message(span_warning("[source] deflects [hitting_projectile] with its energy swords!")) + playsound(source, 'sound/weapons/blade1.ogg', 50, TRUE) + return COMPONENT_BULLET_BLOCKED /mob/living/simple_animal/bot/secbot/grievous/on_entered(datum/source, atom/movable/AM) . = ..() diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 9fccd6d7ca5c..3c7502b8de81 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -461,11 +461,15 @@ return do_sparks(5, TRUE, src) -/mob/living/simple_animal/bot/bullet_act(obj/projectile/Proj, def_zone, piercing_hit = FALSE) - if(Proj && (Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - if(prob(75) && Proj.damage > 0) - do_sparks(5, TRUE, src) - return ..() +/mob/living/simple_animal/bot/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) + . = ..() + if(prob(25) || . != BULLET_ACT_HIT) + return + if(hitting_projectile.damage_type != BRUTE && hitting_projectile.damage_type != BURN) + return + if(!hitting_projectile.is_hostile_projectile() || hitting_projectile.damage <= 0) + return + do_sparks(5, TRUE, src) /mob/living/simple_animal/bot/emp_act(severity) . = ..() @@ -657,9 +661,9 @@ Pass a positive integer as an argument to override a bot's default speed. bot_reset() //Reset a bot before setting it to call mode. //For giving the bot temporary all-access. This method is bad and makes me feel bad. Refactoring access to a component is for another PR. - var/obj/item/card/id/all_access = new /obj/item/card/id/advanced/gold/captains_spare() - set_path(get_path_to(src, waypoint, max_distance=200, id = all_access)) - qdel(all_access) + //Easier then building the list ourselves. I'm sorry. + var/static/obj/item/card/id/all_access = new /obj/item/card/id/advanced/gold/captains_spare() + set_path(get_path_to(src, waypoint, max_distance=200, access = all_access.GetAccess())) calling_ai = caller //Link the AI to the bot! ai_waypoint = waypoint @@ -871,12 +875,12 @@ Pass a positive integer as an argument to override a bot's default speed. // given an optional turf to avoid /mob/living/simple_animal/bot/proc/calc_path(turf/avoid) check_bot_access() - set_path(get_path_to(src, patrol_target, max_distance=120, id=access_card, exclude=avoid)) + set_path(get_path_to(src, patrol_target, max_distance=120, access=access_card.GetAccess(), exclude=avoid, diagonal_handling=DIAGONAL_REMOVE_ALL)) /mob/living/simple_animal/bot/proc/calc_summon_path(turf/avoid) check_bot_access() var/datum/callback/path_complete = CALLBACK(src, PROC_REF(on_summon_path_finish)) - SSpathfinder.pathfind(src, summon_target, max_distance=150, id=access_card, exclude=avoid, on_finish = path_complete) + SSpathfinder.pathfind(src, summon_target, max_distance=150, access=access_card.GetAccess(), exclude=avoid, diagonal_handling=DIAGONAL_REMOVE_ALL, on_finish=list(path_complete)) /mob/living/simple_animal/bot/proc/on_summon_path_finish(list/path) set_path(path) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index 7203dcd7dd89..2c5042636384 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -294,7 +294,7 @@ return if(target && path.len == 0 && (get_dist(src,target) > 1)) - path = get_path_to(src, target, max_distance=30, mintargetdist=1, id=access_card) + path = get_path_to(src, target, max_distance=30, mintargetdist=1, access=access_card.GetAccess()) mode = BOT_MOVING if(length(path) == 0) add_to_ignore(target) diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm index e928c903231c..e9de68b4edce 100644 --- a/code/modules/mob/living/simple_animal/bot/firebot.dm +++ b/code/modules/mob/living/simple_animal/bot/firebot.dm @@ -108,8 +108,9 @@ ..() if(!(bot_cover_flags & BOT_COVER_EMAGGED)) return - if(user) - to_chat(user, span_danger("[src] buzzes and beeps.")) + + to_chat(user, span_warning("You enable the very ironically named \"fighting with fire\" mode, and disable the targeting safeties.")) // heheehe. funny + audible_message(span_danger("[src] buzzes oddly!")) playsound(src, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) if(user) @@ -229,7 +230,7 @@ if(target_fire && (get_dist(src, target_fire) > 2)) - path = get_path_to(src, target_fire, max_distance=30, mintargetdist=1, id=access_card) + path = get_path_to(src, target_fire, max_distance=30, mintargetdist=1, access=access_card.GetAccess()) mode = BOT_MOVING if(!path.len) soft_reset() diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index aecf5f9412cb..d311ff4b258a 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -248,9 +248,9 @@ if(!length(path)) if(!isturf(target)) var/turf/TL = get_turf(target) - path = get_path_to(src, TL, max_distance=30, id=access_card,simulated_only = FALSE) + path = get_path_to(src, TL, max_distance=30, access=access_card.GetAccess(), simulated_only = FALSE) else - path = get_path_to(src, target, max_distance=30, id=access_card,simulated_only = FALSE) + path = get_path_to(src, target, max_distance=30, access=access_card.GetAccess(), simulated_only = FALSE) if(!bot_move(target)) add_to_ignore(target) diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 971d9b87f1fd..6b5816f5acc0 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -411,10 +411,10 @@ return if(patient && path.len == 0 && (get_dist(src,patient) > 1)) - path = get_path_to(src, patient, max_distance=30, id=access_card) + path = get_path_to(src, patient, max_distance=30, access=access_card.GetAccess()) mode = BOT_MOVING if(!path.len) //try to get closer if you can't reach the patient directly - path = get_path_to(src, patient, max_distance=30, mintargetdist=1, id=access_card) + path = get_path_to(src, patient, max_distance=30, mintargetdist=1, access=access_card.GetAccess()) if(!path.len) //Do not chase a patient we cannot reach. soft_reset() @@ -568,10 +568,10 @@ healies *= 1.1 if(bot_cover_flags & BOT_COVER_EMAGGED) patient.reagents.add_reagent(/datum/reagent/toxin/chloralhydrate, 5) - patient.apply_damage_type((healies*1),treatment_method) + patient.apply_damage((healies * 1), treatment_method, spread_damage = TRUE) log_combat(src, patient, "pretended to tend wounds on", "internal tools", "([uppertext(treatment_method)]) (EMAGGED)") else - patient.apply_damage_type((healies*-1),treatment_method) //don't need to check treatment_method since we know by this point that they were actually damaged. + patient.heal_damage_type((healies * 1), treatment_method) //don't need to check treatment_method since we know by this point that they were actually damaged. log_combat(src, patient, "tended the wounds of", "internal tools", "([uppertext(treatment_method)])") C.visible_message(span_notice("[src] tends the wounds of [patient]!"), \ "[span_green("[src] tends your wounds!")]") diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 0f4d48f0b821..79a22e3093d6 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -579,7 +579,7 @@ // calculates a path to the current destination // given an optional turf to avoid /mob/living/simple_animal/bot/mulebot/calc_path(turf/avoid = null) - path = get_path_to(src, target, max_distance=250, id=access_card, exclude=avoid) + path = get_path_to(src, target, max_distance=250, access=access_card.GetAccess(), exclude=avoid, diagonal_handling=DIAGONAL_REMOVE_ALL) // sets the current destination // signals all beacons matching the delivery code diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 5cc8f7255976..3b35b1616296 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -253,11 +253,14 @@ update_appearance() /mob/living/simple_animal/bot/secbot/bullet_act(obj/projectile/Proj) + . = ..() + if(. != BULLET_ACT_HIT) + return + if(istype(Proj, /obj/projectile/beam) || istype(Proj, /obj/projectile/bullet)) if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)) if(Proj.is_hostile_projectile() && Proj.damage < src.health && ishuman(Proj.firer)) retaliate(Proj.firer) - return ..() /mob/living/simple_animal/bot/secbot/UnarmedAttack(atom/attack_target, proximity_flag) if(!(bot_mode_flags & BOT_MODE_ON)) diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm index 0ad4b9401d4b..ee632224e230 100644 --- a/code/modules/mob/living/simple_animal/damage_procs.dm +++ b/code/modules/mob/living/simple_animal/damage_procs.dm @@ -18,31 +18,47 @@ if(AIStatus == AI_IDLE) toggle_ai(AI_ON) +/mob/living/simple_animal/get_damage_mod(damage_type) + var/modifier = ..() + if (damage_type in damage_coeff) + return modifier * damage_coeff[damage_type] + return modifier + /mob/living/simple_animal/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + if(!can_adjust_brute_loss(amount, forced, required_bodytype)) + return 0 if(forced) . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[BRUTE]) . = adjustHealth(amount * damage_coeff[BRUTE] * CONFIG_GET(number/damage_multiplier), updating_health, forced) /mob/living/simple_animal/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) + if(!can_adjust_fire_loss(amount, forced, required_bodytype)) + return 0 if(forced) . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[BURN]) . = adjustHealth(amount * damage_coeff[BURN] * CONFIG_GET(number/damage_multiplier), updating_health, forced) /mob/living/simple_animal/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype, required_respiration_type) + if(!can_adjust_oxy_loss(amount, forced, required_biotype, required_respiration_type)) + return 0 if(forced) . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[OXY]) . = adjustHealth(amount * damage_coeff[OXY] * CONFIG_GET(number/damage_multiplier), updating_health, forced) /mob/living/simple_animal/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) + if(!can_adjust_tox_loss(amount, forced, required_biotype)) + return 0 if(forced) . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[TOX]) . = adjustHealth(amount * damage_coeff[TOX] * CONFIG_GET(number/damage_multiplier), updating_health, forced) -/mob/living/simple_animal/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) +/mob/living/simple_animal/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE, required_biotype) + if(!can_adjust_clone_loss(amount, forced, required_biotype)) + return 0 if(forced) . = adjustHealth(amount * CONFIG_GET(number/damage_multiplier), updating_health, forced) else if(damage_coeff[CLONE]) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm deleted file mode 100644 index bf5cc4922103..000000000000 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ /dev/null @@ -1,89 +0,0 @@ - -/////////////////// -//DRONE INVENTORY// -/////////////////// -//Drone inventory -//Drone hands - - -/mob/living/simple_animal/drone/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) - if(..()) - update_held_items() - if(I == head) - head = null - update_worn_head() - if(I == internal_storage) - internal_storage = null - update_inv_internal_storage() - return TRUE - return FALSE - - -/mob/living/simple_animal/drone/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE) - switch(slot) - if(ITEM_SLOT_HEAD) - if(head) - return FALSE - if(!((I.slot_flags & ITEM_SLOT_HEAD) || (I.slot_flags & ITEM_SLOT_MASK))) - return FALSE - return TRUE - if(ITEM_SLOT_DEX_STORAGE) - if(internal_storage) - return FALSE - return TRUE - ..() - - -/mob/living/simple_animal/drone/get_item_by_slot(slot_id) - switch(slot_id) - if(ITEM_SLOT_HEAD) - return head - if(ITEM_SLOT_DEX_STORAGE) - return internal_storage - - return ..() - -/mob/living/simple_animal/drone/get_slot_by_item(obj/item/looking_for) - if(internal_storage == looking_for) - return ITEM_SLOT_DEX_STORAGE - if(head == looking_for) - return ITEM_SLOT_HEAD - return ..() - -/mob/living/simple_animal/drone/equip_to_slot(obj/item/I, slot) - if(!slot) - return - if(!istype(I)) - return - - var/index = get_held_index_of_item(I) - if(index) - held_items[index] = null - update_held_items() - - if(I.pulledby) - I.pulledby.stop_pulling() - - I.screen_loc = null // will get moved if inventory is visible - I.forceMove(src) - SET_PLANE_EXPLICIT(I, ABOVE_HUD_PLANE, src) - - switch(slot) - if(ITEM_SLOT_HEAD) - head = I - update_worn_head() - if(ITEM_SLOT_DEX_STORAGE) - internal_storage = I - update_inv_internal_storage() - else - to_chat(src, span_danger("You are trying to equip this item to an unsupported inventory slot. Report this to a coder!")) - return - - //Call back for item being equipped to drone - I.on_equipped(src, slot) - -/mob/living/simple_animal/drone/getBackSlot() - return ITEM_SLOT_DEX_STORAGE - -/mob/living/simple_animal/drone/getBeltSlot() - return ITEM_SLOT_DEX_STORAGE diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm deleted file mode 100644 index baeb6123d251..000000000000 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ /dev/null @@ -1,121 +0,0 @@ -//goat -/mob/living/simple_animal/hostile/retaliate/goat - name = "goat" - desc = "Not known for their pleasant disposition." - icon_state = "goat" - icon_living = "goat" - icon_dead = "goat_dead" - speak = list("EHEHEHEHEH","eh?") - speak_emote = list("brays") - emote_hear = list("brays.") - emote_see = list("shakes their head.", "stamps a foot.", "glares around.") - speak_chance = 1 - turns_per_move = 5 - butcher_results = list(/obj/item/food/meat/slab = 4) - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - response_harm_continuous = "kicks" - response_harm_simple = "kick" - faction = list(FACTION_NEUTRAL) - mob_biotypes = MOB_ORGANIC|MOB_BEAST - attack_same = 1 - attack_verb_continuous = "kicks" - attack_verb_simple = "kick" - attack_sound = 'sound/weapons/punch1.ogg' - attack_vis_effect = ATTACK_EFFECT_KICK - health = 40 - maxHealth = 40 - minbodytemp = 180 - melee_damage_lower = 1 - melee_damage_upper = 2 - environment_smash = ENVIRONMENT_SMASH_NONE - stop_automated_movement_when_pulled = 1 - blood_volume = BLOOD_VOLUME_NORMAL - - footstep_type = FOOTSTEP_MOB_SHOE - -/mob/living/simple_animal/hostile/retaliate/goat/Initialize(mapload) - AddComponent(/datum/component/udder) - AddElement(/datum/element/cliff_walking) //we walk the cliff - . = ..() - -/mob/living/simple_animal/hostile/retaliate/goat/Life(seconds_per_tick = SSMOBS_DT, times_fired) - . = ..() - if(.) - //chance to go crazy and start wacking stuff - if(!enemies.len && SPT_PROB(0.5, seconds_per_tick)) - Retaliate() - - if(enemies.len && SPT_PROB(5, seconds_per_tick)) - enemies.Cut() - LoseTarget() - src.visible_message(span_notice("[src] calms down.")) - if(stat != CONSCIOUS) - return - - eat_plants() - if(pulledby) - return - - for(var/direction in shuffle(list(1,2,4,8,5,6,9,10))) - var/turf/step = get_step(src, direction) - - if(!istype(step)) - return - - var/vine = locate(/obj/structure/spacevine) in step - var/mushroom = locate(/obj/structure/glowshroom) in step - var/flower = locate(/obj/structure/alien/resin/flower_bud) in step - - if(vine || mushroom || flower) - Move(step, get_dir(src, step)) - -/mob/living/simple_animal/hostile/retaliate/goat/Retaliate() - ..() - src.visible_message(span_danger("[src] gets an evil-looking gleam in [p_their()] eye.")) - -/mob/living/simple_animal/hostile/retaliate/goat/Move() - . = ..() - if(!stat) - eat_plants() - -/mob/living/simple_animal/hostile/retaliate/goat/proc/eat_plants() - var/obj/structure/spacevine/vine = locate(/obj/structure/spacevine) in loc - if(vine) - vine.eat(src) - - var/obj/structure/alien/resin/flower_bud/flower = locate(/obj/structure/alien/resin/flower_bud) in loc - if(flower) - flower.take_damage(rand(30, 50), BRUTE, 0) - - var/obj/structure/glowshroom/mushroom = locate(/obj/structure/glowshroom) in loc - if(mushroom) - qdel(mushroom) - - if((vine || flower || mushroom) && prob(10)) - say("Nom") // bon appetit - playsound(src, 'sound/items/eatfood.ogg', rand(30, 50), TRUE) - -/mob/living/simple_animal/hostile/retaliate/goat/AttackingTarget() - . = ..() - - if(!. || !isliving(target)) - return - - var/mob/living/plant_target = target - if(!(plant_target.mob_biotypes & MOB_PLANT)) - return - - plant_target.adjustBruteLoss(20) - playsound(src, 'sound/items/eatfood.ogg', rand(30, 50), TRUE) - var/obj/item/bodypart/edible_bodypart - - if(ishuman(plant_target)) - var/mob/living/carbon/human/plant_man = target - edible_bodypart = pick(plant_man.bodyparts) - edible_bodypart.dismember() - - plant_target.visible_message(span_warning("[src] takes a big chomp out of [plant_target]!"), \ - span_userdanger("[src] takes a big chomp out of your [edible_bodypart || "body"]!")) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm deleted file mode 100644 index 21b52c5f8018..000000000000 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ /dev/null @@ -1,638 +0,0 @@ -GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians - -/mob/living/simple_animal/hostile/guardian - name = "Guardian Spirit" - real_name = "Guardian Spirit" - desc = "A mysterious being that stands by its charge, ever vigilant." - speak_emote = list("hisses") - gender = NEUTER - mob_biotypes = NONE - bubble_icon = "guardian" - response_help_continuous = "passes through" - response_help_simple = "pass through" - response_disarm_continuous = "flails at" - response_disarm_simple = "flail at" - response_harm_continuous = "punches" - response_harm_simple = "punch" - icon = 'icons/mob/nonhuman-player/guardian.dmi' - icon_state = "magicbase" - icon_living = "magicbase" - icon_dead = "magicbase" - speed = 0 - istate = ISTATE_HARM|ISTATE_BLOCKING - stop_automated_movement = 1 - attack_sound = 'sound/weapons/punch1.ogg' - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = INFINITY - attack_verb_continuous = "punches" - attack_verb_simple = "punch" - maxHealth = INFINITY //The spirit itself is invincible - health = INFINITY - healable = FALSE //don't brusepack the guardian - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) //how much damage from each damage type we transfer to the owner - environment_smash = ENVIRONMENT_SMASH_STRUCTURES - obj_damage = 40 - melee_damage_lower = 15 - melee_damage_upper = 15 - del_on_death = TRUE - loot = list(/obj/effect/temp_visual/guardian/phase/out) - AIStatus = AI_OFF - can_have_ai = FALSE - light_system = MOVABLE_LIGHT - light_outer_range = 3 - light_on = FALSE - hud_type = /datum/hud/guardian - dextrous_hud_type = /datum/hud/dextrous/guardian //if we're set to dextrous, account for it. - faction = list() - - /// The guardian's color, used for their sprite, chat, and some effects made by it. - var/guardian_color - /// List of overlays we use. - var/list/guardian_overlays[GUARDIAN_TOTAL_LAYERS] - - /// The summoner of the guardian, the one it's intended to guard! - var/mob/living/summoner - /// How far from the summoner the guardian can be. - var/range = 10 - - /// Which toggle button the HUD uses. - var/toggle_button_type = /atom/movable/screen/guardian/toggle_mode/inactive - /// Name used by the guardian creator. - var/creator_name = "Error" - /// Description used by the guardian creator. - var/creator_desc = "This shouldn't be here! Report it on GitHub!" - /// Icon used by the guardian creator. - var/creator_icon = "fuck" - - /// A string explaining to the guardian what they can do. - var/playstyle_string = span_boldholoparasite("You are a Guardian without any type. You shouldn't exist!") - /// The fluff string we actually use. - var/used_fluff_string - /// Fluff string from tarot cards. - var/magic_fluff_string = span_holoparasite("You draw the Coder, symbolizing bugs and errors. This shouldn't happen! Submit a bug report!") - /// Fluff string from holoparasite injectors. - var/tech_fluff_string = span_holoparasite("BOOT SEQUENCE COMPLETE. ERROR MODULE LOADED. THIS SHOULDN'T HAPPEN. Submit a bug report!") - /// Fluff string from holocarp fishsticks. - var/carp_fluff_string = span_holoparasite("CARP CARP CARP SOME SORT OF HORRIFIC BUG BLAME THE CODERS CARP CARP CARP") - /// Fluff string from the dusty shard. - var/miner_fluff_string = span_holoparasite("You encounter... Mythril, it shouldn't exist... Submit a bug report!") - - /// Are we forced to not be able to manifest/recall? - var/locked = FALSE - /// Cooldown between manifests/recalls. - COOLDOWN_DECLARE(manifest_cooldown) - /// Cooldown between the summoner resetting the guardian's client. - COOLDOWN_DECLARE(resetting_cooldown) - -/mob/living/simple_animal/hostile/guardian/Initialize(mapload, theme) - . = ..() - GLOB.parasites += src - update_theme(theme) - AddElement(/datum/element/simple_flying) - manifest_effects() - -/mob/living/simple_animal/hostile/guardian/Destroy() //if deleted by admins or something random, cut from the summoner - if(is_deployed()) - recall_effects() - if(!QDELETED(summoner)) - cut_summoner(different_person = TRUE) - return ..() - -/// Setter for our summoner mob. -/mob/living/simple_animal/hostile/guardian/proc/set_summoner(mob/living/to_who, different_person = FALSE) - if(QDELETED(to_who)) - qdel(src) //no gettin off scot-free pal......... - return - if(summoner) - cut_summoner(different_person) - summoner = to_who - update_health_hud() - med_hud_set_health() - med_hud_set_status() - add_verb(to_who, list( - /mob/living/proc/guardian_comm, - /mob/living/proc/guardian_recall, - /mob/living/proc/guardian_reset, - )) - if(different_person) - if(mind) - mind.enslave_mind_to_creator(to_who) - else //mindless guardian, manually give them factions - faction += summoner.faction - summoner.faction += "[REF(src)]" - remove_all_languages(LANGUAGE_MASTER) - copy_languages(to_who, LANGUAGE_MASTER) // make sure holoparasites speak same language as master - update_atom_languages() - RegisterSignal(to_who, COMSIG_MOVABLE_MOVED, PROC_REF(check_distance)) - RegisterSignal(to_who, COMSIG_PARENT_QDELETING, PROC_REF(on_summoner_deletion)) - RegisterSignal(to_who, COMSIG_LIVING_DEATH, PROC_REF(on_summoner_death)) - RegisterSignal(to_who, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(on_summoner_health_update)) - RegisterSignal(to_who, COMSIG_LIVING_ON_WABBAJACKED, PROC_REF(on_summoner_wabbajacked)) - RegisterSignal(to_who, COMSIG_LIVING_SHAPESHIFTED, PROC_REF(on_summoner_shapeshifted)) - RegisterSignal(to_who, COMSIG_LIVING_UNSHAPESHIFTED, PROC_REF(on_summoner_unshapeshifted)) - recall(forced = TRUE) - if(to_who.stat == DEAD) - on_summoner_death(to_who) - -/mob/living/simple_animal/hostile/guardian/proc/cut_summoner(different_person = FALSE) - if(is_deployed()) - recall_effects() - forceMove(get_turf(src)) - UnregisterSignal(summoner, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH, COMSIG_LIVING_HEALTH_UPDATE, COMSIG_LIVING_ON_WABBAJACKED, COMSIG_LIVING_SHAPESHIFTED, COMSIG_LIVING_UNSHAPESHIFTED)) - if(different_person) - summoner.faction -= "[REF(src)]" - faction -= summoner.faction - mind?.remove_all_antag_datums() - if(!length(summoner.get_all_linked_holoparasites() - src)) - remove_verb(summoner, list( - /mob/living/proc/guardian_comm, - /mob/living/proc/guardian_recall, - /mob/living/proc/guardian_reset, - )) - summoner = null - -/// Signal proc for [COMSIG_LIVING_ON_WABBAJACKED], when our summoner is wabbajacked we should be alerted. -/mob/living/simple_animal/hostile/guardian/proc/on_summoner_wabbajacked(mob/living/source, mob/living/new_mob) - SIGNAL_HANDLER - - set_summoner(new_mob) - to_chat(src, span_holoparasite("Your summoner has changed form!")) - -/// Signal proc for [COMSIG_LIVING_SHAPESHIFTED], when our summoner is shapeshifted we should change to the new mob -/mob/living/simple_animal/hostile/guardian/proc/on_summoner_shapeshifted(mob/living/source, mob/living/new_shape) - SIGNAL_HANDLER - - set_summoner(new_shape) - to_chat(src, span_holoparasite("Your summoner has shapeshifted into that of a [new_shape]!")) - -/// Signal proc for [COMSIG_LIVING_UNSHAPESHIFTED], when our summoner unshapeshifts go back to that mob -/mob/living/simple_animal/hostile/guardian/proc/on_summoner_unshapeshifted(mob/living/source, mob/living/old_summoner) - SIGNAL_HANDLER - - set_summoner(old_summoner) - to_chat(src, span_holoparasite("Your summoner has shapeshifted back into their normal form!")) - -// Ha, no -/mob/living/simple_animal/hostile/guardian/wabbajack(what_to_randomize, change_flags = WABBAJACK) - visible_message(span_warning("[src] resists the polymorph!")) - -/mob/living/simple_animal/hostile/guardian/proc/on_summoner_health_update(mob/living/source) - SIGNAL_HANDLER - - update_health_hud() - med_hud_set_health() - med_hud_set_status() - -/mob/living/simple_animal/hostile/guardian/med_hud_set_health() - var/image/holder = hud_list?[HEALTH_HUD] - if(isnull(holder)) - return - holder.icon_state = "hud[RoundHealth(summoner || src)]" - var/icon/size_check = icon(icon, icon_state, dir) - holder.pixel_y = size_check.Height() - world.icon_size - -/mob/living/simple_animal/hostile/guardian/med_hud_set_status() - var/image/holder = hud_list?[STATUS_HUD] - if(isnull(holder)) - return - var/icon/size_check = icon(icon, icon_state, dir) - holder.pixel_y = size_check.Height() - world.icon_size - var/mob/living/checking_mob = summoner || src - if(checking_mob.stat == DEAD || HAS_TRAIT(checking_mob, TRAIT_FAKEDEATH)) - holder.icon_state = "huddead" - else - holder.icon_state = "hudhealthy" - -/mob/living/simple_animal/hostile/guardian/Destroy() - GLOB.parasites -= src - return ..() - -/mob/living/simple_animal/hostile/guardian/proc/update_theme(theme) //update the guardian's theme - if(!theme) - theme = pick(GUARDIAN_THEME_MAGIC, GUARDIAN_THEME_TECH, GUARDIAN_THEME_CARP, GUARDIAN_THEME_MINER) - switch(theme)//should make it easier to create new stand designs in the future if anyone likes that - if(GUARDIAN_THEME_MAGIC) - name = "Guardian Spirit" - real_name = "Guardian Spirit" - bubble_icon = "guardian" - icon_state = "magicbase" - icon_living = "magicbase" - icon_dead = "magicbase" - used_fluff_string = magic_fluff_string - if(GUARDIAN_THEME_TECH) - name = "Holoparasite" - real_name = "Holoparasite" - bubble_icon = "holo" - icon_state = "techbase" - icon_living = "techbase" - icon_dead = "techbase" - used_fluff_string = tech_fluff_string - if(GUARDIAN_THEME_MINER) - name = "Power Miner" - real_name = "Power Miner" - bubble_icon = "guardian" - icon_state = "minerbase" - icon_living = "minerbase" - icon_dead = "minerbase" - used_fluff_string = miner_fluff_string - if(GUARDIAN_THEME_CARP) - name = "Holocarp" - real_name = "Holocarp" - bubble_icon = "holo" - icon_state = null //entirely handled by overlays - icon_living = null - icon_dead = null - speak_emote = string_list(list("gnashes")) - desc = "A mysterious fish that stands by its charge, ever vigilant." - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - used_fluff_string = carp_fluff_string - guardian_overlays[GUARDIAN_COLOR_LAYER] = mutable_appearance(icon, theme) - apply_overlay(GUARDIAN_COLOR_LAYER) - -/mob/living/simple_animal/hostile/guardian/Login() //if we have a mind, set its name to ours when it logs in - . = ..() - if(!. || !client) - return FALSE - if(!summoner) - to_chat(src, span_boldholoparasite("For some reason, somehow, you have no summoner. Please report this bug immediately.")) - else - to_chat(src, span_holoparasite("You are a [real_name], bound to serve [summoner.real_name].")) - to_chat(src, span_holoparasite("You are capable of manifesting or recalling to your master with the buttons on your HUD. You will also find a button to communicate with [summoner.p_them()] privately there.")) - to_chat(src, span_holoparasite("While personally invincible, you will die if [summoner.real_name] does, and any damage dealt to you will have a portion passed on to [summoner.p_them()] as you feed upon [summoner.p_them()] to sustain yourself.")) - to_chat(src, playstyle_string) - if(!guardian_color) - locked = TRUE - guardian_rename() - guardian_recolor() - locked = FALSE - -/mob/living/simple_animal/hostile/guardian/mind_initialize() - . = ..() - if(!summoner) - to_chat(src, span_boldholoparasite("For some reason, somehow, you have no summoner. Please report this bug immediately.")) - return - mind.enslave_mind_to_creator(summoner) //once our mind is created, we become enslaved to our summoner. cant be done in the first run of set_summoner, because by then we dont have a mind yet. - -/mob/living/simple_animal/hostile/guardian/proc/guardian_recolor() - if(!client) - return - var/chosen_guardian_color = input(src, "What would you like your color to be?","Choose Your Color","#ffffff") as color|null - if(!chosen_guardian_color) //redo proc until we get a color - to_chat(src, span_warning("Not a valid color, please try again.")) - guardian_recolor() - return - set_guardian_color(chosen_guardian_color) - -/mob/living/simple_animal/hostile/guardian/proc/set_guardian_color(colour) - guardian_color = colour - set_light_color(guardian_color) - var/mutable_appearance/guardian_color_overlay = guardian_overlays[GUARDIAN_COLOR_LAYER] - remove_overlay(GUARDIAN_COLOR_LAYER) - guardian_color_overlay.color = guardian_color - guardian_overlays[GUARDIAN_COLOR_LAYER] = guardian_color_overlay - apply_overlay(GUARDIAN_COLOR_LAYER) - -/mob/living/simple_animal/hostile/guardian/proc/guardian_rename() - if(!client) - return - var/new_name = sanitize_name(reject_bad_text(tgui_input_text(src, "What would you like your name to be?", "Choose Your Name", real_name, MAX_NAME_LEN))) - if(!new_name) //redo proc until we get a good name - to_chat(src, span_warning("Not a valid name, please try again.")) - guardian_rename() - return - to_chat(src, span_notice("Your new name [span_name("[new_name]")] anchors itself in your mind.")) - fully_replace_character_name(null, new_name) - -/mob/living/simple_animal/hostile/guardian/proc/on_summoner_death(mob/living/source) - SIGNAL_HANDLER - - cut_summoner() - forceMove(source.loc) - to_chat(src, span_danger("Your summoner has died!")) - visible_message(span_bolddanger("\The [src] dies along with its user!")) - source.visible_message(span_bolddanger("[source]'s body is completely consumed by the strain of sustaining [src]!")) - source.dust(drop_items = TRUE) - death(TRUE) - -/mob/living/simple_animal/hostile/guardian/proc/on_summoner_deletion(mob/living/source) - SIGNAL_HANDLER - - cut_summoner() - to_chat(src, span_danger("Your summoner is gone!")) - qdel(src) - -/mob/living/simple_animal/hostile/guardian/get_status_tab_items() - . += ..() - if(summoner) - var/healthpercent = health_percentage(summoner) - . += "Summoner Health: [round(healthpercent, 0.5)]%" - if(!COOLDOWN_FINISHED(src, manifest_cooldown)) - . += "Manifest/Recall Cooldown Remaining: [DisplayTimeText(COOLDOWN_TIMELEFT(src, manifest_cooldown))]" - -/mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range - . = ..() - check_distance() - -/mob/living/simple_animal/hostile/guardian/proc/check_distance() - SIGNAL_HANDLER - - if(!summoner) - return - if(get_dist(get_turf(summoner), get_turf(src)) <= range) - return - to_chat(src, span_holoparasite("You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]!")) - visible_message(span_danger("\The [src] jumps back to its user.")) - if(istype(summoner.loc, /obj/effect)) - recall(forced = TRUE) - else - new /obj/effect/temp_visual/guardian/phase/out(loc) - forceMove(summoner.loc) - new /obj/effect/temp_visual/guardian/phase(loc) - -/mob/living/simple_animal/hostile/guardian/can_suicide() - return FALSE - -/mob/living/simple_animal/hostile/guardian/proc/is_deployed() - return loc != summoner || !summoner - -/mob/living/simple_animal/hostile/guardian/AttackingTarget(atom/attacked_target) - if(!is_deployed()) - to_chat(src, span_bolddanger("You must be manifested to attack!")) - return FALSE - else - return ..() - -/mob/living/simple_animal/hostile/guardian/death(gibbed) - . = ..() - if(!QDELETED(summoner)) - to_chat(summoner, span_bolddanger("Your [name] died somehow!")) - summoner.dust() - -/mob/living/simple_animal/hostile/guardian/update_health_hud() - var/severity = 0 - var/healthpercent = health_percentage(summoner || src) - switch(healthpercent) - if(100 to INFINITY) - severity = 0 - if(85 to 100) - severity = 1 - if(70 to 85) - severity = 2 - if(55 to 70) - severity = 3 - if(40 to 55) - severity = 4 - if(25 to 40) - severity = 5 - else - severity = 6 - if(severity > 0) - overlay_fullscreen("brute", /atom/movable/screen/fullscreen/brute, severity) - else - clear_fullscreen("brute") - if(hud_used?.healths) - hud_used.healths.maptext = MAPTEXT("
[round(healthpercent, 0.5)]%
") - -/mob/living/simple_animal/hostile/guardian/adjustHealth(amount, updating_health = TRUE, forced = FALSE) //The spirit is invincible, but passes on damage to the summoner - . = amount - if(!summoner) - return ..() - if(!is_deployed()) - return FALSE - summoner.adjustBruteLoss(amount) - if(amount < 0 || QDELETED(summoner)) - return - to_chat(summoner, span_bolddanger("Your [name] is under attack! You take damage!")) - summoner.visible_message(span_bolddanger("Blood sprays from [summoner] as [src] takes damage!")) - switch(summoner.stat) - if(UNCONSCIOUS, HARD_CRIT) - to_chat(summoner, span_bolddanger("Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!")) - summoner.adjustCloneLoss(amount * 0.5) //dying hosts take 50% bonus damage as cloneloss - -/mob/living/simple_animal/hostile/guardian/ex_act(severity, target) - switch(severity) - if(EXPLODE_DEVASTATE) - investigate_log("has been gibbed by an explosion.", INVESTIGATE_DEATHS) - gib() - return TRUE - if(EXPLODE_HEAVY) - adjustBruteLoss(60) - if(EXPLODE_LIGHT) - adjustBruteLoss(30) - -/mob/living/simple_animal/hostile/guardian/gib() - death(TRUE) - -/mob/living/simple_animal/hostile/guardian/dust(just_ash, drop_items, force) - death(TRUE) - -//HAND HANDLING - -/mob/living/simple_animal/hostile/guardian/equip_to_slot(obj/item/equipped_item, slot) - if(!slot) - return FALSE - if(!istype(equipped_item)) - return FALSE - - . = TRUE - var/index = get_held_index_of_item(equipped_item) - if(index) - held_items[index] = null - update_held_items() - - if(equipped_item.pulledby) - equipped_item.pulledby.stop_pulling() - - equipped_item.screen_loc = null // will get moved if inventory is visible - equipped_item.forceMove(src) - SET_PLANE_EXPLICIT(equipped_item, ABOVE_HUD_PLANE, src) - equipped_item.on_equipped(src, slot) - -/mob/living/simple_animal/hostile/guardian/proc/apply_overlay(cache_index) - if((. = guardian_overlays[cache_index])) - add_overlay(.) - -/mob/living/simple_animal/hostile/guardian/proc/remove_overlay(cache_index) - var/overlay = guardian_overlays[cache_index] - if(overlay) - cut_overlay(overlay) - guardian_overlays[cache_index] = null - -/mob/living/simple_animal/hostile/guardian/update_held_items() - remove_overlay(GUARDIAN_HANDS_LAYER) - var/list/hands_overlays = list() - var/obj/item/l_hand = get_item_for_held_index(1) - var/obj/item/r_hand = get_item_for_held_index(2) - - if(r_hand) - hands_overlays += r_hand.build_worn_icon(default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) - - if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - SET_PLANE_EXPLICIT(r_hand, ABOVE_HUD_PLANE, src) - r_hand.screen_loc = ui_hand_position(get_held_index_of_item(r_hand)) - client.screen |= r_hand - - if(l_hand) - hands_overlays += l_hand.build_worn_icon(default_layer = GUARDIAN_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) - - if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - SET_PLANE_EXPLICIT(l_hand, ABOVE_HUD_PLANE, src) - l_hand.screen_loc = ui_hand_position(get_held_index_of_item(l_hand)) - client.screen |= l_hand - - if(length(hands_overlays)) - guardian_overlays[GUARDIAN_HANDS_LAYER] = hands_overlays - apply_overlay(GUARDIAN_HANDS_LAYER) - -/mob/living/simple_animal/hostile/guardian/regenerate_icons() - update_held_items() - -//MANIFEST, RECALL, TOGGLE MODE/LIGHT, SHOW TYPE - -/mob/living/simple_animal/hostile/guardian/proc/manifest(forced) - if(is_deployed() || istype(summoner.loc, /obj/effect) || (!COOLDOWN_FINISHED(src, manifest_cooldown) && !forced) || locked) - return FALSE - forceMove(summoner.loc) - new /obj/effect/temp_visual/guardian/phase(loc) - COOLDOWN_START(src, manifest_cooldown, 1 SECONDS) - reset_perspective() - manifest_effects() - return TRUE - -/mob/living/simple_animal/hostile/guardian/proc/recall(forced) - if(!is_deployed() || !summoner || (!COOLDOWN_FINISHED(src, manifest_cooldown) && !forced) || locked) - return FALSE - new /obj/effect/temp_visual/guardian/phase/out(loc) - forceMove(summoner) - COOLDOWN_START(src, manifest_cooldown, 1 SECONDS) - recall_effects() - return TRUE - -/mob/living/simple_animal/hostile/guardian/proc/manifest_effects() - return - -/mob/living/simple_animal/hostile/guardian/proc/recall_effects() - return - -/mob/living/simple_animal/hostile/guardian/proc/toggle_modes() - to_chat(src, span_bolddanger("You don't have another mode!")) - -/mob/living/simple_animal/hostile/guardian/proc/toggle_light() - if(!light_on) - to_chat(src, span_notice("You activate your light.")) - set_light_on(TRUE) - else - to_chat(src, span_notice("You deactivate your light.")) - set_light_on(FALSE) - - -/mob/living/simple_animal/hostile/guardian/verb/check_type() - set name = "Check Guardian Type" - set category = "Guardian" - set desc = "Check what type you are." - to_chat(src, playstyle_string) - -//COMMUNICATION - -/mob/living/simple_animal/hostile/guardian/proc/communicate() - if(!summoner) - return - var/sender_key = key - var/input = tgui_input_text(src, "Enter a message to tell your summoner", "Guardian") - if(sender_key != key || !input) //guardian got reset, or did not enter anything - return - - var/preliminary_message = span_boldholoparasite("[input]") //apply basic color/bolding - var/my_message = "[src]: [preliminary_message]" //add source, color source with the guardian's color - - to_chat(summoner, "[my_message]") - var/list/guardians = summoner.get_all_linked_holoparasites() - for(var/guardian in guardians) - to_chat(guardian, "[my_message]") - for(var/dead_mob in GLOB.dead_mob_list) - var/link = FOLLOW_LINK(dead_mob, src) - to_chat(dead_mob, "[link] [my_message]") - - src.log_talk(input, LOG_SAY, tag="guardian") - -/mob/living/proc/guardian_comm() - set name = "Communicate" - set category = "Guardian" - set desc = "Communicate telepathically with your guardian." - var/input = tgui_input_text(src, "Enter a message to tell your guardian", "Message") - if(!input) - return - - var/preliminary_message = span_boldholoparasite("[input]") //apply basic color/bolding - var/my_message = span_boldholoparasite("[src]: [preliminary_message]") //add source, color source with default grey... - - to_chat(src, "[my_message]") - var/list/guardians = get_all_linked_holoparasites() - for(var/mob/living/simple_animal/hostile/guardian/guardian as anything in guardians) - to_chat(guardian, "[src]: [preliminary_message]" ) - for(var/dead_mob in GLOB.dead_mob_list) - var/link = FOLLOW_LINK(dead_mob, src) - to_chat(dead_mob, "[link] [my_message]") - - src.log_talk(input, LOG_SAY, tag="guardian") - -//FORCE RECALL/RESET - -/mob/living/proc/guardian_recall() - set name = "Recall Guardian" - set category = "Guardian" - set desc = "Forcibly recall your guardian." - var/list/guardians = get_all_linked_holoparasites() - for(var/mob/living/simple_animal/hostile/guardian/guardian in guardians) - guardian.recall() - -/mob/living/proc/guardian_reset() - set name = "Reset Guardian Player (5 Minute Cooldown)" - set category = "Guardian" - set desc = "Re-rolls which ghost will control your Guardian. Can be used once per 5 minutes." - - var/list/guardians = get_all_linked_holoparasites() - for(var/mob/living/simple_animal/hostile/guardian/resetting_guardian as anything in guardians) - if(!COOLDOWN_FINISHED(resetting_guardian, resetting_cooldown)) - guardians -= resetting_guardian //clear out guardians that are already reset - - var/mob/living/simple_animal/hostile/guardian/chosen_guardian = tgui_input_list(src, "Pick the guardian you wish to reset", "Guardian Reset", sort_names(guardians)) - if(isnull(chosen_guardian)) - to_chat(src, span_holoparasite("You decide not to reset [length(guardians) > 1 ? "any of your guardians":"your guardian"].")) - return - - to_chat(src, span_holoparasite("You attempt to reset [chosen_guardian.real_name]'s personality...")) - var/list/mob/dead/observer/ghost_candidates = poll_ghost_candidates("Do you want to play as [src.real_name]'s Guardian Spirit?", ROLE_PAI, FALSE, 100) - if(!LAZYLEN(ghost_candidates)) - to_chat(src, span_holoparasite("There were no ghosts willing to take control of [chosen_guardian.real_name]. Looks like you're stuck with it for now.")) - return - - var/mob/dead/observer/candidate = pick(ghost_candidates) - to_chat(chosen_guardian, span_holoparasite("Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance.")) - to_chat(src, span_boldholoparasite("Your [chosen_guardian.real_name] has been successfully reset.")) - message_admins("[key_name_admin(candidate)] has taken control of ([ADMIN_LOOKUPFLW(chosen_guardian)])") - chosen_guardian.ghostize(FALSE) - chosen_guardian.key = candidate.key - COOLDOWN_START(chosen_guardian, resetting_cooldown, 5 MINUTES) - chosen_guardian.guardian_rename() //give it a new color and name, to show it's a new person - chosen_guardian.guardian_recolor() - -////////parasite tracking/finding procs - -/// Returns a list of all holoparasites that has this mob as a summoner. -/mob/living/proc/get_all_linked_holoparasites() - RETURN_TYPE(/list) - var/list/all_parasites = list() - for(var/mob/living/simple_animal/hostile/guardian/stand as anything in GLOB.parasites) - if(stand.summoner != src) - continue - all_parasites += stand - return all_parasites - -/// Returns true if this holoparasite has the same summoner as the passed holoparasite. -/mob/living/simple_animal/hostile/guardian/proc/hasmatchingsummoner(mob/living/simple_animal/hostile/guardian/other_guardian) - return istype(other_guardian) && other_guardian.summoner == summoner diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm deleted file mode 100644 index 340e92a5b423..000000000000 --- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm +++ /dev/null @@ -1,107 +0,0 @@ -//Assassin -/mob/living/simple_animal/hostile/guardian/assassin - melee_damage_lower = 15 - melee_damage_upper = 15 - attack_verb_continuous = "slashes" - attack_verb_simple = "slash" - attack_sound = 'sound/weapons/bladeslice.ogg' - attack_vis_effect = ATTACK_EFFECT_SLASH - sharpness = SHARP_POINTY - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) - playstyle_string = span_holoparasite("As an assassin type you do medium damage and have no damage resistance, but can enter stealth, massively increasing the damage of your next attack and causing it to ignore armor. Stealth is broken when you attack or take damage.") - magic_fluff_string = span_holoparasite("..And draw the Space Ninja, a lethal, invisible assassin.") - tech_fluff_string = span_holoparasite("Boot sequence complete. Assassin modules loaded. Holoparasite swarm online.") - carp_fluff_string = span_holoparasite("CARP CARP CARP! Caught one! It's an assassin carp! Just when you thought it was safe to go back to the water... which is unhelpful, because we're in space.") - miner_fluff_string = span_holoparasite("You encounter... Glass, a sharp, fragile attacker.") - creator_name = "Assassin" - creator_desc = "Does medium damage and takes full damage, but can enter stealth, causing its next attack to do massive damage and ignore armor. However, it becomes briefly unable to recall after attacking from stealth." - creator_icon = "assassin" - toggle_button_type = /atom/movable/screen/guardian/toggle_mode/assassin - /// Is it in stealth mode? - var/toggle = FALSE - /// Time between going in stealth. - var/stealth_cooldown_time = 16 SECONDS - /// Damage added in stealth mode. - var/damage_bonus = 35 - /// Our wound bonus when in stealth mode. - var/stealth_wound_bonus = -20 //from -100, you can now wound! - /// Screen alert given when we are able to stealth. - var/atom/movable/screen/alert/canstealthalert - /// Screen alert given when we are in stealth. - var/atom/movable/screen/alert/instealthalert - /// Cooldown for the stealth toggle. - COOLDOWN_DECLARE(stealth_cooldown) - -/mob/living/simple_animal/hostile/guardian/assassin/get_status_tab_items() - . = ..() - if(!COOLDOWN_FINISHED(src, stealth_cooldown)) - . += "Stealth Cooldown Remaining: [DisplayTimeText(COOLDOWN_TIMELEFT(src, stealth_cooldown))]" - -/mob/living/simple_animal/hostile/guardian/assassin/AttackingTarget(atom/attacked_target) - . = ..() - if(.) - if(toggle && (isliving(target) || istype(target, /obj/structure/window) || istype(target, /obj/structure/grille))) - toggle_modes(forced = TRUE) - -/mob/living/simple_animal/hostile/guardian/assassin/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(. > 0 && toggle) - toggle_modes(forced = TRUE) - -/mob/living/simple_animal/hostile/guardian/assassin/recall_effects() - if(toggle) - toggle_modes(forced = TRUE) - -/mob/living/simple_animal/hostile/guardian/assassin/toggle_modes(forced = FALSE) - if(toggle) - melee_damage_lower -= damage_bonus - melee_damage_upper -= damage_bonus - armour_penetration = initial(armour_penetration) - wound_bonus = initial(wound_bonus) - obj_damage = initial(obj_damage) - environment_smash = initial(environment_smash) - alpha = initial(alpha) - if(!forced) - to_chat(src, span_bolddanger("You exit stealth.")) - else - visible_message(span_danger("\The [src] suddenly appears!")) - COOLDOWN_START(src, stealth_cooldown, stealth_cooldown_time) //we were forced out of stealth and go on cooldown - addtimer(CALLBACK(src, PROC_REF(updatestealthalert)), stealth_cooldown_time) - COOLDOWN_START(src, manifest_cooldown, 4 SECONDS) //can't recall for 4 seconds - updatestealthalert() - toggle = FALSE - else if(COOLDOWN_FINISHED(src, stealth_cooldown)) - if(!is_deployed()) - to_chat(src, span_bolddanger("You have to be manifested to enter stealth!")) - return - melee_damage_lower += damage_bonus - melee_damage_upper += damage_bonus - armour_penetration = 100 - wound_bonus = stealth_wound_bonus - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - new /obj/effect/temp_visual/guardian/phase/out(get_turf(src)) - alpha = 15 - if(!forced) - to_chat(src, span_bolddanger("You enter stealth, empowering your next attack.")) - updatestealthalert() - toggle = TRUE - else if(!forced) - to_chat(src, span_bolddanger("You cannot yet enter stealth, wait another [DisplayTimeText(COOLDOWN_TIMELEFT(src, stealth_cooldown))]!")) - -/mob/living/simple_animal/hostile/guardian/assassin/proc/updatestealthalert() - if(!COOLDOWN_FINISHED(src, stealth_cooldown)) - clear_alert("instealth") - instealthalert = null - clear_alert("canstealth") - canstealthalert = null - return - if(toggle && !instealthalert) - instealthalert = throw_alert("instealth", /atom/movable/screen/alert/instealth) - clear_alert("canstealth") - canstealthalert = null - else if(!toggle && !canstealthalert) - canstealthalert = throw_alert("canstealth", /atom/movable/screen/alert/canstealth) - clear_alert("instealth") - instealthalert = null - diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm deleted file mode 100644 index e1e0de66b00a..000000000000 --- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm +++ /dev/null @@ -1,74 +0,0 @@ -//Charger -/mob/living/simple_animal/hostile/guardian/charger - melee_damage_lower = 15 - melee_damage_upper = 15 - ranged = TRUE //technically - ranged_message = "charges" - ranged_cooldown_time = 4 SECONDS - speed = -0.5 - damage_coeff = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, CLONE = 0.75, STAMINA = 0, OXY = 0.75) - playstyle_string = span_holoparasite("As a charger type you do medium damage, have light damage resistance, move very fast, can be ridden, and can charge at a location, damaging any target hit and forcing them to drop any items they are holding.") - magic_fluff_string = span_holoparasite("..And draw the Hunter, an alien master of rapid assault.") - tech_fluff_string = span_holoparasite("Boot sequence complete. Charge modules loaded. Holoparasite swarm online.") - carp_fluff_string = span_holoparasite("CARP CARP CARP! Caught one! It's a charger carp, that likes running at people. But it doesn't have any legs...") - miner_fluff_string = span_holoparasite("You encounter... Titanium, a lightweight, agile fighter.") - creator_name = "Charger" - creator_desc = "Moves very fast, does medium damage on attack, can be ridden and can charge at targets, damaging the first target hit and forcing them to drop any items they are holding." - creator_icon = "charger" - /// Is it currently charging at something? - var/charging = FALSE - /// How much damage it does while charging. - var/charge_damage = 20 - -/mob/living/simple_animal/hostile/guardian/charger/Initialize(mapload, theme) - . = ..() - AddElement(/datum/element/ridable, /datum/component/riding/creature/guardian) - -/mob/living/simple_animal/hostile/guardian/charger/get_status_tab_items() - . = ..() - if(!COOLDOWN_FINISHED(src, ranged_cooldown)) - . += "Charge Cooldown Remaining: [DisplayTimeText(COOLDOWN_TIMELEFT(src, ranged_cooldown))]" - -/mob/living/simple_animal/hostile/guardian/charger/OpenFire(atom/target) - if(charging) - return - visible_message(span_danger("[src] [ranged_message] at [target]!")) - COOLDOWN_START(src, ranged_cooldown, ranged_cooldown_time) - clear_alert(ALERT_CHARGE) - addtimer(CALLBACK(src, PROC_REF(throw_alert), ALERT_CHARGE, /atom/movable/screen/alert/cancharge), ranged_cooldown_time) - Shoot(target) - -/mob/living/simple_animal/hostile/guardian/charger/Shoot(atom/targeted_atom) - charging = TRUE - playsound(src, 'sound/items/modsuit/loader_launch.ogg', 75, TRUE) - throw_at(targeted_atom, range, speed = 1.5, thrower = src, spin = FALSE, diagonals_first = TRUE, callback = CALLBACK(src, PROC_REF(charging_end))) - -/mob/living/simple_animal/hostile/guardian/charger/proc/charging_end() - charging = FALSE - -/mob/living/simple_animal/hostile/guardian/charger/Move() - if(charging) - new /obj/effect/temp_visual/decoy/fading(loc, src) - return ..() - -/mob/living/simple_animal/hostile/guardian/charger/check_distance() - if(!charging) - ..() - -/mob/living/simple_animal/hostile/guardian/charger/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - if(!charging) - return ..() - if(!isliving(hit_atom) || hit_atom == summoner || hasmatchingsummoner(hit_atom)) - return - var/mob/living/hit_mob = hit_atom - if(ishuman(hit_mob)) - var/mob/living/carbon/human/hit_human = hit_mob - if(hit_human.check_shields(src, charge_damage, name, attack_type = THROWN_PROJECTILE_ATTACK)) - return - hit_mob.drop_all_held_items() - hit_mob.visible_message(span_danger("[src] slams into [hit_mob]!"), span_userdanger("[src] slams into you!")) - hit_mob.apply_damage(charge_damage, BRUTE) - playsound(hit_mob, 'sound/effects/meteorimpact.ogg', 100, TRUE) - shake_camera(hit_mob, 4, 3) - shake_camera(src, 2, 3) - diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm deleted file mode 100644 index bdbc0e8f4d34..000000000000 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ /dev/null @@ -1,97 +0,0 @@ -//Dextrous -/mob/living/simple_animal/hostile/guardian/dextrous - melee_damage_lower = 10 - melee_damage_upper = 10 - damage_coeff = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, CLONE = 0.75, STAMINA = 0, OXY = 0.75) - playstyle_string = span_holoparasite("As a dextrous type you can hold items, store an item within yourself, and have medium damage resistance, but do low damage on attacks. Recalling and leashing will force you to drop unstored items!") - magic_fluff_string = span_holoparasite("..And draw the Drone, a dextrous master of construction and repair.") - tech_fluff_string = span_holoparasite("Boot sequence complete. Dextrous combat modules loaded. Holoparasite swarm online.") - carp_fluff_string = span_holoparasite("CARP CARP CARP! You caught one! It can hold stuff in its fins, sort of.") - miner_fluff_string = span_holoparasite("You encounter... Gold, a malleable constructor.") - creator_name = "Dextrous" - creator_desc = "Does low damage on attack, but is capable of holding items and storing a single item within it. It will drop items held in its hands when it recalls, but it will retain the stored item." - creator_icon = "dextrous" - dextrous = TRUE - held_items = list(null, null) - var/obj/item/internal_storage //what we're storing within ourself - -/mob/living/simple_animal/hostile/guardian/dextrous/death(gibbed) - . = ..() - if(internal_storage) - dropItemToGround(internal_storage) - -/mob/living/simple_animal/hostile/guardian/dextrous/examine(mob/user) - if(dextrous) - . = list("This is [icon2html(src)] \a [src]!\n[desc]") - for(var/obj/item/held_item in held_items) - if(held_item.item_flags & (ABSTRACT|EXAMINE_SKIP|HAND_ITEM)) - continue - . += "It has [held_item.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(held_item))]." - if(internal_storage && !(internal_storage.item_flags & ABSTRACT)) - . += "It is holding [internal_storage.get_examine_string(user)] in its internal storage." - . += "" - else - return ..() - -/mob/living/simple_animal/hostile/guardian/dextrous/recall_effects() - drop_all_held_items() - -/mob/living/simple_animal/hostile/guardian/dextrous/check_distance() - if(!summoner || get_dist(get_turf(summoner), get_turf(src)) <= range) - return - drop_all_held_items() - ..() //lose items, then return - -//SLOT HANDLING BULLSHIT FOR INTERNAL STORAGE -/mob/living/simple_animal/hostile/guardian/dextrous/doUnEquip(obj/item/equipped_item, force, newloc, no_move, invdrop = TRUE, silent = FALSE) - if(..()) - update_held_items() - if(equipped_item == internal_storage) - internal_storage = null - update_inv_internal_storage() - return TRUE - return FALSE - -/mob/living/simple_animal/hostile/guardian/dextrous/can_equip(obj/item/equipped_item, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE) - switch(slot) - if(ITEM_SLOT_DEX_STORAGE) - if(internal_storage) - return FALSE - return TRUE - ..() - -/mob/living/simple_animal/hostile/guardian/dextrous/get_item_by_slot(slot_id) - if(slot_id == ITEM_SLOT_DEX_STORAGE) - return internal_storage - return ..() - -/mob/living/simple_animal/hostile/guardian/dextrous/get_slot_by_item(obj/item/looking_for) - if(internal_storage == looking_for) - return ITEM_SLOT_DEX_STORAGE - return ..() - -/mob/living/simple_animal/hostile/guardian/dextrous/equip_to_slot(obj/item/equipped_item, slot) - if(!..()) - return - - switch(slot) - if(ITEM_SLOT_DEX_STORAGE) - internal_storage = equipped_item - update_inv_internal_storage() - else - to_chat(src, span_danger("You are trying to equip this item to an unsupported inventory slot. Report this to a coder!")) - -/mob/living/simple_animal/hostile/guardian/dextrous/getBackSlot() - return ITEM_SLOT_DEX_STORAGE - -/mob/living/simple_animal/hostile/guardian/dextrous/getBeltSlot() - return ITEM_SLOT_DEX_STORAGE - -/mob/living/simple_animal/hostile/guardian/dextrous/proc/update_inv_internal_storage() - if(internal_storage && client && hud_used?.hud_shown) - internal_storage.screen_loc = ui_id - client.screen += internal_storage - -/mob/living/simple_animal/hostile/guardian/dextrous/regenerate_icons() - ..() - update_inv_internal_storage() diff --git a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm b/code/modules/mob/living/simple_animal/guardian/types/explosive.dm deleted file mode 100644 index df5fce2380d0..000000000000 --- a/code/modules/mob/living/simple_animal/guardian/types/explosive.dm +++ /dev/null @@ -1,72 +0,0 @@ -#define UNREGISTER_BOMB_SIGNALS(A) \ - do { \ - UnregisterSignal(A, boom_signals); \ - UnregisterSignal(A, COMSIG_PARENT_EXAMINE); \ - } while (0) - -//Explosive -/mob/living/simple_animal/hostile/guardian/explosive - melee_damage_lower = 15 - melee_damage_upper = 15 - damage_coeff = list(BRUTE = 0.6, BURN = 0.6, TOX = 0.6, CLONE = 0.6, STAMINA = 0, OXY = 0.6) - range = 13 - playstyle_string = span_holoparasite("As an explosive type, you have moderate close combat abilities and are capable of converting nearby items and objects into disguised bombs via right-click.") - magic_fluff_string = span_holoparasite("..And draw the Scientist, master of explosive death.") - tech_fluff_string = span_holoparasite("Boot sequence complete. Explosive modules active. Holoparasite swarm online.") - carp_fluff_string = span_holoparasite("CARP CARP CARP! Caught one! It's an explosive carp! Boom goes the fishy.") - miner_fluff_string = span_holoparasite("You encounter... Gibtonite, an explosive fighter.") - creator_name = "Explosive" - creator_desc = "High damage resist and medium power attack that may explosively teleport targets. Can turn any object, including objects too large to pick up, into a bomb, dealing explosive damage to the next person to touch it. The object will return to normal after the trap is triggered or after a delay." - creator_icon = "explosive" - /// Static list of signals that activate the boom. - var/static/list/boom_signals = list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_BUMPED, COMSIG_ATOM_ATTACK_HAND) - /// After this amount of time passses, boom deactivates. - var/decay_time = 1 MINUTES - /// Time between bombs. - var/bomb_cooldown_time = 20 SECONDS - /// The cooldown timer between bombs. - COOLDOWN_DECLARE(bomb_cooldown) - -/mob/living/simple_animal/hostile/guardian/explosive/get_status_tab_items() - . = ..() - if(!COOLDOWN_FINISHED(src, bomb_cooldown)) - . += "Bomb Cooldown Remaining: [DisplayTimeText(COOLDOWN_TIMELEFT(src, bomb_cooldown))]" - -/mob/living/simple_animal/hostile/guardian/explosive/UnarmedAttack(atom/attack_target, proximity_flag) - if((istate & ISTATE_SECONDARY) && proximity_flag && isobj(attack_target)) - plant_bomb(attack_target) - return - return ..() - -/mob/living/simple_animal/hostile/guardian/explosive/proc/plant_bomb(obj/planting_on) - if(!COOLDOWN_FINISHED(src, bomb_cooldown)) - to_chat(src, span_bolddanger("Your powers are on cooldown! You must wait [DisplayTimeText(COOLDOWN_TIMELEFT(src, bomb_cooldown))] between bombs.")) - return - to_chat(src, span_bolddanger("Success! Bomb armed!")) - COOLDOWN_START(src, bomb_cooldown, bomb_cooldown_time) - RegisterSignal(planting_on, COMSIG_PARENT_EXAMINE, PROC_REF(display_examine)) - RegisterSignals(planting_on, boom_signals, PROC_REF(kaboom)) - addtimer(CALLBACK(src, PROC_REF(disable), planting_on), decay_time, TIMER_UNIQUE|TIMER_OVERRIDE) - -/mob/living/simple_animal/hostile/guardian/explosive/proc/kaboom(atom/source, mob/living/explodee) - SIGNAL_HANDLER - if(!istype(explodee)) - return - if(explodee == src || explodee == summoner || hasmatchingsummoner(explodee)) - return - to_chat(explodee, span_bolddanger("[source] was boobytrapped!")) - to_chat(src, span_bolddanger("Success! Your trap caught [explodee]")) - playsound(source, 'sound/effects/explosion2.ogg', 200, TRUE) - new /obj/effect/temp_visual/explosion(get_turf(source)) - EX_ACT(explodee, EXPLODE_HEAVY) - UNREGISTER_BOMB_SIGNALS(source) - -/mob/living/simple_animal/hostile/guardian/explosive/proc/disable(obj/rigged_obj) - to_chat(src, span_bolddanger("Failure! Your trap didn't catch anyone this time.")) - UNREGISTER_BOMB_SIGNALS(rigged_obj) - -/mob/living/simple_animal/hostile/guardian/explosive/proc/display_examine(datum/source, mob/user, text) - SIGNAL_HANDLER - text += span_holoparasite("It glows with a strange light!") - -#undef UNREGISTER_BOMB_SIGNALS diff --git a/code/modules/mob/living/simple_animal/guardian/types/gaseous.dm b/code/modules/mob/living/simple_animal/guardian/types/gaseous.dm deleted file mode 100644 index 7808f8a6b482..000000000000 --- a/code/modules/mob/living/simple_animal/guardian/types/gaseous.dm +++ /dev/null @@ -1,103 +0,0 @@ -//Gaseous -/mob/living/simple_animal/hostile/guardian/gaseous - melee_damage_lower = 10 - melee_damage_upper = 10 - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 0) - range = 7 - playstyle_string = span_holoparasite("As a gaseous type, you have only light damage resistance, but you can expel gas in an area. In addition, your punches cause sparks, and you make your summoner inflammable.") - magic_fluff_string = span_holoparasite("..And draw the Atmospheric Technician, flooding the area with gas!") - tech_fluff_string = span_holoparasite("Boot sequence complete. Atmospheric modules activated. Holoparasite swarm online.") - carp_fluff_string = span_holoparasite("CARP CARP CARP! You caught one! OH GOD, EVERYTHING'S ON FIRE. Except you and the fish.") - miner_fluff_string = span_holoparasite("You encounter... Plasma, the bringer of fire.") - creator_name = "Gaseous" - creator_desc = "Creates sparks on touch and continuously expels a gas of its choice. Automatically extinguishes the user if they catch on fire." - creator_icon = "gaseous" - toggle_button_type = /atom/movable/screen/guardian/toggle_mode/gases - /// Gas being expelled. - var/expelled_gas = null - /// Rate of temperature stabilization per second. - var/temp_stabilization_rate = 0.1 - /// Possible gases to expel, with how much moles they create. - var/static/list/possible_gases = list( - /datum/gas/oxygen = 50, - /datum/gas/nitrogen = 750, //overpressurizing is hard!. - /datum/gas/water_vapor = 1, //you need incredibly little water vapor for the effects to kick in - /datum/gas/nitrous_oxide = 15, - /datum/gas/carbon_dioxide = 50, - /datum/gas/plasma = 3, - /datum/gas/bz = 10, - ) - /// Gas colors, used for the particles. - var/static/list/gas_colors = list( - /datum/gas/oxygen = "#63BFDD", //color of frozen oxygen - /datum/gas/nitrogen = "#777777", //grey (grey) - /datum/gas/water_vapor = "#96ADCF", //water is slightly blue - /datum/gas/nitrous_oxide = "#FEFEFE", //white like the sprite - /datum/gas/carbon_dioxide = "#222222", //black like coal - /datum/gas/plasma = "#B233CC", //color of the plasma sprite - /datum/gas/bz = "#FAFF00", //color of the bz metabolites reagent - ) - -/mob/living/simple_animal/hostile/guardian/gaseous/Initialize(mapload, theme) - . = ..() - RegisterSignal(src, COMSIG_ATOM_PRE_PRESSURE_PUSH, PROC_REF(stop_pressure)) - -/mob/living/simple_animal/hostile/guardian/gaseous/AttackingTarget(atom/attacked_target) - . = ..() - if(!isliving(target)) - return - do_sparks(1, TRUE, target) - -/mob/living/simple_animal/hostile/guardian/gaseous/recall(forced) - expelled_gas = null - QDEL_NULL(particles) //need to delete before putting in another object - . = ..() - if(. && summoner) - UnregisterSignal(summoner, COMSIG_ATOM_PRE_PRESSURE_PUSH) - -/mob/living/simple_animal/hostile/guardian/gaseous/manifest(forced) - . = ..() - if(. && summoner) - RegisterSignal(summoner, COMSIG_ATOM_PRE_PRESSURE_PUSH, PROC_REF(stop_pressure)) - -/mob/living/simple_animal/hostile/guardian/gaseous/Life(seconds_per_tick, times_fired) - . = ..() - if(summoner) - summoner.extinguish_mob() - summoner.set_fire_stacks(0, remove_wet_stacks = FALSE) - summoner.adjust_bodytemperature(get_temp_change_amount((summoner.get_body_temp_normal() - summoner.bodytemperature), temp_stabilization_rate * seconds_per_tick)) - if(!expelled_gas) - return - var/datum/gas_mixture/mix_to_spawn = new() - mix_to_spawn.add_gas(expelled_gas) - mix_to_spawn.gases[expelled_gas][MOLES] = possible_gases[expelled_gas] * seconds_per_tick - mix_to_spawn.temperature = T20C - var/turf/open/our_turf = get_turf(src) - our_turf.assume_air(mix_to_spawn) - -/mob/living/simple_animal/hostile/guardian/gaseous/toggle_modes() - var/list/gases = list("None") - for(var/datum/gas/gas as anything in possible_gases) - gases[initial(gas.name)] = gas - var/picked_gas = tgui_input_list(src, "Select a gas to expel.", "Gas Producer", gases) - if(picked_gas == "None") - expelled_gas = null - QDEL_NULL(particles) - to_chat(src, span_notice("You stopped expelling gas.")) - return - var/gas_type = gases[picked_gas] - if(!picked_gas || !gas_type) - return - to_chat(src, span_bolddanger("You are now expelling [picked_gas].")) - investigate_log("set their gas type to [picked_gas].", INVESTIGATE_ATMOS) - expelled_gas = gas_type - if(!particles) - particles = new /particles/smoke/steam() - particles.position = list(-1, 8, 0) - particles.fadein = 5 - particles.height = 200 - particles.color = gas_colors[gas_type] - -/mob/living/simple_animal/hostile/guardian/gaseous/proc/stop_pressure(datum/source) - SIGNAL_HANDLER - return COMSIG_ATOM_BLOCKS_PRESSURE diff --git a/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm b/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm deleted file mode 100644 index 2e8dabf8f584..000000000000 --- a/code/modules/mob/living/simple_animal/guardian/types/gravitokinetic.dm +++ /dev/null @@ -1,91 +0,0 @@ -//gravitokinetic -/mob/living/simple_animal/hostile/guardian/gravitokinetic - melee_damage_lower = 15 - melee_damage_upper = 15 - damage_coeff = list(BRUTE = 0.75, BURN = 0.75, TOX = 0.75, CLONE = 0.75, STAMINA = 0, OXY = 0.75) - playstyle_string = span_holoparasite("As a gravitokinetic type, you can right-click to make the gravity on the ground stronger, and punching applies this effect to a target.") - magic_fluff_string = span_holoparasite("..And draw the Singularity, an anomalous force of terror.") - tech_fluff_string = span_holoparasite("Boot sequence complete. Gravitokinetic modules loaded. Holoparasite swarm online.") - carp_fluff_string = span_holoparasite("CARP CARP CARP! Caught one! It's a gravitokinetic carp! Now do you understand the gravity of the situation?") - miner_fluff_string = span_holoparasite("You encounter... Bananium, a master of gravity business.") - creator_name = "Gravitokinetic" - creator_desc = "Attacks will apply crushing gravity to the target. Can target the ground as well to slow targets advancing on you, but this will affect the user." - creator_icon = "gravitokinetic" - /// Targets we have applied our effects on. - var/list/gravity_targets = list() - /// Distance in which our ability works - var/gravity_power_range = 10 - /// Gravity added on punches. - var/punch_gravity = 5 - /// Gravity added to turfs. - var/turf_gravity = 3 - -/mob/living/simple_animal/hostile/guardian/gravitokinetic/Initialize(mapload, theme) - . = ..() - AddElement(/datum/element/forced_gravity, 1) - -/mob/living/simple_animal/hostile/guardian/gravitokinetic/set_summoner(mob/to_who, different_person) - . = ..() - to_who.AddElement(/datum/element/forced_gravity, 1) - -/mob/living/simple_animal/hostile/guardian/gravitokinetic/cut_summoner(different_person) - summoner.RemoveElement(/datum/element/forced_gravity, 1) - return ..() - -///Removes gravity from affected mobs upon guardian death to prevent permanent effects -/mob/living/simple_animal/hostile/guardian/gravitokinetic/death() - . = ..() - for(var/gravity_target in gravity_targets) - remove_gravity(gravity_target) - -/mob/living/simple_animal/hostile/guardian/gravitokinetic/AttackingTarget(atom/attacked_target) - . = ..() - if(isliving(target) && !hasmatchingsummoner(attacked_target) && target != src && target != summoner && !gravity_targets[target]) - to_chat(src, span_bolddanger("Your punch has applied heavy gravity to [target]!")) - add_gravity(target, punch_gravity) - to_chat(target, span_userdanger("Everything feels really heavy!")) - -/mob/living/simple_animal/hostile/guardian/gravitokinetic/UnarmedAttack(atom/attack_target, proximity_flag) - if((istate & ISTATE_SECONDARY) && proximity_flag && !gravity_targets[target]) - slam_turf(attack_target) - return - return ..() - -/mob/living/simple_animal/hostile/guardian/gravitokinetic/proc/slam_turf(turf/open/slammed) - if(!isopenturf(slammed) || isgroundlessturf(slammed)) - to_chat(src, span_warning("You cannot add gravity to this!")) - return - visible_message(span_danger("[src] slams their fist into the [slammed]!"), span_notice("You modify the gravity of the [slammed].")) - do_attack_animation(slammed) - add_gravity(slammed, turf_gravity) - -/mob/living/simple_animal/hostile/guardian/gravitokinetic/recall_effects() - to_chat(src, span_bolddanger("You have released your gravitokinetic powers!")) - for(var/gravity_target in gravity_targets) - remove_gravity(gravity_target) - -/mob/living/simple_animal/hostile/guardian/gravitokinetic/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - for(var/gravity_target in gravity_targets) - if(get_dist(src, gravity_target) > gravity_power_range) - remove_gravity(gravity_target) - -/mob/living/simple_animal/hostile/guardian/gravitokinetic/proc/add_gravity(atom/target, new_gravity = 3) - if(gravity_targets[target]) - return - target.AddElement(/datum/element/forced_gravity, new_gravity) - gravity_targets[target] = new_gravity - RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(distance_check)) - playsound(src, 'sound/effects/gravhit.ogg', 100, TRUE) - -/mob/living/simple_animal/hostile/guardian/gravitokinetic/proc/remove_gravity(atom/target) - if(isnull(gravity_targets[target])) - return - UnregisterSignal(target, COMSIG_MOVABLE_MOVED) - target.RemoveElement(/datum/element/forced_gravity, gravity_targets[target]) - gravity_targets -= target - -/mob/living/simple_animal/hostile/guardian/gravitokinetic/proc/distance_check(atom/movable/moving_target, old_loc, dir, forced) - SIGNAL_HANDLER - if(get_dist(src, moving_target) > gravity_power_range) - remove_gravity(moving_target) diff --git a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm deleted file mode 100644 index 9739445f7c9c..000000000000 --- a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm +++ /dev/null @@ -1,111 +0,0 @@ -/obj/effect/ebeam/chain - name = "lightning chain" - layer = LYING_MOB_LAYER - plane = GAME_PLANE_FOV_HIDDEN - -//Lightning -/mob/living/simple_animal/hostile/guardian/lightning - melee_damage_lower = 7 - melee_damage_upper = 7 - attack_verb_continuous = "shocks" - attack_verb_simple = "shock" - melee_damage_type = BURN - attack_sound = 'sound/machines/defib_zap.ogg' - damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) - range = 7 - playstyle_string = span_holoparasite("As a lightning type, you will apply lightning chains to targets on attack and have a lightning chain to your summoner. Lightning chains will shock anyone near them.") - magic_fluff_string = span_holoparasite("..And draw the Tesla, a shocking, lethal source of power.") - tech_fluff_string = span_holoparasite("Boot sequence complete. Lightning modules active. Holoparasite swarm online.") - carp_fluff_string = span_holoparasite("CARP CARP CARP! Caught one! It's a lightning carp! Everyone else goes zap zap.") - miner_fluff_string = span_holoparasite("You encounter... Iron, a conductive master of lightning.") - creator_name = "Lightning" - creator_desc = "Attacks apply lightning chains to targets. Has a lightning chain to the user. Lightning chains shock everything near them, doing constant damage." - creator_icon = "lightning" - /// Beam datum of our lightning chain to the summoner. - var/datum/beam/summonerchain - /// List of all lightning chains attached to enemies. - var/list/enemychains = list() - /// Amount of shocks we've given through the chain to the summoner. - var/successfulshocks = 0 - /// Cooldown between shocks. - COOLDOWN_DECLARE(shock_cooldown) - -/mob/living/simple_animal/hostile/guardian/lightning/AttackingTarget(atom/attacked_target) - . = ..() - if(!. || !isliving(target) || target == summoner || hasmatchingsummoner(target)) - return - cleardeletedchains() - for(var/datum/beam/chain as anything in enemychains) - if(chain.target == target) - return //oh this guy already HAS a chain, let's not chain again - if(length(enemychains) > 2) - var/datum/beam/enemy_chain = pick(enemychains) - qdel(enemy_chain) - enemychains -= enemy_chain - enemychains += Beam(target, "lightning[rand(1,12)]", maxdistance=7, beam_type=/obj/effect/ebeam/chain) - -/mob/living/simple_animal/hostile/guardian/lightning/manifest_effects() - START_PROCESSING(SSfastprocess, src) - if(summoner) - summonerchain = Beam(summoner, "lightning[rand(1,12)]", beam_type=/obj/effect/ebeam/chain) - -/mob/living/simple_animal/hostile/guardian/lightning/recall_effects() - STOP_PROCESSING(SSfastprocess, src) - removechains() - -/mob/living/simple_animal/hostile/guardian/lightning/process(seconds_per_tick) - if(!COOLDOWN_FINISHED(src, shock_cooldown)) - return - if(successfulshocks > 5) - successfulshocks = 0 - if(shockallchains()) - successfulshocks++ - COOLDOWN_START(src, shock_cooldown, 0.3 SECONDS) - -/mob/living/simple_animal/hostile/guardian/lightning/proc/cleardeletedchains() - if(summonerchain && QDELETED(summonerchain)) - summonerchain = null - for(var/datum/chain as anything in enemychains) - if(QDELETED(chain)) - enemychains -= chain - -/mob/living/simple_animal/hostile/guardian/lightning/proc/shockallchains() - . = 0 - cleardeletedchains() - if(summonerchain) - . += chainshock(summonerchain) - for(var/chain in enemychains) - . += chainshock(chain) - -/mob/living/simple_animal/hostile/guardian/lightning/proc/removechains() - QDEL_NULL(summonerchain) - for(var/chain in enemychains) - qdel(chain) - enemychains = list() - -/mob/living/simple_animal/hostile/guardian/lightning/proc/chainshock(datum/beam/B) //fuck you, fuck this - . = 0 - var/list/turfs = list() - for(var/E in B.elements) - var/obj/effect/ebeam/chainpart = E - if(chainpart && chainpart.x && chainpart.y && chainpart.z) - var/turf/T = get_turf_pixel(chainpart) - turfs |= T - if(T != get_turf(B.origin) && T != get_turf(B.target)) - for(var/turf/TU in circle_range(T, 1)) - turfs |= TU - for(var/turf in turfs) - var/turf/T = turf - for(var/mob/living/L in T) - if(L.stat != DEAD && L != src && L != summoner) - if(hasmatchingsummoner(L)) //if the summoner matches don't hurt them - continue - if(successfulshocks > 4) - L.electrocute_act(0) - L.visible_message( - span_danger("[L] was shocked by the lightning chain!"), \ - span_userdanger("You are shocked by the lightning chain!"), \ - span_hear("You hear a heavy electrical crack.") \ - ) - L.adjustFireLoss(1.2) //adds up very rapidly - . = 1 diff --git a/code/modules/mob/living/simple_animal/guardian/types/protector.dm b/code/modules/mob/living/simple_animal/guardian/types/protector.dm deleted file mode 100644 index 1e7dc6ba54dd..000000000000 --- a/code/modules/mob/living/simple_animal/guardian/types/protector.dm +++ /dev/null @@ -1,76 +0,0 @@ -//Protector -/mob/living/simple_animal/hostile/guardian/protector - melee_damage_lower = 15 - melee_damage_upper = 15 - range = 15 //worse for it due to how it leashes - damage_coeff = list(BRUTE = 0.4, BURN = 0.4, TOX = 0.4, CLONE = 0.4, STAMINA = 0, OXY = 0.4) - playstyle_string = span_holoparasite("As a protector type you cause your summoner to leash to you instead of you leashing to them and have two modes; Combat Mode, where you do and take medium damage, and Protection Mode, where you do and take almost no damage, but move slightly slower.") - magic_fluff_string = span_holoparasite("..And draw the Guardian, a stalwart protector that never leaves the side of its charge.") - tech_fluff_string = span_holoparasite("Boot sequence complete. Protector modules loaded. Holoparasite swarm online.") - carp_fluff_string = span_holoparasite("CARP CARP CARP! You caught one! Wait, no... it caught you! The fisher has become the fishy.") - miner_fluff_string = span_holoparasite("You encounter... Uranium, a very resistant guardian.") - creator_name = "Protector" - creator_desc = "Causes you to teleport to it when out of range, unlike other parasites. Has two modes; Combat, where it does and takes medium damage, and Protection, where it does and takes almost no damage but moves slightly slower." - creator_icon = "protector" - toggle_button_type = /atom/movable/screen/guardian/toggle_mode - /// Damage removed in protecting mode. - var/damage_penalty = 13 - /// Is it in protecting mode? - var/toggle = FALSE - /// Overlay of our protection shield. - var/mutable_appearance/shield_overlay - -/mob/living/simple_animal/hostile/guardian/protector/ex_act(severity) - if(severity >= EXPLODE_DEVASTATE) - adjustBruteLoss(400) //if in protector mode, will do 20 damage and not actually necessarily kill the summoner - else - . = ..() - if(QDELETED(src)) - return FALSE - if(toggle) - visible_message(span_danger("The explosion glances off [src]'s energy shielding!")) - -/mob/living/simple_animal/hostile/guardian/protector/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(. > 0 && toggle) - var/image/flash_overlay = new('icons/effects/effects.dmi', src, "shield-flash", layer+0.01, dir = pick(GLOB.cardinals)) - flash_overlay.color = guardian_color - flick_overlay_view(flash_overlay, 0.5 SECONDS) - -/mob/living/simple_animal/hostile/guardian/protector/toggle_modes() - if(COOLDOWN_FINISHED(src, manifest_cooldown)) - return - COOLDOWN_START(src, manifest_cooldown, 1 SECONDS) - if(toggle) - cut_overlay(shield_overlay) - melee_damage_lower += damage_penalty - melee_damage_upper += damage_penalty - speed = initial(speed) - damage_coeff = list(BRUTE = 0.4, BURN = 0.4, TOX = 0.4, CLONE = 0.4, STAMINA = 0, OXY = 0.4) - to_chat(src, span_bolddanger("You switch to combat mode.")) - toggle = FALSE - else - if(!shield_overlay) - shield_overlay = mutable_appearance('icons/effects/effects.dmi', "shield-grey") - shield_overlay.color = guardian_color - add_overlay(shield_overlay) - melee_damage_lower -= damage_penalty - melee_damage_upper -= damage_penalty - speed = 1 - damage_coeff = list(BRUTE = 0.05, BURN = 0.05, TOX = 0.05, CLONE = 0.05, STAMINA = 0, OXY = 0.05) //damage? what's damage? - to_chat(src, span_bolddanger("You switch to protection mode.")) - toggle = TRUE - -/mob/living/simple_animal/hostile/guardian/protector/check_distance() //snap to what? snap to the guardian! - if(!summoner || get_dist(summoner, src) <= range) - return - if(istype(summoner.loc, /obj/effect)) - to_chat(src, span_holoparasite("You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]!")) - visible_message(span_danger("\The [src] jumps back to its user.")) - recall(forced = TRUE) - return - to_chat(summoner, span_holoparasite("You moved out of range, and were pulled back! You can only move [range] meters from [real_name]!")) - summoner.visible_message(span_danger("\The [summoner] jumps back to [summoner.p_their()] protector.")) - new /obj/effect/temp_visual/guardian/phase/out(get_turf(summoner)) - summoner.forceMove(get_turf(src)) - new /obj/effect/temp_visual/guardian/phase(get_turf(summoner)) diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm deleted file mode 100644 index d93b14912ebd..000000000000 --- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm +++ /dev/null @@ -1,182 +0,0 @@ -//Ranged -/obj/projectile/guardian - name = "crystal spray" - icon_state = "guardian" - damage = 5 - damage_type = BRUTE - armour_penetration = 100 - -/mob/living/simple_animal/hostile/guardian/ranged - istate = NONE - friendly_verb_continuous = "quietly assesses" - friendly_verb_simple = "quietly assess" - melee_damage_lower = 10 - melee_damage_upper = 10 - damage_coeff = list(BRUTE = 0.9, BURN = 0.9, TOX = 0.9, CLONE = 0.9, STAMINA = 0, OXY = 0.9) - projectiletype = /obj/projectile/guardian - ranged_cooldown_time = 1 //fast! - projectilesound = 'sound/effects/hit_on_shattered_glass.ogg' - ranged = 1 - range = 13 - playstyle_string = span_holoparasite("As a ranged type, you have only light damage resistance, but are capable of spraying shards of crystal at incredibly high speed. You can also deploy surveillance snares to monitor enemy movement. Finally, you can switch to scout mode, in which you can't attack, but can move without limit.") - magic_fluff_string = span_holoparasite("..And draw the Sentinel, an alien master of ranged combat.") - tech_fluff_string = span_holoparasite("Boot sequence complete. Ranged combat modules active. Holoparasite swarm online.") - carp_fluff_string = span_holoparasite("CARP CARP CARP! Caught one, it's a ranged carp. This fishy can watch people pee in the ocean.") - miner_fluff_string = span_holoparasite("You encounter... Diamond, a powerful projectile thrower.") - creator_name = "Ranged" - creator_desc = "Has two modes. Ranged; which fires a constant stream of weak, armor-ignoring projectiles. Scout; where it cannot attack, but can move through walls and is quite hard to see. Can lay surveillance snares, which alert it when crossed, in either mode." - creator_icon = "ranged" - see_invisible = SEE_INVISIBLE_LIVING - toggle_button_type = /atom/movable/screen/guardian/toggle_mode - /// List of all deployed snares. - var/list/snares = list() - /// Is it in scouting mode? - var/toggle = FALSE - /// Maximum snares deployed at once. - var/max_snares = 6 - /// Lower damage before scouting. - var/previous_lower_damage = 0 - /// Upper damage before scouting. - var/previous_upper_damage = 0 - -/mob/living/simple_animal/hostile/guardian/ranged/toggle_modes() - if(is_deployed() && summoner) - to_chat(src, span_bolddanger("You have to be recalled to toggle modes!")) - return - if(toggle) - ranged = initial(ranged) - melee_damage_lower = previous_lower_damage - melee_damage_upper = previous_upper_damage - previous_lower_damage = 0 - previous_upper_damage = 0 - obj_damage = initial(obj_damage) - environment_smash = initial(environment_smash) - alpha = 255 - range = initial(range) - to_chat(src, span_bolddanger("You switch to combat mode.")) - toggle = FALSE - else - ranged = 0 - previous_lower_damage = melee_damage_lower - melee_damage_lower = 0 - previous_upper_damage = melee_damage_upper - melee_damage_upper = 0 - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - alpha = 45 - range = 255 - to_chat(src, span_bolddanger("You switch to scout mode.")) - toggle = TRUE - - -/mob/living/simple_animal/hostile/guardian/ranged/Shoot(atom/targeted_atom) - . = ..() - if(!istype(., /obj/projectile)) - return - var/obj/projectile/shot_projectile = . - shot_projectile.color = guardian_color - -/mob/living/simple_animal/hostile/guardian/ranged/toggle_light() - var/msg - switch(lighting_cutoff) - if (LIGHTING_CUTOFF_VISIBLE) - lighting_cutoff_red = 10 - lighting_cutoff_green = 10 - lighting_cutoff_blue = 15 - msg = "You activate your night vision." - if (LIGHTING_CUTOFF_MEDIUM) - lighting_cutoff_red = 25 - lighting_cutoff_green = 25 - lighting_cutoff_blue = 35 - msg = "You increase your night vision." - if (LIGHTING_CUTOFF_HIGH) - lighting_cutoff_red = 35 - lighting_cutoff_green = 35 - lighting_cutoff_blue = 50 - msg = "You maximize your night vision." - else - lighting_cutoff_red = 0 - lighting_cutoff_green = 0 - lighting_cutoff_blue = 0 - msg = "You deactivate your night vision." - sync_lighting_plane_cutoff() - to_chat(src, span_notice(msg)) - - -/mob/living/simple_animal/hostile/guardian/ranged/verb/Snare() - set name = "Set Surveillance Snare" - set category = "Guardian" - set desc = "Set an invisible snare that will alert you when living creatures walk over it. Max of 5" - if(length(snares) < max_snares) - var/turf/snare_loc = get_turf(src) - var/obj/effect/snare/new_snare = new /obj/effect/snare(snare_loc, src) - new_snare.name = "[get_area(snare_loc)] snare ([rand(1, 1000)])" - snares += new_snare - to_chat(src, span_bolddanger("Surveillance snare deployed!")) - else - to_chat(src, span_bolddanger("You have too many snares deployed. Remove some first.")) - -/mob/living/simple_animal/hostile/guardian/ranged/verb/DisarmSnare() - set name = "Remove Surveillance Snare" - set category = "Guardian" - set desc = "Disarm unwanted surveillance snares." - var/picked_snare = tgui_input_list(src, "Pick which snare to remove.", "Remove Snare", sort_names(snares)) - if(isnull(picked_snare)) - return - qdel(picked_snare) - to_chat(src, span_bolddanger("Snare disarmed.")) - -/obj/effect/snare - name = "snare" - desc = "You shouldn't be seeing this!" - invisibility = INVISIBILITY_ABSTRACT - var/datum/weakref/guardian_ref - -/obj/effect/snare/Initialize(mapload, spawning_guardian) - . = ..() - guardian_ref = WEAKREF(spawning_guardian) - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/effect/snare/Destroy(force) - var/mob/living/simple_animal/hostile/guardian/ranged/spawning_guardian = guardian_ref?.resolve() - if(spawning_guardian) - spawning_guardian.snares -= src - return ..() - -/obj/effect/snare/proc/on_entered(datum/source, crossed_object) - SIGNAL_HANDLER - var/mob/living/simple_animal/hostile/guardian/ranged/spawning_guardian = guardian_ref?.resolve() - if(!spawning_guardian) - qdel(src) - return - if(!isliving(crossed_object) || crossed_object == spawning_guardian || spawning_guardian.hasmatchingsummoner(crossed_object)) - return - send_message(spawning_guardian.summoner || spawning_guardian, crossed_object) - -/obj/effect/snare/proc/send_message(mob/living/recipient, crossed_object) - to_chat(recipient, span_bolddanger("[crossed_object] has crossed [name].")) - var/list/guardians = recipient.get_all_linked_holoparasites() - for(var/guardian in guardians) - send_message(guardian, crossed_object) - -/obj/effect/snare/singularity_act() - return - -/obj/effect/snare/singularity_pull() - return - -/mob/living/simple_animal/hostile/guardian/ranged/manifest_effects() - if(toggle) - incorporeal_move = INCORPOREAL_MOVE_BASIC - -/mob/living/simple_animal/hostile/guardian/ranged/recall_effects() - // To stop scout mode from moving when recalled - incorporeal_move = FALSE - -/mob/living/simple_animal/hostile/guardian/ranged/AttackingTarget(atom/attacked_target) - if(toggle) - return - return ..() diff --git a/code/modules/mob/living/simple_animal/guardian/types/standard.dm b/code/modules/mob/living/simple_animal/guardian/types/standard.dm deleted file mode 100644 index 89f671d3ffa1..000000000000 --- a/code/modules/mob/living/simple_animal/guardian/types/standard.dm +++ /dev/null @@ -1,41 +0,0 @@ -//Standard -/mob/living/simple_animal/hostile/guardian/standard - damage_coeff = list(BRUTE = 0.5, BURN = 0.5, TOX = 0.5, CLONE = 0.5, STAMINA = 0, OXY = 0.5) - melee_damage_lower = 20 - melee_damage_upper = 20 - wound_bonus = -5 //you can wound! - obj_damage = 80 - next_move_modifier = 0.8 //attacks 20% faster - environment_smash = ENVIRONMENT_SMASH_WALLS - playstyle_string = span_holoparasite("As a standard type you have no special abilities, but have a high damage resistance and a powerful attack capable of smashing through walls.") - magic_fluff_string = span_holoparasite("..And draw the Assistant, faceless and generic, but never to be underestimated.") - tech_fluff_string = span_holoparasite("Boot sequence complete. Standard combat modules loaded. Holoparasite swarm online.") - carp_fluff_string = span_holoparasite("CARP CARP CARP! You caught one! It's really boring and standard. Better punch some walls to ease the tension.") - miner_fluff_string = span_holoparasite("You encounter... Adamantine, a powerful attacker.") - creator_name = "Standard" - creator_desc = "Devastating close combat attacks and high damage resistance. Can smash through weak walls." - creator_icon = "standard" - /// The text we shout when attacking. - var/battlecry = "AT" - -/mob/living/simple_animal/hostile/guardian/standard/verb/Battlecry() - set name = "Set Battlecry" - set category = "Guardian" - set desc = "Choose what you shout as you punch people." - var/input = tgui_input_text(src, "What do you want your battlecry to be?", "Battle Cry", max_length = 6) - if(input) - battlecry = input - -/mob/living/simple_animal/hostile/guardian/standard/AttackingTarget(atom/attacked_target) - . = ..() - if(!isliving(target) || attacked_target == src) - return - var/msg = "" - for(var/i in 1 to 9) - msg += battlecry - say("[msg]!!", ignore_spam = TRUE) - for(var/j in 1 to 4) - addtimer(CALLBACK(src, PROC_REF(do_attack_sound), target.loc), j) - -/mob/living/simple_animal/hostile/guardian/standard/proc/do_attack_sound(atom/playing_from) - playsound(playing_from, attack_sound, 50, TRUE, TRUE) diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm deleted file mode 100644 index 6a7e008a165b..000000000000 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ /dev/null @@ -1,138 +0,0 @@ -//Support -/mob/living/simple_animal/hostile/guardian/support - speed = 0 - damage_coeff = list(BRUTE = 0.7, BURN = 0.7, TOX = 0.7, CLONE = 0.7, STAMINA = 0, OXY = 0.7) - melee_damage_lower = 15 - melee_damage_upper = 15 - playstyle_string = span_holoparasite("As a support type, you may right-click to heal targets. In addition, alt-clicking on an adjacent object or mob will warp them to your bluespace beacon after a short delay.") - magic_fluff_string = span_holoparasite("..And draw the Chief Medical Officer, a potent force of life... and death.") - carp_fluff_string = span_holoparasite("CARP CARP CARP! You caught a support carp. It's a kleptocarp!") - tech_fluff_string = span_holoparasite("Boot sequence complete. Support modules active. Holoparasite swarm online.") - miner_fluff_string = span_holoparasite("You encounter... Bluespace, the master of support.") - creator_name = "Support" - creator_desc = "Does medium damage, but can heal its targets and create beacons to teleport people and things to." - creator_icon = "support" - /// Is it in healing mode? - var/toggle = FALSE - /// How much we heal per hit. - var/healing_amount = 5 - /// Our teleportation beacon. - var/obj/structure/receiving_pad/beacon - /// Time it takes to teleport. - var/teleporting_time = 6 SECONDS - /// Time between creating beacons. - var/beacon_cooldown_time = 5 MINUTES - /// Cooldown between creating beacons. - COOLDOWN_DECLARE(beacon_cooldown) - -/mob/living/simple_animal/hostile/guardian/support/Initialize(mapload) - . = ..() - var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - medsensor.show_to(src) - -/mob/living/simple_animal/hostile/guardian/support/get_status_tab_items() - . = ..() - if(!COOLDOWN_FINISHED(src, beacon_cooldown)) - . += "Beacon Cooldown Remaining: [DisplayTimeText(COOLDOWN_TIMELEFT(src, beacon_cooldown))]" - -/mob/living/simple_animal/hostile/guardian/support/UnarmedAttack(atom/attack_target, proximity_flag) - if((istate & ISTATE_SECONDARY) && proximity_flag && isliving(attack_target)) - heal_target(attack_target) - return - return ..() - -/mob/living/simple_animal/hostile/guardian/support/proc/heal_target(mob/living/target) - do_attack_animation(target, ATTACK_EFFECT_PUNCH) - target.visible_message(span_notice("[src] heals [target]!"),\ - span_userdanger("[src] heals you!"), null, COMBAT_MESSAGE_RANGE, src) - to_chat(src, span_notice("You heal [target]!")) - playsound(target, attack_sound, 50, TRUE, TRUE, frequency = -1) //play punch in REVERSE - target.adjustBruteLoss(-healing_amount) - target.adjustFireLoss(-healing_amount) - target.adjustOxyLoss(-healing_amount) - target.adjustToxLoss(-healing_amount) - var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(target)) - heal_effect.color = guardian_color - -/mob/living/simple_animal/hostile/guardian/support/verb/Beacon() - set name = "Place Bluespace Beacon" - set category = "Guardian" - set desc = "Mark a floor as your beacon point, allowing you to warp targets to it. Your beacon will not work at extreme distances." - - if(!COOLDOWN_FINISHED(src, beacon_cooldown)) - to_chat(src, span_bolddanger("Your power is on cooldown. You must wait five minutes between placing beacons.")) - return - - var/turf/beacon_loc = get_turf(src.loc) - if(!isfloorturf(beacon_loc)) - return - - if(beacon) - beacon.disappear() - beacon = null - - beacon = new(beacon_loc, src) - - to_chat(src, span_bolddanger("Beacon placed! You may now warp targets and objects to it, including your user, via Alt+Click.")) - - COOLDOWN_START(src, beacon_cooldown, beacon_cooldown_time) - -/obj/structure/receiving_pad - name = "bluespace receiving pad" - icon = 'icons/turf/floors.dmi' - desc = "A receiving zone for bluespace teleportations." - icon_state = "light_on-8" - light_outer_range = MINIMUM_USEFUL_LIGHT_RANGE - density = FALSE - anchored = TRUE - plane = FLOOR_PLANE - layer = ABOVE_OPEN_TURF_LAYER - -/obj/structure/receiving_pad/New(loc, mob/living/simple_animal/hostile/guardian/spawning_guardian) - . = ..() - add_atom_colour(spawning_guardian?.guardian_color, FIXED_COLOUR_PRIORITY) - -/obj/structure/receiving_pad/proc/disappear() - visible_message(span_notice("[src] vanishes!")) - qdel(src) - -/mob/living/simple_animal/hostile/guardian/support/AltClickOn(atom/movable/target) - teleport_to_beacon(target) - -/mob/living/simple_animal/hostile/guardian/support/proc/teleport_to_beacon(atom/movable/teleport_target) - if(!istype(teleport_target)) - return - if(!beacon) - to_chat(src, span_bolddanger("You need a beacon placed to warp things!")) - return - if(!is_deployed()) - to_chat(src, span_bolddanger("You must be manifested to warp a target!")) - return - if(!Adjacent(teleport_target)) - to_chat(src, span_bolddanger("You must be adjacent to your target!")) - return - if(teleport_target.anchored) - to_chat(src, span_bolddanger("Your target is anchored!")) - return - var/turf/target_turf = get_turf(teleport_target) - if(beacon.z != target_turf.z) - to_chat(src, span_bolddanger("The beacon is too far away to warp to!")) - return - to_chat(src, span_bolddanger("You begin to warp [teleport_target].")) - teleport_target.visible_message(span_danger("[teleport_target] starts to glow faintly!"), \ - span_userdanger("You start to faintly glow, and you feel strangely weightless!")) - do_attack_animation(teleport_target) - playsound(teleport_target, attack_sound, 50, TRUE, TRUE, frequency = -1) //play punch in REVERSE - if(!do_after(src, teleporting_time, teleport_target)) //now start the channel - to_chat(src, span_bolddanger("You need to hold still!")) - return - new /obj/effect/temp_visual/guardian/phase/out(target_turf) - if(isliving(teleport_target)) - var/mob/living/living_target = teleport_target - living_target.flash_act() - teleport_target.visible_message( - span_danger("[teleport_target] disappears in a flash of light!"), \ - span_userdanger("Your vision is obscured by a flash of light!"), \ - ) - do_teleport(teleport_target, beacon, 0, channel = TELEPORT_CHANNEL_BLUESPACE) - new /obj/effect/temp_visual/guardian/phase(get_turf(teleport_target)) diff --git a/code/modules/mob/living/simple_animal/hostile/blob.dm b/code/modules/mob/living/simple_animal/hostile/blob.dm deleted file mode 100644 index 7b84d2db18ce..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/blob.dm +++ /dev/null @@ -1,99 +0,0 @@ -//Do not spawn -/mob/living/simple_animal/hostile/blob - icon = 'icons/mob/nonhuman-player/blob.dmi' - pass_flags = PASSBLOB - faction = list(ROLE_BLOB) - bubble_icon = "blob" - speak_emote = null //so we use verb_yell/verb_say/etc - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = INFINITY - unique_name = 1 - istate = ISTATE_HARM|ISTATE_BLOCKING - // ... Blob colored lighting - lighting_cutoff_red = 20 - lighting_cutoff_green = 40 - lighting_cutoff_blue = 30 - initial_language_holder = /datum/language_holder/empty - retreat_distance = null //! retreat doesn't obey pass_flags, so won't work on blob mobs. - /// Blob camera that controls the blob - var/mob/camera/blob/overmind = null - /// The factory producing spores, blobbernauts - var/obj/structure/blob/special/factory = null - /// If this is related to anything else - var/independent = FALSE - -/mob/living/simple_animal/hostile/blob/update_icons() - if(overmind) - add_atom_colour(overmind.blobstrain.color, FIXED_COLOUR_PRIORITY) - else - remove_atom_colour(FIXED_COLOUR_PRIORITY) - -/mob/living/simple_animal/hostile/blob/Initialize(mapload) - . = ..() - if(!independent) //no pulling people deep into the blob - remove_verb(src, /mob/living/verb/pulled) - else - pass_flags &= ~PASSBLOB - -/mob/living/simple_animal/hostile/blob/Destroy() - if(overmind) - overmind.blob_mobs -= src - return ..() - -/mob/living/simple_animal/hostile/blob/get_status_tab_items() - . = ..() - if(overmind) - . += "Blobs to Win: [overmind.blobs_legit.len]/[overmind.blobwincount]" - -/mob/living/simple_animal/hostile/blob/blob_act(obj/structure/blob/B) - if(stat != DEAD && health < maxHealth) - for(var/unused in 1 to 2) - var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed - if(overmind) - heal_effect.color = overmind.blobstrain.complementary_color - else - heal_effect.color = "#000000" - adjustHealth(-maxHealth*BLOBMOB_HEALING_MULTIPLIER) - -/mob/living/simple_animal/hostile/blob/fire_act(exposed_temperature, exposed_volume) - ..() - if(exposed_temperature) - adjustFireLoss(clamp(0.01 * exposed_temperature, 1, 5)) - else - adjustFireLoss(5) - -/mob/living/simple_animal/hostile/blob/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(istype(mover, /obj/structure/blob)) - return TRUE - -///override to use astar/JPS instead of walk_to so we can take our blob pass_flags into account. -/mob/living/simple_animal/hostile/blob/Goto(target, delay, minimum_distance) - if(prevent_goto_movement) - return FALSE - if(target == src.target) - approaching_target = TRUE - else - approaching_target = FALSE - - SSmove_manager.jps_move(moving = src, chasing = target, delay = delay, repath_delay = 2 SECONDS, minimum_distance = minimum_distance, simulated_only = FALSE, skip_first = TRUE, timeout = 5 SECONDS, flags = MOVEMENT_LOOP_IGNORE_GLIDE) - return TRUE - -/mob/living/simple_animal/hostile/blob/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) - for(var/obj/structure/blob/blob in range(1, src)) - return 1 - return ..() - -/mob/living/simple_animal/hostile/blob/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) - if(sanitize) - message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) - var/spanned_message = say_quote(message) - var/rendered = "\[Blob Telepathy\] [real_name] [spanned_message]" - for(var/creature in GLOB.mob_list) - if(isovermind(creature) || isblobmonster(creature)) - to_chat(creature, rendered) - if(isobserver(creature)) - var/link = FOLLOW_LINK(creature, src) - to_chat(creature, "[link] [rendered]") - diff --git a/code/modules/mob/living/simple_animal/hostile/blobbernaut.dm b/code/modules/mob/living/simple_animal/hostile/blobbernaut.dm deleted file mode 100644 index 507c4c584319..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/blobbernaut.dm +++ /dev/null @@ -1,109 +0,0 @@ -/mob/living/simple_animal/hostile/blob/blobbernaut - name = "blobbernaut" - desc = "A hulking, mobile chunk of blobmass." - icon_state = "blobbernaut" - icon_living = "blobbernaut" - icon_dead = "blobbernaut_dead" - health = BLOBMOB_BLOBBERNAUT_HEALTH - maxHealth = BLOBMOB_BLOBBERNAUT_HEALTH - damage_coeff = list(BRUTE = 0.5, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) - melee_damage_lower = BLOBMOB_BLOBBERNAUT_DMG_SOLO_LOWER - melee_damage_upper = BLOBMOB_BLOBBERNAUT_DMG_SOLO_UPPER - obj_damage = BLOBMOB_BLOBBERNAUT_DMG_OBJ - attack_verb_continuous = "slams" - attack_verb_simple = "slam" - attack_sound = 'sound/effects/blobattack.ogg' - verb_say = "gurgles" - verb_ask = "demands" - verb_exclaim = "roars" - verb_yell = "bellows" - force_threshold = 10 - pressure_resistance = 50 - mob_size = MOB_SIZE_LARGE - hud_type = /datum/hud/living/blobbernaut - -/mob/living/simple_animal/hostile/blob/blobbernaut/Initialize(mapload) - . = ..() - add_cell_sample() - -/mob/living/simple_animal/hostile/blob/blobbernaut/mind_initialize() - . = ..() - if(independent | !overmind) - return - var/datum/antagonist/blob_minion/blobbernaut/naut = new(overmind) - mind.add_antag_datum(naut) - -/mob/living/simple_animal/hostile/blob/blobbernaut/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOBBERNAUT, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - -/mob/living/simple_animal/hostile/blob/blobbernaut/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if(!..()) - return FALSE - var/list/blobs_in_area = range(2, src) - - if(independent) - return FALSE // strong independent blobbernaut that don't need no blob - - var/damagesources = 0 - - if(!(locate(/obj/structure/blob) in blobs_in_area)) - damagesources++ - - if(!factory) - damagesources++ - else - if(locate(/obj/structure/blob/special/core) in blobs_in_area) - adjustHealth(-maxHealth*BLOBMOB_BLOBBERNAUT_HEALING_CORE * seconds_per_tick) - var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed - if(overmind) - heal_effect.color = overmind.blobstrain.complementary_color - else - heal_effect.color = "#000000" - if(locate(/obj/structure/blob/special/node) in blobs_in_area) - adjustHealth(-maxHealth*BLOBMOB_BLOBBERNAUT_HEALING_NODE * seconds_per_tick) - var/obj/effect/temp_visual/heal/heal_effect = new /obj/effect/temp_visual/heal(get_turf(src)) - if(overmind) - heal_effect.color = overmind.blobstrain.complementary_color - else - heal_effect.color = "#000000" - - if(!damagesources) - return FALSE - - adjustHealth(maxHealth * BLOBMOB_BLOBBERNAUT_HEALTH_DECAY * damagesources * seconds_per_tick) //take 2.5% of max health as damage when not near the blob or if the naut has no factory, 5% if both - var/image/image = new('icons/mob/nonhuman-player/blob.dmi', src, "nautdamage", MOB_LAYER+0.01) - image.appearance_flags = RESET_COLOR - - if(overmind) - image.color = overmind.blobstrain.complementary_color - - flick_overlay_view(image, 8) - -/mob/living/simple_animal/hostile/blob/blobbernaut/AttackingTarget() - . = ..() - if(. && isliving(target) && overmind) - overmind.blobstrain.blobbernaut_attack(target, src) - -/mob/living/simple_animal/hostile/blob/blobbernaut/update_icons() - ..() - if(overmind) //if we have an overmind, we're doing chemical reactions instead of pure damage - melee_damage_lower = BLOBMOB_BLOBBERNAUT_DMG_LOWER - melee_damage_upper = BLOBMOB_BLOBBERNAUT_DMG_UPPER - attack_verb_continuous = overmind.blobstrain.blobbernaut_message - else - melee_damage_lower = initial(melee_damage_lower) - melee_damage_upper = initial(melee_damage_upper) - attack_verb_continuous = initial(attack_verb_continuous) - -/mob/living/simple_animal/hostile/blob/blobbernaut/death(gibbed) - ..(gibbed) - if(factory) - factory.naut = null //remove this naut from its factory - factory.max_integrity = initial(factory.max_integrity) - flick("blobbernaut_death", src) - -/mob/living/simple_animal/hostile/blob/blobbernaut/independent - independent = TRUE - gold_core_spawnable = HOSTILE_SPAWN - - diff --git a/code/modules/mob/living/simple_animal/hostile/blobspore.dm b/code/modules/mob/living/simple_animal/hostile/blobspore.dm deleted file mode 100644 index 9ef4f5b31cdd..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/blobspore.dm +++ /dev/null @@ -1,170 +0,0 @@ -/mob/living/simple_animal/hostile/blob/blobspore - name = "blob spore" - desc = "A floating, fragile spore." - icon_state = "blobpod" - icon_living = "blobpod" - health_doll_icon = "blobpod" - health = BLOBMOB_SPORE_HEALTH - maxHealth = BLOBMOB_SPORE_HEALTH - verb_say = "psychically pulses" - verb_ask = "psychically probes" - verb_exclaim = "psychically yells" - verb_yell = "psychically screams" - melee_damage_lower = BLOBMOB_SPORE_DMG_LOWER - melee_damage_upper = BLOBMOB_SPORE_DMG_UPPER - environment_smash = ENVIRONMENT_SMASH_NONE - obj_damage = 0 - attack_verb_continuous = "hits" - attack_verb_simple = "hit" - attack_sound = 'sound/weapons/genhit1.ogg' - del_on_death = TRUE - death_message = "explodes into a cloud of gas!" - gold_core_spawnable = NO_SPAWN //gold slime cores should only spawn the independent subtype - /// Size of cloud produced from a dying spore - var/death_cloud_size = 1 - /// The attached person - var/mob/living/carbon/human/corpse - /// If this is attached to a person - var/is_zombie = FALSE - /// Whether or not this is a fragile spore from Distributed Neurons - var/is_weak = FALSE - -/mob/living/simple_animal/hostile/blob/blobspore/Initialize(mapload, obj/structure/blob/special/linked_node) - . = ..() - AddElement(/datum/element/simple_flying) - - if(!istype(linked_node)) - return - - factory = linked_node - factory.spores += src - if(linked_node.overmind && istype(linked_node.overmind.blobstrain, /datum/blobstrain/reagent/distributed_neurons) && !istype(src, /mob/living/simple_animal/hostile/blob/blobspore/weak)) - notify_ghosts("A controllable spore has been created in \the [get_area(src)].", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Sentient Spore Created") - add_cell_sample() - -/mob/living/simple_animal/hostile/blob/blobspore/mind_initialize() - . = ..() - if(independent || !overmind) - return FALSE - var/datum/antagonist/blob_minion/blob_zombie/zombie = new(overmind) - mind.add_antag_datum(zombie) - -/mob/living/simple_animal/hostile/blob/blobspore/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if(!is_zombie && isturf(loc)) - for(var/mob/living/carbon/human/target in view(src,1)) //Only for corpse right next to/on same tile - if(!is_weak && target.stat == DEAD) - zombify(target) - break - if(factory && !is_valid_z_level(get_turf(src), get_turf(factory))) - death() - return ..() - -/mob/living/simple_animal/hostile/blob/blobspore/attack_ghost(mob/user) - . = ..() - if(.) - return - humanize_pod(user) - -/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed) - // On death, create a small smoke of harmful gas (s-Acid) - var/datum/effect_system/fluid_spread/smoke/chem/spores = new - var/turf/location = get_turf(src) - - // Create the reagents to put into the air - create_reagents(10) - - if(overmind?.blobstrain) - overmind.blobstrain.on_sporedeath(src) - else - reagents.add_reagent(/datum/reagent/toxin/spore, 10) - - // Attach the smoke spreader and setup/start it. - spores.attach(location) - spores.set_up(death_cloud_size, holder = src, location = location, carry = reagents, silent = TRUE) - spores.start() - if(factory) - factory.spore_delay = world.time + factory.spore_cooldown //put the factory on cooldown - - return ..() - -/mob/living/simple_animal/hostile/blob/blobspore/Destroy() - if(factory) - factory.spores -= src - factory = null - if(corpse) - corpse.forceMove(loc) - corpse = null - return ..() - -/mob/living/simple_animal/hostile/blob/blobspore/update_icons() - if(overmind) - add_atom_colour(overmind.blobstrain.complementary_color, FIXED_COLOUR_PRIORITY) - else - remove_atom_colour(FIXED_COLOUR_PRIORITY) - if(!is_zombie) - return FALSE - - copy_overlays(corpse, TRUE) - var/mutable_appearance/blob_head_overlay = mutable_appearance('icons/mob/nonhuman-player/blob.dmi', "blob_head") - if(overmind) - blob_head_overlay.color = overmind.blobstrain.complementary_color - color = initial(color) // looks better. - add_overlay(blob_head_overlay) - -/mob/living/simple_animal/hostile/blob/blobspore/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOBSPORE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - -/mob/living/simple_animal/hostile/blob/blobspore/independent - gold_core_spawnable = HOSTILE_SPAWN - independent = TRUE - -/mob/living/simple_animal/hostile/blob/blobspore/weak - name = "fragile blob spore" - health = 15 - maxHealth = 15 - melee_damage_lower = 1 - melee_damage_upper = 2 - death_cloud_size = 0 - is_weak = TRUE - -/** Ghost control a blob zombie */ -/mob/living/simple_animal/hostile/blob/blobspore/proc/humanize_pod(mob/user) - if((!overmind || istype(src, /mob/living/simple_animal/hostile/blob/blobspore/weak) || !istype(overmind.blobstrain, /datum/blobstrain/reagent/distributed_neurons)) && !is_zombie) - return FALSE - if(key || stat) - return FALSE - var/pod_ask = tgui_alert(usr, "Are you bulbous enough?", "Blob Spore", list("Yes", "No")) - if(pod_ask != "Yes" || QDELETED(src)) - return FALSE - if(key) - to_chat(user, span_warning("Someone else already took this spore!")) - return FALSE - key = user.key - log_message("took control of [name].", LOG_GAME) - -/** Zombifies a dead mob, turning it into a blob zombie */ -/mob/living/simple_animal/hostile/blob/blobspore/proc/zombify(mob/living/carbon/human/target) - is_zombie = 1 - if(target.wear_suit) - maxHealth += target.get_armor_rating(MELEE) // That zombie's got armor, I want armor! - maxHealth += 40 - health = maxHealth - name = "blob zombie" - desc = "A shambling corpse animated by the blob." - mob_biotypes |= MOB_HUMANOID - melee_damage_lower += 8 - melee_damage_upper += 11 - obj_damage = 20 // now that it has a corpse to puppet, it can properly attack structures - environment_smash = ENVIRONMENT_SMASH_STRUCTURES - movement_type = GROUND - death_cloud_size = 0 - icon = target.icon - icon_state = "zombie" - target.hairstyle = null - target.update_body_parts() - target.forceMove(src) - corpse = target - update_icons() - visible_message(span_warning("The corpse of [target.name] suddenly rises!")) - if(!key) - notify_ghosts("\A [src] has been created in \the [get_area(src)].", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Blob Zombie Created") diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm deleted file mode 100644 index bc1852ba57fa..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm +++ /dev/null @@ -1,139 +0,0 @@ -/mob/living/simple_animal/hostile/boss - name = "\improper A Perfectly Generic Boss Placeholder" - desc = "" - robust_searching = 1 - stat_attack = HARD_CRIT - status_flags = 0 - istate = ISTATE_HARM|ISTATE_BLOCKING - sentience_type = SENTIENCE_BOSS - gender = NEUTER - var/list/boss_abilities = list() //list of /datum/action/boss - var/datum/boss_active_timed_battle/atb - var/point_regen_delay = 1 - - -/mob/living/simple_animal/hostile/boss/Initialize(mapload) - . = ..() - - atb = new() - atb.point_regen_delay = point_regen_delay - atb.boss = src - - for(var/ab in boss_abilities) - boss_abilities -= ab - var/datum/action/boss/AB = new ab() - AB.boss = src - AB.Grant(src) - boss_abilities += AB - - atb.assign_abilities(boss_abilities) - - -/mob/living/simple_animal/hostile/boss/Destroy() - qdel(atb) - atb = null - for(var/ab in boss_abilities) - var/datum/action/boss/AB = ab - AB.boss = null - AB.Remove(src) - qdel(AB) - boss_abilities.Cut() - return ..() - - -//Action datum for bosses -//Override Trigger() as shown below to do things -/datum/action/boss - check_flags = AB_CHECK_CONSCIOUS //Incase the boss is given a player - var/boss_cost = 100 //Cost of usage for the boss' AI 1-100 - var/usage_probability = 100 - var/mob/living/simple_animal/hostile/boss/boss - var/boss_type = /mob/living/simple_animal/hostile/boss - var/needs_target = TRUE //Does the boss need to have a target? (Only matters for the AI) - var/say_when_triggered = "" //What does the boss Say() when the ability triggers? - -/datum/action/boss/Trigger(trigger_flags) - . = ..() - if(!.) - return - if(!istype(boss, boss_type)) - return - if(!boss.atb) - return - if(boss.atb.points < boss_cost) - return - if(!boss.client) - if(needs_target && !boss.target) - return - if(boss) - if(say_when_triggered) - boss.say(say_when_triggered, forced = "boss action") - if(!boss.atb.spend(boss_cost)) - return - -//Example: -/* -/datum/action/boss/selfgib/Trigger(trigger_flags) - if(..()) - boss.gib() -*/ - - -//Designed for boss mobs only -/datum/boss_active_timed_battle - var/list/abilities //a list of /datum/action/boss owned by a boss mob - var/point_regen_delay = 5 - var/points = 50 //1-100, start with 50 so we can use some abilities but not insta-buttfug somebody - var/next_point_time = 0 - var/chance_to_hold_onto_points = 50 - var/highest_cost = 0 - var/mob/living/simple_animal/hostile/boss/boss - - -/datum/boss_active_timed_battle/New() - ..() - START_PROCESSING(SSobj, src) - - -/datum/boss_active_timed_battle/proc/assign_abilities(list/L) - if(!L) - return 0 - abilities = L - for(var/ab in abilities) - var/datum/action/boss/AB = ab - if(AB.boss_cost > highest_cost) - highest_cost = AB.boss_cost - - -/datum/boss_active_timed_battle/proc/spend(cost) - if(cost <= points) - points = max(0,points-cost) - return 1 - return 0 - - -/datum/boss_active_timed_battle/proc/refund(cost) - points = min(points+cost, 100) - - -/datum/boss_active_timed_battle/process() - if(world.time >= next_point_time) - next_point_time = world.time + point_regen_delay - points = min(100, ++points) //has to be out of 100 - - if(abilities) - chance_to_hold_onto_points = highest_cost*0.5 - if(points != 100 && prob(chance_to_hold_onto_points)) - return //Let's save our points for a better ability (unless we're at max points, in which case we can't save anymore!) - if(!boss.client) - abilities = shuffle(abilities) - for(var/ab in abilities) - var/datum/action/boss/AB = ab - if(prob(AB.usage_probability) && AB.Trigger()) - break - - -/datum/boss_active_timed_battle/Destroy() - abilities = null - SSobj.processing.Remove(src) - return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm b/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm deleted file mode 100644 index 56206da9dbc3..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/constructs/constructs.dm +++ /dev/null @@ -1,136 +0,0 @@ -/mob/living/simple_animal/hostile/construct - name = "Construct" - real_name = "Construct" - desc = "" - gender = NEUTER - mob_biotypes = NONE - speak_emote = list("hisses") - response_help_continuous = "thinks better of touching" - response_help_simple = "think better of touching" - response_disarm_continuous = "flails at" - response_disarm_simple = "flail at" - response_harm_continuous = "punches" - response_harm_simple = "punch" - speak_chance = 1 - icon = 'icons/mob/nonhuman-player/cult.dmi' - speed = 0 - istate = ISTATE_HARM|ISTATE_BLOCKING - stop_automated_movement = 1 - status_flags = CANPUSH - attack_sound = 'sound/weapons/punch1.ogg' - // Vivid red, cause cult theme - lighting_cutoff_red = 30 - lighting_cutoff_green = 5 - lighting_cutoff_blue = 20 - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = INFINITY - healable = 0 - faction = list(FACTION_CULT) - pressure_resistance = 100 - unique_name = 1 - AIStatus = AI_OFF //normal constructs don't have AI - loot = list(/obj/item/ectoplasm) - del_on_death = TRUE - initial_language_holder = /datum/language_holder/construct - death_message = "collapses in a shattered heap." - /// List of spells that this construct can cast - var/list/construct_spells = list() - /// Flavor text shown to players when they spawn as this construct - var/playstyle_string = "You are a generic construct! Your job is to not exist, and you should probably adminhelp this." - /// The construct's master - var/master = null - /// Whether this construct is currently seeking nar nar - var/seeking = FALSE - /// Whether this construct can repair other constructs or cult buildings. - var/can_repair = FALSE - /// Whether this construct can repair itself. Works independently of can_repair. - var/can_repair_self = FALSE - /// Theme controls color. THEME_CULT is red THEME_WIZARD is purple and THEME_HOLY is blue - var/theme = THEME_CULT - -/mob/living/simple_animal/hostile/construct/Initialize(mapload) - . = ..() - AddElement(/datum/element/simple_flying) - add_traits(list(TRAIT_HEALS_FROM_CULT_PYLONS, TRAIT_SPACEWALK), INNATE_TRAIT) - for(var/spell in construct_spells) - var/datum/action/new_spell = new spell(src) - new_spell.Grant(src) - - var/spell_count = 1 - for(var/datum/action/spell as anything in actions) - if(!(spell.type in construct_spells)) - continue - - var/pos = 2 + spell_count * 31 - if(construct_spells.len >= 4) - pos -= 31 * (construct_spells.len - 4) - spell.default_button_position = "6:[pos],4:-2" // Set the default position to this random position - spell_count++ - update_action_buttons() - - if(icon_state) - add_overlay("glow_[icon_state]_[theme]") - -/mob/living/simple_animal/hostile/construct/Login() - . = ..() - if(!. || !client) - return FALSE - to_chat(src, playstyle_string) - -/mob/living/simple_animal/hostile/construct/examine(mob/user) - var/pronoun = p_they(TRUE) - var/plural = p_s() - var/text_span - switch(theme) - if(THEME_CULT) - text_span = "cult" - if(THEME_WIZARD) - text_span = "purple" - if(THEME_HOLY) - text_span = "blue" - . = list("This is [icon2html(src, user)] \a [src]!\n[desc]") - if(health < maxHealth) - if(health >= maxHealth/2) - . += span_warning("[pronoun] look[plural] slightly dented.") - else - . += span_warning("[pronoun] look[plural] severely dented!") - . += "" - -/mob/living/simple_animal/hostile/construct/attack_animal(mob/living/simple_animal/user, list/modifiers) - if(!isconstruct(user)) - if(src != user) - return ..() - return - - var/mob/living/simple_animal/hostile/construct/doll = user - if(!doll.can_repair || (doll == src && !doll.can_repair_self)) - return ..() - if(theme != doll.theme) - return ..() - - if(health >= maxHealth) - if(src != user) - to_chat(user, span_cult("You cannot repair [src]'s dents, as [p_they()] [p_have()] none!")) - else - to_chat(user, span_cult("You cannot repair your own dents, as you have none!")) - return - - adjustHealth(-5) - if(src == user) - user.visible_message(span_danger("[user] repairs some of [p_their()] own dents."), \ - span_cult("You repair some of your own dents, leaving you at [user.health]/[user.maxHealth] health.")) - return - - Beam(user, icon_state="sendbeam", time = 4) - user.visible_message(span_danger("[user] repairs some of \the [src]'s dents."), \ - span_cult("You repair some of [src]'s dents, leaving [src] at [health]/[maxHealth] health.")) - - -/mob/living/simple_animal/hostile/construct/narsie_act() - return - -/mob/living/simple_animal/hostile/construct/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) - return FALSE - diff --git a/code/modules/mob/living/simple_animal/hostile/constructs/juggernaut.dm b/code/modules/mob/living/simple_animal/hostile/constructs/juggernaut.dm deleted file mode 100644 index 3eb80cf7a88e..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/constructs/juggernaut.dm +++ /dev/null @@ -1,75 +0,0 @@ -/mob/living/simple_animal/hostile/construct/juggernaut - name = "Juggernaut" - real_name = "Juggernaut" - desc = "A massive, armored construct built to spearhead attacks and soak up enemy fire." - icon_state = "juggernaut" - icon_living = "juggernaut" - maxHealth = 150 - health = 150 - response_harm_continuous = "harmlessly punches" - response_harm_simple = "harmlessly punch" - harm_intent_damage = 0 - obj_damage = 90 - melee_damage_lower = 25 - melee_damage_upper = 25 - attack_verb_continuous = "smashes their armored gauntlet into" - attack_verb_simple = "smash your armored gauntlet into" - speed = 2.5 - environment_smash = ENVIRONMENT_SMASH_WALLS - attack_sound = 'sound/weapons/punch3.ogg' - status_flags = 0 - mob_size = MOB_SIZE_LARGE - force_threshold = 10 - construct_spells = list( - /datum/action/cooldown/spell/forcewall/cult, - /datum/action/cooldown/spell/basic_projectile/juggernaut, - /datum/action/innate/cult/create_rune/wall, - ) - playstyle_string = "You are a Juggernaut. Though slow, your shell can withstand heavy punishment, \ - create shield walls, rip apart enemies and walls alike, and even deflect energy weapons." - -/mob/living/simple_animal/hostile/construct/juggernaut/hostile //actually hostile, will move around, hit things - AIStatus = AI_ON - environment_smash = ENVIRONMENT_SMASH_STRUCTURES //only token destruction, don't smash the cult wall NO STOP - -/mob/living/simple_animal/hostile/construct/juggernaut/bullet_act(obj/projectile/bullet) - if(!istype(bullet, /obj/projectile/energy) && !istype(bullet, /obj/projectile/beam)) - return ..() - if(!prob(40 - round(bullet.damage / 3))) // reflect chance - return ..() - - apply_damage(bullet.damage * 0.5, bullet.damage_type) - visible_message(span_danger("The [bullet.name] is reflected by [src]'s armored shell!"), \ - span_userdanger("The [bullet.name] is reflected by your armored shell!")) - - if(!bullet.starting) - return BULLET_ACT_FORCE_PIERCE - // Find a turf near or on the original location to bounce to - var/new_x = bullet.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) - var/new_y = bullet.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3) - var/turf/current_tile = get_turf(src) - - // redirect the projectile - bullet.original = locate(new_x, new_y, bullet.z) - bullet.starting = current_tile - bullet.firer = src - bullet.yo = new_y - current_tile.y - bullet.xo = new_x - current_tile.x - var/new_angle_s = bullet.Angle + rand(120,240) - while(new_angle_s > 180) // Translate to regular projectile degrees - new_angle_s -= 360 - bullet.set_angle(new_angle_s) - - return BULLET_ACT_FORCE_PIERCE // complete projectile permutation - - -//////////////////////////Juggernaut-alts//////////////////////////// -/mob/living/simple_animal/hostile/construct/juggernaut/angelic - theme = THEME_HOLY - loot = list(/obj/item/ectoplasm/angelic) - -/mob/living/simple_animal/hostile/construct/juggernaut/mystic - theme = THEME_WIZARD - loot = list(/obj/item/ectoplasm/mystic) - -/mob/living/simple_animal/hostile/construct/juggernaut/noncult diff --git a/code/modules/mob/living/simple_animal/hostile/constructs/wraith.dm b/code/modules/mob/living/simple_animal/hostile/constructs/wraith.dm deleted file mode 100644 index e7ef22a9e073..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/constructs/wraith.dm +++ /dev/null @@ -1,78 +0,0 @@ -/mob/living/simple_animal/hostile/construct/wraith - name = "Wraith" - real_name = "Wraith" - desc = "A wicked, clawed shell constructed to assassinate enemies and sow chaos behind enemy lines." - icon_state = "wraith" - icon_living = "wraith" - maxHealth = 65 - health = 65 - melee_damage_lower = 20 - melee_damage_upper = 20 - retreat_distance = 2 //AI wraiths will move in and out of combat - attack_verb_continuous = "slashes" - attack_verb_simple = "slash" - attack_sound = 'sound/weapons/bladeslice.ogg' - attack_vis_effect = ATTACK_EFFECT_SLASH - construct_spells = list( - /datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift, - /datum/action/innate/cult/create_rune/tele, - ) - playstyle_string = "You are a Wraith. Though relatively fragile, you are fast, deadly, \ - can phase through walls, and your attacks will lower the cooldown on phasing." - - // Accomplishing various things gives you a refund on jaunt, to jump in and out. - /// The seconds refunded per attack - var/attack_refund = 1 SECONDS - /// The seconds refunded when putting a target into critical - var/crit_refund = 5 SECONDS - -/mob/living/simple_animal/hostile/construct/wraith/AttackingTarget() //refund jaunt cooldown when attacking living targets - var/prev_stat - var/mob/living/living_target = target - - if(isliving(living_target) && !IS_CULTIST(living_target)) - prev_stat = living_target.stat - - . = ..() - if(!. || !isnum(prev_stat)) - return - - var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/jaunt = locate() in actions - if(!jaunt) - return - - var/total_refund = 0 SECONDS - // they're dead, and you killed them - full refund - if(QDELETED(living_target) || (living_target.stat == DEAD && prev_stat != DEAD)) - total_refund += jaunt.cooldown_time - // you knocked them into critical - else if(HAS_TRAIT(living_target, TRAIT_CRITICAL_CONDITION) && prev_stat == CONSCIOUS) - total_refund += crit_refund - - if(living_target.stat != DEAD && prev_stat != DEAD) - total_refund += attack_refund - - jaunt.next_use_time -= total_refund - jaunt.build_all_button_icons() - -/mob/living/simple_animal/hostile/construct/wraith/hostile //actually hostile, will move around, hit things - AIStatus = AI_ON - -//////////////////////////Wraith-alts//////////////////////////// -/mob/living/simple_animal/hostile/construct/wraith/angelic - theme = THEME_HOLY - construct_spells = list( - /datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/angelic, - /datum/action/innate/cult/create_rune/tele, - ) - loot = list(/obj/item/ectoplasm/angelic) - -/mob/living/simple_animal/hostile/construct/wraith/mystic - theme = THEME_WIZARD - construct_spells = list( - /datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/mystic, - /datum/action/innate/cult/create_rune/tele, - ) - loot = list(/obj/item/ectoplasm/mystic) - -/mob/living/simple_animal/hostile/construct/wraith/noncult diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm deleted file mode 100644 index 55007a1121ce..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm +++ /dev/null @@ -1,173 +0,0 @@ -#define GORILLA_TOTAL_LAYERS 1 - -/mob/living/simple_animal/hostile/gorilla - name = "Gorilla" - desc = "A ground-dwelling, predominantly herbivorous ape that inhabits the forests of central Africa." - icon = 'icons/mob/simple/gorilla.dmi' - icon_state = "crawling" - icon_living = "crawling" - icon_dead = "dead" - health_doll_icon = "crawling" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - speak_chance = 80 - maxHealth = 220 - health = 220 - loot = list(/obj/effect/gibspawner/generic/animal) - butcher_results = list(/obj/item/food/meat/slab/gorilla = 4) - response_help_continuous = "prods" - response_help_simple = "prod" - response_disarm_continuous = "challenges" - response_disarm_simple = "challenge" - response_harm_continuous = "thumps" - response_harm_simple = "thump" - speed = 0.5 - melee_damage_lower = 15 - melee_damage_upper = 18 - damage_coeff = list(BRUTE = 1, BURN = 1.5, TOX = 1.5, CLONE = 0, STAMINA = 0, OXY = 1.5) - obj_damage = 20 - environment_smash = ENVIRONMENT_SMASH_WALLS - attack_verb_continuous = "pummels" - attack_verb_simple = "pummel" - attack_sound = 'sound/weapons/punch1.ogg' - dextrous = TRUE - held_items = list(null, null) - faction = list(FACTION_MONKEY, FACTION_JUNGLE) - robust_searching = TRUE - stat_attack = HARD_CRIT - minbodytemp = 270 - maxbodytemp = 350 - unique_name = TRUE - footstep_type = FOOTSTEP_MOB_BAREFOOT - - var/list/gorilla_overlays[GORILLA_TOTAL_LAYERS] - var/oogas = 0 - -// Gorillas like to dismember limbs from unconscious mobs. -// Returns null when the target is not an unconscious carbon mob; a list of limbs (possibly empty) otherwise. -/mob/living/simple_animal/hostile/gorilla/proc/get_target_bodyparts(atom/hit_target) - if(!iscarbon(hit_target)) - return - - var/mob/living/carbon/carbon_target = hit_target - if(carbon_target.stat < UNCONSCIOUS) - return - - var/list/parts = list() - for(var/obj/item/bodypart/part as anything in carbon_target.bodyparts) - if(part.body_part == HEAD || part.body_part == CHEST) - continue - if(part.bodypart_flags & BODYPART_UNREMOVABLE) - continue - parts += part - return parts - -/mob/living/simple_animal/hostile/gorilla/AttackingTarget(atom/attacked_target) - . = ..() - if(!.) - return - - if(client) - oogaooga() - - var/list/parts = get_target_bodyparts(target) - if(length(parts)) - var/obj/item/bodypart/to_dismember = pick(parts) - to_dismember.dismember() - return - - if(isliving(target)) - var/mob/living/living_target = target - if(prob(80)) - living_target.throw_at(get_edge_target_turf(living_target, dir), rand(1, 2), 7, src) - - else - living_target.Paralyze(2 SECONDS) - visible_message(span_danger("[src] knocks [living_target] down!")) - -/mob/living/simple_animal/hostile/gorilla/CanAttack(atom/the_target) - var/list/parts = get_target_bodyparts(target) - return ..() && !ismonkey(the_target) && (!parts || length(parts) > 3) - -/mob/living/simple_animal/hostile/gorilla/CanSmashTurfs(turf/T) - return iswallturf(T) - -/mob/living/simple_animal/hostile/gorilla/gib(no_brain) - if(!no_brain) - var/mob/living/brain/gorilla_brain = new(drop_location()) - gorilla_brain.name = real_name - gorilla_brain.real_name = real_name - mind?.transfer_to(gorilla_brain) - return ..() - -/mob/living/simple_animal/hostile/gorilla/handle_automated_speech(override) - if(speak_chance && (override || prob(speak_chance))) - playsound(src, 'sound/creatures/gorilla.ogg', 50) - return ..() - -/mob/living/simple_animal/hostile/gorilla/can_use_guns(obj/item/G) - to_chat(src, span_warning("Your meaty finger is much too large for the trigger guard!")) - return FALSE - -/mob/living/simple_animal/hostile/gorilla/proc/oogaooga() - oogas -= 1 - if(oogas <= 0) - oogas = rand(2,6) - playsound(src, 'sound/creatures/gorilla.ogg', 50) - -/mob/living/simple_animal/hostile/gorilla/lesser - name = "lesser Gorilla" - desc = "An adolescent Gorilla. It may not be fully grown but, much like a banana, that just means it's sturdier and harder to chew!" - speak_chance = 100 // compensating for something - maxHealth = 120 - health = 120 - butcher_results = list(/obj/item/food/meat/slab/gorilla = 2) - speed = 0.35 - melee_damage_lower = 10 - melee_damage_upper = 15 - obj_damage = 15 - stat_attack = SOFT_CRIT - unique_name = TRUE - -/mob/living/simple_animal/hostile/gorilla/lesser/Initialize(mapload) - . = ..() - transform *= 0.75 // smolrilla - -/mob/living/simple_animal/hostile/gorilla/cargo_domestic - name = "Cargorilla" // Overriden, normally - icon = 'icons/mob/simple/cargorillia.dmi' - desc = "Cargo's pet gorilla. They seem to have an 'I love Mom' tattoo." - maxHealth = 200 - health = 200 - faction = list(FACTION_NEUTRAL, FACTION_MONKEY, FACTION_JUNGLE) - gold_core_spawnable = NO_SPAWN - unique_name = FALSE - -/mob/living/simple_animal/hostile/gorilla/cargo_domestic/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_PACIFISM, INNATE_TRAIT) - AddComponent(/datum/component/crate_carrier) - -/// Poll ghosts for control of the gorilla. -/mob/living/simple_animal/hostile/gorilla/cargo_domestic/proc/poll_for_gorilla() - AddComponent(\ - /datum/component/ghost_direct_control,\ - poll_candidates = TRUE,\ - poll_length = 30 SECONDS,\ - role_name = "Cargorilla",\ - assumed_control_message = "You are Cargorilla, a pacifistic friend of the station and carrier of freight.",\ - poll_ignore_key = POLL_IGNORE_CARGORILLA,\ - after_assumed_control = CALLBACK(src, PROC_REF(became_player_controlled)),\ - ) - -/// Called once a ghost assumes control -/mob/living/simple_animal/hostile/gorilla/cargo_domestic/proc/became_player_controlled() - mind.set_assigned_role(SSjob.GetJobType(/datum/job/cargo_technician)) - mind.special_role = "Cargorilla" - to_chat(src, span_notice("You can pick up crates by clicking on them, and drop them by clicking on the ground.")) - -/obj/item/card/id/advanced/cargo_gorilla - name = "cargorilla ID" - desc = "A card used to provide ID and determine access across the station. A gorilla-sized ID for a gorilla-sized cargo technician." - trim = /datum/id_trim/job/cargo_technician - -#undef GORILLA_TOTAL_LAYERS diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm deleted file mode 100644 index 39dfe8f7d899..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/visuals_icons.dm +++ /dev/null @@ -1,56 +0,0 @@ -#define GORILLA_HANDS_LAYER 1 - -/mob/living/simple_animal/hostile/gorilla/proc/apply_overlay(cache_index) - . = gorilla_overlays[cache_index] - if(.) - add_overlay(.) - -/mob/living/simple_animal/hostile/gorilla/proc/remove_overlay(cache_index) - var/I = gorilla_overlays[cache_index] - if(I) - cut_overlay(I) - gorilla_overlays[cache_index] = null - -/mob/living/simple_animal/hostile/gorilla/update_held_items() - cut_overlays("standing_overlay") - remove_overlay(GORILLA_HANDS_LAYER) - - var/standing = FALSE - for(var/I in held_items) - if(I) - standing = TRUE - break - if(!standing) - if(stat != DEAD) - icon_state = "crawling" - set_varspeed(0.5) - return ..() - if(stat != DEAD) - icon_state = "standing" - set_varspeed(1) // Gorillas are slow when standing up. - - var/list/hands_overlays = list() - - var/obj/item/l_hand = get_item_for_held_index(1) - var/obj/item/r_hand = get_item_for_held_index(2) - - if(r_hand) - var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(default_layer = GORILLA_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE) - r_hand_overlay.pixel_y -= 1 - hands_overlays += r_hand_overlay - - if(l_hand) - var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(default_layer = GORILLA_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE) - l_hand_overlay.pixel_y -= 1 - hands_overlays += l_hand_overlay - - if(hands_overlays.len) - gorilla_overlays[GORILLA_HANDS_LAYER] = hands_overlays - apply_overlay(GORILLA_HANDS_LAYER) - add_overlay("standing_overlay") - return ..() - -/mob/living/simple_animal/hostile/gorilla/regenerate_icons() - update_held_items() - -#undef GORILLA_HANDS_LAYER diff --git a/code/modules/mob/living/simple_animal/hostile/heretic_monsters.dm b/code/modules/mob/living/simple_animal/hostile/heretic_monsters.dm deleted file mode 100644 index 0c98f67eef46..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/heretic_monsters.dm +++ /dev/null @@ -1,427 +0,0 @@ -/mob/living/simple_animal/hostile/heretic_summon - name = "Eldritch Demon" - real_name = "Eldritch Demon" - desc = "A horror from beyond this realm." - icon = 'icons/mob/nonhuman-player/eldritch_mobs.dmi' - gender = NEUTER - mob_biotypes = NONE - attack_sound = 'sound/weapons/punch1.ogg' - response_help_continuous = "thinks better of touching" - response_help_simple = "think better of touching" - response_disarm_continuous = "flails at" - response_disarm_simple = "flail at" - response_harm_continuous = "reaps" - response_harm_simple = "tears" - speak_emote = list("screams") - speak_chance = 1 - speed = 0 - istate = ISTATE_HARM|ISTATE_BLOCKING - stop_automated_movement = TRUE - AIStatus = AI_OFF - // Sort of greenish brown, to match the vibeTM - lighting_cutoff_red = 20 - lighting_cutoff_green = 25 - lighting_cutoff_blue = 5 - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = INFINITY - healable = FALSE - movement_type = GROUND - pressure_resistance = 100 - del_on_death = TRUE - death_message = "implodes into itself." - loot = list(/obj/effect/gibspawner/human) - faction = list(FACTION_HERETIC) - simple_mob_flags = SILENCE_RANGED_MESSAGE - - /// Innate spells that are added when a beast is created. - var/list/actions_to_add - -/mob/living/simple_animal/hostile/heretic_summon/Initialize(mapload) - . = ..() - for(var/spell in actions_to_add) - var/datum/action/cooldown/spell/new_spell = new spell(src) - new_spell.Grant(src) - -/mob/living/simple_animal/hostile/heretic_summon/raw_prophet - name = "Raw Prophet" - real_name = "Raw Prophet" - desc = "An abomination stitched together from a few severed arms and one lost eye." - icon_state = "raw_prophet" - icon_living = "raw_prophet" - status_flags = CANPUSH - melee_damage_lower = 5 - melee_damage_upper = 10 - maxHealth = 65 - health = 65 - sight = SEE_MOBS|SEE_OBJS|SEE_TURFS - loot = list(/obj/effect/gibspawner/human, /obj/item/bodypart/arm/left, /obj/item/organ/internal/eyes) - actions_to_add = list( - /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/long, - /datum/action/cooldown/spell/list_target/telepathy/eldritch, - /datum/action/cooldown/spell/pointed/blind/eldritch, - /datum/action/innate/expand_sight, - ) - /// A weakref to the last target we smacked. Hitting targets consecutively does more damage. - var/datum/weakref/last_target - -/mob/living/simple_animal/hostile/heretic_summon/raw_prophet/Initialize(mapload) - . = ..() - var/on_link_message = "You feel something new enter your sphere of mind... \ - You hear whispers of people far away, screeches of horror and a huming of welcome to [src]'s Mansus Link." - - var/on_unlink_message = "Your mind shatters as [src]'s Mansus Link leaves your mind." - - AddComponent(/datum/component/mind_linker, \ - network_name = "Mansus Link", \ - chat_color = "#568b00", \ - linker_action_path = /datum/action/cooldown/spell/pointed/manse_link, \ - link_message = on_link_message, \ - unlink_message = on_unlink_message, \ - post_unlink_callback = CALLBACK(src, PROC_REF(after_unlink)), \ - speech_action_background_icon_state = "bg_heretic", \ - ) - -/mob/living/simple_animal/hostile/heretic_summon/raw_prophet/attack_animal(mob/living/simple_animal/user, list/modifiers) - if(user == src) // Easy to hit yourself + very fragile = accidental suicide, prevent that - return - - return ..() - -/mob/living/simple_animal/hostile/heretic_summon/raw_prophet/AttackingTarget(atom/attacked_target) - if(WEAKREF(attacked_target) == last_target) - melee_damage_lower = min(melee_damage_lower + 5, 30) - melee_damage_upper = min(melee_damage_upper + 5, 35) - else - melee_damage_lower = initial(melee_damage_lower) - melee_damage_upper = initial(melee_damage_upper) - - . = ..() - if(!.) - return - - SpinAnimation(5, 1) - last_target = WEAKREF(attacked_target) - -/mob/living/simple_animal/hostile/heretic_summon/raw_prophet/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - var/rotation_degree = (360 / 3) - if(movement_dir & WEST || movement_dir & SOUTH) - rotation_degree *= -1 - - var/matrix/to_turn = matrix(transform) - to_turn = turn(transform, rotation_degree) - animate(src, transform = to_turn, time = 0.1 SECONDS) - -/* - * Callback for the mind_linker component. - * Stuns people who are ejected from the network. - */ -/mob/living/simple_animal/hostile/heretic_summon/raw_prophet/proc/after_unlink(mob/living/unlinked_mob) - if(QDELETED(unlinked_mob) || unlinked_mob.stat == DEAD) - return - - INVOKE_ASYNC(unlinked_mob, TYPE_PROC_REF(/mob, emote), "scream") - unlinked_mob.AdjustParalyzed(0.5 SECONDS) //micro stun - -// What if we took a linked list... But made it a mob? -/// The "Terror of the Night" / Armsy, a large worm made of multiple bodyparts that occupies multiple tiles -/mob/living/simple_animal/hostile/heretic_summon/armsy - name = "Terror of the night" - real_name = "Armsy" - desc = "An abomination made from dozens and dozens of severed and malformed limbs piled onto each other." - icon_state = "armsy_start" - icon_living = "armsy_start" - maxHealth = 200 - health = 200 - melee_damage_lower = 10 - melee_damage_upper = 15 - move_force = MOVE_FORCE_OVERPOWERING - move_resist = MOVE_FORCE_OVERPOWERING - pull_force = MOVE_FORCE_OVERPOWERING - movement_type = GROUND - mob_size = MOB_SIZE_HUGE - sentience_type = SENTIENCE_BOSS - environment_smash = ENVIRONMENT_SMASH_RWALLS - mob_biotypes = MOB_ORGANIC|MOB_EPIC - obj_damage = 200 - ranged_cooldown_time = 5 - ranged = TRUE - rapid = 1 - actions_to_add = list(/datum/action/cooldown/spell/worm_contract) - ///Previous segment in the chain - var/mob/living/simple_animal/hostile/heretic_summon/armsy/back - ///Next segment in the chain - var/mob/living/simple_animal/hostile/heretic_summon/armsy/front - ///Your old location - var/oldloc - ///Allow / disallow pulling - var/allow_pulling = FALSE - ///How many arms do we have to eat to expand? - var/stacks_to_grow = 5 - ///Currently eaten arms - var/current_stacks = 0 - ///Does this follow other pieces? - var/follow = TRUE - -/* - * Arguments - * * spawn_bodyparts - whether we spawn additional armsy bodies until we reach length. - * * worm_length - the length of the worm we're creating. Below 3 doesn't work very well. - */ -/mob/living/simple_animal/hostile/heretic_summon/armsy/Initialize(mapload, spawn_bodyparts = TRUE, worm_length = 6) - . = ..() - if(worm_length < 3) - stack_trace("[type] created with invalid len ([worm_length]). Reverting to 3.") - worm_length = 3 //code breaks below 3, let's just not allow it. - - oldloc = loc - RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(update_chain_links)) - if(!spawn_bodyparts) - return - - AddComponent(/datum/component/blood_walk, \ - blood_type = /obj/effect/decal/cleanable/blood/tracks, \ - target_dir_change = TRUE) - - allow_pulling = TRUE - // Sets the hp of the head to be exactly the (length * hp), so the head is de facto the hardest to destroy. - maxHealth = worm_length * maxHealth - health = maxHealth - - // The previous link in the chain - var/mob/living/simple_animal/hostile/heretic_summon/armsy/prev = src - // The current link in the chain - var/mob/living/simple_animal/hostile/heretic_summon/armsy/current - - for(var/i in 1 to worm_length) - current = new type(drop_location(), FALSE) - current.icon_state = "armsy_mid" - current.icon_living = "armsy_mid" - current.AIStatus = AI_OFF - current.front = prev - prev.back = current - prev = current - - prev.icon_state = "armsy_end" - prev.icon_living = "armsy_end" - -/mob/living/simple_animal/hostile/heretic_summon/armsy/adjustBruteLoss(amount, updating_health, forced, required_bodytype) - if(back) - return back.adjustBruteLoss(amount, updating_health, forced) - - return ..() - -/mob/living/simple_animal/hostile/heretic_summon/armsy/adjustFireLoss(amount, updating_health, forced, required_bodytype) - if(back) - return back.adjustFireLoss(amount, updating_health, forced) - - return ..() - -// We are literally a vessel of otherworldly destruction, we bring our own gravity unto this plane -/mob/living/simple_animal/hostile/heretic_summon/armsy/has_gravity(turf/T) - return TRUE - -/mob/living/simple_animal/hostile/heretic_summon/armsy/can_be_pulled() - return FALSE - -/// Updates every body in the chain to force move onto a single tile. -/mob/living/simple_animal/hostile/heretic_summon/armsy/proc/contract_next_chain_into_single_tile() - if(!back) - return - - back.forceMove(loc) - back.contract_next_chain_into_single_tile() - -/* - * Recursively get the length of our chain. - */ -/mob/living/simple_animal/hostile/heretic_summon/armsy/proc/get_length() - . = 1 - if(back) - . += back.get_length() - -/// Updates the next mob in the chain to move to our last location. Fixes the chain if somehow broken. -/mob/living/simple_animal/hostile/heretic_summon/armsy/proc/update_chain_links() - SIGNAL_HANDLER - - if(!follow) - return - - if(back && back.loc != oldloc) - back.Move(oldloc) - - // self fixing properties if somehow broken - if(front && loc != front.oldloc) - forceMove(front.oldloc) - - oldloc = loc - -/mob/living/simple_animal/hostile/heretic_summon/armsy/Destroy() - if(front) - front.icon_state = "armsy_end" - front.icon_living = "armsy_end" - front.back = null - front = null - if(back) - QDEL_NULL(back) // chain destruction baby - return ..() - -/* - * Handle healing our chain. - * - * Eating arms off the ground heals us, - * and if we eat enough arms while above - * a certain health threshold, we even gain back parts! - */ -/mob/living/simple_animal/hostile/heretic_summon/armsy/proc/heal() - if(back) - back.heal() - return - - adjustBruteLoss(-maxHealth * 0.5, FALSE) - adjustFireLoss(-maxHealth * 0.5, FALSE) - - if(health < maxHealth * 0.8) - return - - current_stacks++ - if(current_stacks < stacks_to_grow) - return - - var/mob/living/simple_animal/hostile/heretic_summon/armsy/prev = new type(drop_location(), FALSE) - icon_state = "armsy_mid" - icon_living = "armsy_mid" - back = prev - prev.icon_state = "armsy_end" - prev.icon_living = "armsy_end" - prev.front = src - prev.AIStatus = AI_OFF - current_stacks = 0 - -/mob/living/simple_animal/hostile/heretic_summon/armsy/Shoot(atom/targeted_atom) - GiveTarget(targeted_atom) - AttackingTarget() - -/mob/living/simple_animal/hostile/heretic_summon/armsy/AttackingTarget() - if(istype(target, /obj/item/bodypart/arm)) - playsound(src, 'sound/magic/demon_consume.ogg', 50, TRUE) - qdel(target) - heal() - return - if(target == back || target == front) - return - if(back) - back.GiveTarget(target) - back.AttackingTarget() - if(!Adjacent(target)) - return - do_attack_animation(target) - - if(iscarbon(target)) - var/mob/living/carbon/carbon_target = target - if(HAS_TRAIT(carbon_target, TRAIT_NODISMEMBER)) - return ..() - - var/list/parts_to_remove = list() - for(var/obj/item/bodypart/bodypart in carbon_target.bodyparts) - if(bodypart.body_part != HEAD && bodypart.body_part != CHEST && bodypart.body_part != LEG_LEFT && bodypart.body_part != LEG_RIGHT) - if(!(bodypart.bodypart_flags & BODYPART_UNREMOVABLE)) - parts_to_remove += bodypart - - if(parts_to_remove.len && prob(10)) - var/obj/item/bodypart/lost_arm = pick(parts_to_remove) - lost_arm.dismember() - - return ..() - -/mob/living/simple_animal/hostile/heretic_summon/armsy/prime - name = "Lord of the Night" - real_name = "Master of Decay" - maxHealth = 400 - health = 400 - melee_damage_lower = 30 - melee_damage_upper = 50 - -/mob/living/simple_animal/hostile/heretic_summon/armsy/prime/Initialize(mapload, spawn_bodyparts = TRUE, worm_length = 9) - . = ..() - var/matrix/matrix_transformation = matrix() - matrix_transformation.Scale(1.4, 1.4) - transform = matrix_transformation - -/mob/living/simple_animal/hostile/heretic_summon/rust_spirit - name = "Rust Walker" - real_name = "Rusty" - desc = "An incomprehensible abomination. Everywhere it steps, it appears to be actively seeping life out of its surroundings." - icon_state = "rust_walker_s" - icon_living = "rust_walker_s" - status_flags = CANPUSH - maxHealth = 75 - health = 75 - melee_damage_lower = 15 - melee_damage_upper = 20 - sight = SEE_TURFS - actions_to_add = list( - /datum/action/cooldown/spell/aoe/rust_conversion/small, - /datum/action/cooldown/spell/basic_projectile/rust_wave/short, - ) - -/mob/living/simple_animal/hostile/heretic_summon/rust_spirit/setDir(newdir) - . = ..() - if(newdir == NORTH) - icon_state = "rust_walker_n" - else if(newdir == SOUTH) - icon_state = "rust_walker_s" - update_appearance(UPDATE_ICON_STATE) - -/mob/living/simple_animal/hostile/heretic_summon/rust_spirit/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - playsound(src, 'sound/effects/footstep/rustystep1.ogg', 100, TRUE) - -/mob/living/simple_animal/hostile/heretic_summon/rust_spirit/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if(stat == DEAD) - return ..() - - var/turf/our_turf = get_turf(src) - if(HAS_TRAIT(our_turf, TRAIT_RUSTY)) - adjustBruteLoss(-1.5 * seconds_per_tick, FALSE) - adjustFireLoss(-1.5 * seconds_per_tick, FALSE) - - return ..() - -/mob/living/simple_animal/hostile/heretic_summon/ash_spirit - name = "Ash Man" - real_name = "Ashy" - desc = "An incomprehensible abomination. As it moves, a thin trail of ash follows, appearing from seemingly nowhere." - icon_state = "ash_walker" - icon_living = "ash_walker" - status_flags = CANPUSH - maxHealth = 75 - health = 75 - melee_damage_lower = 15 - melee_damage_upper = 20 - sight = SEE_TURFS - actions_to_add = list( - /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash, - /datum/action/cooldown/spell/pointed/cleave, - /datum/action/cooldown/spell/fire_sworn, - ) - -/mob/living/simple_animal/hostile/heretic_summon/stalker - name = "Flesh Stalker" - real_name = "Flesh Stalker" - desc = "An abomination made from several limbs and organs. Every moment you stare at it, it appears to shift and change unnaturally." - icon_state = "stalker" - icon_living = "stalker" - status_flags = CANPUSH - maxHealth = 150 - health = 150 - melee_damage_lower = 15 - melee_damage_upper = 20 - sight = SEE_MOBS - actions_to_add = list( - /datum/action/cooldown/spell/shapeshift/eldritch, - /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash, - /datum/action/cooldown/spell/emp/eldritch, - ) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index ec5b53c0bce6..7e76d70f0f7d 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -172,7 +172,7 @@ Goto(P.starting, move_to_delay, 3) return ..() -//////////////HOSTILE MOB TARGETTING AND AGGRESSION//////////// +//////////////HOSTILE MOB TARGETING AND AGGRESSION//////////// /mob/living/simple_animal/hostile/proc/ListTargets() //Step 1, find out what we can see var/atom/target_from = GET_TARGETS_FROM(src) @@ -196,7 +196,7 @@ possible_targets = ListTargets() for(var/atom/pos_targ as anything in possible_targets) - if(Found(pos_targ)) //Just in case people want to override targetting + if(Found(pos_targ)) //Just in case people want to override targeting all_potential_targets = list(pos_targ) break @@ -259,7 +259,7 @@ if(search_objects < 2) if(isliving(the_target)) var/mob/living/L = the_target - var/faction_check = faction_check_mob(L) + var/faction_check = faction_check_atom(L) if(robust_searching) if(faction_check && !attack_same) return FALSE @@ -417,7 +417,7 @@ SSmove_manager.stop_looping(src) LoseAggro() -//////////////END HOSTILE MOB TARGETTING AND AGGRESSION//////////// +//////////////END HOSTILE MOB TARGETING AND AGGRESSION//////////// /mob/living/simple_animal/hostile/death(gibbed) LoseTarget() @@ -428,7 +428,7 @@ playsound(loc, 'sound/machines/chime.ogg', 50, TRUE, -1) var/atom/target_from = GET_TARGETS_FROM(src) for(var/mob/living/simple_animal/hostile/M in oview(distance, target_from)) - if(faction_check_mob(M, TRUE)) + if(faction_check_atom(M, TRUE)) if(M.AIStatus == AI_OFF) return else @@ -440,7 +440,7 @@ for(var/mob/living/L in T) if(L == src || L == A) continue - if(faction_check_mob(L) && !attack_same) + if(faction_check_atom(L) && !attack_same) return TRUE /mob/living/simple_animal/hostile/proc/OpenFire(atom/A) 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 73b7f6aa6260..102fd13c532c 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -40,7 +40,7 @@ nondirectional_sprite = TRUE impact_effect_type = /obj/effect/temp_visual/leaper_projectile_impact -/obj/projectile/leaper/on_hit(atom/target, blocked = FALSE) +/obj/projectile/leaper/on_hit(atom/target, blocked = 0, pierce_hit) ..() if (!isliving(target)) return @@ -148,6 +148,7 @@ /mob/living/simple_animal/hostile/jungle/leaper/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) remove_verb(src, /mob/living/verb/pulled) add_cell_sample() @@ -215,9 +216,8 @@ if(z != target.z) return hopping = TRUE - set_density(FALSE) + add_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), LEAPING_TRAIT) pass_flags |= PASSMOB - notransform = TRUE var/turf/new_turf = locate((target.x + rand(-3,3)),(target.y + rand(-3,3)),target.z) if(player_hop) new_turf = get_turf(target) @@ -228,8 +228,7 @@ throw_at(new_turf, max(3,get_dist(src,new_turf)), 1, src, FALSE, callback = CALLBACK(src, PROC_REF(FinishHop))) /mob/living/simple_animal/hostile/jungle/leaper/proc/FinishHop() - set_density(TRUE) - notransform = FALSE + remove_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), LEAPING_TRAIT) pass_flags &= ~PASSMOB hopping = FALSE playsound(src.loc, 'sound/effects/meteorimpact.ogg', 100, TRUE) @@ -240,18 +239,17 @@ /mob/living/simple_animal/hostile/jungle/leaper/proc/BellyFlop() var/turf/new_turf = get_turf(target) hopping = TRUE - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, LEAPING_TRAIT) new /obj/effect/temp_visual/leaper_crush(new_turf) - addtimer(CALLBACK(src, PROC_REF(BellyFlopHop), new_turf), 30) + addtimer(CALLBACK(src, PROC_REF(BellyFlopHop), new_turf), 3 SECONDS) /mob/living/simple_animal/hostile/jungle/leaper/proc/BellyFlopHop(turf/T) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, LEAPING_TRAIT) throw_at(T, get_dist(src,T),1,src, FALSE, callback = CALLBACK(src, PROC_REF(Crush))) /mob/living/simple_animal/hostile/jungle/leaper/proc/Crush() hopping = FALSE - set_density(TRUE) - notransform = FALSE + remove_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), LEAPING_TRAIT) playsound(src, 'sound/effects/meteorimpact.ogg', 200, TRUE) for(var/mob/living/L in orange(1, src)) L.adjustBruteLoss(35) diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm deleted file mode 100644 index 2e65ba824568..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm +++ /dev/null @@ -1,229 +0,0 @@ -#define MOOK_ATTACK_NEUTRAL 0 -#define MOOK_ATTACK_WARMUP 1 -#define MOOK_ATTACK_ACTIVE 2 -#define MOOK_ATTACK_RECOVERY 3 -#define ATTACK_INTERMISSION_TIME 5 - -//Fragile but highly aggressive wanderers that pose a large threat in numbers. -//They'll attempt to leap at their target from afar using their hatchets. -/mob/living/simple_animal/hostile/jungle/mook - name = "wanderer" - desc = "This unhealthy looking primitive is wielding a rudimentary hatchet, swinging it with wild abandon. One isn't much of a threat, but in numbers they can quickly overwhelm a superior opponent." - icon = 'icons/mob/simple/jungle/mook.dmi' - icon_state = "mook" - icon_living = "mook" - icon_dead = "mook_dead" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - SET_BASE_PIXEL(-16, -8) - - maxHealth = 45 - health = 45 - melee_damage_lower = 30 - melee_damage_upper = 30 - ranged = TRUE - ranged_cooldown_time = 10 - pass_flags_self = LETPASSTHROW - robust_searching = TRUE - stat_attack = HARD_CRIT - attack_sound = 'sound/weapons/rapierhit.ogg' - attack_vis_effect = ATTACK_EFFECT_SLASH - death_sound = 'sound/voice/mook_death.ogg' - aggro_vision_range = 15 //A little more aggressive once in combat to balance out their really low HP - var/attack_state = MOOK_ATTACK_NEUTRAL - var/struck_target_leap = FALSE - - footstep_type = FOOTSTEP_MOB_BAREFOOT - -/mob/living/simple_animal/hostile/jungle/mook/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(istype(mover, /mob/living/simple_animal/hostile/jungle/mook)) - var/mob/living/simple_animal/hostile/jungle/mook/mook_moover = mover - if(mook_moover.attack_state == MOOK_ATTACK_ACTIVE && mook_moover.throwing) - return TRUE - -/mob/living/simple_animal/hostile/jungle/mook/death() - desc = "A deceased primitive. Upon closer inspection, it was suffering from severe cellular degeneration and its garments are machine made..."//Can you guess the twist - return ..() - -/mob/living/simple_animal/hostile/jungle/mook/AttackingTarget() - if(isliving(target)) - if(ranged_cooldown <= world.time && attack_state == MOOK_ATTACK_NEUTRAL) - var/mob/living/L = target - if(L.incapacitated()) - WarmupAttack(forced_slash_combo = TRUE) - return - WarmupAttack() - return - return ..() - -/mob/living/simple_animal/hostile/jungle/mook/Goto() - if(attack_state != MOOK_ATTACK_NEUTRAL) - return - return ..() - -/mob/living/simple_animal/hostile/jungle/mook/Move() - if(attack_state == MOOK_ATTACK_WARMUP || attack_state == MOOK_ATTACK_RECOVERY) - return - return ..() - -/mob/living/simple_animal/hostile/jungle/mook/proc/WarmupAttack(forced_slash_combo = FALSE) - if(attack_state == MOOK_ATTACK_NEUTRAL && target) - attack_state = MOOK_ATTACK_WARMUP - SSmove_manager.stop_looping(src) - update_icons() - if(prob(50) && get_dist(src,target) <= 3 || forced_slash_combo) - addtimer(CALLBACK(src, PROC_REF(SlashCombo)), ATTACK_INTERMISSION_TIME) - return - addtimer(CALLBACK(src, PROC_REF(LeapAttack)), ATTACK_INTERMISSION_TIME + rand(0,3)) - return - attack_state = MOOK_ATTACK_RECOVERY - ResetNeutral() - -/mob/living/simple_animal/hostile/jungle/mook/proc/SlashCombo() - if(attack_state == MOOK_ATTACK_WARMUP && !stat) - attack_state = MOOK_ATTACK_ACTIVE - update_icons() - SlashAttack() - addtimer(CALLBACK(src, PROC_REF(SlashAttack)), 3) - addtimer(CALLBACK(src, PROC_REF(SlashAttack)), 6) - addtimer(CALLBACK(src, PROC_REF(AttackRecovery)), 9) - -/mob/living/simple_animal/hostile/jungle/mook/proc/SlashAttack() - if(target && !stat && attack_state == MOOK_ATTACK_ACTIVE) - melee_damage_lower = 15 - melee_damage_upper = 15 - var/mob_direction = get_dir(src,target) - var/atom/target_from = GET_TARGETS_FROM(src) - if(get_dist(src,target) > 1) - step(src,mob_direction) - if(isturf(target_from.loc) && target.Adjacent(target_from) && isliving(target)) - var/mob/living/L = target - L.attack_animal(src) - return - var/swing_turf = get_step(src,mob_direction) - new /obj/effect/temp_visual/kinetic_blast(swing_turf) - playsound(src, 'sound/weapons/slashmiss.ogg', 50, TRUE) - -/mob/living/simple_animal/hostile/jungle/mook/proc/LeapAttack() - if(target && !stat && attack_state == MOOK_ATTACK_WARMUP) - attack_state = MOOK_ATTACK_ACTIVE - set_density(FALSE) - melee_damage_lower = 30 - melee_damage_upper = 30 - update_icons() - new /obj/effect/temp_visual/mook_dust(get_turf(src)) - playsound(src, 'sound/weapons/thudswoosh.ogg', 25, TRUE) - playsound(src, 'sound/voice/mook_leap_yell.ogg', 100, TRUE) - var/target_turf = get_turf(target) - throw_at(target_turf, 7, 1, src, FALSE, callback = CALLBACK(src, PROC_REF(AttackRecovery))) - return - attack_state = MOOK_ATTACK_RECOVERY - ResetNeutral() - -/mob/living/simple_animal/hostile/jungle/mook/proc/AttackRecovery() - if(attack_state == MOOK_ATTACK_ACTIVE && !stat) - attack_state = MOOK_ATTACK_RECOVERY - set_density(TRUE) - face_atom(target) - if(!struck_target_leap) - update_icons() - struck_target_leap = FALSE - if(prob(40)) - attack_state = MOOK_ATTACK_NEUTRAL - if(target) - if(isliving(target)) - var/mob/living/L = target - if(L.incapacitated() && L.stat != DEAD) - addtimer(CALLBACK(src, PROC_REF(WarmupAttack), TRUE), ATTACK_INTERMISSION_TIME) - return - addtimer(CALLBACK(src, PROC_REF(WarmupAttack)), ATTACK_INTERMISSION_TIME) - return - addtimer(CALLBACK(src, PROC_REF(ResetNeutral)), ATTACK_INTERMISSION_TIME) - -/mob/living/simple_animal/hostile/jungle/mook/proc/ResetNeutral() - if(attack_state == MOOK_ATTACK_RECOVERY) - attack_state = MOOK_ATTACK_NEUTRAL - ranged_cooldown = world.time + ranged_cooldown_time - update_icons() - if(target && !stat) - update_icons() - Goto(target, move_to_delay, minimum_distance) - -/mob/living/simple_animal/hostile/jungle/mook/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - . = ..() - if(isliving(hit_atom) && attack_state == MOOK_ATTACK_ACTIVE) - var/mob/living/L = hit_atom - if(CanAttack(L)) - L.attack_animal(src) - struck_target_leap = TRUE - set_density(TRUE) - update_icons() - var/mook_under_us = FALSE - for(var/A in get_turf(src)) - if(struck_target_leap && mook_under_us) - break - if(A == src) - continue - if(isliving(A)) - var/mob/living/ML = A - if(!struck_target_leap && CanAttack(ML))//Check if some joker is attempting to use rest to evade us - struck_target_leap = TRUE - ML.attack_animal(src) - set_density(TRUE) - struck_target_leap = TRUE - update_icons() - continue - if(istype(ML, /mob/living/simple_animal/hostile/jungle/mook) && !mook_under_us)//If we land on the same tile as another mook, spread out so we don't stack our sprite on the same tile - var/mob/living/simple_animal/hostile/jungle/mook/M = ML - if(!M.stat) - mook_under_us = TRUE - var/anydir = pick(GLOB.cardinals) - Move(get_step(src, anydir), anydir) - continue - -/mob/living/simple_animal/hostile/jungle/mook/handle_automated_action() - if(attack_state) - return - return ..() - -/mob/living/simple_animal/hostile/jungle/mook/OpenFire() - if(isliving(target)) - var/mob/living/L = target - if(L.incapacitated()) - return - WarmupAttack() - -/mob/living/simple_animal/hostile/jungle/mook/update_icons() - . = ..() - if(!stat) - switch(attack_state) - if(MOOK_ATTACK_NEUTRAL) - icon_state = "mook" - if(MOOK_ATTACK_WARMUP) - icon_state = "mook_warmup" - if(MOOK_ATTACK_ACTIVE) - if(!density) - icon_state = "mook_leap" - return - if(struck_target_leap) - icon_state = "mook_strike" - return - icon_state = "mook_slash_combo" - if(MOOK_ATTACK_RECOVERY) - icon_state = "mook" - -/obj/effect/temp_visual/mook_dust - name = "dust" - desc = "It's just a dust cloud!" - icon = 'icons/mob/simple/jungle/mook.dmi' - icon_state = "mook_leap_cloud" - layer = BELOW_MOB_LAYER - plane = GAME_PLANE - SET_BASE_PIXEL(-16, -16) - duration = 10 - -#undef MOOK_ATTACK_NEUTRAL -#undef MOOK_ATTACK_WARMUP -#undef MOOK_ATTACK_ACTIVE -#undef MOOK_ATTACK_RECOVERY -#undef ATTACK_INTERMISSION_TIME diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm deleted file mode 100644 index f4f726bc0bac..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm +++ /dev/null @@ -1,240 +0,0 @@ -#define SEEDLING_STATE_NEUTRAL 0 -#define SEEDLING_STATE_WARMUP 1 -#define SEEDLING_STATE_ACTIVE 2 -#define SEEDLING_STATE_RECOVERY 3 - -//A plant rooted in the ground that forfeits its melee attack in favor of ranged barrages. -//It will fire flurries of solar energy, and occasionally charge up a powerful blast that makes it vulnerable to attack. -/mob/living/simple_animal/hostile/jungle/seedling - name = "seedling" - desc = "This oversized, predatory flower conceals what can only be described as an organic energy cannon, and it will not die until its hidden vital organs are sliced out. \ - The concentrated streams of energy it sometimes produces require its full attention, attacking it during this time will prevent it from finishing its attack." - icon = 'icons/mob/simple/jungle/seedling.dmi' - icon_state = "seedling" - icon_living = "seedling" - icon_dead = "seedling_dead" - mob_biotypes = MOB_ORGANIC | MOB_PLANT - maxHealth = 100 - health = 100 - melee_damage_lower = 30 - melee_damage_upper = 30 - SET_BASE_PIXEL(-16, -14) - - minimum_distance = 3 - move_to_delay = 20 - vision_range = 9 - aggro_vision_range = 15 - ranged = TRUE - ranged_cooldown_time = 10 - projectiletype = /obj/projectile/seedling - projectilesound = 'sound/weapons/pierce.ogg' - robust_searching = TRUE - stat_attack = HARD_CRIT - move_resist = MOVE_FORCE_EXTREMELY_STRONG - var/combatant_state = SEEDLING_STATE_NEUTRAL - var/mob/living/beam_debuff_target - var/solar_beam_identifier = 0 - -/obj/projectile/seedling - name = "solar energy" - icon_state = "seedling" - damage = 10 - damage_type = BURN - light_outer_range = 2 - armor_flag = ENERGY - light_color = LIGHT_COLOR_DIM_YELLOW - hitsound = 'sound/weapons/sear.ogg' - hitsound_wall = 'sound/weapons/effects/searwall.ogg' - nondirectional_sprite = TRUE - -/obj/projectile/seedling/Bump(atom/A)//Stops seedlings from destroying other jungle mobs through FF - if(isliving(A)) - var/mob/living/L = A - if(FACTION_JUNGLE in L.faction) - return FALSE - return ..() - -/obj/effect/temp_visual/solarbeam_killsat - name = "beam of solar energy" - icon_state = "solar_beam" - icon = 'icons/effects/beam.dmi' - plane = LIGHTING_PLANE - layer = LIGHTING_PRIMARY_LAYER - duration = 5 - randomdir = FALSE - -/datum/status_effect/seedling_beam_indicator - id = "seedling beam indicator" - duration = 30 - status_type = STATUS_EFFECT_MULTIPLE - alert_type = null - tick_interval = 1 - var/atom/movable/screen/seedling/seedling_screen_object - var/atom/target - - -/datum/status_effect/seedling_beam_indicator/on_creation(mob/living/new_owner, target_plant) - . = ..() - if(.) - target = target_plant - tick() - -/datum/status_effect/seedling_beam_indicator/on_apply() - if(owner.client) - seedling_screen_object = new /atom/movable/screen/seedling() - owner.client.screen += seedling_screen_object - tick() - return ..() - -/datum/status_effect/seedling_beam_indicator/Destroy() - if(owner) - if(owner.client) - owner.client.screen -= seedling_screen_object - return ..() - -/datum/status_effect/seedling_beam_indicator/tick() - var/target_angle = get_angle(owner, target) - var/matrix/final = matrix() - final.Turn(target_angle) - seedling_screen_object.transform = final - -/atom/movable/screen/seedling - icon = 'icons/mob/simple/jungle/arachnid.dmi' - icon_state = "seedling_beam_indicator" - screen_loc = "CENTER:-16,CENTER:-16" - -/mob/living/simple_animal/hostile/jungle/seedling/Goto() - if(combatant_state != SEEDLING_STATE_NEUTRAL) - return - return ..() - -/mob/living/simple_animal/hostile/jungle/seedling/AttackingTarget() - if(isliving(target)) - if(ranged_cooldown <= world.time && combatant_state == SEEDLING_STATE_NEUTRAL) - OpenFire(target) - return - return ..() - -/mob/living/simple_animal/hostile/jungle/seedling/OpenFire() - WarmupAttack() - -/mob/living/simple_animal/hostile/jungle/seedling/proc/WarmupAttack() - if(combatant_state == SEEDLING_STATE_NEUTRAL) - combatant_state = SEEDLING_STATE_WARMUP - SSmove_manager.stop_looping(src) - update_icons() - var/target_dist = get_dist(src,target) - var/living_target_check = isliving(target) - if(living_target_check) - if(target_dist > 7)//Offscreen check - SolarBeamStartup(target) - return - if(get_dist(src,target) >= 4 && prob(40)) - SolarBeamStartup(target) - return - addtimer(CALLBACK(src, PROC_REF(Volley)), 5) - -/mob/living/simple_animal/hostile/jungle/seedling/proc/SolarBeamStartup(mob/living/living_target)//It's more like requiem than final spark - if(combatant_state == SEEDLING_STATE_WARMUP && target) - combatant_state = SEEDLING_STATE_ACTIVE - living_target.apply_status_effect(/datum/status_effect/seedling_beam_indicator, src) - beam_debuff_target = living_target - playsound(src,'sound/effects/seedling_chargeup.ogg', 100, FALSE) - if(get_dist(src,living_target) > 7) - playsound(living_target,'sound/effects/seedling_chargeup.ogg', 100, FALSE) - solar_beam_identifier = world.time - addtimer(CALLBACK(src, PROC_REF(Beamu), living_target, solar_beam_identifier), 35) - -/mob/living/simple_animal/hostile/jungle/seedling/proc/Beamu(mob/living/living_target, beam_id = 0) - if(combatant_state == SEEDLING_STATE_ACTIVE && living_target && beam_id == solar_beam_identifier) - if(living_target.z == z) - update_icons() - var/obj/effect/temp_visual/solarbeam_killsat/S = new (get_turf(src)) - var/matrix/starting = matrix() - starting.Scale(1,32) - starting.Translate(0,520) - S.transform = starting - var/obj/effect/temp_visual/solarbeam_killsat/K = new (get_turf(living_target)) - var/matrix/final = matrix() - final.Scale(1,32) - final.Translate(0,512) - K.transform = final - living_target.adjustFireLoss(30) - living_target.adjust_fire_stacks(0.2)//Just here for the showmanship - living_target.ignite_mob() - playsound(living_target,'sound/weapons/sear.ogg', 50, TRUE) - addtimer(CALLBACK(src, PROC_REF(AttackRecovery)), 5) - return - AttackRecovery() - -/mob/living/simple_animal/hostile/jungle/seedling/proc/Volley() - if(combatant_state == SEEDLING_STATE_WARMUP && target) - combatant_state = SEEDLING_STATE_ACTIVE - update_icons() - var/datum/callback/cb = CALLBACK(src, PROC_REF(InaccurateShot)) - for(var/i in 1 to 13) - addtimer(cb, i) - addtimer(CALLBACK(src, PROC_REF(AttackRecovery)), 14) - -/mob/living/simple_animal/hostile/jungle/seedling/proc/InaccurateShot() - if(!QDELETED(target) && combatant_state == SEEDLING_STATE_ACTIVE && !stat) - if(get_dist(src,target) <= 3)//If they're close enough just aim straight at them so we don't miss at point blank ranges - Shoot(target) - return - var/turf/our_turf = get_turf(src) - var/obj/projectile/seedling/readied_shot = new /obj/projectile/seedling(our_turf) - readied_shot.preparePixelProjectile(target, src, null, rand(-10, 10)) - readied_shot.fire() - playsound(src, projectilesound, 100, TRUE) - -/mob/living/simple_animal/hostile/jungle/seedling/proc/AttackRecovery() - if(combatant_state == SEEDLING_STATE_ACTIVE) - combatant_state = SEEDLING_STATE_RECOVERY - update_icons() - ranged_cooldown = world.time + ranged_cooldown_time - if(target) - face_atom(target) - addtimer(CALLBACK(src, PROC_REF(ResetNeutral)), 10) - -/mob/living/simple_animal/hostile/jungle/seedling/proc/ResetNeutral() - combatant_state = SEEDLING_STATE_NEUTRAL - if(target && !stat) - update_icons() - Goto(target, move_to_delay, minimum_distance) - -/mob/living/simple_animal/hostile/jungle/seedling/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(combatant_state == SEEDLING_STATE_ACTIVE && beam_debuff_target) - beam_debuff_target.remove_status_effect(/datum/status_effect/seedling_beam_indicator) - beam_debuff_target = null - solar_beam_identifier = 0 - AttackRecovery() - -/mob/living/simple_animal/hostile/jungle/seedling/update_icons() - . = ..() - if(!stat) - switch(combatant_state) - if(SEEDLING_STATE_NEUTRAL) - icon_state = "seedling" - if(SEEDLING_STATE_WARMUP) - icon_state = "seedling_charging" - if(SEEDLING_STATE_ACTIVE) - icon_state = "seedling_fire" - if(SEEDLING_STATE_RECOVERY) - icon_state = "seedling" - -/mob/living/simple_animal/hostile/jungle/seedling/GiveTarget() - if(target) - if(combatant_state == SEEDLING_STATE_WARMUP || combatant_state == SEEDLING_STATE_ACTIVE)//So it doesn't 180 and blast you in the face while it's firing at someone else - return - return ..() - -/mob/living/simple_animal/hostile/jungle/seedling/LoseTarget() - if(combatant_state == SEEDLING_STATE_WARMUP || combatant_state == SEEDLING_STATE_ACTIVE) - return - return ..() - -#undef SEEDLING_STATE_NEUTRAL -#undef SEEDLING_STATE_WARMUP -#undef SEEDLING_STATE_ACTIVE -#undef SEEDLING_STATE_RECOVERY diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm index ece63945e320..689e1391bfd6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm @@ -50,11 +50,10 @@ var/chosen_attack = 1 /// Attack actions, sets chosen_attack to the number in the action var/list/attack_action_types = list() - /// If there is a small sprite icon for players controlling the megafauna to use - var/small_sprite_type /mob/living/simple_animal/hostile/megafauna/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) AddElement(/datum/element/simple_flying) if(gps_name && true_spawn) AddComponent(/datum/component/gps, gps_name) @@ -63,9 +62,6 @@ for(var/action_type in attack_action_types) var/datum/action/innate/megafauna_attack/attack_action = new action_type() attack_action.Grant(src) - if(small_sprite_type) - var/datum/action/small_sprite/small_action = new small_sprite_type() - small_action.Grant(src) /mob/living/simple_animal/hostile/megafauna/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) //Safety check 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 55b80a8d0b89..ec90fa9fa7bb 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -67,7 +67,6 @@ Difficulty: Hard score_achievement_type = /datum/award/score/bubblegum_score death_message = "sinks into a pool of blood, fleeing the battle. You've won, for now... " death_sound = 'sound/magic/enter_blood.ogg' - small_sprite_type = /datum/action/small_sprite/megafauna/bubblegum faction = list(FACTION_MINING, FACTION_BOSS, FACTION_HELL) /// Check to see if we should spawn blood var/spawn_blood = TRUE @@ -138,7 +137,7 @@ Difficulty: Hard . = list() for(var/mob/living/L in targets) var/list/bloodpool = get_bloodcrawlable_pools(get_turf(L), 0) - if(bloodpool.len && (!faction_check_mob(L) || L.stat == DEAD)) + if(bloodpool.len && (!faction_check_atom(L) || L.stat == DEAD)) . += L /** @@ -154,7 +153,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/bubblegum/attackby(obj/item/W, mob/user, params) . = ..() if(istype(W, /obj/item/organ/internal/tongue)) - user.client?.give_award(/datum/award/achievement/misc/frenching, user) + user.client?.give_award(/datum/award/achievement/jobs/frenching, user) /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/try_bloodattack() var/list/targets = get_mobs_on_blood() @@ -202,7 +201,7 @@ Difficulty: Hard new /obj/effect/temp_visual/bubblegum_hands/leftsmack(T) SLEEP_CHECK_DEATH(4, src) for(var/mob/living/L in T) - if(!faction_check_mob(L)) + if(!faction_check_atom(L)) to_chat(L, span_userdanger("[src] rends you!")) playsound(T, attack_sound, 100, TRUE, -1) var/limb_to_hit = L.get_bodypart(L.get_random_valid_zone(even_weights = TRUE)) @@ -218,7 +217,7 @@ Difficulty: Hard new /obj/effect/temp_visual/bubblegum_hands/leftthumb(T) SLEEP_CHECK_DEATH(6, src) for(var/mob/living/L in T) - if(!faction_check_mob(L)) + if(!faction_check_atom(L)) if(L.stat != CONSCIOUS) to_chat(L, span_userdanger("[src] drags you through the blood!")) playsound(T, 'sound/magic/enter_blood.ogg', 100, TRUE, -1) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 88a009c23a43..265bde8e1282 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -55,7 +55,6 @@ loot = list(/obj/structure/closet/crate/necropolis/colossus) death_message = "disintegrates, leaving a glowing core in its wake." death_sound = 'sound/magic/demon_dies.ogg' - small_sprite_type = /datum/action/small_sprite/megafauna/colossus /// Spiral shots ability var/datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/colossus/spiral_shots /// Random shots ablity @@ -187,7 +186,6 @@ damage = 25 armour_penetration = 50 speed = 2 - eyeblur = 0 damage_type = BRUTE pass_flags = PASSTABLE plane = GAME_PLANE @@ -198,7 +196,7 @@ direct_target = TRUE return ..(target, direct_target, ignore_loc, cross_failed) -/obj/projectile/colossus/on_hit(atom/target, blocked = FALSE) +/obj/projectile/colossus/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) var/mob/living/dust_mob = target @@ -598,11 +596,10 @@ /obj/structure/closet/stasis/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) if(isliving(arrived) && holder_animal) - var/mob/living/L = arrived - L.notransform = 1 - ADD_TRAIT(L, TRAIT_MUTE, STASIS_MUTE) - L.status_flags |= GODMODE - L.mind.transfer_to(holder_animal) + var/mob/living/possessor = arrived + possessor.add_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), STASIS_MUTE) + possessor.status_flags |= GODMODE + possessor.mind.transfer_to(holder_animal) var/datum/action/exit_possession/escape = new(holder_animal) escape.Grant(holder_animal) remove_verb(holder_animal, /mob/living/verb/pulled) @@ -610,9 +607,8 @@ /obj/structure/closet/stasis/dump_contents(kill = TRUE) STOP_PROCESSING(SSobj, src) for(var/mob/living/possessor in src) - REMOVE_TRAIT(possessor, TRAIT_MUTE, STASIS_MUTE) + possessor.remove_traits(list(TRAIT_UNDENSE, TRAIT_NO_TRANSFORM), STASIS_MUTE) possessor.status_flags &= ~GODMODE - possessor.notransform = FALSE if(kill || !isanimal_or_basicmob(loc)) possessor.investigate_log("has died from [src].", INVESTIGATE_DEATHS) possessor.death(FALSE) 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 8596283166ef..e01821f8d3c3 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 @@ -198,7 +198,7 @@ Difficulty: Extremely Hard homing_turn_speed = 3 damage_type = BURN -/obj/projectile/colossus/frost_orb/on_hit(atom/target, blocked = FALSE) +/obj/projectile/colossus/frost_orb/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isturf(target) || isobj(target)) EX_ACT(target, EXPLODE_HEAVY) @@ -224,7 +224,7 @@ Difficulty: Extremely Hard range = 150 damage_type = BRUTE -/obj/projectile/colossus/ice_blast/on_hit(atom/target, blocked = FALSE) +/obj/projectile/colossus/ice_blast/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isturf(target) || isobj(target)) EX_ACT(target, EXPLODE_HEAVY) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 7d2f9226d5a3..c9c55baabd26 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -1,7 +1,3 @@ -///used whenever the drake generates a hotspot -#define DRAKE_FIRE_TEMP 500 -///used whenever the drake generates a hotspot -#define DRAKE_FIRE_EXPOSURE 50 ///used to see if the drake is enraged or not #define DRAKE_ENRAGED (health < maxHealth*0.5) @@ -73,7 +69,6 @@ death_message = "collapses into a pile of bones, its flesh sloughing away." death_sound = 'sound/magic/demon_dies.ogg' footstep_type = FOOTSTEP_MOB_HEAVY - small_sprite_type = /datum/action/small_sprite/megafauna/drake /// Fire cone ability var/datum/action/cooldown/mob_cooldown/fire_breath/cone/fire_cone /// Meteors ability @@ -176,36 +171,6 @@ remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) set_light_range(initial(light_outer_range)) -//fire line keeps going even if dragon is deleted -/proc/dragon_fire_line(atom/source, list/turfs, frozen = FALSE) - var/list/hit_list = list() - for(var/turf/T in turfs) - if(isclosedturf(T)) - break - var/obj/effect/hotspot/drake_fire_hotspot = new /obj/effect/hotspot(T) - if(frozen) - drake_fire_hotspot.add_atom_colour(COLOR_BLUE_LIGHT, FIXED_COLOUR_PRIORITY) - T.hotspot_expose(DRAKE_FIRE_TEMP,DRAKE_FIRE_EXPOSURE,1) - for(var/mob/living/L in T.contents) - if(L in hit_list || istype(L, source.type)) - continue - hit_list += L - if(!frozen) - L.adjustFireLoss(20) - to_chat(L, span_userdanger("You're hit by [source]'s fire breath!")) - continue - L.adjustFireLoss(10) - L.apply_status_effect(/datum/status_effect/ice_block_talisman, 20) - to_chat(L, span_userdanger("You're hit by [source]'s freezing breath!")) - - // deals damage to mechs - for(var/obj/vehicle/sealed/mecha/M in T.contents) - if(M in hit_list) - continue - hit_list += M - M.take_damage(45, BRUTE, MELEE, 1) - sleep(0.15 SECONDS) - /mob/living/simple_animal/hostile/megafauna/dragon/ex_act(severity, target) if(severity <= EXPLODE_LIGHT) return FALSE @@ -372,8 +337,5 @@ return #undef DRAKE_ENRAGED -#undef DRAKE_FIRE_EXPOSURE -#undef DRAKE_FIRE_TEMP - #undef SWOOP_DAMAGEABLE #undef SWOOP_INVULNERABLE 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 b9be840b9ae9..3807ede11573 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -356,13 +356,13 @@ Difficulty: Hard animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out SLEEP_CHECK_DEATH(1, src) visible_message(span_hierophant_warning("[src] fades out!")) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, VANISHING_TRAIT) SLEEP_CHECK_DEATH(2, src) forceMove(T) SLEEP_CHECK_DEATH(1, src) animate(src, alpha = 255, time = 2, easing = EASE_IN) //fade IN SLEEP_CHECK_DEATH(1, src) - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, VANISHING_TRAIT) visible_message(span_hierophant_warning("[src] fades in!")) SLEEP_CHECK_DEATH(1, src) //at this point the blasts we made detonate blinking = FALSE @@ -441,7 +441,7 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/hierophant/CanAttack(atom/the_target) . = ..() - if(istype(the_target, /mob/living/simple_animal/hostile/asteroid/hivelordbrood)) //ignore temporary targets in favor of more permanent targets + if(istype(the_target, /mob/living/basic/legion_brood)) //ignore temporary targets in favor of more permanent targets return FALSE /mob/living/simple_animal/hostile/megafauna/hierophant/GiveTarget(new_target) @@ -697,7 +697,7 @@ Difficulty: Hard return for(var/mob/living/L in T.contents - hit_things) //find and damage mobs... hit_things += L - if((friendly_fire_check && caster?.faction_check_mob(L)) || L.stat == DEAD) + if((friendly_fire_check && caster?.faction_check_atom(L)) || L.stat == DEAD) continue if(L.client) flash_color(L.client, "#660099", 1) @@ -722,7 +722,7 @@ Difficulty: Hard hit_things += M for(var/O in M.occupants) var/mob/living/occupant = O - if(friendly_fire_check && caster?.faction_check_mob(occupant)) + if(friendly_fire_check && caster?.faction_check_atom(occupant)) continue to_chat(occupant, span_userdanger("Your [M.name] is struck by a [name]!")) playsound(M,'sound/weapons/sear.ogg', 50, TRUE, -4) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm index 25d3ebf67fcf..346ac82ba06f 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm @@ -60,7 +60,6 @@ attack_action_types = list(/datum/action/innate/megafauna_attack/create_skull, /datum/action/innate/megafauna_attack/charge_target, /datum/action/innate/megafauna_attack/create_turrets) - small_sprite_type = /datum/action/small_sprite/megafauna/legion var/size = LEGION_LARGE var/charging = FALSE @@ -142,10 +141,9 @@ ///Attack proc. Spawns a singular legion skull. /mob/living/simple_animal/hostile/megafauna/legion/proc/create_legion_skull() - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new(loc) - A.GiveTarget(target) - A.friends = friends - A.faction = faction + var/mob/living/basic/legion_brood/minion = new(loc) + minion.assign_creator(src) + minion.ai_controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] = target //CHARGE @@ -211,7 +209,7 @@ var/mob/living/living_target = target switch(living_target.stat) if(UNCONSCIOUS, HARD_CRIT) - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/legion = new(loc) + var/mob/living/basic/legion_brood/legion = new(loc) legion.infest(living_target) @@ -271,14 +269,14 @@ density = TRUE layer = ABOVE_OBJ_LAYER armor_type = /datum/armor/structure_legionturret + //Compared with the targeted mobs. If they have the faction, turret won't shoot. + faction = list(FACTION_MINING) ///What kind of projectile the actual damaging part should be. var/projectile_type = /obj/projectile/beam/legion ///Time until the tracer gets shot var/initial_firing_time = 18 ///How long it takes between shooting the tracer and the projectile. var/shot_delay = 8 - ///Compared with the targeted mobs. If they have the faction, turret won't shoot. - var/faction = list(FACTION_MINING) /datum/armor/structure_legionturret laser = 100 @@ -326,7 +324,6 @@ hitsound = 'sound/magic/magic_missile.ogg' damage = 19 range = 6 - eyeblur = 0 light_color = COLOR_SOFT_RED impact_effect_type = /obj/effect/temp_visual/kinetic_blast tracer_type = /obj/effect/projectile/tracer/legion diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm index 0bdf2f18bb07..e4cbd54dc4dc 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm @@ -10,6 +10,8 @@ Difficulty: Hard +Warning the icebox version is being overridden in monkestation/code/modules/mob/living/simple_animal/megafauna/wendigo.dm + */ /mob/living/simple_animal/hostile/megafauna/wendigo @@ -57,13 +59,13 @@ Difficulty: Hard /// Saves the turf the megafauna was created at (spawns exit portal here) var/turf/starting /// Range for wendigo stomping when it moves - var/stomp_range = 0 + var/stomp_range = 1 /// Stores directions the mob is moving, then calls that a move has fully ended when these directions are removed in moved var/stored_move_dirs = 0 /// If the wendigo is allowed to move var/can_move = TRUE /// Time before the wendigo can scream again - var/scream_cooldown_time = 5 SECONDS + var/scream_cooldown_time = 10 SECONDS /// Stores the last scream time so it doesn't spam it COOLDOWN_DECLARE(scream_cooldown) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 207ae7de7149..fcc5af943de2 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -336,14 +336,14 @@ GLOBAL_LIST_INIT(animatable_blacklist, list(/obj/structure/table, /obj/structure if(locked) return if(!opened) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, MIMIC_TRAIT) opened = TRUE icon_state = "crateopen" playsound(src, open_sound, 50, TRUE) for(var/atom/movable/AM in src) AM.forceMove(loc) else - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, MIMIC_TRAIT) opened = FALSE icon_state = "crate" playsound(src, close_sound, 50, TRUE) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm deleted file mode 100644 index c55f9ffb76b5..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm +++ /dev/null @@ -1,242 +0,0 @@ -#define BRIMBEAM_RANGE 10 - -/mob/living/simple_animal/hostile/asteroid/brimdemon - name = "brimdemon" - desc = "A misshapen demon with big, red eyes and a hinged mouth. Not much is known about the creatures \ - due to their response to any unexpected stimulus being \"brimbeam\", a deadly blood-laser barrage." - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "brimdemon" - icon_living = "brimdemon" - icon_dead = "brimdemon_dead" - mob_biotypes = MOB_ORGANIC|MOB_BEAST - speak_emote = list("cackles") - emote_taunt = list("screeches") - emote_hear = list("cackles","screeches") - istate = ISTATE_HARM|ISTATE_BLOCKING - stat_attack = HARD_CRIT - ranged_cooldown_time = 5 SECONDS - vision_range = 6 - retreat_distance = 2 - speed = 3 - move_to_delay = 5 - maxHealth = 250 - health = 250 - obj_damage = 15 - melee_damage_lower = 7.5 - melee_damage_upper = 7.5 - rapid_melee = 2 // every second attack - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - butcher_results = list( - /obj/item/food/meat/slab = 2, - /obj/effect/decal/cleanable/brimdust = 1, - /obj/item/organ/internal/monster_core/brimdust_sac = 1, - ) - loot = list() - robust_searching = TRUE - footstep_type = FOOTSTEP_MOB_CLAW - death_message = "wails as infernal energy escapes from its wounds, leaving it an empty husk." - death_sound = 'sound/magic/demon_dies.ogg' - light_color = LIGHT_COLOR_BLOOD_MAGIC - light_power = 5 - light_outer_range = 1.4 - crusher_loot = /obj/item/crusher_trophy/brimdemon_fang - /// Are we charging/firing? If yes stops our movement. - var/firing = FALSE - /// A list of all the beam parts. - var/list/beamparts = list() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/Destroy() - QDEL_LIST(beamparts) - return ..() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/Login() - ranged = TRUE - return ..() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/Logout() - ranged = FALSE - return ..() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/death() - firing = FALSE - cut_overlay("brimdemon_telegraph_dir") - move_resist = initial(move_resist) - return ..() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/Goto(target, delay, minimum_distance) - if(firing) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/MoveToTarget(list/possible_targets) - if(firing) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/AttackingTarget(atom/attacked_target) - if(firing) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/Move(atom/newloc, dir, step_x , step_y) - if(firing) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/OpenFire() - if(firing) - balloon_alert(src, "already firing!") - return - if(!COOLDOWN_FINISHED(src, ranged_cooldown)) - balloon_alert(src, "on cooldown!") - return - firing = TRUE - set_dir_on_move = FALSE - icon_state = "brimdemon_firing" - move_resist = MOVE_FORCE_VERY_STRONG - add_overlay("brimdemon_telegraph_dir") - visible_message(span_danger("[src] starts charging!")) - balloon_alert(src, "charging...") - addtimer(CALLBACK(src, PROC_REF(fire_laser)), 1 SECONDS) - COOLDOWN_START(src, ranged_cooldown, ranged_cooldown_time) - -/mob/living/simple_animal/hostile/asteroid/brimdemon/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - check_fire() - -/mob/living/simple_animal/hostile/asteroid/brimdemon/proc/check_fire() - if(key || QDELETED(target) || get_dist(src, target) > BRIMBEAM_RANGE || !(get_dir(src, target) in GLOB.cardinals)) - return - face_atom(target) - OpenFire() - -/// Fires a brimbeam, getting a line of turfs between it and the direction to the target and creating a brimbeam effect on every one of them. -/mob/living/simple_animal/hostile/asteroid/brimdemon/proc/fire_laser() - if(stat == DEAD) - return - visible_message(span_danger("[src] fires a brimbeam!")) - balloon_alert(src, "brimbeam fired") - playsound(src, 'sound/creatures/brimdemon.ogg', 150, FALSE, 0, 3) - cut_overlay("brimdemon_telegraph_dir") - var/turf/target_turf = get_ranged_target_turf(src, dir, BRIMBEAM_RANGE) - var/turf/origin_turf = get_turf(src) - var/list/affected_turfs = get_line(origin_turf, target_turf) - origin_turf - for(var/turf/affected_turf in affected_turfs) - var/blocked = FALSE - if(affected_turf.opacity) - blocked = TRUE - for(var/obj/potential_block in affected_turf.contents) - if(potential_block.opacity) - blocked = TRUE - break - if(blocked) - break - var/atom/new_brimbeam = new /obj/effect/brimbeam(affected_turf) - new_brimbeam.dir = dir - beamparts += new_brimbeam - for(var/mob/living/hit_mob in affected_turf.contents) - hit_mob.adjustFireLoss(25) - to_chat(hit_mob, span_userdanger("You're hit by [src]'s brimbeam!")) - if(length(beamparts)) - var/atom/last_brimbeam = beamparts[length(beamparts)] - last_brimbeam.icon_state = "brimbeam_end" - var/atom/first_brimbeam = beamparts[1] - first_brimbeam.icon_state = "brimbeam_start" - addtimer(CALLBACK(src, PROC_REF(end_laser)), 2 SECONDS) - -/// Deletes all the brimbeam parts and sets variables back to their initial ones. -/mob/living/simple_animal/hostile/asteroid/brimdemon/proc/end_laser() - if(stat != DEAD) - icon_state = initial(icon_state) - move_resist = initial(move_resist) - set_dir_on_move = initial(set_dir_on_move) - firing = FALSE - for(var/obj/effect/brimbeam/beam in beamparts) - animate(beam, time = 0.5 SECONDS, alpha = 0) - QDEL_IN(beam, 0.5 SECONDS) - beamparts -= beam - -/obj/effect/brimbeam - name = "brimbeam" - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "brimbeam_mid" - layer = ABOVE_MOB_LAYER - plane = ABOVE_GAME_PLANE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - light_color = LIGHT_COLOR_BLOOD_MAGIC - light_power = 3 - light_outer_range = 2 - -/obj/effect/brimbeam/Initialize(mapload) - . = ..() - START_PROCESSING(SSfastprocess, src) - -/obj/effect/brimbeam/Destroy() - STOP_PROCESSING(SSfastprocess, src) - return ..() - -/obj/effect/brimbeam/process() - for(var/mob/living/hit_mob in get_turf(src)) - damage(hit_mob) - -/obj/effect/brimbeam/proc/damage(mob/living/hit_mob) - hit_mob.adjustFireLoss(5) - to_chat(hit_mob, span_danger("You're damaged by [src]!")) - -/obj/item/crusher_trophy/brimdemon_fang - name = "brimdemon's fang" - icon_state = "brimdemon_fang" - desc = "A fang from a brimdemon's corpse." - denied_type = /obj/item/crusher_trophy/brimdemon_fang - var/static/list/comic_phrases = list("BOOM", "BANG", "KABLOW", "KAPOW", "OUCH", "BAM", "KAPOW", "WHAM", "POW", "KABOOM") - -/obj/item/crusher_trophy/brimdemon_fang/effect_desc() - return "mark detonation creates visual and audiosensory effects on the target" - -/obj/item/crusher_trophy/brimdemon_fang/on_mark_detonation(mob/living/target, mob/living/user) - target.balloon_alert_to_viewers("[pick(comic_phrases)]!") - playsound(target, 'sound/lavaland/brimdemon_crush.ogg', 100) - -/obj/effect/decal/cleanable/brimdust - name = "brimdust" - desc = "Dust from a brimdemon. It is considered valuable for its' botanical abilities." - icon_state = "brimdust" - icon = 'icons/obj/mining.dmi' - layer = FLOOR_CLEAN_LAYER - mergeable_decal = FALSE - -/obj/effect/decal/cleanable/brimdust/Initialize(mapload) - . = ..() - reagents.add_reagent(/datum/reagent/brimdust, 15) - -/obj/item/ore_sensor - name = "ore sensor" - desc = "Using demonic frequencies, this ear-mounted tool detects ores in the nearby terrain." - icon_state = "oresensor" - icon = 'icons/obj/mining.dmi' - slot_flags = ITEM_SLOT_EARS - var/range = 5 - var/cooldown = 4 SECONDS //between the standard and the advanced ore scanner in strength - COOLDOWN_DECLARE(ore_sensing_cooldown) - -/obj/item/ore_sensor/equipped(mob/user, slot, initial) - . = ..() - if(slot & ITEM_SLOT_EARS) - START_PROCESSING(SSobj, src) - else - STOP_PROCESSING(SSobj, src) - -/obj/item/ore_sensor/dropped(mob/user, silent) - . = ..() - STOP_PROCESSING(SSobj, src) - -/obj/item/ore_sensor/process(seconds_per_tick) - if(!COOLDOWN_FINISHED(src, ore_sensing_cooldown)) - return - COOLDOWN_START(src, ore_sensing_cooldown, cooldown) - mineral_scan_pulse(get_turf(src), range) - -#undef BRIMBEAM_RANGE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 77bd86b758f6..0055806b7d84 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -28,6 +28,7 @@ //Gives player-controlled variants the ability to swap attacks /mob/living/simple_animal/hostile/asteroid/elite/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) for(var/action_type in attack_action_types) var/datum/action/innate/elite_attack/attack_action = new action_type() attack_action.Grant(src) @@ -36,7 +37,7 @@ /mob/living/simple_animal/hostile/asteroid/elite/AttackingTarget() if(ishostile(target)) var/mob/living/simple_animal/hostile/M = target - if(faction_check_mob(M)) + if(faction_check_atom(M)) return FALSE if(istype(target, /obj/structure/elite_tumor)) var/obj/structure/elite_tumor/T = target diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm index 1ed9d778f918..73b57c4fe3b6 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm @@ -138,9 +138,7 @@ if(target) H.original = target H.fire(set_angle) - if(is_trishot) - shoot_projectile(marker, set_angle + 15, FALSE, FALSE) - shoot_projectile(marker, set_angle - 15, FALSE, FALSE) + //monke edit - removed heralds shotgun BS from his tri shot /mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_trishot(target) ranged_cooldown = world.time + 30 @@ -225,16 +223,15 @@ name ="death bolt" icon_state= "chronobolt" damage = 20 - armour_penetration = 50 + armour_penetration = 25 //was 50 changed because 50 was waay too much monkestation 20 edit speed = 2 - eyeblur = 0 damage_type = BRUTE pass_flags = PASSTABLE -/obj/projectile/herald/on_hit(atom/target, blocked = FALSE) +/obj/projectile/herald/on_hit(atom/target, blocked = 0, pierce_hit) if(ismob(target) && ismob(firer)) var/mob/living/mob_target = target - if(mob_target.faction_check_mob(firer)) + if(mob_target.faction_check_atom(firer)) damage = 0 . = ..() @@ -247,7 +244,7 @@ damage = 0 color = rgb(255,255,102) -/obj/projectile/herald/teleshot/on_hit(atom/target, blocked = FALSE) +/obj/projectile/herald/teleshot/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() firer.forceMove(get_turf(src)) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm index 613bcfd1f7ee..fa50663b9ca0 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm @@ -149,7 +149,7 @@ var/throwtarget = get_edge_target_turf(src, move_dir) for(var/mob/living/trample_target in T.contents - hit_things - src) hit_things += trample_target - if(faction_check_mob(trample_target)) + if(faction_check_atom(trample_target)) continue visible_message(span_boldwarning("[src] tramples and kicks [trample_target]!")) to_chat(trample_target, span_userdanger("[src] tramples you and kicks you away!")) @@ -328,10 +328,9 @@ /obj/item/crusher_trophy/legionnaire_spine/on_mark_detonation(mob/living/target, mob/living/user) if(!prob(bonus_value) || target.stat == DEAD) return - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion(user.loc) - A.GiveTarget(target) - A.friends += user - A.faction = user.faction.Copy() + var/mob/living/basic/legion_brood/minion = new (user.loc) + minion.assign_creator(user) + minion.ai_controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] = target /obj/item/crusher_trophy/legionnaire_spine/attack_self(mob/user) if(!isliving(user)) @@ -342,9 +341,9 @@ to_chat(LivingUser, "You need to wait longer to use this again.") return LivingUser.visible_message(span_boldwarning("[LivingUser] shakes the [src] and summons a legion skull!")) - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/LegionSkull = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion(LivingUser.loc) - LegionSkull.friends += LivingUser - LegionSkull.faction = LivingUser.faction.Copy() + + var/mob/living/basic/legion_brood/minion = new (LivingUser.loc) + minion.assign_creator(LivingUser) next_use_time = world.time + 4 SECONDS #undef LEGIONNAIRE_CHARGE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm index 0fae77d08ceb..b4f171a10ceb 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm @@ -147,13 +147,13 @@ new /obj/effect/temp_visual/hierophant/blast/damaging/pandora(t, src) animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out visible_message(span_hierophant_warning("[src] fades out!")) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, VANISHING_TRAIT) addtimer(CALLBACK(src, PROC_REF(pandora_teleport_3), T), 2) /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_3(turf/T) forceMove(T) animate(src, alpha = 255, time = 2, easing = EASE_IN) //fade IN - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, VANISHING_TRAIT) visible_message(span_hierophant_warning("[src] fades in!")) /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares(target) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm deleted file mode 100644 index 8858612f8cee..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm +++ /dev/null @@ -1,130 +0,0 @@ -//Gutlunches, passive mods that devour blood and gibs -/mob/living/simple_animal/hostile/asteroid/gutlunch - name = "gutlunch" - desc = "A scavenger that eats raw meat, often found alongside ash walkers. Produces a thick, nutritious milk." - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "gutlunch" - icon_living = "gutlunch" - icon_dead = "gutlunch" - mob_biotypes = MOB_ORGANIC|MOB_BEAST - speak_emote = list("warbles", "quavers") - emote_hear = list("trills.") - emote_see = list("sniffs.", "burps.") - weather_immunities = list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE) - faction = list(FACTION_MINING, FACTION_ASHWALKER) - density = FALSE - speak_chance = 1 - turns_per_move = 8 - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - move_to_delay = 15 - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - response_harm_continuous = "squishes" - response_harm_simple = "squish" - friendly_verb_continuous = "pinches" - friendly_verb_simple = "pinch" - istate = NONE - gold_core_spawnable = FRIENDLY_SPAWN - stat_attack = HARD_CRIT - gender = NEUTER - stop_automated_movement = FALSE - stop_automated_movement_when_pulled = TRUE - stat_exclusive = TRUE - robust_searching = TRUE - search_objects = 3 //Ancient simplemob AI shitcode. This makes them ignore all other mobs. - del_on_death = TRUE - loot = list(/obj/effect/decal/cleanable/blood/gibs) - death_message = "is pulped into bugmash." - - animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch - childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch = 100) - - wanted_objects = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/blood/gibs/, /obj/item/organ) - -/mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize(mapload) - . = ..() - if(wanted_objects.len) - AddComponent(/datum/component/udder, /obj/item/udder/gutlunch, CALLBACK(src, PROC_REF(regenerate_icons)), CALLBACK(src, PROC_REF(regenerate_icons))) - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - -/mob/living/simple_animal/hostile/asteroid/gutlunch/CanAttack(atom/the_target) // Gutlunch-specific version of CanAttack to handle stupid stat_exclusive = true crap so we don't have to do it for literally every single simple_animal/hostile except the two that spawn in lavaland - if(!the_target || !isturf(the_target.loc)) // bail out on invalids - return FALSE - - if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it - return FALSE - - if(isliving(the_target)) - var/mob/living/L = the_target - - if(faction_check_mob(L) && !attack_same) - return FALSE - if(L.stat > stat_attack || L.stat != stat_attack && stat_exclusive) - return FALSE - - return TRUE - - if(isobj(the_target) && is_type_in_typecache(the_target, wanted_objects)) - return TRUE - - return FALSE - -/mob/living/simple_animal/hostile/asteroid/gutlunch/regenerate_icons(new_udder_volume, max_udder_volume) - cut_overlays() - var/static/gutlunch_full_overlay - if(isnull(gutlunch_full_overlay)) - gutlunch_full_overlay = iconstate2appearance(icon, "gl_full") - if(new_udder_volume == max_udder_volume) - add_overlay(gutlunch_full_overlay) - ..() - -//Male gutlunch. They're smaller and more colorful! -/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck - name = "gubbuck" - gender = MALE - -/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck/Initialize(mapload) - . = ..() - add_atom_colour(pick("#E39FBB", "#D97D64", "#CF8C4A"), FIXED_COLOUR_PRIORITY) - resize = 0.85 - update_transform() - -//Lady gutlunch. They make the babby. -/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen - name = "guthen" - gender = FEMALE - -/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch - name = "grublunch" - wanted_objects = list() //They don't eat. - gold_core_spawnable = NO_SPAWN - var/growth = 0 - -//Baby gutlunch -/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch/Initialize(mapload) - . = ..() - add_atom_colour("#9E9E9E", FIXED_COLOUR_PRIORITY) //Somewhat hidden - resize = 0.45 - update_transform() - -/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch/Life(seconds_per_tick = SSMOBS_DT, times_fired) - ..() - growth++ - if(growth > 50) //originally used a timer for this but it was more of a problem than it was worth. - growUp() - -/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch/proc/growUp() - var/mob/living/L - if(prob(45)) - L = new /mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck(loc) - else - L = new /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen(loc) - mind?.transfer_to(L) - L.faction = faction - L.setDir(dir) - L.Stun(20, ignore_canstun = TRUE) - visible_message(span_notice("[src] grows up into [L].")) - qdel(src) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm deleted file mode 100644 index 90cedd348418..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ /dev/null @@ -1,320 +0,0 @@ -/mob/living/simple_animal/hostile/asteroid/hivelord - name = "hivelord" - desc = "A truly alien creature, it is a mass of unknown organic material, constantly fluctuating. When attacking, pieces of it split off and attack in tandem with the original." - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "Hivelord" - icon_living = "Hivelord" - icon_aggro = "Hivelord_alert" - icon_dead = "Hivelord_dead" - icon_gib = "syndicate_gib" - mob_biotypes = MOB_ORGANIC - move_to_delay = 14 - ranged = 1 - vision_range = 5 - aggro_vision_range = 9 - speed = 3 - maxHealth = 75 - health = 75 - harm_intent_damage = 5 - melee_damage_lower = 0 - melee_damage_upper = 0 - attack_verb_continuous = "lashes out at" - attack_verb_simple = "lash out at" - speak_emote = list("telepathically cries") - attack_sound = 'sound/weapons/pierce.ogg' - throw_message = "falls right through the strange body of the" - ranged_cooldown = 0 - ranged_cooldown_time = 20 - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - retreat_distance = 3 - minimum_distance = 3 - pass_flags = PASSTABLE - loot = list(/obj/item/organ/internal/monster_core/regenerative_core) - var/brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood - var/has_clickbox = TRUE - -/mob/living/simple_animal/hostile/asteroid/hivelord/Initialize(mapload) - . = ..() - if(has_clickbox) - AddComponent(/datum/component/clickbox, icon_state = "hivelord", max_scale = INFINITY, dead_state = "hivelord_dead") //they writhe so much. - -/mob/living/simple_animal/hostile/asteroid/hivelord/OpenFire(the_target) - if(world.time >= ranged_cooldown) - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/A = new brood_type(src.loc) - - A.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) - A.GiveTarget(target) - A.friends = friends - A.faction = faction.Copy() - ranged_cooldown = world.time + ranged_cooldown_time - -/mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget() - OpenFire() - return TRUE - -/mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed) - mouse_opacity = MOUSE_OPACITY_ICON - ..(gibbed) - -//A fragile but rapidly produced creature -/mob/living/simple_animal/hostile/asteroid/hivelordbrood - name = "hivelord brood" - desc = "A fragment of the original Hivelord, rallying behind its original. One isn't much of a threat, but..." - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "Hivelordbrood" - icon_living = "Hivelordbrood" - icon_aggro = "Hivelordbrood" - icon_dead = "Hivelordbrood" - icon_gib = "syndicate_gib" - move_to_delay = 1 - friendly_verb_continuous = "buzzes near" - friendly_verb_simple = "buzz near" - vision_range = 10 - speed = 3 - maxHealth = 1 - health = 1 - harm_intent_damage = 5 - melee_damage_lower = 2 - melee_damage_upper = 2 - attack_verb_continuous = "slashes" - attack_verb_simple = "slash" - speak_emote = list("telepathically cries") - attack_sound = 'sound/weapons/pierce.ogg' - attack_vis_effect = ATTACK_EFFECT_SLASH - throw_message = "falls right through the strange body of the" - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - pass_flags = PASSTABLE | PASSMOB - density = TRUE - del_on_death = 1 - var/clickbox_state = "hivelord" - var/clickbox_max_scale = INFINITY - -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/Initialize(mapload) - . = ..() - addtimer(CALLBACK(src, PROC_REF(death)), 100) - AddElement(/datum/element/simple_flying) - AddComponent(/datum/component/swarming) - AddComponent(/datum/component/clickbox, icon_state = clickbox_state, max_scale = clickbox_max_scale) - -//Legion -/mob/living/simple_animal/hostile/asteroid/hivelord/legion - name = "legion" - desc = "You can still see what was once a human under the shifting mass of corruption." - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "legion" - icon_living = "legion" - icon_aggro = "legion" - icon_dead = "legion" - icon_gib = "syndicate_gib" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - mouse_opacity = MOUSE_OPACITY_ICON - obj_damage = 60 - melee_damage_lower = 15 - melee_damage_upper = 15 - attack_verb_continuous = "lashes out at" - attack_verb_simple = "lash out at" - speak_emote = list("echoes") - attack_sound = 'sound/weapons/pierce.ogg' - throw_message = "bounces harmlessly off of" - crusher_loot = /obj/item/crusher_trophy/legion_skull - loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion) - brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion - del_on_death = 1 - stat_attack = HARD_CRIT - robust_searching = 1 - has_clickbox = FALSE - var/dwarf_mob = FALSE - var/mob/living/carbon/human/stored_mob - -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/random/Initialize(mapload) - . = ..() - if(prob(5)) - new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(loc) - return INITIALIZE_HINT_QDEL - -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf - name = "dwarf legion" - desc = "You can still see what was once a rather small human under the shifting mass of corruption." - icon_state = "dwarf_legion" - icon_living = "dwarf_legion" - icon_aggro = "dwarf_legion" - icon_dead = "dwarf_legion" - maxHealth = 60 - health = 60 - speed = 2 //faster! - crusher_drop_mod = 20 - dwarf_mob = TRUE - -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/death(gibbed) - visible_message(span_warning("The skulls on [src] wail in anger as they flee from their dying host!")) - var/turf/T = get_turf(src) - if(T) - if(stored_mob) - stored_mob.forceMove(get_turf(src)) - stored_mob = null - else if(fromtendril) - new /obj/effect/mob_spawn/corpse/human/charredskeleton(T) - else if(dwarf_mob) - new /obj/effect/mob_spawn/corpse/human/legioninfested/dwarf(T) - else - new /obj/effect/mob_spawn/corpse/human/legioninfested(T) - ..(gibbed) - -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril - fromtendril = TRUE - -//Legion skull -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion - name = "legion" - desc = "One of many." - icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi' - icon_state = "legion_head" - icon_living = "legion_head" - icon_aggro = "legion_head" - icon_dead = "legion_head" - icon_gib = "syndicate_gib" - friendly_verb_continuous = "buzzes near" - friendly_verb_simple = "buzz near" - vision_range = 10 - maxHealth = 1 - health = 5 - harm_intent_damage = 5 - melee_damage_lower = 12 - melee_damage_upper = 12 - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_vis_effect = ATTACK_EFFECT_BITE - speak_emote = list("echoes") - attack_sound = 'sound/weapons/pierce.ogg' - throw_message = "is shrugged off by" - del_on_death = TRUE - stat_attack = HARD_CRIT - robust_searching = 1 - clickbox_state = "sphere" - clickbox_max_scale = 2 - var/can_infest_dead = FALSE - -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life(seconds_per_tick = SSMOBS_DT, times_fired) - . = ..() - if(stat == DEAD || !isturf(loc)) - return - for(var/mob/living/carbon/human/victim in range(src, 1)) //Only for corpse right next to/on same tile - switch(victim.stat) - if(UNCONSCIOUS, HARD_CRIT) - infest(victim) - return //This will qdelete the legion. - if(DEAD) - if(can_infest_dead) - infest(victim) - return //This will qdelete the legion. - -///Create a legion at the location of a corpse. Exists so that legion subtypes can override it with their own type of legion. -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/make_legion(mob/living/carbon/human/H) - if(HAS_TRAIT(H, TRAIT_DWARF)) //dwarf legions aren't just fluff! - return new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc) - else - return new /mob/living/simple_animal/hostile/asteroid/hivelord/legion(H.loc) - -///Create a new legion using the supplied human H -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H) - visible_message(span_warning("[name] burrows into the flesh of [H]!")) - var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L = make_legion(H) - visible_message(span_warning("[L] staggers to [L.p_their()] feet!")) - H.investigate_log("has been killed by hivelord infestation.", INVESTIGATE_DEATHS) - H.death() - H.adjustBruteLoss(1000) - L.stored_mob = H - H.forceMove(L) - qdel(src) - -//Advanced Legion is slightly tougher to kill and can raise corpses (revive other legions) -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/advanced - stat_attack = DEAD - maxHealth = 120 - health = 120 - brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced - icon_state = "dwarf_legion" - icon_living = "dwarf_legion" - icon_aggro = "dwarf_legion" - icon_dead = "dwarf_legion" - -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced - stat_attack = DEAD - can_infest_dead = TRUE - -//Legion that spawns Legions -/mob/living/simple_animal/hostile/big_legion - name = "legion" - desc = "One of many." - icon = 'icons/mob/simple/lavaland/64x64megafauna.dmi' - icon_state = "legion" - icon_living = "legion" - icon_dead = "legion" - health_doll_icon = "legion" - health = 450 - maxHealth = 450 - melee_damage_lower = 20 - melee_damage_upper = 20 - anchored = FALSE - AIStatus = AI_ON - stop_automated_movement = FALSE - wander = TRUE - maxbodytemp = INFINITY - layer = MOB_LAYER - del_on_death = TRUE - sentience_type = SENTIENCE_BOSS - loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion = 3, /obj/effect/mob_spawn/corpse/human/legioninfested = 5) - move_to_delay = 14 - vision_range = 5 - aggro_vision_range = 9 - speed = 3 - faction = list(FACTION_MINING) - weather_immunities = list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE) - obj_damage = 30 - environment_smash = ENVIRONMENT_SMASH_STRUCTURES - // Purple, but bright cause we're gonna need to spot mobs on lavaland - lighting_cutoff_red = 35 - lighting_cutoff_green = 20 - lighting_cutoff_blue = 45 - - -/mob/living/simple_animal/hostile/big_legion/Initialize(mapload) - .=..() - AddComponent(\ - /datum/component/spawner,\ - spawn_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion),\ - spawn_time = 20 SECONDS,\ - max_spawned = 3,\ - spawn_text = "peels itself off from",\ - faction = faction,\ - ) - -// Snow Legion -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow - name = "snow legion" - desc = "You can still see what was once a human under the shifting snowy mass, clearly decorated by a clown." - icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' - icon_state = "snowlegion" - icon_living = "snowlegion" - icon_aggro = "snowlegion_alive" - icon_dead = "snowlegion" - crusher_loot = /obj/item/crusher_trophy/legion_skull - loot = list(/obj/item/organ/internal/monster_core/regenerative_core/legion) - brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow - weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) - -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow/make_legion(mob/living/carbon/human/H) - return new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow(H.loc) - -// Snow Legion skull -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow - name = "snow legion" - desc = "One of many." - icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' - icon_state = "snowlegion_head" - icon_living = "snowlegion_head" - icon_aggro = "snowlegion_head" - icon_dead = "snowlegion_head" - weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm deleted file mode 100644 index 9d84fe2e1fe8..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm +++ /dev/null @@ -1,85 +0,0 @@ -/mob/living/simple_animal/hostile/asteroid/ice_demon - name = "demonic watcher" - desc = "A creature formed entirely out of ice, bluespace energy emanates from inside of it." - icon = 'icons/mob/simple/icemoon/icemoon_monsters.dmi' - icon_state = "ice_demon" - icon_living = "ice_demon" - icon_dead = "ice_demon_dead" - icon_gib = "syndicate_gib" - mob_biotypes = MOB_ORGANIC|MOB_BEAST - mouse_opacity = MOUSE_OPACITY_ICON - speak_emote = list("telepathically cries") - speed = 2 - move_to_delay = 2 - projectiletype = /obj/projectile/temp/ice_demon - projectilesound = 'sound/weapons/pierce.ogg' - ranged = TRUE - ranged_message = "manifests ice" - ranged_cooldown_time = 1.5 SECONDS - minimum_distance = 3 - retreat_distance = 3 - maxHealth = 150 - health = 150 - obj_damage = 40 - melee_damage_lower = 15 - melee_damage_upper = 15 - attack_verb_continuous = "slices" - attack_verb_simple = "slice" - attack_sound = 'sound/weapons/bladeslice.ogg' - attack_vis_effect = ATTACK_EFFECT_SLASH - vision_range = 9 - aggro_vision_range = 9 - move_force = MOVE_FORCE_VERY_STRONG - move_resist = MOVE_FORCE_VERY_STRONG - pull_force = MOVE_FORCE_VERY_STRONG - del_on_death = TRUE - loot = list() - crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing - death_message = "fades as the energies that tied it to this world dissipate." - death_sound = 'sound/magic/demon_dies.ogg' - stat_attack = HARD_CRIT - robust_searching = TRUE - footstep_type = FOOTSTEP_MOB_CLAW - /// Distance the demon will teleport from the target - var/teleport_distance = 3 - -/mob/living/simple_animal/hostile/asteroid/ice_demon/Initialize(mapload) - . = ..() - AddElement(/datum/element/simple_flying) - -/obj/projectile/temp/ice_demon - name = "ice blast" - icon_state = "ice_2" - damage = 5 - damage_type = BURN - armor_flag = ENERGY - speed = 1 - pixel_speed_multiplier = 0.25 - range = 200 - temperature = -75 - -/mob/living/simple_animal/hostile/asteroid/ice_demon/OpenFire() - ranged_cooldown = world.time + ranged_cooldown_time - // Sentient ice demons teleporting has been linked to server crashes - if(client) - return ..() - if(teleport_distance <= 0) - return ..() - var/list/possible_ends = view(teleport_distance, target.loc) - view(teleport_distance - 1, target.loc) - for(var/turf/closed/turf_to_remove in possible_ends) - possible_ends -= turf_to_remove - if(!possible_ends.len) - return ..() - var/turf/end = pick(possible_ends) - do_teleport(src, end, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE) - SLEEP_CHECK_DEATH(8, src) - return ..() - -/mob/living/simple_animal/hostile/asteroid/ice_demon/death(gibbed) - move_force = MOVE_FORCE_DEFAULT - move_resist = MOVE_RESIST_DEFAULT - pull_force = PULL_FORCE_DEFAULT - new /obj/item/stack/ore/bluespace_crystal(loc, 3) - if(prob(5)) - new /obj/item/raw_anomaly_core/bluespace(loc) - return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm deleted file mode 100644 index 2b81c6612cb9..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm +++ /dev/null @@ -1,111 +0,0 @@ -/mob/living/simple_animal/hostile/nanotrasen - name = "\improper Nanotrasen Private Security Officer" - desc = "An officer part of Nanotrasen's private security force, he seems rather unpleased to meet you." - icon = 'icons/mob/simple/simple_human.dmi' - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - sentience_type = SENTIENCE_HUMANOID - speak_chance = 0 - turns_per_move = 5 - speed = 0 - stat_attack = HARD_CRIT - robust_searching = 1 - maxHealth = 100 - health = 100 - harm_intent_damage = 5 - melee_damage_lower = 10 - melee_damage_upper = 15 - attack_verb_continuous = "punches" - attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' - istate = ISTATE_HARM|ISTATE_BLOCKING - loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasensoldier) - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 7.5 - faction = list(ROLE_DEATHSQUAD) - check_friendly_fire = TRUE - status_flags = CANPUSH - del_on_death = TRUE - dodging = TRUE - footstep_type = FOOTSTEP_MOB_SHOE - /// Path of the mob spawner we base the mob's visuals off of. - var/mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasensoldier - /// Path of the held item we give to the mob's visuals. - var/held_item - -/mob/living/simple_animal/hostile/nanotrasen/Initialize(mapload) - . = ..() - apply_dynamic_human_appearance(src, mob_spawn_path = mob_spawner, r_hand = held_item) - -/mob/living/simple_animal/hostile/nanotrasen/screaming/Aggro() - ..() - summon_backup(15) - say("411 in progress, requesting backup!") - -/mob/living/simple_animal/hostile/nanotrasen/ranged - icon_state = "nanotrasenranged" - icon_living = "nanotrasenranged" - ranged = 1 - retreat_distance = 3 - minimum_distance = 5 - casingtype = /obj/item/ammo_casing/c45 - projectilesound = 'sound/weapons/gun/pistol/shot_alt.ogg' - held_item = /obj/item/gun/ballistic/automatic/pistol/m1911 - -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg - icon_state = "nanotrasenrangedsmg" - icon_living = "nanotrasenrangedsmg" - rapid = 3 - casingtype = /obj/item/ammo_casing/c46x30mm - projectilesound = 'sound/weapons/gun/smg/shot.ogg' - held_item = /obj/item/gun/ballistic/automatic/wt550 - - -/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace - name = "\improper Nanotrasen Private Security Officer" - desc = "An officer part of Nanotrasen's private security force." - icon = 'icons/mob/simple/simple_human.dmi' - turns_per_move = 5 - speed = 0 - stat_attack = HARD_CRIT - robust_searching = 1 - vision_range = 3 - maxHealth = 100 - health = 100 - harm_intent_damage = 5 - melee_damage_lower = 10 - melee_damage_upper = 15 - attack_verb_continuous = "punches" - attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' - faction = list(FACTION_NANOTRASEN_PRIVATE) - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - sentience_type = SENTIENCE_HUMANOID - istate = ISTATE_HARM|ISTATE_BLOCKING - loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasensoldier) - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 7.5 - status_flags = CANPUSH - search_objects = 1 - /// Path of the held item we give to the mob's visuals. - var/held_item - -/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/Initialize(mapload) - . = ..() - apply_dynamic_human_appearance(src, mob_spawn_path = /obj/effect/mob_spawn/corpse/human/nanotrasensoldier, r_hand = held_item) - -/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/Aggro() - ..() - summon_backup(15) - say("411 in progress, requesting backup!") - -/mob/living/simple_animal/hostile/retaliate/nanotrasenpeace/ranged - vision_range = 9 - rapid = 3 - ranged = 1 - retreat_distance = 3 - minimum_distance = 5 - casingtype = /obj/item/ammo_casing/c46x30mm - projectilesound = 'sound/weapons/gun/smg/shot.ogg' - loot = list(/obj/item/gun/ballistic/automatic/wt550, - /obj/effect/mob_spawn/corpse/human/nanotrasensoldier) - held_item = /obj/item/gun/ballistic/automatic/wt550 diff --git a/code/modules/mob/living/simple_animal/hostile/ooze.dm b/code/modules/mob/living/simple_animal/hostile/ooze.dm index 3bcbf3b7d85d..695dcc9e4c4e 100644 --- a/code/modules/mob/living/simple_animal/hostile/ooze.dm +++ b/code/modules/mob/living/simple_animal/hostile/ooze.dm @@ -295,7 +295,7 @@ /mob/living/simple_animal/hostile/ooze/grapes/add_cell_sample() AddElement(/datum/element/swabable, CELL_LINE_TABLE_GRAPE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) -///Ability that allows the owner to fire healing globules at mobs, targetting specific limbs. +///Ability that allows the owner to fire healing globules at mobs, targeting specific limbs. /datum/action/cooldown/globules name = "Fire Mending globule" desc = "Fires a mending globule at someone, healing a specific limb of theirs." diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm index 237360468f8d..bf1c12d5da1e 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/retaliate.dm @@ -37,7 +37,7 @@ continue if(isliving(A)) var/mob/living/M = A - if(faction_check_mob(M) && attack_same || !faction_check_mob(M)) + if(faction_check_atom(M) && attack_same || !faction_check_atom(M)) enemies |= WEAKREF(M) else if(ismecha(A)) var/obj/vehicle/sealed/mecha/M = A @@ -46,7 +46,7 @@ add_enemies(M.occupants) for(var/mob/living/simple_animal/hostile/retaliate/H in around) - if(faction_check_mob(H) && !attack_same && !H.attack_same) + if(faction_check_atom(H) && !attack_same && !H.attack_same) H.enemies |= enemies /mob/living/simple_animal/hostile/retaliate/adjustHealth(amount, updating_health = TRUE, forced = FALSE) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/snake.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/snake.dm deleted file mode 100644 index e128349bc2e8..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/snake.dm +++ /dev/null @@ -1,76 +0,0 @@ - -/mob/living/simple_animal/hostile/retaliate/snake - name = "snake" - desc = "A slithery snake. These legless reptiles are the bane of mice and adventurers alike." - icon_state = "snake" - icon_living = "snake" - icon_dead = "snake_dead" - speak_emote = list("hisses") - health = 20 - maxHealth = 20 - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - melee_damage_lower = 5 - melee_damage_upper = 6 - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "shoos" - response_disarm_simple = "shoo" - response_harm_continuous = "steps on" - response_harm_simple = "step on" - faction = list(FACTION_HOSTILE) - density = FALSE - pass_flags = PASSTABLE | PASSMOB - mob_size = MOB_SIZE_SMALL - mob_biotypes = MOB_ORGANIC|MOB_BEAST|MOB_REPTILE - gold_core_spawnable = FRIENDLY_SPAWN - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - -/mob/living/simple_animal/hostile/retaliate/snake/Initialize(mapload, special_reagent) - . = ..() - add_cell_sample() - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - if(!special_reagent) - special_reagent = /datum/reagent/toxin - AddElement(/datum/element/venomous, special_reagent, 4) - -/mob/living/simple_animal/hostile/retaliate/snake/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_SNAKE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - -/mob/living/simple_animal/hostile/retaliate/snake/ListTargets(atom/the_target) - var/atom/target_from = GET_TARGETS_FROM(src) - . = oview(vision_range, target_from) //get list of things in vision range - var/list/living_mobs = list() - var/list/mice = list() - for (var/HM in .) - //Yum a tasty mouse - if(ismouse(HM)) - mice += HM - if(isliving(HM)) - living_mobs += HM - - // if no tasty mice to chase, lets chase any living mob enemies in our vision range - if(length(mice)) - return mice - - var/list/actual_enemies = list() - for(var/datum/weakref/enemy as anything in enemies) - var/mob/flesh_and_blood = enemy.resolve() - if(!flesh_and_blood) - enemies -= enemy - continue - actual_enemies += flesh_and_blood - - //Filter living mobs (in range mobs) by those we consider enemies (retaliate behaviour) - return living_mobs & actual_enemies - -/mob/living/simple_animal/hostile/retaliate/snake/AttackingTarget() - if(ismouse(target)) - visible_message(span_notice("[name] consumes [target] in a single gulp!"), span_notice("You consume [target] in a single gulp!")) - QDEL_NULL(target) - adjustBruteLoss(-2) - else - return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/trader.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/trader.dm deleted file mode 100644 index e637638e7ebe..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/trader.dm +++ /dev/null @@ -1,501 +0,0 @@ -#define ITEM_REJECTED_PHRASE "ITEM_REJECTED_PHRASE" -#define ITEM_SELLING_CANCELED_PHRASE "ITEM_SELLING_CANCELED_PHRASE" -#define ITEM_SELLING_ACCEPTED_PHRASE "ITEM_SELLING_ACCEPTED_PHRASE" -#define INTERESTED_PHRASE "INTERESTED_PHRASE" -#define BUY_PHRASE "BUY_PHRASE" -#define NO_CASH_PHRASE "NO_CASH_PHRASE" -#define NO_STOCK_PHRASE "NO_STOCK_PHRASE" -#define NOT_WILLING_TO_BUY_PHRASE "NOT_WILLING_TO_BUY_PHRASE" -#define ITEM_IS_WORTHLESS_PHRASE "ITEM_IS_WORTHLESS_PHRASE" -#define TRADER_HAS_ENOUGH_ITEM_PHRASE "TRADER_HAS_ENOUGH_ITEM_PHRASE" -#define TRADER_LORE_PHRASE "TRADER_LORE_PHRASE" -#define TRADER_NOT_BUYING_ANYTHING "TRADER_NOT_BUYING_ANYTHING" -#define TRADER_NOT_SELLING_ANYTHING "TRADER_NOT_SELLING_ANYTHING" - -#define TRADER_PRODUCT_INFO_PRICE 1 -#define TRADER_PRODUCT_INFO_QUANTITY 2 -//Only valid for wanted_items -#define TRADER_PRODUCT_INFO_PRICE_MOD_DESCRIPTION 3 - -/** - * # Trader - * - * A mob that has some dialogue options with radials, allows for selling items and buying em' - * - */ -/mob/living/simple_animal/hostile/retaliate/trader - name = "Trader" - desc = "Come buy some!" - icon = 'icons/mob/simple/traders.dmi' - icon_state = "faceless" - maxHealth = 200 - health = 200 - melee_damage_lower = 10 - melee_damage_upper = 10 - attack_verb_continuous = "punches" - attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' - del_on_death = TRUE - loot = list(/obj/effect/mob_spawn/corpse/human) - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 2.5 - casingtype = /obj/item/ammo_casing/shotgun/buckshot - wander = FALSE - ranged = TRUE - istate = ISTATE_HARM|ISTATE_BLOCKING - move_resist = MOVE_FORCE_STRONG - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - sentience_type = SENTIENCE_HUMANOID - speed = 0 - stat_attack = HARD_CRIT - robust_searching = TRUE - check_friendly_fire = TRUE - interaction_flags_atom = INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND|INTERACT_ATOM_ATTACK_HAND|INTERACT_ATOM_NO_FINGERPRINT_INTERACT - ///Sound used when item sold/bought - var/sell_sound = 'sound/effects/cashregister.ogg' - /** - * Format; list(TYPEPATH = list(PRICE, QUANTITY)) - * Associated list of items the NPC sells with how much they cost and the quantity available before a restock - * This list is filled by Initialize(), if you want to change the starting products, modify initial_products() - * * - */ - var/list/products - /** - * A list of wanted items that the trader would wish to buy, each typepath has a assigned value, quantity and additional flavor text - * - * CHILDREN OF TYPEPATHS INCLUDED IN WANTED_ITEMS WILL BE TREATED AS THE PARENT IF NO ENTRY EXISTS FOR THE CHILDREN - * - * As an additional note; if you include multiple children of a typepath; the typepath with the most children should be placed after all other typepaths - * Bad; list(/obj/item/milk = list(100, 1, ""), /obj/item/milk/small = list(50, 2, "")) - * Good; list(/obj/item/milk/small = list(50, 2, ""), /obj/item/milk = list(100, 1, "")) - * This is mainly because sell_item() uses a istype(item_being_sold, item_in_entry) to determine what parent should the child be automatically considered as - * If /obj/item/milk/small/spooky was being sold; /obj/item/milk/small would be the first to check against rather than /obj/item/milk - * - * Format; list(TYPEPATH = list(PRICE, QUANTITY, ADDITIONAL_DESCRIPTION)) - * Associated list of items able to be sold to the NPC with the money given for them. - * The price given should be the "base" price; any price manipulation based on variables should be done with apply_sell_price_mods() - * ADDITIONAL_DESCRIPTION is any additional text added to explain how the variables of the item effect the price; if it's stack based, it's final price depends how much is in the stack - * EX; /obj/item/stack/sheet/mineral/diamond = list(500, INFINITY, ", per 2000 cm3 sheet of diamond") - * This list is filled by Initialize(), if you want to change the starting wanted items, modify initial_wanteds() - */ - var/list/wanted_items - ///Associated list of defines matched with list of phrases; phrase to be said is dealt by return_trader_phrase() - var/list/say_phrases = list( - ITEM_REJECTED_PHRASE = list( - "Sorry, I'm not a fan of anything you're showing me. Give me something better and we'll talk." - ), - ITEM_SELLING_CANCELED_PHRASE = list( - "What a shame, tell me if you changed your mind." - ), - ITEM_SELLING_ACCEPTED_PHRASE = list( - "Pleasure doing business with you." - ), - INTERESTED_PHRASE = list( - "Hey, you've got an item that interests me, I'd like to buy it, I'll give you some cash for it, deal?" - ), - BUY_PHRASE = list( - "Pleasure doing business with you." - ), - NO_CASH_PHRASE = list( - "Sorry adventurer, I can't give credit! Come back when you're a little mmmmm... richer!" - ), - NO_STOCK_PHRASE = list( - "Sorry adventurer, but that item is not in stock at the moment." - ), - NOT_WILLING_TO_BUY_PHRASE = list( - "I don't want to buy that item for the time being, check back another time." - ), - ITEM_IS_WORTHLESS_PHRASE = list( - "This item seems to be worthless on a closer look, I won't buy this." - ), - TRADER_HAS_ENOUGH_ITEM_PHRASE = list( - "I already bought enough of this for the time being." - ), - TRADER_LORE_PHRASE = list( - "Hello! I am the test trader.", - "Oooooooo~!" - ), - TRADER_NOT_BUYING_ANYTHING = list( - "I'm currently buying nothing at the moment." - ), - TRADER_NOT_SELLING_ANYTHING = list( - "I'm currently selling nothing at the moment." - ), - ) - ///The name of the currency that is used when buying or selling items - var/currency_name = "credits" - -///Initializes the products and item demands of the trader -/mob/living/simple_animal/hostile/retaliate/trader/Initialize(mapload) - . = ..() - restock_products() - renew_item_demands() - -///Returns a list of the starting price/quanity/fluff text about the product listings; products = initial(products) doesn't work so this exists mainly for restock_products() -/mob/living/simple_animal/hostile/retaliate/trader/proc/initial_products() - return list(/obj/item/food/burger/ghost = list(200, INFINITY), - ) - -///Returns a list of the starting price/quanity/fluff text about the wanted items; wanted_items = initial(wanted_items) doesn't work so this exists mainly for renew_item_demands() -/mob/living/simple_animal/hostile/retaliate/trader/proc/initial_wanteds() - return list(/obj/item/ectoplasm = list(100, INFINITY, ""), - ) - -/** - * Depending on the passed parameter/override, returns a randomly picked string out of a list - * - * Do note when overriding this argument, you will need to ensure pick(the list) doesn't get supplied with a list of zero length - * Arguments: - * * say_text - (String) a define that matches the key of a entry in say_phrases - */ -/mob/living/simple_animal/hostile/retaliate/trader/proc/return_trader_phrase(say_text) - if(!length(say_phrases[say_text])) - return - return pick(say_phrases[say_text]) - //return (length(say_phrases[say_text]) ? pick(say_phrases[say_text]) : "") - -///Sets up the radials for the user and calls procs related to the actions the user wants to take -/mob/living/simple_animal/hostile/retaliate/trader/interact(mob/user) - if(user == target) - return FALSE - var/list/npc_options = list() - if(products.len) - npc_options["Buy"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_buy") - if(length(say_phrases[TRADER_LORE_PHRASE])) - npc_options["Talk"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_talk") - if(wanted_items.len) - npc_options["Sell"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_sell") - if(!npc_options.len) - return FALSE - var/npc_result = show_radial_menu(user, src, npc_options, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) - switch(npc_result) - if("Buy") - buy_item(user) - if("Sell") - try_sell(user) - if("Talk") - discuss(user) - face_atom(user) - return TRUE - -/** - * Checks if the user is ok to use the radial - * - * Checks if the user is not a mob or is incapacitated or not adjacent to the source of the radial, in those cases returns FALSE, otherwise returns TRUE - * Arguments: - * * user - (Mob REF) The mob checking the menu - */ -/mob/living/simple_animal/hostile/retaliate/trader/proc/check_menu(mob/user) - if(!istype(user)) - return FALSE - if(user.incapacitated() || !user.Adjacent(src)) - return FALSE - return TRUE - -///Talk about what items are being sold/wanted by the trader and in what quantity or lore -/mob/living/simple_animal/hostile/retaliate/trader/proc/discuss(mob/user) - var/list/npc_options = list( - "Lore" = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_lore"), - "Selling?" = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_selling"), - "Buying?" = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_buying"), - ) - var/pick = show_radial_menu(user, src, npc_options, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) - switch(pick) - if("Lore") - say(return_trader_phrase(TRADER_LORE_PHRASE)) - if("Buying?") - trader_buys_what(user) - if("Selling?") - trader_sells_what(user) - -///Displays to the user what the trader is willing to buy and how much until a restock happens -/mob/living/simple_animal/hostile/retaliate/trader/proc/trader_buys_what(mob/user) - if(!wanted_items.len) - say(return_trader_phrase(TRADER_NOT_BUYING_ANYTHING)) - return - var/list/product_info - to_chat(user, span_green("I'm willing to buy the following; ")) - for(var/obj/item/thing as anything in wanted_items) - product_info = wanted_items[thing] - var/tern_op_result = (product_info[TRADER_PRODUCT_INFO_QUANTITY] == INFINITY ? "as many as I can." : "[product_info[TRADER_PRODUCT_INFO_QUANTITY]]") //Coder friendly string concat - if(product_info[TRADER_PRODUCT_INFO_QUANTITY] <= 0) //Zero demand - to_chat(user, span_notice("[span_red("(DOESN'T WANT MORE)")] [initial(thing.name)] for [product_info[TRADER_PRODUCT_INFO_PRICE]] [currency_name][product_info[TRADER_PRODUCT_INFO_PRICE_MOD_DESCRIPTION]]; willing to buy [span_red("[tern_op_result]")] more.")) - else - to_chat(user, span_notice("[initial(thing.name)] for [product_info[TRADER_PRODUCT_INFO_PRICE]] [currency_name][product_info[TRADER_PRODUCT_INFO_PRICE_MOD_DESCRIPTION]]; willing to buy [span_green("[tern_op_result]")]")) - -///Displays to the user what the trader is selling and how much is in stock -/mob/living/simple_animal/hostile/retaliate/trader/proc/trader_sells_what(mob/user) - if(!products.len) - say(return_trader_phrase(TRADER_NOT_SELLING_ANYTHING)) - return - var/list/product_info - to_chat(user, span_green("I'm currently selling the following; ")) - for(var/obj/item/thing as anything in products) - product_info = products[thing] - var/tern_op_result = (product_info[TRADER_PRODUCT_INFO_QUANTITY] == INFINITY ? "an infinite amount" : "[product_info[TRADER_PRODUCT_INFO_QUANTITY]]") //Coder friendly string concat - if(product_info[TRADER_PRODUCT_INFO_QUANTITY] <= 0) //Out of stock - to_chat(user, span_notice("[span_red("(OUT OF STOCK)")] [initial(thing.name)] for [product_info[TRADER_PRODUCT_INFO_PRICE]] [currency_name]; [span_red("[tern_op_result]")] left in stock")) - else - to_chat(user, span_notice("[initial(thing.name)] for [product_info[TRADER_PRODUCT_INFO_PRICE]] [currency_name]; [span_green("[tern_op_result]")] left in stock")) - -/** - * Generates a radial of the items the NPC sells and lets the user try to buy one - * Arguments: - * * user - (Mob REF) The mob trying to buy something - */ -/mob/living/simple_animal/hostile/retaliate/trader/proc/buy_item(mob/user) - if(!LAZYLEN(products)) - return - - var/list/display_names = list() - var/list/items = list() - var/list/product_info - for(var/obj/item/thing as anything in products) - display_names["[initial(thing.name)]"] = thing - var/image/item_image = image(icon = initial(thing.icon), icon_state = initial(thing.icon_state)) - product_info = products[thing] - if(product_info[TRADER_PRODUCT_INFO_QUANTITY] <= 0) //out of stock - item_image.overlays += image(icon = 'icons/hud/radial.dmi', icon_state = "radial_center") - items += list("[initial(thing.name)]" = item_image) - var/pick = show_radial_menu(user, src, items, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) - if(!pick) - return - var/obj/item/item_to_buy = display_names[pick] - face_atom(user) - product_info = products[item_to_buy] - if(!product_info[TRADER_PRODUCT_INFO_QUANTITY]) - say("[initial(item_to_buy.name)] appears to be out of stock.") - return - say("It will cost you [product_info[TRADER_PRODUCT_INFO_PRICE]] [currency_name] to buy \the [initial(item_to_buy.name)]. Are you sure you want to buy it?") - var/list/npc_options = list( - "Yes" = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_yes"), - "No" = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_no") - ) - var/buyer_will_buy = show_radial_menu(user, src, npc_options, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) - if(buyer_will_buy != "Yes") - return - face_atom(user) - if(!spend_buyer_offhand_money(user, product_info[TRADER_PRODUCT_INFO_PRICE])) - say(return_trader_phrase(NO_CASH_PHRASE)) - return - item_to_buy = new item_to_buy(get_turf(user)) - user.put_in_hands(item_to_buy) - playsound(src, sell_sound, 50, TRUE) - product_info[TRADER_PRODUCT_INFO_QUANTITY] -= 1 - say(return_trader_phrase(BUY_PHRASE)) - -///Calculates the value of money in the hand of the buyer and spends it if it's sufficient -/mob/living/simple_animal/hostile/retaliate/trader/proc/spend_buyer_offhand_money(mob/user, the_cost) - var/value = 0 - var/obj/item/holochip/cash = user.is_holding_item_of_type(/obj/item/holochip) - if(cash) - value += cash.credits - if((value >= the_cost) && cash) - return cash.spend(the_cost) - return FALSE //Purchase unsuccessful - -/** - * Tries to call sell_item on one of the user's held items, if fail gives a chat message - * - * Gets both items in the user's hands, and then tries to call sell_item on them, if both fail, he gives a chat message - * Arguments: - * * user - (Mob REF) The mob trying to sell something - */ -/mob/living/simple_animal/hostile/retaliate/trader/proc/try_sell(mob/user) - var/sold_item = FALSE - for(var/obj/item/an_item in user.held_items) - if(sell_item(user, an_item)) - sold_item = TRUE - break - if(!sold_item) - say(return_trader_phrase(ITEM_REJECTED_PHRASE)) - -/** - * Checks if an item is in the list of wanted items and if it is after a Yes/No radial returns generate_cash with the value of the item for the NPC - * Arguments: - * * user - (Mob REF) The mob trying to sell something - * * selling - (Item REF) The item being sold - */ -/mob/living/simple_animal/hostile/retaliate/trader/proc/sell_item(mob/user, obj/item/selling) - var/cost - if(!selling) - return FALSE - var/list/product_info - //Keep track of the typepath; rather mundane but it's required for correctly modifying the wanted_items - //should a product be sellable because even if it doesn't have a entry because it's a child of a parent that is present on the list - var/typepath_for_product_info - if(selling.type in wanted_items) - product_info = wanted_items[selling.type] - typepath_for_product_info = selling.type - else //Assume wanted_items is setup in the correct way; read wanted_items documentation for more info - for(var/typepath in wanted_items) - if(istype(selling, typepath)) - product_info = wanted_items[typepath] - typepath_for_product_info = typepath - break - - if(!product_info) //Nothing interesting to sell - return FALSE - if(product_info[TRADER_PRODUCT_INFO_QUANTITY] <= 0) - say(return_trader_phrase(TRADER_HAS_ENOUGH_ITEM_PHRASE)) - return FALSE - cost = apply_sell_price_mods(selling, product_info[TRADER_PRODUCT_INFO_PRICE]) - if(cost <= 0) - say(return_trader_phrase(ITEM_IS_WORTHLESS_PHRASE)) - return FALSE - say(return_trader_phrase(INTERESTED_PHRASE)) - say("You will receive [cost] [currency_name] for the [selling].") - var/list/npc_options = list( - "Yes" = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_yes"), - "No" = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_no"), - ) - face_atom(user) - var/npc_result = show_radial_menu(user, src, npc_options, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) - if(npc_result != "Yes") - say(return_trader_phrase(ITEM_SELLING_CANCELED_PHRASE)) - return TRUE - say(return_trader_phrase(ITEM_SELLING_ACCEPTED_PHRASE)) - playsound(src, sell_sound, 50, TRUE) - log_econ("[selling] has been sold to [src] (typepath used for product info; [typepath_for_product_info]) by [user] for [cost] cash.") - exchange_sold_items(selling, cost, typepath_for_product_info) - generate_cash(cost, user) - return TRUE - -/** - * Handles modifying/deleting the items to ensure that a proper amount is converted into cash; put into it's own proc to make the children of this not override a 30+ line sell_item() - * - * Arguments: - * * selling - (Item REF) this is the item being sold - * * value_exchanged_for - (Number) the "value", useful for a scenario where you want to remove enough items equal to the value - * * original_typepath - (Typepath) For scenarios where a children of a parent is being sold but we want to modify the parent's product information - */ -/mob/living/simple_animal/hostile/retaliate/trader/proc/exchange_sold_items(obj/item/selling, value_exchanged_for, original_typepath) - var/list/product_info = wanted_items[original_typepath] - if(isstack(selling)) - var/obj/item/stack/the_stack = selling - var/actually_sold = min(the_stack.amount, product_info[TRADER_PRODUCT_INFO_QUANTITY]) - the_stack.use(actually_sold) - product_info[TRADER_PRODUCT_INFO_QUANTITY] -= (actually_sold) - else - qdel(selling) - product_info[TRADER_PRODUCT_INFO_QUANTITY] -= 1 - -/** - * Modifies the 'base' price of a item based on certain variables - * - * Arguments: - * * Reference to the item; this is the item being sold - * * Original cost; the original cost of the item, to be manipulated depending on the variables of the item, one example is using item.amount if it's a stack - */ -/mob/living/simple_animal/hostile/retaliate/trader/proc/apply_sell_price_mods(obj/item/selling, original_cost) - if(isstack(selling)) - var/obj/item/stack/stackoverflow = selling - original_cost *= stackoverflow.amount - return original_cost - -/** - * Creates an item equal to the value set by the proc and puts it in the user's hands if possible - * Arguments: - * * value - A number; The amount of cash that will be on the holochip - * * user - Reference to a mob; The mob we put the holochip in hands of - */ -/mob/living/simple_animal/hostile/retaliate/trader/proc/generate_cash(value, mob/user) - var/obj/item/holochip/chip = new /obj/item/holochip(get_turf(user), value) - user.put_in_hands(chip) - -///Sets quantity of all products to initial(quanity); this proc is currently not called anywhere on the base class of traders -/mob/living/simple_animal/hostile/retaliate/trader/proc/restock_products() - products = initial_products() - -///Sets quantity of all wanted_items to initial(quanity); this proc is currently not called anywhere on the base class of traders -/mob/living/simple_animal/hostile/retaliate/trader/proc/renew_item_demands() - wanted_items = initial_wanteds() - -/mob/living/simple_animal/hostile/retaliate/trader/mrbones - name = "Mr. Bones" - desc = "A skeleton merchant, he seems very humerus." - speak_emote = list("rattles") - speech_span = SPAN_SANS - sell_sound = 'sound/voice/hiss2.ogg' - mob_biotypes = MOB_UNDEAD|MOB_HUMANOID - icon_state = "mrbones" - gender = MALE - loot = list(/obj/effect/decal/remains/human) - - say_phrases = list( - ITEM_REJECTED_PHRASE = list( - "Sorry, I'm not a fan of anything you're showing me. Give me something better and we'll talk." - ), - ITEM_SELLING_CANCELED_PHRASE = list( - "What a shame, tell me if you changed your mind." - ), - ITEM_SELLING_ACCEPTED_PHRASE = list( - "Pleasure doing business with you." - ), - INTERESTED_PHRASE = list( - "Hey, you've got an item that interests me, I'd like to buy it, I'll give you some cash for it, deal?" - ), - BUY_PHRASE = list( - "Bone appetit!" - ), - NO_CASH_PHRASE = list( - "Sorry adventurer, I can't give credit! Come back when you're a little mmmmm... richer!" - ), - NO_STOCK_PHRASE = list( - "Sorry adventurer, but that item is not in stock at the moment." - ), - NOT_WILLING_TO_BUY_PHRASE = list( - "I don't want to buy that item for the time being, check back another time." - ), - ITEM_IS_WORTHLESS_PHRASE = list( - "This item seems to be worthless on a closer look, I won't buy this." - ), - TRADER_HAS_ENOUGH_ITEM_PHRASE = list( - "I already bought enough of this for the time being." - ), - TRADER_LORE_PHRASE = list( - "Hello, I am Mr. Bones!", - "The ride never ends!", - "I'd really like a refreshing carton of milk!", - "I'm willing to play big prices for BONES! Need materials to make merch, eh?", - "It's a beautiful day outside. Birds are singing, Flowers are blooming... On days like these, kids like you... Should be buying my wares!" - ), - TRADER_NOT_BUYING_ANYTHING = list( - "I'm currently buying nothing at the moment." - ), - TRADER_NOT_SELLING_ANYTHING = list( - "I'm currently selling nothing at the moment." - ), - ) - -/mob/living/simple_animal/hostile/retaliate/trader/mrbones/initial_products() - return list( - /obj/item/clothing/head/helmet/skull = list(150, INFINITY), - /obj/item/clothing/mask/bandana/skull/black = list(50, INFINITY), - /obj/item/food/cookie/sugar/spookyskull = list(10, INFINITY), - /obj/item/instrument/trombone/spectral = list(10000, INFINITY), - /obj/item/shovel/serrated = list(150, INFINITY), - ) - -/mob/living/simple_animal/hostile/retaliate/trader/mrbones/initial_wanteds() - return list( - /obj/item/reagent_containers/condiment/milk = list(1000, INFINITY, ""), - /obj/item/stack/sheet/bone = list(420, INFINITY, ", per sheet of bone"), - ) - -#undef ITEM_REJECTED_PHRASE -#undef ITEM_SELLING_CANCELED_PHRASE -#undef ITEM_SELLING_ACCEPTED_PHRASE -#undef INTERESTED_PHRASE -#undef BUY_PHRASE -#undef NO_CASH_PHRASE -#undef NO_STOCK_PHRASE -#undef NOT_WILLING_TO_BUY_PHRASE -#undef ITEM_IS_WORTHLESS_PHRASE -#undef TRADER_HAS_ENOUGH_ITEM_PHRASE -#undef TRADER_LORE_PHRASE -#undef TRADER_NOT_BUYING_ANYTHING -#undef TRADER_NOT_SELLING_ANYTHING -#undef TRADER_PRODUCT_INFO_PRICE -#undef TRADER_PRODUCT_INFO_QUANTITY -#undef TRADER_PRODUCT_INFO_PRICE_MOD_DESCRIPTION diff --git a/code/modules/mob/living/simple_animal/hostile/smspider.dm b/code/modules/mob/living/simple_animal/hostile/smspider.dm deleted file mode 100644 index 215164a9f6e3..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/smspider.dm +++ /dev/null @@ -1,65 +0,0 @@ -/mob/living/simple_animal/hostile/smspider - name = "supermatter spider" - desc= "A sliver of supermatter placed upon a robotically enhanced pedestal." - icon = 'icons/mob/simple/smspider.dmi' - icon_state = "smspider" - icon_living = "smspider" - icon_dead = "smspider_dead" - gender = NEUTER - mob_biotypes = MOB_BUG|MOB_ROBOTIC - turns_per_move = 2 - speak_emote = list("vibrates") - emote_see = list("vibrates") - emote_taunt = list("vibrates") - taunt_chance = 40 - istate = ISTATE_HARM|ISTATE_BLOCKING - maxHealth = 10 - health = 10 - minbodytemp = 0 - maxbodytemp = 1500 - healable = 0 - attack_verb_continuous = "slices" - attack_verb_simple = "slice" - attack_sound = 'sound/effects/supermatter.ogg' - attack_vis_effect = ATTACK_EFFECT_CLAW - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - robust_searching = 1 - faction = list(FACTION_HOSTILE) - // Gold, supermatter tinted - lighting_cutoff_red = 30 - lighting_cutoff_green = 30 - lighting_cutoff_blue = 10 - death_message = "falls to the ground, its shard dulling to a miserable grey!" - footstep_type = FOOTSTEP_MOB_CLAW - var/overcharged = FALSE // if true, spider will not die if it dusts a limb - -/mob/living/simple_animal/hostile/smspider/AttackingTarget() - . = ..() - if(isliving(target)) - playsound(get_turf(src), 'sound/effects/supermatter.ogg', 10, TRUE) - visible_message(span_danger("[src] knocks into [target], turning them to dust in a brilliant flash of light!")) - var/mob/living/victim = target - victim.investigate_log("has been dusted by [src].", INVESTIGATE_DEATHS) - victim.dust() - if(!overcharged) - death() - else if(!isturf(target)) - playsound(get_turf(src), 'sound/effects/supermatter.ogg', 10, TRUE) - visible_message(span_danger("[src] knocks into [target], turning it to dust in a brilliant flash of light!")) - qdel(target) - if(!overcharged) - death() - return FALSE - -/mob/living/simple_animal/hostile/smspider/Initialize(mapload) - . = ..() - AddComponent(/datum/component/swarming) - -/mob/living/simple_animal/hostile/smspider/overcharged - name = "overcharged supermatter spider" - desc = "A sliver of overcharged supermatter placed upon a robotically enhanced pedestal. This one seems especially dangerous." - icon_state = "smspideroc" - icon_living = "smspideroc" - maxHealth = 25 - health = 25 - overcharged = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm deleted file mode 100644 index 234d2b691f62..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ /dev/null @@ -1,385 +0,0 @@ -/// The darkness threshold for space dragon when choosing a color -#define DARKNESS_THRESHOLD 50 - -/** - * # Space Dragon - * - * A space-faring leviathan-esque monster which breathes fire and summons carp. Spawned during its respective midround antagonist event. - * - * A space-faring monstrosity who has the ability to breathe dangerous fire breath and uses its powerful wings to knock foes away. - * Normally spawned as an antagonist during the Space Dragon event, Space Dragon's main goal is to open three rifts from which to pull a great tide of carp onto the station. - * Space Dragon can summon only one rift at a time, and can do so anywhere a blob is allowed to spawn. In order to trigger his victory condition, Space Dragon must summon and defend three rifts while they charge. - * Space Dragon, when spawned, has five minutes to summon the first rift. Failing to do so will cause Space Dragon to return from whence he came. - * When the rift spawns, ghosts can interact with it to spawn in as space carp to help complete the mission. One carp is granted when the rift is first summoned, with an extra one every 30 seconds. - * Once the victory condition is met, all current rifts become invulnerable to damage, are allowed to spawn infinite sentient space carp, and Space Dragon gets unlimited rage. - * Alternatively, if the shuttle arrives while Space Dragon is still active, their victory condition will automatically be met and all the rifts will immediately become fully charged. - * If a charging rift is destroyed, Space Dragon will be incredibly slowed, and the endlag on his gust attack is greatly increased on each use. - * Space Dragon has the following abilities to assist him with his objective: - * - Can shoot fire in straight line, dealing 30 burn damage and setting those suseptible on fire. - * - Can use his wings to temporarily stun and knock back any nearby mobs. This attack has no cooldown, but instead has endlag after the attack where Space Dragon cannot act. This endlag's time decreases over time, but is added to every time he uses the move. - * - Can swallow mob corpses to heal for half their max health. Any corpses swallowed are stored within him, and will be regurgitated on death. - * - Can tear through any type of wall. This takes 4 seconds for most walls, and 12 seconds for reinforced walls. - */ -/mob/living/simple_animal/hostile/space_dragon - name = "Space Dragon" - desc = "A vile, leviathan-esque creature that flies in the most unnatural way. Looks slightly similar to a space carp." - gender = NEUTER - maxHealth = 320 - health = 320 - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0.5, OXY = 1) - istate = ISTATE_HARM|ISTATE_BLOCKING - speed = 0 - movement_type = FLYING - attack_verb_continuous = "chomps" - attack_verb_simple = "chomp" - attack_sound = 'sound/magic/demon_attack1.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - death_sound = 'sound/creatures/space_dragon_roar.ogg' - icon = 'icons/mob/nonhuman-player/spacedragon.dmi' - icon_state = "spacedragon" - icon_living = "spacedragon" - icon_dead = "spacedragon_dead" - health_doll_icon = "spacedragon" - obj_damage = 50 - environment_smash = ENVIRONMENT_SMASH_NONE - flags_1 = PREVENT_CONTENTS_EXPLOSION_1 - melee_damage_upper = 35 - melee_damage_lower = 35 - mob_size = MOB_SIZE_LARGE - armour_penetration = 30 - pixel_x = -16 - base_pixel_x = -16 - maptext_height = 64 - maptext_width = 64 - turns_per_move = 5 - ranged = TRUE - mouse_opacity = MOUSE_OPACITY_ICON - butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30) - death_message = "screeches as its wings turn to dust and it collapses on the floor, its life extinguished." - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = 1500 - faction = list(FACTION_CARP) - pressure_resistance = 200 - /// How much endlag using Wing Gust should apply. Each use of wing gust increments this, and it decreases over time. - var/tiredness = 0 - /// A multiplier to how much each use of wing gust should add to the tiredness variable. Set to 5 if the current rift is destroyed. - var/tiredness_mult = 1 - /// The distance Space Dragon's gust reaches - var/gust_distance = 4 - /// The amount of tiredness to add to Space Dragon per use of gust - var/gust_tiredness = 30 - /// Determines whether or not Space Dragon is in the middle of using wing gust. If set to true, prevents him from moving and doing certain actions. - var/using_special = FALSE - /// Determines whether or not Space Dragon is currently tearing through a wall. - var/tearing_wall = FALSE - /// The ability to make your sprite smaller - var/datum/action/small_sprite/space_dragon/small_sprite - /// The color of the space dragon. - var/chosen_color - /// Minimum devastation damage dealt coefficient based on max health - var/devastation_damage_min_percentage = 0.4 - /// Maximum devastation damage dealt coefficient based on max health - var/devastation_damage_max_percentage = 0.75 - -/mob/living/simple_animal/hostile/space_dragon/Initialize(mapload) - . = ..() - AddElement(/datum/element/simple_flying) - add_traits(list(TRAIT_SPACEWALK, TRAIT_FREE_HYPERSPACE_MOVEMENT, TRAIT_NO_FLOATING_ANIM, TRAIT_HEALS_FROM_CARP_RIFTS), INNATE_TRAIT) - AddElement(/datum/element/content_barfer) - small_sprite = new - small_sprite.Grant(src) - RegisterSignal(small_sprite, COMSIG_ACTION_TRIGGER, PROC_REF(add_dragon_overlay)) - -/mob/living/simple_animal/hostile/space_dragon/Login() - . = ..() - if(!chosen_color) - dragon_name() - color_selection() - -/mob/living/simple_animal/hostile/space_dragon/ex_act_devastate() - var/damage_coefficient = rand(devastation_damage_min_percentage, devastation_damage_max_percentage) - adjustBruteLoss(initial(maxHealth)*damage_coefficient) - -/mob/living/simple_animal/hostile/space_dragon/Life(seconds_per_tick = SSMOBS_DT, times_fired) - . = ..() - tiredness = max(tiredness - (0.5 * seconds_per_tick), 0) - for(var/mob/living/consumed_mob in src) - if(consumed_mob.stat == DEAD) - continue - playsound(src, 'sound/effects/splat.ogg', 50, TRUE) - visible_message(span_danger("[src] vomits up [consumed_mob]!")) - consumed_mob.forceMove(loc) - consumed_mob.Paralyze(50) - -/mob/living/simple_animal/hostile/space_dragon/AttackingTarget() - if(using_special) - return - if(target == src) - 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 = 40 - if(istype(target, /turf/closed/wall/r_wall)) - timetotear = 120 - 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 - return - if(isliving(target)) //Swallows corpses like a snake to regain health. - var/mob/living/L = target - if(L.stat == DEAD) - to_chat(src, span_warning("You begin to swallow [L] whole...")) - if(do_after(src, 30, target = L)) - if(eat(L)) - adjustHealth(-L.maxHealth * 0.25) - return - . = ..() - if(ismecha(target)) - var/obj/vehicle/sealed/mecha/M = target - M.take_damage(50, BRUTE, MELEE, 1) - -/mob/living/simple_animal/hostile/space_dragon/ranged_secondary_attack(atom/target, modifiers) - if(using_special) - return - using_special = TRUE - icon_state = "spacedragon_gust" - add_dragon_overlay() - useGust(0) - -/mob/living/simple_animal/hostile/space_dragon/Move() - if(!using_special) - ..() - -/mob/living/simple_animal/hostile/space_dragon/OpenFire() - if(using_special) - return - ranged_cooldown = world.time + ranged_cooldown_time - fire_stream() - -/mob/living/simple_animal/hostile/space_dragon/death(gibbed) - . = ..() - add_dragon_overlay() - UnregisterSignal(small_sprite, COMSIG_ACTION_TRIGGER) - -/mob/living/simple_animal/hostile/space_dragon/revive(full_heal_flags = NONE, excess_healing = 0, force_grab_ghost = FALSE) - var/was_dead = stat == DEAD - . = ..() - add_dragon_overlay() - - if (was_dead) - RegisterSignal(small_sprite, COMSIG_ACTION_TRIGGER, PROC_REF(add_dragon_overlay)) - -/** - * Allows space dragon to choose its own name. - * - * Prompts the space dragon to choose a name, which it will then apply to itself. - * If the name is invalid, will re-prompt the dragon until a proper name is chosen. - */ -/mob/living/simple_animal/hostile/space_dragon/proc/dragon_name() - var/chosen_name = sanitize_name(reject_bad_text(tgui_input_text(src, "What would you like your name to be?", "Choose Your Name", real_name, MAX_NAME_LEN))) - if(!chosen_name) - to_chat(src, span_warning("Not a valid name, please try again.")) - dragon_name() - return - to_chat(src, span_notice("Your name is now [span_name("[chosen_name]")], the feared Space Dragon.")) - fully_replace_character_name(null, chosen_name) - -/** - * Allows space dragon to choose a color for itself. - * - * Prompts the space dragon to choose a color, from which it will then apply to itself. - * If an invalid color is given, will re-prompt the dragon until a proper color is chosen. - */ -/mob/living/simple_animal/hostile/space_dragon/proc/color_selection() - chosen_color = input(src,"What would you like your color to be?","Choose Your Color", COLOR_WHITE) as color|null - if(!chosen_color) //redo proc until we get a color - to_chat(src, span_warning("Not a valid color, please try again.")) - color_selection() - return - var/temp_hsv = RGBtoHSV(chosen_color) - if(ReadHSV(temp_hsv)[3] < DARKNESS_THRESHOLD) - to_chat(src, span_danger("Invalid color. Your color is not bright enough.")) - color_selection() - return - add_atom_colour(chosen_color, FIXED_COLOUR_PRIORITY) - add_dragon_overlay() - -/** - * Adds the proper overlay to the space dragon. - * - * Clears the current overlay on space dragon and adds a proper one for whatever animation he's in. - */ -/mob/living/simple_animal/hostile/space_dragon/proc/add_dragon_overlay() - cut_overlays() - if(!small_sprite.small) - return - if(stat == DEAD) - var/mutable_appearance/overlay = mutable_appearance(icon, "overlay_dead") - overlay.appearance_flags = RESET_COLOR - add_overlay(overlay) - return - if(!using_special) - var/mutable_appearance/overlay = mutable_appearance(icon, "overlay_base") - overlay.appearance_flags = RESET_COLOR - add_overlay(overlay) - return - if(using_special) - var/mutable_appearance/overlay = mutable_appearance(icon, "overlay_gust") - overlay.appearance_flags = RESET_COLOR - add_overlay(overlay) - -/** - * Determines a line of turfs from sources's position to the target with length range. - * - * Determines a line of turfs from the source's position to the target with length range. - * The line will extend on past the target if the range is large enough, and not reach the target if range is small enough. - * Arguments: - * * offset - whether or not to aim slightly to the left or right of the target - * * range - how many turfs should we go out for - * * atom/at - The target - */ -/mob/living/simple_animal/hostile/space_dragon/proc/line_target(offset, range, atom/at = target) - if(!at) - return - var/angle = ATAN2(at.x - src.x, at.y - src.y) + offset - var/turf/T = get_turf(src) - for(var/i in 1 to range) - var/turf/check = locate(src.x + cos(angle) * i, src.y + sin(angle) * i, src.z) - if(!check) - break - T = check - return (get_line(src, T) - get_turf(src)) - -/** - * Spawns fire at each position in a line from the source to the target. - * - * Spawns fire at each position in a line from the source to the target. - * Stops if it comes into contact with a solid wall, a window, or a door. - * Delays the spawning of each fire by 1.5 deciseconds. - * Arguments: - * * atom/at - The target - */ -/mob/living/simple_animal/hostile/space_dragon/proc/fire_stream(atom/at = target) - playsound(get_turf(src),'sound/magic/fireball.ogg', 200, TRUE) - var/range = 20 - var/list/turfs = list() - turfs = line_target(0, range, at) - var/delayFire = -1.0 - for(var/turf/T in turfs) - if(isclosedturf(T)) - return - for(var/obj/structure/window/W in T.contents) - return - for(var/obj/machinery/door/D in T.contents) - if(D.density) - return - delayFire += 1.5 - addtimer(CALLBACK(src, PROC_REF(dragon_fire_line), T), delayFire) - -/** - * What occurs on each tile to actually create the fire. - * - * Creates a fire on the given turf. - * It creates a hotspot on the given turf, damages any living mob with 30 burn damage, and damages mechs by 50. - * It can only hit any given target once. - * Arguments: - * * turf/T - The turf to trigger the effects on. - */ -/mob/living/simple_animal/hostile/space_dragon/proc/dragon_fire_line(turf/T) - var/list/hit_list = list() - hit_list += src - new /obj/effect/hotspot(T) - T.hotspot_expose(700,50,1) - for(var/mob/living/L in T.contents) - if(L in hit_list) - continue - if(L.mind?.has_antag_datum(/datum/antagonist/space_carp)) - continue - hit_list += L - L.adjustFireLoss(30) - to_chat(L, span_userdanger("You're hit by [src]'s fire breath!")) - // deals damage to mechs - for(var/obj/vehicle/sealed/mecha/M in T.contents) - if(M in hit_list) - continue - hit_list += M - M.take_damage(50, BRUTE, MELEE, 1) - -/** - * Handles consuming and storing consumed things inside Space Dragon - * - * Plays a sound and then stores the consumed thing inside Space Dragon. - * Used in AttackingTarget(), paired with a heal should it succeed. - * Arguments: - * * atom/movable/A - The thing being consumed - */ -/mob/living/simple_animal/hostile/space_dragon/proc/eat(atom/movable/A) - if(A && A.loc != src) - playsound(src, 'sound/magic/demon_attack1.ogg', 100, TRUE) - visible_message(span_warning("[src] swallows [A] whole!")) - A.forceMove(src) - return TRUE - return FALSE - -/** - * Resets Space Dragon's status after using wing gust. - * - * Resets Space Dragon's status after using wing gust. - * If it isn't dead by the time it calls this method, reset the sprite back to the normal living sprite. - * Also sets the using_special variable to FALSE, allowing Space Dragon to move and attack freely again. - */ -/mob/living/simple_animal/hostile/space_dragon/proc/reset_status() - if(stat != DEAD) - icon_state = "spacedragon" - using_special = FALSE - add_dragon_overlay() - -/** - * Handles wing gust from the windup all the way to the endlag at the end. - * - * Handles the wing gust attack from start to finish, based on the timer. - * When intially triggered, starts at 0. Until the timer reaches 10, increase Space Dragon's y position by 2 and call back to the function in 1.5 deciseconds. - * When the timer is at 10, trigger the attack. Change Space Dragon's sprite. reset his y position, and push all living creatures back in a 3 tile radius and stun them for 5 seconds. - * Stay in the ending state for how much our tiredness dictates and add to our tiredness. - * Arguments: - * * timer - The timer used for the windup. - */ -/mob/living/simple_animal/hostile/space_dragon/proc/useGust(timer) - if(timer != 10) - pixel_y = pixel_y + 2; - addtimer(CALLBACK(src, PROC_REF(useGust), timer + 1), 1.5) - return - pixel_y = 0 - icon_state = "spacedragon_gust_2" - cut_overlays() - var/mutable_appearance/overlay = mutable_appearance(icon, "overlay_gust_2") - overlay.appearance_flags = RESET_COLOR - add_overlay(overlay) - playsound(src, 'sound/effects/gravhit.ogg', 100, TRUE) - var/gust_locs = spiral_range_turfs(gust_distance, get_turf(src)) - var/list/hit_things = list() - for(var/turf/T in gust_locs) - for(var/mob/living/L in T.contents) - if(L == src) - continue - hit_things += L - visible_message(span_boldwarning("[L] is knocked back by the gust!")) - to_chat(L, span_userdanger("You're knocked back by the gust!")) - var/dir_to_target = get_dir(get_turf(src), get_turf(L)) - var/throwtarget = get_edge_target_turf(target, dir_to_target) - L.safe_throw_at(throwtarget, 10, 1, src) - L.Paralyze(50) - addtimer(CALLBACK(src, PROC_REF(reset_status)), 4 + ((tiredness * tiredness_mult) / 10)) - tiredness = tiredness + (gust_tiredness * tiredness_mult) - -#undef DARKNESS_THRESHOLD diff --git a/code/modules/mob/living/simple_animal/hostile/wizard.dm b/code/modules/mob/living/simple_animal/hostile/wizard.dm deleted file mode 100644 index 25432e2f6dea..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/wizard.dm +++ /dev/null @@ -1,83 +0,0 @@ -/mob/living/simple_animal/hostile/wizard - name = "Space Wizard" - desc = "EI NATH?" - icon = 'icons/mob/simple/simple_human.dmi' - icon_state = "wizard" - icon_living = "wizard" - icon_dead = "wizard_dead" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - sentience_type = SENTIENCE_HUMANOID - speak_chance = 0 - turns_per_move = 3 - speed = 0 - maxHealth = 100 - health = 100 - harm_intent_damage = 5 - melee_damage_lower = 5 - melee_damage_upper = 5 - attack_verb_continuous = "punches" - attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' - istate = ISTATE_HARM|ISTATE_BLOCKING - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 7.5 - faction = list(ROLE_WIZARD) - status_flags = CANPUSH - footstep_type = FOOTSTEP_MOB_SHOE - - retreat_distance = 3 //out of fireball range - minimum_distance = 3 - del_on_death = 1 - loot = list( - /obj/effect/mob_spawn/corpse/human/wizard, - /obj/item/staff, - ) - - var/next_cast = 0 - var/datum/action/cooldown/spell/pointed/projectile/fireball/fireball - var/datum/action/cooldown/spell/teleport/radius_turf/blink/blink - var/datum/action/cooldown/spell/aoe/magic_missile/magic_missile - -/mob/living/simple_animal/hostile/wizard/Initialize(mapload) - . = ..() - apply_dynamic_human_appearance(src, mob_spawn_path = /obj/effect/mob_spawn/corpse/human/wizard, r_hand = /obj/item/staff) - var/obj/item/implant/exile/exiled = new /obj/item/implant/exile(src) - exiled.implant(src) - - fireball = new(src) - fireball.spell_requirements &= ~(SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_WIZARD_GARB|SPELL_REQUIRES_MIND) - fireball.Grant(src) - - magic_missile = new(src) - magic_missile.spell_requirements &= ~(SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_WIZARD_GARB|SPELL_REQUIRES_MIND) - magic_missile.Grant(src) - - blink = new(src) - blink.spell_requirements &= ~(SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_WIZARD_GARB|SPELL_REQUIRES_MIND) - blink.outer_tele_radius = 3 - blink.Grant(src) - -/mob/living/simple_animal/hostile/wizard/Destroy() - QDEL_NULL(fireball) - QDEL_NULL(magic_missile) - QDEL_NULL(blink) - return ..() - -/mob/living/simple_animal/hostile/wizard/handle_automated_action() - . = ..() - if(target && next_cast < world.time) - if((get_dir(src, target) in list(SOUTH, EAST, WEST, NORTH)) && fireball.can_cast_spell(feedback = FALSE)) - setDir(get_dir(src, target)) - fireball.Trigger(null, target) - next_cast = world.time + 1 SECONDS - return - - if(magic_missile.IsAvailable()) - magic_missile.Trigger(null, target) - next_cast = world.time + 1 SECONDS - return - - if(blink.IsAvailable()) // Spam Blink when you can - blink.Trigger(null, src) - next_cast = world.time + 1 SECONDS - return diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm deleted file mode 100644 index ae67f37277f8..000000000000 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ /dev/null @@ -1,1033 +0,0 @@ -/* Parrots! - * Contains - * Defines - * Inventory (headset stuff) - * Attack responces - * AI - * Procs / Verbs (usable by players) - * Sub-types - * Hear & say (the things we do for gimmicks) - */ - -/* - * Defines - */ - -//Only a maximum of one action and one intent should be active at any given time. -//Actions -#define PARROT_PERCH (1<<0) //Sitting/sleeping, not moving -#define PARROT_SWOOP (1<<1) //Moving towards or away from a target -#define PARROT_WANDER (1<<2) //Moving without a specific target in mind - -//Intents -#define PARROT_STEAL (1<<3) //Flying towards a target to steal it/from it -#define PARROT_ATTACK (1<<4) //Flying towards a target to attack it -#define PARROT_RETURN (1<<5) //Flying towards its perch -#define PARROT_FLEE (1<<6) //Flying away from its attacker - - -/mob/living/simple_animal/parrot - name = "parrot" - desc = "The parrot squawks, \"They're a Parrot! BAWWK!\"" //' - icon = 'icons/mob/simple/animal.dmi' - icon_state = "parrot_fly" - icon_living = "parrot_fly" - icon_dead = "parrot_dead" - var/icon_sit = "parrot_sit" - density = FALSE - health = 80 - maxHealth = 80 - pass_flags = PASSTABLE | PASSMOB - - speak = list("Hi!","Hello!","Cracker?","BAWWWWK george mellons griffing me!") - speak_emote = list("squawks","says","yells") - emote_hear = list("squawks.","bawks!") - emote_see = list("flutters their wings.") - - speak_chance = 1 //1% (1 in 100) chance every tick; So about once per 150 seconds, assuming an average tick is 1.5s - turns_per_move = 5 - butcher_results = list(/obj/item/food/cracker = 1) - melee_damage_upper = 10 - melee_damage_lower = 5 - - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently moves aside" - response_disarm_simple = "gently move aside" - response_harm_continuous = "swats" - response_harm_simple = "swat" - stop_automated_movement = 1 - istate = ISTATE_HARM|ISTATE_BLOCKING //parrots now start "aggressive" since only player parrots will nuzzle. - attack_verb_continuous = "chomps" - attack_verb_simple = "chomp" - attack_vis_effect = ATTACK_EFFECT_BITE - friendly_verb_continuous = "grooms" - friendly_verb_simple = "groom" - mob_size = MOB_SIZE_SMALL - gold_core_spawnable = FRIENDLY_SPAWN - - var/parrot_damage_upper = 10 - var/parrot_state = PARROT_WANDER //Hunt for a perch when created - var/parrot_sleep_max = 25 //The time the parrot sits while perched before looking around. Mosly a way to avoid the parrot's AI in life() being run every single tick. - var/parrot_sleep_dur = 25 //Same as above, this is the var that physically counts down - var/parrot_dam_zone = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_ARM, BODY_ZONE_R_LEG) //For humans, select a bodypart to attack - - var/parrot_speed = 5 //"Delay in world ticks between movement." according to byond. Yeah, that's BS but it does directly affect movement. Higher number = slower. - var/parrot_lastmove = null //Updates/Stores position of the parrot while it's moving - var/parrot_stuck = 0 //If parrot_lastmove hasn't changed, this will increment until it reaches parrot_stuck_threshold - var/parrot_stuck_threshold = 10 //if this == parrot_stuck, it'll force the parrot back to wandering - - var/list/speech_buffer = list() - var/speech_shuffle_rate = 20 - var/list/available_channels = list() - - //Headset for Poly to yell at engineers :) - var/obj/item/radio/headset/ears = null - - //Wheter the Parrot should come with a headset - var/spawn_headset = TRUE - - //The thing the parrot is currently interested in. This gets used for items the parrot wants to pick up, mobs it wants to steal from, - //mobs it wants to attack or mobs that have attacked it - var/atom/movable/parrot_interest = null - - //Parrots will generally sit on their perch unless something catches their eye. - //These vars store their preffered perch and if they dont have one, what they can use as a perch - var/obj/parrot_perch = null - var/obj/desired_perches = list(/obj/structure/frame/computer, - /obj/structure/displaycase, - /obj/structure/filingcabinet, - /obj/machinery/teleport, - /obj/machinery/dna_scannernew, - /obj/machinery/telecomms, - /obj/machinery/nuclearbomb, - /obj/machinery/recharge_station, - /obj/machinery/smartfridge, - /obj/machinery/computer, - /obj/machinery/suit_storage_unit, - ) - - //Parrots are kleptomaniacs. This variable ... stores the item a parrot is holding. - var/obj/item/held_item = null - - -/mob/living/simple_animal/parrot/Initialize(mapload) - . = ..() - parrot_sleep_dur = parrot_sleep_max //In case someone decides to change the max without changing the duration var - - add_verb(src, list(/mob/living/simple_animal/parrot/proc/steal_from_ground, \ - /mob/living/simple_animal/parrot/proc/steal_from_mob, \ - /mob/living/simple_animal/parrot/verb/drop_held_item_player, \ - /mob/living/simple_animal/parrot/proc/perch_player, \ - /mob/living/simple_animal/parrot/proc/toggle_mode, - /mob/living/simple_animal/parrot/proc/perch_mob_player)) - - AddElement(/datum/element/strippable, GLOB.strippable_parrot_items) - AddElement(/datum/element/simple_flying) - if(!spawn_headset) - return - if(!ears) - var/headset = pick(/obj/item/radio/headset/headset_sec, \ - /obj/item/radio/headset/headset_eng, \ - /obj/item/radio/headset/headset_med, \ - /obj/item/radio/headset/headset_sci, \ - /obj/item/radio/headset/headset_cargo) - ears = new headset(src) - -/mob/living/simple_animal/parrot/Destroy() - QDEL_NULL(ears) - return ..() - -/mob/living/simple_animal/parrot/examine(mob/user) - . = ..() - if(stat) - if(HAS_TRAIT(user, TRAIT_NAIVE)) - . += pick("It seems tired and shagged out after a long squawk.", "It seems to be pining for the fjords.", "It's resting. It's a beautiful bird. Lovely plumage.") - else - . += pick("This parrot is no more.","This is a late parrot.","This is an ex-parrot.") - -/mob/living/simple_animal/parrot/death(gibbed) - if(held_item) - held_item.forceMove(drop_location()) - held_item = null - SSmove_manager.stop_looping(src) - - if(buckled) - buckled.unbuckle_mob(src,force=1) - buckled = null - pixel_x = base_pixel_x - pixel_y = base_pixel_y - - return ..() - - -/mob/living/simple_animal/parrot/get_status_tab_items() - . = ..() - . += "Held Item: [held_item]" - -/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, list/message_mods = list(), message_range) - . = ..() - if(speaker != src && prob(50)) //Dont imitate ourselves - if(!radio_freq || prob(10)) - if(speech_buffer.len >= 500) - speech_buffer -= pick(speech_buffer) - speech_buffer |= html_decode(raw_message) - if(speaker == src && !client) //If a parrot squawks in the woods and no one is around to hear it, does it make a sound? This code says yes! - return message - -/mob/living/simple_animal/parrot/radio(message, list/message_mods = list(), list/spans, language) //literally copied from human/radio(), but there's no other way to do this. at least it's better than it used to be. - . = ..() - if(.) - return - - if(message_mods[MODE_HEADSET]) - if(ears) - ears.talk_into(src, message, , spans, language, message_mods) - return ITALICS | REDUCE_RANGE - else if(message_mods[RADIO_EXTENSION] == MODE_DEPARTMENT) - if(ears) - ears.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) - return ITALICS | REDUCE_RANGE - else if(message_mods[RADIO_EXTENSION] in GLOB.radiochannels) - if(ears) - ears.talk_into(src, message, message_mods[RADIO_EXTENSION], spans, language, message_mods) - return ITALICS | REDUCE_RANGE - - return FALSE - -GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( - /datum/strippable_item/parrot_headset, -))) - -/datum/strippable_item/parrot_headset - key = STRIPPABLE_ITEM_PARROT_HEADSET - -/datum/strippable_item/parrot_headset/get_item(atom/source) - var/mob/living/simple_animal/parrot/parrot_source = source - return istype(parrot_source) ? parrot_source.ears : null - -/datum/strippable_item/parrot_headset/try_equip(atom/source, obj/item/equipping, mob/user) - . = ..() - if (!.) - return FALSE - - if (!istype(equipping, /obj/item/radio/headset)) - to_chat(user, span_warning("[equipping] won't fit!")) - return FALSE - - return TRUE - -// There is no delay for putting a headset on a parrot. -/datum/strippable_item/parrot_headset/start_equip(atom/source, obj/item/equipping, mob/user) - return TRUE - -/datum/strippable_item/parrot_headset/finish_equip(atom/source, obj/item/equipping, mob/user) - var/obj/item/radio/headset/radio = equipping - if (!istype(radio)) - return - - var/mob/living/simple_animal/parrot/parrot_source = source - if (!istype(parrot_source)) - return - - if (!user.transferItemToLoc(radio, source)) - return - - parrot_source.ears = radio - - to_chat(user, span_notice("You fit [radio] onto [source].")) - - parrot_source.available_channels.Cut() - - for (var/channel in radio.channels) - var/channel_to_add - - switch (channel) - if (RADIO_CHANNEL_ENGINEERING) - channel_to_add = RADIO_TOKEN_ENGINEERING - if (RADIO_CHANNEL_COMMAND) - channel_to_add = RADIO_TOKEN_COMMAND - if (RADIO_CHANNEL_SECURITY) - channel_to_add = RADIO_TOKEN_SECURITY - if (RADIO_CHANNEL_SCIENCE) - channel_to_add = RADIO_TOKEN_SCIENCE - if (RADIO_CHANNEL_MEDICAL) - channel_to_add = RADIO_TOKEN_MEDICAL - if (RADIO_CHANNEL_SUPPLY) - channel_to_add = RADIO_TOKEN_SUPPLY - if (RADIO_CHANNEL_SERVICE) - channel_to_add = RADIO_TOKEN_SERVICE - - if (channel_to_add) - parrot_source.available_channels += channel_to_add - - if (radio.translate_binary) - parrot_source.available_channels.Add(MODE_TOKEN_BINARY) - -/datum/strippable_item/parrot_headset/start_unequip(atom/source, mob/user) - . = ..() - if (!.) - return FALSE - - var/mob/living/simple_animal/parrot/parrot_source = source - if (!istype(parrot_source)) - return - - if (!parrot_source.stat) - parrot_source.say("[parrot_source.available_channels.len ? "[pick(parrot_source.available_channels)] " : null]BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") - - return TRUE - -/datum/strippable_item/parrot_headset/finish_unequip(atom/source, mob/user) - var/mob/living/simple_animal/parrot/parrot_source = source - if (!istype(parrot_source)) - return - - parrot_source.ears.forceMove(parrot_source.drop_location()) - parrot_source.ears = null - -/* - * Attack responces - */ -//Humans, monkeys, aliens -/mob/living/simple_animal/parrot/attack_hand(mob/living/carbon/user, list/modifiers) - ..() - if(client) - return - if(!stat && (user.istate & ISTATE_HARM)) - - icon_state = icon_living //It is going to be flying regardless of whether it flees or attacks - - if(parrot_state == PARROT_PERCH) - parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - - parrot_interest = user - parrot_state = PARROT_SWOOP //The parrot just got hit, it WILL move, now to pick a direction.. - - if(health > 30) //Let's get in there and squawk it up! - parrot_state |= PARROT_ATTACK - else - parrot_state |= PARROT_FLEE //Otherwise, fly like a bat out of hell! - drop_held_item(0) - if(stat != DEAD && !(user.istate & ISTATE_HARM)) - handle_automated_speech(1) //assured speak/emote - return - -/mob/living/simple_animal/parrot/attack_paw(mob/living/carbon/human/user, list/modifiers) - return attack_hand(modifiers) - -/mob/living/simple_animal/parrot/attack_alien(mob/living/carbon/alien/user, list/modifiers) - return attack_hand(user, modifiers) - -//Simple animals -/mob/living/simple_animal/parrot/attack_animal(mob/living/simple_animal/user, list/modifiers) - . = ..() //goodbye immortal parrots - - if(client) - return - - if(parrot_state == PARROT_PERCH) - parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - - if(user.melee_damage_upper > 0 && !stat) - parrot_interest = user - parrot_state = PARROT_SWOOP | PARROT_ATTACK //Attack other animals regardless - icon_state = icon_living - -//Mobs with objects -/mob/living/simple_animal/parrot/attackby(obj/item/O, mob/living/user, params) - if(!stat && !client && !istype(O, /obj/item/stack/medical) && !istype(O, /obj/item/food/cracker)) - if(O.force) - if(parrot_state == PARROT_PERCH) - parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - - parrot_interest = user - parrot_state = PARROT_SWOOP - if(health > 30) //Let's get in there and squawk it up! - parrot_state |= PARROT_ATTACK - else - parrot_state |= PARROT_FLEE - icon_state = icon_living - drop_held_item(0) - else if(istype(O, /obj/item/food/cracker)) //Poly wants a cracker. - qdel(O) - if(health < maxHealth) - adjustBruteLoss(-10) - speak_chance *= 1.27 // 20 crackers to go from 1% to 100% - speech_shuffle_rate += 10 - to_chat(user, span_notice("[src] eagerly devours the cracker.")) - ..() - return - -//Bullets -/mob/living/simple_animal/parrot/bullet_act(obj/projectile/Proj) - . = ..() - if(!stat && !client) - if(parrot_state == PARROT_PERCH) - parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - - parrot_interest = null - parrot_state = PARROT_WANDER | PARROT_FLEE //Been shot and survived! RUN LIKE HELL! - //parrot_been_shot += 5 - icon_state = icon_living - drop_held_item(0) - -/mob/living/simple_animal/parrot/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) - if(!stat) //Birds can fly, fun fact. No I don't care that space doesn't have air. Space parrots bitch - return TRUE - return ..() -/* - * AI - Not really intelligent, but I'm calling it AI anyway. - */ -/mob/living/simple_animal/parrot/Life(seconds_per_tick = SSMOBS_DT, times_fired) - ..() - - //Sprite update for when a parrot gets pulled - if(pulledby && !stat && parrot_state != PARROT_WANDER) - if(buckled) - buckled.unbuckle_mob(src, TRUE) - buckled = null - icon_state = icon_living - parrot_state = PARROT_WANDER - pixel_x = initial(pixel_x) - pixel_y = initial(pixel_y) - return - - -//-----SPEECH - /* Parrot speech mimickry! - Phrases that the parrot Hear()s get added to speach_buffer. - Every once in a while, the parrot picks one of the lines from the buffer and replaces an element of the 'speech' list. */ -/mob/living/simple_animal/parrot/handle_automated_speech() - ..() - if(speech_buffer.len && prob(speech_shuffle_rate)) //shuffle out a phrase and add in a new one - if(speak.len) - speak.Remove(pick(speak)) - - speak.Add(pick(speech_buffer)) - - -/mob/living/simple_animal/parrot/handle_automated_movement() - if(!isturf(src.loc) || !(mobility_flags & MOBILITY_MOVE) || buckled) - return //If it can't move, dont let it move. (The buckled check probably isn't necessary thanks to canmove) - - if(client && stat == CONSCIOUS && parrot_state != icon_living) - icon_state = icon_living - -//-----SLEEPING - if(parrot_state == PARROT_PERCH) - if(parrot_perch && parrot_perch.loc != src.loc) //Make sure someone hasn't moved our perch on us - if(parrot_perch in view(src)) - parrot_state = PARROT_SWOOP | PARROT_RETURN - icon_state = icon_living - return - else - parrot_state = PARROT_WANDER - icon_state = icon_living - return - - parrot_sleep_dur-- - if(parrot_sleep_dur) //Zzz - return - - else - //This way we only call the stuff below once every [sleep_max] ticks. - parrot_sleep_dur = parrot_sleep_max - - //Cycle through message modes for the headset - if(speak.len) - var/list/newspeak = list() - - if(available_channels.len && src.ears) - for(var/possible_phrase in speak) - - //50/50 chance to not use the radio at all - var/useradio = 0 - if(prob(50)) - useradio = 1 - - if((possible_phrase[1] in GLOB.department_radio_prefixes) && (copytext_char(possible_phrase, 2, 3) in GLOB.department_radio_keys)) - possible_phrase = "[useradio?pick(available_channels):""][copytext_char(possible_phrase, 3)]" //crop out the channel prefix - else - possible_phrase = "[useradio?pick(available_channels):""][possible_phrase]" - - newspeak.Add(possible_phrase) - - else //If we have no headset or channels to use, dont try to use any! - for(var/possible_phrase in speak) - if((possible_phrase[1] in GLOB.department_radio_prefixes) && (copytext_char(possible_phrase, 2, 3) in GLOB.department_radio_keys)) - possible_phrase = copytext_char(possible_phrase, 3) //crop out the channel prefix - newspeak.Add(possible_phrase) - speak = newspeak - - //Search for item to steal - parrot_interest = search_for_item() - if(parrot_interest) - manual_emote("looks in [parrot_interest]'s direction and takes flight.") - parrot_state = PARROT_SWOOP | PARROT_STEAL - icon_state = icon_living - return - -//-----WANDERING - This is basically a 'I dont know what to do yet' state - else if(parrot_state == PARROT_WANDER) - //Stop movement, we'll set it later - SSmove_manager.stop_looping(src) - parrot_interest = null - - //Wander around aimlessly. This will help keep the loops from searches down - //and possibly move the mob into a new are in view of something they can use - if(prob(90)) - step(src, pick(GLOB.cardinals)) - return - - if(!held_item && !parrot_perch) //If we've got nothing to do.. look for something to do. - var/atom/movable/AM = search_for_perch_and_item() //This handles checking through lists so we know it's either a perch or stealable item - if(AM) - if(isitem(AM) || isliving(AM)) //If stealable item - parrot_interest = AM - manual_emote("turns and flies towards [parrot_interest].") - parrot_state = PARROT_SWOOP | PARROT_STEAL - return - else //Else it's a perch - parrot_perch = AM - parrot_state = PARROT_SWOOP | PARROT_RETURN - return - return - - if(parrot_interest && (parrot_interest in view(src))) - parrot_state = PARROT_SWOOP | PARROT_STEAL - return - - if(parrot_perch && (parrot_perch in view(src))) - parrot_state = PARROT_SWOOP | PARROT_RETURN - return - - else //Have an item but no perch? Find one! - parrot_perch = search_for_perch() - if(parrot_perch) - parrot_state = PARROT_SWOOP | PARROT_RETURN - return -//-----STEALING - else if(parrot_state == (PARROT_SWOOP | PARROT_STEAL)) - SSmove_manager.stop_looping(src) - if(!parrot_interest || held_item) - parrot_state = PARROT_SWOOP | PARROT_RETURN - return - - if(!(parrot_interest in view(src))) - parrot_state = PARROT_SWOOP | PARROT_RETURN - return - - if(Adjacent(parrot_interest)) - - if(isliving(parrot_interest)) - steal_from_mob() - - else //This should ensure that we only grab the item we want, and make sure it's not already collected on our perch - if(!parrot_perch || parrot_interest.loc != parrot_perch.loc) - held_item = parrot_interest - parrot_interest.forceMove(src) - visible_message(span_notice("[src] grabs [held_item]!"), span_notice("You grab [held_item]!"), span_hear("You hear the sounds of wings flapping furiously.")) - - parrot_interest = null - parrot_state = PARROT_SWOOP | PARROT_RETURN - return - - SSmove_manager.move_to(src, parrot_interest, 1, parrot_speed) - if(isStuck()) - return - - return - -//-----RETURNING TO PERCH - else if(parrot_state == (PARROT_SWOOP | PARROT_RETURN)) - SSmove_manager.stop_looping(src) - if(!parrot_perch || !isturf(parrot_perch.loc)) //Make sure the perch exists and somehow isn't inside of something else. - parrot_perch = null - parrot_state = PARROT_WANDER - return - - if(Adjacent(parrot_perch)) - forceMove(parrot_perch.loc) - drop_held_item() - parrot_state = PARROT_PERCH - icon_state = icon_sit - return - - SSmove_manager.move_to(src, parrot_perch, 1, parrot_speed) - if(isStuck()) - return - - return - -//-----FLEEING - else if(parrot_state == (PARROT_SWOOP | PARROT_FLEE)) - SSmove_manager.stop_looping(src) - if(!parrot_interest || !isliving(parrot_interest)) //Sanity - parrot_state = PARROT_WANDER - - SSmove_manager.move_away(src, parrot_interest, 1, parrot_speed) - if(isStuck()) - return - - return - -//-----ATTACKING - else if(parrot_state == (PARROT_SWOOP | PARROT_ATTACK)) - - //If we're attacking a nothing, an object, a turf or a ghost for some stupid reason, switch to wander - if(!parrot_interest || !isliving(parrot_interest)) - parrot_interest = null - parrot_state = PARROT_WANDER - return - - var/mob/living/L = parrot_interest - if(melee_damage_upper == 0) - melee_damage_upper = parrot_damage_upper - set_combat_mode(TRUE) - - //If the mob is close enough to interact with - if(Adjacent(parrot_interest)) - - //If the mob we've been chasing/attacking dies or falls into crit, check for loot! - if(L.stat) - parrot_interest = null - if(!held_item) - held_item = steal_from_ground() - if(!held_item) - held_item = steal_from_mob() //Apparently it's possible for dead mobs to hang onto items in certain circumstances. - if(parrot_perch in view(src)) //If we have a home nearby, go to it, otherwise find a new home - parrot_state = PARROT_SWOOP | PARROT_RETURN - else - parrot_state = PARROT_WANDER - return - - attack_verb_continuous = pick("claws at", "chomps") - attack_verb_simple = pick("claw at", "chomp") - L.attack_animal(src)//Time for the hurt to begin! - //Otherwise, fly towards the mob! - else - SSmove_manager.move_to(src, parrot_interest, 1, parrot_speed) - if(isStuck()) - return - - return -//-----STATE MISHAP - else //This should not happen. If it does lets reset everything and try again - SSmove_manager.stop_looping(src) - parrot_interest = null - parrot_perch = null - drop_held_item() - parrot_state = PARROT_WANDER - return - -/* - * Procs - */ - -/mob/living/simple_animal/parrot/proc/isStuck() - //Check to see if the parrot is stuck due to things like windows or doors or windowdoors - if(parrot_lastmove) - if(parrot_lastmove == src.loc) - if(parrot_stuck_threshold >= ++parrot_stuck) //If it has been stuck for a while, go back to wander. - parrot_state = PARROT_WANDER - parrot_stuck = 0 - parrot_lastmove = null - return TRUE - else - parrot_lastmove = null - else - parrot_lastmove = src.loc - return FALSE - -/mob/living/simple_animal/parrot/proc/search_for_item() - var/item - for(var/atom/movable/AM in view(src)) - //Skip items we already stole or are wearing or are too big - if(parrot_perch && AM.loc == parrot_perch.loc || AM.loc == src) - continue - if(isitem(AM)) - var/obj/item/I = AM - if(I.w_class < WEIGHT_CLASS_SMALL) - item = I - else if(iscarbon(AM)) - var/mob/living/carbon/C = AM - for(var/obj/item/I in C.held_items) - if(I.w_class <= WEIGHT_CLASS_SMALL) - item = I - break - if(item) - if(!length(get_path_to(src, item))) // WHY DO WE DISREGARD THE PATH AHHHHHH - item = null - continue - return item - -/mob/living/simple_animal/parrot/proc/search_for_perch() - for(var/obj/O in view(src)) - for(var/path in desired_perches) - if(istype(O, path)) - return O - return null - -//This proc was made to save on doing two 'in view' loops seperatly -/mob/living/simple_animal/parrot/proc/search_for_perch_and_item() - for(var/atom/movable/AM in view(src)) - for(var/perch_path in desired_perches) - if(istype(AM, perch_path)) - return AM - - //Skip items we already stole or are wearing or are too big - if(parrot_perch && AM.loc == parrot_perch.loc || AM.loc == src) - continue - - if(isitem(AM)) - var/obj/item/I = AM - if(I.w_class <= WEIGHT_CLASS_SMALL) - return I - - if(iscarbon(AM)) - var/mob/living/carbon/C = AM - for(var/obj/item/I in C.held_items) - if(I.w_class <= WEIGHT_CLASS_SMALL) - return C - return null - - -/* - * Verbs - These are actually procs, but can be used as verbs by player-controlled parrots. - */ -/mob/living/simple_animal/parrot/proc/steal_from_ground() - set name = "Steal from ground" - set category = "Parrot" - set desc = "Grabs a nearby item." - - if(stat) - return -1 - - if(held_item) - to_chat(src, span_warning("You are already holding [held_item]!")) - return 1 - - for(var/obj/item/I in view(1,src)) - //Make sure we're not already holding it and it's small enough - if(I.loc != src && I.w_class <= WEIGHT_CLASS_SMALL) - - //If we have a perch and the item is sitting on it, continue - if(!client && parrot_perch && I.loc == parrot_perch.loc) - continue - - held_item = I - I.forceMove(src) - visible_message(span_notice("[src] grabs [held_item]!"), span_notice("You grab [held_item]!"), span_hear("You hear the sounds of wings flapping furiously.")) - return held_item - - to_chat(src, span_warning("There is nothing of interest to take!")) - return 0 - -/mob/living/simple_animal/parrot/proc/steal_from_mob() - set name = "Steal from mob" - set category = "Parrot" - set desc = "Steals an item right out of a person's hand!" - - if(stat) - return -1 - - if(held_item) - to_chat(src, span_warning("You are already holding [held_item]!")) - return 1 - - var/obj/item/stolen_item = null - - for(var/mob/living/carbon/C in view(1,src)) - for(var/obj/item/I in C.held_items) - if(I.w_class <= WEIGHT_CLASS_SMALL) - stolen_item = I - break - - if(stolen_item) - C.transferItemToLoc(stolen_item, src, TRUE) - held_item = stolen_item - visible_message(span_notice("[src] grabs [held_item] out of [C]'s hand!"), span_notice("You snag [held_item] out of [C]'s hand!"), span_hear("You hear the sounds of wings flapping furiously.")) - return held_item - - to_chat(src, span_warning("There is nothing of interest to take!")) - return 0 - -/mob/living/simple_animal/parrot/verb/drop_held_item_player() - set name = "Drop held item" - set category = "Parrot" - set desc = "Drop the item you're holding." - - if(stat) - return - - src.drop_held_item() - - return - -/mob/living/simple_animal/parrot/proc/drop_held_item(drop_gently = 1) - set name = "Drop held item" - set category = "Parrot" - set desc = "Drop the item you're holding." - - if(stat) - return -1 - - if(!held_item) - if(src == usr) //So that other mobs won't make this message appear when they're bludgeoning you. - to_chat(src, span_warning("You have nothing to drop!")) - return 0 - - -//parrots will eat crackers instead of dropping them - if(istype(held_item, /obj/item/food/cracker) && (drop_gently)) - qdel(held_item) - held_item = null - if(health < maxHealth) - adjustBruteLoss(-10) - manual_emote("[src] eagerly downs the cracker.") - return 1 - - - if(!drop_gently) - if(isgrenade(held_item)) - var/obj/item/grenade/G = held_item - G.forceMove(drop_location()) - G.detonate() - to_chat(src, span_danger("You let go of [held_item]!")) - held_item = null - return 1 - - to_chat(src, span_notice("You drop [held_item].")) - - held_item.forceMove(drop_location()) - held_item = null - return 1 - -/mob/living/simple_animal/parrot/proc/perch_player() - set name = "Sit" - set category = "Parrot" - set desc = "Sit on a nice comfy perch." - - if(stat || !client) - return - - if(icon_state == icon_living) - for(var/atom/movable/AM in view(src,1)) - for(var/perch_path in desired_perches) - if(istype(AM, perch_path)) - src.forceMove(AM.loc) - icon_state = icon_sit - parrot_state = PARROT_PERCH - return - to_chat(src, span_warning("There is no perch nearby to sit on!")) - return - -/mob/living/simple_animal/parrot/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - if(. && !stat && client && parrot_state == PARROT_PERCH) - parrot_state = PARROT_WANDER - icon_state = icon_living - pixel_x = initial(pixel_x) - pixel_y = initial(pixel_y) - -/mob/living/simple_animal/parrot/proc/perch_mob_player() - set name = "Sit on Human's Shoulder" - set category = "Parrot" - set desc = "Sit on a nice comfy human being!" - - if(stat || !client) - return - - if(!buckled) - for(var/mob/living/carbon/human/H in view(src,1)) - if(H.has_buckled_mobs() && H.buckled_mobs.len >= H.max_buckled_mobs) //Already has a parrot, or is being eaten by a slime - continue - perch_on_human(H) - return - to_chat(src, span_warning("There is nobody nearby that you can sit on!")) - else - icon_state = icon_living - parrot_state = PARROT_WANDER - if(buckled) - to_chat(src, span_notice("You are no longer sitting on [buckled]'s shoulder.")) - buckled.unbuckle_mob(src, TRUE) - buckled = null - pixel_x = initial(pixel_x) - pixel_y = initial(pixel_y) - - - -/mob/living/simple_animal/parrot/proc/perch_on_human(mob/living/carbon/human/H) - if(!H) - return - forceMove(get_turf(H)) - if(H.buckle_mob(src, TRUE)) - pixel_y = 9 - pixel_x = pick(-8,8) //pick left or right shoulder - icon_state = icon_sit - parrot_state = PARROT_PERCH - to_chat(src, span_notice("You sit on [H]'s shoulder.")) - - -/mob/living/simple_animal/parrot/proc/toggle_mode() - set name = "Toggle mode" - set category = "Parrot" - set desc = "Time to bear those claws!" - - if(stat || !client) - return - - if((istate & ISTATE_HARM)) - melee_damage_upper = 0 - set_combat_mode(FALSE) - else - melee_damage_upper = parrot_damage_upper - set_combat_mode(TRUE) - to_chat(src, span_notice("You will now [(istate & ISTATE_HARM) ? "Harm" : "Help"] others.")) - return - -/mob/living/simple_animal/parrot/natural - spawn_headset = FALSE -/* - * Sub-types - */ -/mob/living/simple_animal/parrot/poly - name = "Poly" - desc = "Poly the Parrot. An expert on quantum cracker theory." - speak = list("Poly wanna cracker!", ":e Check the crystal, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN MODSUITS?",":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE") - gold_core_spawnable = NO_SPAWN - speak_chance = 3 - var/memory_saved = FALSE - var/rounds_survived = 0 - var/longest_survival = 0 - var/longest_deathstreak = 0 - -/mob/living/simple_animal/parrot/poly/Initialize(mapload) - ears = new /obj/item/radio/headset/headset_eng(src) - available_channels = list(":e") - Read_Memory() - if(rounds_survived == longest_survival) - speak += pick("...[longest_survival].", "The things I've seen!", "I have lived many lives!", "What are you before me?") - desc += " Old as sin, and just as loud. Claimed to be [rounds_survived]." - speak_chance = 20 //His hubris has made him more annoying/easier to justify killing - add_atom_colour("#EEEE22", FIXED_COLOUR_PRIORITY) - else if(rounds_survived == longest_deathstreak) - speak += pick("What are you waiting for!", "Violence breeds violence!", "Blood! Blood!", "Strike me down if you dare!") - desc += " The squawks of [-rounds_survived] dead parrots ring out in your ears..." - add_atom_colour("#BB7777", FIXED_COLOUR_PRIORITY) - else if(rounds_survived > 0) - speak += pick("...again?", "No, It was over!", "Let me out!", "It never ends!") - desc += " Over [rounds_survived] shifts without a \"terrible\" \"accident\"!" - else - speak += pick("...alive?", "This isn't parrot heaven!", "I live, I die, I live again!", "The void fades!") - - . = ..() - -/mob/living/simple_animal/parrot/poly/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved) - Write_Memory(FALSE) - memory_saved = TRUE - ..() - -/mob/living/simple_animal/parrot/poly/death(gibbed) - if(!memory_saved) - Write_Memory(TRUE) - if(rounds_survived == longest_survival || rounds_survived == longest_deathstreak || prob(0.666)) - var/mob/living/simple_animal/parrot/poly/ghost/G = new(loc) - if(mind) - mind.transfer_to(G) - else - G.key = key - ..(gibbed) - -/mob/living/simple_animal/parrot/poly/proc/Read_Memory() - if(fexists("data/npc_saves/Poly.sav")) //legacy compatability to convert old format to new - var/savefile/S = new /savefile("data/npc_saves/Poly.sav") - S["phrases"] >> speech_buffer - S["roundssurvived"] >> rounds_survived - S["longestsurvival"] >> longest_survival - S["longestdeathstreak"] >> longest_deathstreak - fdel("data/npc_saves/Poly.sav") - else - var/json_file = file("data/npc_saves/Poly.json") - if(!fexists(json_file)) - return - var/list/json = json_decode(file2text(json_file)) - speech_buffer = json["phrases"] - rounds_survived = json["roundssurvived"] - longest_survival = json["longestsurvival"] - longest_deathstreak = json["longestdeathstreak"] - if(!islist(speech_buffer)) - speech_buffer = list() - -/mob/living/simple_animal/parrot/poly/Write_Memory(dead, gibbed) - . = ..() - if(!.) - return - var/json_file = file("data/npc_saves/Poly.json") - var/list/file_data = list() - if(islist(speech_buffer)) - file_data["phrases"] = speech_buffer - if(dead) - file_data["roundssurvived"] = min(rounds_survived - 1, 0) - file_data["longestsurvival"] = longest_survival - if(rounds_survived - 1 < longest_deathstreak) - file_data["longestdeathstreak"] = rounds_survived - 1 - else - file_data["longestdeathstreak"] = longest_deathstreak - else - file_data["roundssurvived"] = max(rounds_survived, 0) + 1 - if(rounds_survived + 1 > longest_survival) - file_data["longestsurvival"] = rounds_survived + 1 - else - file_data["longestsurvival"] = longest_survival - file_data["longestdeathstreak"] = longest_deathstreak - fdel(json_file) - WRITE_FILE(json_file, json_encode(file_data)) - -/mob/living/simple_animal/parrot/poly/ghost - name = "The Ghost of Poly" - desc = "Doomed to squawk the Earth." - color = "#FFFFFF77" - speak_chance = 20 - status_flags = GODMODE - sentience_type = SENTIENCE_BOSS //This is so players can't mindswap into ghost poly to become a literal god - incorporeal_move = INCORPOREAL_MOVE_BASIC - butcher_results = list(/obj/item/ectoplasm = 1) - -/mob/living/simple_animal/parrot/poly/ghost/Initialize(mapload) - memory_saved = TRUE //At this point nothing is saved - . = ..() - -/mob/living/simple_animal/parrot/poly/ghost/handle_automated_speech() - if(ismob(loc)) - return - ..() - -/mob/living/simple_animal/parrot/poly/ghost/handle_automated_movement() - if(isliving(parrot_interest)) - if(!ishuman(parrot_interest)) - parrot_interest = null - else if(parrot_state == (PARROT_SWOOP | PARROT_ATTACK) && Adjacent(parrot_interest)) - SSmove_manager.move_to(src, parrot_interest, 0, parrot_speed) - Possess(parrot_interest) - ..() - -/mob/living/simple_animal/parrot/poly/ghost/proc/Possess(mob/living/carbon/human/H) - if(!ishuman(H)) - return - var/datum/disease/parrot_possession/P = new - P.parrot = src - forceMove(H) - H.ForceContractDisease(P, FALSE) - parrot_interest = null - H.visible_message(span_danger("[src] dive bombs into [H]'s chest and vanishes!"), span_userdanger("[src] dive bombs into your chest, vanishing! This can't be good!")) - -#undef PARROT_PERCH -#undef PARROT_SWOOP -#undef PARROT_WANDER -#undef PARROT_STEAL -#undef PARROT_ATTACK -#undef PARROT_RETURN -#undef PARROT_FLEE diff --git a/code/modules/mob/living/simple_animal/revenant.dm b/code/modules/mob/living/simple_animal/revenant.dm deleted file mode 100644 index 97ec1d93a695..000000000000 --- a/code/modules/mob/living/simple_animal/revenant.dm +++ /dev/null @@ -1,544 +0,0 @@ -//Revenants: based off of wraiths from Goon -//"Ghosts" that are invisible and move like ghosts, cannot take damage while invisible -//Can hear deadchat, but are NOT normal ghosts and do NOT have x-ray vision -//Admin-spawn or random event - -/mob/living/simple_animal/revenant - name = "revenant" - desc = "A malevolent spirit." - icon = 'icons/mob/simple/mob.dmi' - icon_state = "revenant_idle" - var/icon_idle = "revenant_idle" - var/icon_reveal = "revenant_revealed" - var/icon_stun = "revenant_stun" - var/icon_drain = "revenant_draining" - var/stasis = FALSE - mob_biotypes = MOB_SPIRIT - incorporeal_move = INCORPOREAL_MOVE_JAUNT - invisibility = INVISIBILITY_REVENANT - health = INFINITY //Revenants don't use health, they use essence instead - maxHealth = INFINITY - plane = GHOST_PLANE - healable = FALSE - sight = SEE_SELF - throwforce = 0 - - // Going for faint purple spoopy ghost - lighting_cutoff_red = 20 - lighting_cutoff_green = 15 - lighting_cutoff_blue = 35 - response_help_continuous = "passes through" - response_help_simple = "pass through" - response_disarm_continuous = "swings through" - response_disarm_simple = "swing through" - response_harm_continuous = "punches through" - response_harm_simple = "punch through" - unsuitable_atmos_damage = 0 - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) //I don't know how you'd apply those, but revenants no-sell them anyway. - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = INFINITY - harm_intent_damage = 0 - friendly_verb_continuous = "touches" - friendly_verb_simple = "touch" - status_flags = 0 - wander = FALSE - density = FALSE - move_resist = MOVE_FORCE_OVERPOWERING - mob_size = MOB_SIZE_TINY - pass_flags = PASSTABLE | PASSGRILLE | PASSMOB - speed = 1 - unique_name = TRUE - hud_possible = list(ANTAG_HUD) - hud_type = /datum/hud/revenant - - var/essence = 75 //The resource, and health, of revenants. - var/essence_regen_cap = 75 //The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount. - var/essence_regenerating = TRUE //If the revenant regenerates essence or not - var/essence_regen_amount = 2.5 //How much essence regenerates per second - var/essence_accumulated = 0 //How much essence the revenant has stolen - var/essence_excess = 0 //How much stolen essence avilable for unlocks - var/revealed = FALSE //If the revenant can take damage from normal sources. - var/unreveal_time = 0 //How long the revenant is revealed for, is about 2 seconds times this var. - var/unstun_time = 0 //How long the revenant is stunned for, is about 2 seconds times this var. - var/inhibited = FALSE //If the revenant's abilities are blocked by a chaplain's power. - var/essence_drained = 0 //How much essence the revenant will drain from the corpse it's feasting on. - var/draining = FALSE //If the revenant is draining someone. - var/list/drained_mobs = list() //Cannot harvest the same mob twice - var/perfectsouls = 0 //How many perfect, regen-cap increasing souls the revenant has. //TODO, add objective for getting a perfect soul(s?) - var/generated_objectives_and_spells = FALSE - -/mob/living/simple_animal/revenant/Initialize(mapload) - . = ..() - AddElement(/datum/element/simple_flying) - add_traits(list(TRAIT_SPACEWALK, TRAIT_SIXTHSENSE, TRAIT_FREE_HYPERSPACE_MOVEMENT), INNATE_TRAIT) - - // Starting spells - - var/datum/action/cooldown/spell/list_target/telepathy/revenant/telepathy = new(src) - telepathy.Grant(src) - - // Starting spells that start locked - var/datum/action/cooldown/spell/aoe/revenant/overload/lights_go_zap = new(src) - lights_go_zap.Grant(src) - - var/datum/action/cooldown/spell/aoe/revenant/defile/windows_go_smash = new(src) - windows_go_smash.Grant(src) - - var/datum/action/cooldown/spell/aoe/revenant/blight/botany_go_mad = new(src) - botany_go_mad.Grant(src) - - var/datum/action/cooldown/spell/aoe/revenant/malfunction/shuttle_go_emag = new(src) - shuttle_go_emag.Grant(src) - - var/datum/action/cooldown/spell/aoe/revenant/haunt_object/toolbox_go_bonk = new(src) - toolbox_go_bonk.Grant(src) - - RegisterSignal(src, COMSIG_LIVING_BANED, PROC_REF(on_baned)) - random_revenant_name() - -/mob/living/simple_animal/revenant/can_perform_action(atom/movable/target, action_bitflags) - return FALSE - -/mob/living/simple_animal/revenant/proc/random_revenant_name() - var/built_name = "" - built_name += pick(strings(REVENANT_NAME_FILE, "spirit_type")) - built_name += " of " - built_name += pick(strings(REVENANT_NAME_FILE, "adverb")) - built_name += pick(strings(REVENANT_NAME_FILE, "theme")) - name = built_name - -/mob/living/simple_animal/revenant/Login() - . = ..() - if(!. || !client) - return FALSE - to_chat(src, span_deadsay("You are a revenant.")) - to_chat(src, "Your formerly mundane spirit has been infused with alien energies and empowered into a revenant.") - to_chat(src, "You are not dead, not alive, but somewhere in between. You are capable of limited interaction with both worlds.") - to_chat(src, "You are invincible and invisible to everyone but other ghosts. Most abilities will reveal you, rendering you vulnerable.") - to_chat(src, "To function, you are to drain the life essence from humans. This essence is a resource, as well as your health, and will power all of your abilities.") - to_chat(src, "You do not remember anything of your past lives, nor will you remember anything about this one after your death.") - to_chat(src, "Be sure to read the wiki page to learn more.") - if(!generated_objectives_and_spells) - generated_objectives_and_spells = TRUE - mind.set_assigned_role(SSjob.GetJobType(/datum/job/revenant)) - mind.special_role = ROLE_REVENANT - SEND_SOUND(src, sound('sound/effects/ghost.ogg')) - mind.add_antag_datum(/datum/antagonist/revenant) - -//Life, Stat, Hud Updates, and Say -/mob/living/simple_animal/revenant/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if(stasis) - return - if(revealed && essence <= 0) - death() - if(unreveal_time && world.time >= unreveal_time) - unreveal_time = 0 - revealed = FALSE - incorporeal_move = INCORPOREAL_MOVE_JAUNT - invisibility = INVISIBILITY_REVENANT - to_chat(src, span_revenboldnotice("You are once more concealed.")) - if(unstun_time && world.time >= unstun_time) - unstun_time = 0 - notransform = FALSE - to_chat(src, span_revenboldnotice("You can move again!")) - if(essence_regenerating && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate - essence = min(essence + (essence_regen_amount * seconds_per_tick), essence_regen_cap) - update_mob_action_buttons() //because we update something required by our spells in life, we need to update our buttons - update_spooky_icon() - update_health_hud() - ..() - -/mob/living/simple_animal/revenant/get_status_tab_items() - . = ..() - . += "Current Essence: [essence >= essence_regen_cap ? essence : "[essence] / [essence_regen_cap]"]E" - . += "Total Essence Stolen: [essence_accumulated]SE" - . += "Unused Stolen Essence: [essence_excess]SE" - . += "Perfect Souls Stolen: [perfectsouls]" - -/mob/living/simple_animal/revenant/update_health_hud() - if(hud_used) - var/essencecolor = "#8F48C6" - if(essence > essence_regen_cap) - essencecolor = "#9A5ACB" //oh boy you've got a lot of essence - else if(!essence) - essencecolor = "#1D2953" //oh jeez you're dying - hud_used.healths.maptext = MAPTEXT("
[essence]E
") - -/mob/living/simple_animal/revenant/med_hud_set_health() - return //we use no hud - -/mob/living/simple_animal/revenant/med_hud_set_status() - return //we use no hud - -/mob/living/simple_animal/revenant/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, message_range = 7, datum/saymode/saymode = null) - if(!message) - return - if(sanitize) - message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) - src.log_talk(message, LOG_SAY) - var/rendered = span_deadsay("UNDEAD: [src] says, \"[message]\"") - for(var/mob/M in GLOB.mob_list) - if(isrevenant(M)) - to_chat(M, rendered) - else if(isobserver(M)) - var/link = FOLLOW_LINK(M, src) - to_chat(M, "[link] [rendered]") - return - - -//Immunities - -/mob/living/simple_animal/revenant/ex_act(severity, target) - return FALSE //Immune to the effects of explosions. - -/mob/living/simple_animal/revenant/blob_act(obj/structure/blob/B) - return //blah blah blobs aren't in tune with the spirit world, or something. - -/mob/living/simple_animal/revenant/singularity_act() - return //don't walk into the singularity expecting to find corpses, okay? - -/mob/living/simple_animal/revenant/narsie_act() - return //most humans will now be either bones or harvesters, but we're still un-alive. - -/mob/living/simple_animal/revenant/bullet_act() - if(!revealed || stasis) - return BULLET_ACT_FORCE_PIERCE - return ..() - -//damage, gibbing, and dying -/mob/living/simple_animal/revenant/proc/on_baned(obj/item/weapon, mob/living/user) - SIGNAL_HANDLER - visible_message(span_warning("[src] violently flinches!"), \ - span_revendanger("As [weapon] passes through you, you feel your essence draining away!")) - inhibited = TRUE - update_mob_action_buttons() - addtimer(CALLBACK(src, PROC_REF(reset_inhibit)), 3 SECONDS) - -/mob/living/simple_animal/revenant/proc/reset_inhibit() - inhibited = FALSE - update_mob_action_buttons() - -/mob/living/simple_animal/revenant/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - if(!forced && !revealed) - return FALSE - . = amount - essence = max(0, essence-amount) - if(updating_health) - update_health_hud() - if(!essence) - death() - -/mob/living/simple_animal/revenant/dust(just_ash, drop_items, force) - death() - -/mob/living/simple_animal/revenant/gib() - death() - -/mob/living/simple_animal/revenant/death() - if(!revealed || stasis) //Revenants cannot die if they aren't revealed //or are already dead - return - stasis = TRUE - to_chat(src, span_revendanger("NO! No... it's too late, you can feel your essence [pick("breaking apart", "drifting away")]...")) - notransform = TRUE - revealed = TRUE - invisibility = 0 - playsound(src, 'sound/effects/screech.ogg', 100, TRUE) - visible_message(span_warning("[src] lets out a waning screech as violet mist swirls around its dissolving body!")) - icon_state = "revenant_draining" - for(var/i = alpha, i > 0, i -= 10) - stoplag() - alpha = i - visible_message(span_danger("[src]'s body breaks apart into a fine pile of blue dust.")) - var/reforming_essence = essence_regen_cap //retain the gained essence capacity - var/obj/item/ectoplasm/revenant/R = new(get_turf(src)) - R.essence = max(reforming_essence - 15 * perfectsouls, 75) //minus any perfect souls - R.old_key = client.key //If the essence reforms, the old revenant is put back in the body - R.revenant = src - invisibility = INVISIBILITY_ABSTRACT - revealed = FALSE - ghostize(0)//Don't re-enter invisible corpse - - -//reveal, stun, icon updates, cast checks, and essence changing -/mob/living/simple_animal/revenant/proc/reveal(time) - if(!src) - return - if(time <= 0) - return - revealed = TRUE - invisibility = 0 - incorporeal_move = FALSE - if(!unreveal_time) - to_chat(src, span_revendanger("You have been revealed!")) - unreveal_time = world.time + time - else - to_chat(src, span_revenwarning("You have been revealed!")) - unreveal_time = unreveal_time + time - update_spooky_icon() - orbiting?.end_orbit(src) - -/mob/living/simple_animal/revenant/proc/stun(time) - if(!src) - return - if(time <= 0) - return - notransform = TRUE - if(!unstun_time) - to_chat(src, span_revendanger("You cannot move!")) - unstun_time = world.time + time - else - to_chat(src, span_revenwarning("You cannot move!")) - unstun_time = unstun_time + time - update_spooky_icon() - orbiting?.end_orbit(src) - -/mob/living/simple_animal/revenant/proc/update_spooky_icon() - if(revealed) - if(notransform) - if(draining) - icon_state = icon_drain - else - icon_state = icon_stun - else - icon_state = icon_reveal - else - icon_state = icon_idle - -/mob/living/simple_animal/revenant/proc/castcheck(essence_cost) - if(!src) - return - var/turf/T = get_turf(src) - if(isclosedturf(T)) - to_chat(src, span_revenwarning("You cannot use abilities from inside of a wall.")) - return FALSE - for(var/obj/O in T) - if(O.density && !O.CanPass(src, get_dir(T, src))) - to_chat(src, span_revenwarning("You cannot use abilities inside of a dense object.")) - return FALSE - if(inhibited) - to_chat(src, span_revenwarning("Your powers have been suppressed by nulling energy!")) - return FALSE - if(!change_essence_amount(essence_cost, TRUE)) - to_chat(src, span_revenwarning("You lack the essence to use that ability.")) - return FALSE - return TRUE - -/mob/living/simple_animal/revenant/proc/unlock(essence_cost) - if(essence_excess < essence_cost) - return FALSE - essence_excess -= essence_cost - update_mob_action_buttons() - return TRUE - -/mob/living/simple_animal/revenant/proc/change_essence_amount(essence_amt, silent = FALSE, source = null) - if(!src) - return - if(essence + essence_amt < 0) - return - essence = max(0, essence+essence_amt) - update_health_hud() - if(essence_amt > 0) - essence_accumulated = max(0, essence_accumulated+essence_amt) - essence_excess = max(0, essence_excess+essence_amt) - update_mob_action_buttons() - if(!silent) - if(essence_amt > 0) - to_chat(src, span_revennotice("Gained [essence_amt]E[source ? " from [source]":""].")) - else - to_chat(src, span_revenminor("Lost [essence_amt]E[source ? " from [source]":""].")) - return 1 - -/mob/living/simple_animal/revenant/proc/death_reset() - revealed = FALSE - unreveal_time = 0 - notransform = 0 - unstun_time = 0 - inhibited = FALSE - draining = FALSE - incorporeal_move = INCORPOREAL_MOVE_JAUNT - invisibility = INVISIBILITY_REVENANT - alpha=255 - stasis = FALSE - -/mob/living/simple_animal/revenant/orbit(atom/target) - setDir(SOUTH) // reset dir so the right directional sprites show up - return ..() - -/mob/living/simple_animal/revenant/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - if(!orbiting) // only needed when orbiting - return ..() - if(incorporeal_move_check(src)) - return ..() - - // back back back it up, the orbitee went somewhere revenant cannot - orbiting?.end_orbit(src) - abstract_move(old_loc) // gross but maybe orbit component will be able to check pre move in the future - -/mob/living/simple_animal/revenant/stop_orbit(datum/component/orbiter/orbits) - // reset the simple_flying animation - animate(src, pixel_y = 2, time = 1 SECONDS, loop = -1, flags = ANIMATION_RELATIVE) - animate(pixel_y = -2, time = 1 SECONDS, flags = ANIMATION_RELATIVE) - return ..() - -/// Incorporeal move check: blocked by holy-watered tiles and salt piles. -/mob/living/simple_animal/revenant/proc/incorporeal_move_check(atom/destination) - var/turf/open/floor/stepTurf = get_turf(destination) - if(stepTurf) - var/obj/effect/decal/cleanable/food/salt/salt = locate() in stepTurf - if(salt) - to_chat(src, span_warning("[salt] bars your passage!")) - reveal(20) - stun(20) - return - if(stepTurf.turf_flags & NOJAUNT) - to_chat(src, span_warning("Some strange aura is blocking the way.")) - return - if(locate(/obj/effect/blessing) in stepTurf) - to_chat(src, span_warning("Holy energies block your path!")) - return - return TRUE - -//reforming -/obj/item/ectoplasm/revenant - name = "glimmering residue" - desc = "A pile of fine blue dust. Small tendrils of violet mist swirl around it." - icon = 'icons/effects/effects.dmi' - icon_state = "revenantEctoplasm" - w_class = WEIGHT_CLASS_SMALL - var/essence = 75 //the maximum essence of the reforming revenant - var/reforming = TRUE - var/inert = FALSE - var/old_key //key of the previous revenant, will have first pick on reform. - var/mob/living/simple_animal/revenant/revenant - -/obj/item/ectoplasm/revenant/Initialize(mapload) - . = ..() - addtimer(CALLBACK(src, PROC_REF(try_reform)), 600) - -/obj/item/ectoplasm/revenant/proc/scatter() - qdel(src) - -/obj/item/ectoplasm/revenant/proc/try_reform() - if(reforming) - reforming = FALSE - reform() - else - inert = TRUE - visible_message(span_warning("[src] settles down and seems lifeless.")) - -/obj/item/ectoplasm/revenant/attack_self(mob/user) - if(!reforming || inert) - return ..() - user.visible_message(span_notice("[user] scatters [src] in all directions."), \ - span_notice("You scatter [src] across the area. The particles slowly fade away.")) - user.dropItemToGround(src) - scatter() - -/obj/item/ectoplasm/revenant/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - ..() - if(inert) - return - visible_message(span_notice("[src] breaks into particles upon impact, which fade away to nothingness.")) - scatter() - -/obj/item/ectoplasm/revenant/examine(mob/user) - . = ..() - if(inert) - . += span_revennotice("It seems inert.") - else if(reforming) - . += span_revenwarning("It is shifting and distorted. It would be wise to destroy this.") - -/obj/item/ectoplasm/revenant/proc/reform() - if(QDELETED(src) || QDELETED(revenant) || inert) - return - var/key_of_revenant - message_admins("Revenant ectoplasm was left undestroyed for 1 minute and is reforming into a new revenant.") - forceMove(drop_location()) //In case it's in a backpack or someone's hand - revenant.forceMove(loc) - if(old_key) - for(var/mob/M in GLOB.dead_mob_list) - if(M.client && M.client.key == old_key) //Only recreates the mob if the mob the client is in is dead - key_of_revenant = old_key - break - if(!key_of_revenant) - message_admins("The new revenant's old client either could not be found or is in a new, living mob - grabbing a random candidate instead...") - var/list/candidates = poll_candidates_for_mob("Do you want to be [revenant.name] (reforming)?", ROLE_REVENANT, ROLE_REVENANT, 5 SECONDS, revenant) - if(!LAZYLEN(candidates)) - qdel(revenant) - message_admins("No candidates were found for the new revenant. Oh well!") - inert = TRUE - visible_message(span_revenwarning("[src] settles down and seems lifeless.")) - return - var/mob/dead/observer/C = pick(candidates) - key_of_revenant = C.key - if(!key_of_revenant) - qdel(revenant) - message_admins("No ckey was found for the new revenant. Oh well!") - inert = TRUE - visible_message(span_revenwarning("[src] settles down and seems lifeless.")) - return - - message_admins("[key_of_revenant] has been [old_key == key_of_revenant ? "re":""]made into a revenant by reforming ectoplasm.") - revenant.log_message("was [old_key == key_of_revenant ? "re":""]made as a revenant by reforming ectoplasm.", LOG_GAME) - visible_message(span_revenboldnotice("[src] suddenly rises into the air before fading away.")) - - revenant.essence = essence - revenant.essence_regen_cap = essence - revenant.death_reset() - revenant.key = key_of_revenant - revenant = null - qdel(src) - -/obj/item/ectoplasm/revenant/suicide_act(mob/living/user) - user.visible_message(span_suicide("[user] is inhaling [src]! It looks like [user.p_theyre()] trying to visit the shadow realm!")) - scatter() - return OXYLOSS - -/obj/item/ectoplasm/revenant/Destroy() - if(!QDELETED(revenant)) - qdel(revenant) - return ..() - -//objectives -/datum/objective/revenant - var/targetAmount = 100 - -/datum/objective/revenant/New() - targetAmount = rand(350,600) - explanation_text = "Absorb [targetAmount] points of essence from humans." - ..() - -/datum/objective/revenant/check_completion() - if(!isrevenant(owner.current)) - return FALSE - var/mob/living/simple_animal/revenant/R = owner.current - if(!R || R.stat == DEAD) - return FALSE - var/essence_stolen = R.essence_accumulated - if(essence_stolen < targetAmount) - return FALSE - return TRUE - -/datum/objective/revenant_fluff - -/datum/objective/revenant_fluff/New() - var/list/explanation_texts = list( - "Assist and exacerbate existing threats at critical moments.", \ - "Impersonate or be worshipped as a god.", \ - "Cause as much chaos and anger as you can without being killed.", \ - "Damage and render as much of the station rusted and unusable as possible.", \ - "Disable and cause malfunctions in as many machines as possible.", \ - "Ensure that any holy weapons are rendered unusable.", \ - "Heed and obey the requests of the dead, provided that carrying them out wouldn't be too inconvenient or self-destructive.", \ - "Make the crew as miserable as possible.", \ - "Make the clown as miserable as possible.", \ - "Make the captain as miserable as possible.", \ - "Prevent the use of energy weapons where possible.", - ) - explanation_text = pick(explanation_texts) - ..() - -/datum/objective/revenant_fluff/check_completion() - return TRUE - diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm deleted file mode 100644 index 87e6f536cb60..000000000000 --- a/code/modules/mob/living/simple_animal/shade.dm +++ /dev/null @@ -1,72 +0,0 @@ -/mob/living/simple_animal/shade - name = "Shade" - real_name = "Shade" - desc = "A bound spirit." - gender = PLURAL - icon = 'icons/mob/nonhuman-player/cult.dmi' - icon_state = "shade_cult" - icon_living = "shade_cult" - mob_biotypes = MOB_SPIRIT - maxHealth = 40 - health = 40 - healable = 0 - speak_emote = list("hisses") - emote_hear = list("wails.","screeches.") - response_help_continuous = "puts their hand through" - response_help_simple = "put your hand through" - response_disarm_continuous = "flails at" - response_disarm_simple = "flail at" - response_harm_continuous = "punches" - response_harm_simple = "punch" - speak_chance = 1 - melee_damage_lower = 5 - melee_damage_upper = 12 - attack_verb_continuous = "metaphysically strikes" - attack_verb_simple = "metaphysically strike" - minbodytemp = 0 - maxbodytemp = INFINITY - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - speed = -1 //they don't have to lug a body made of runed metal around - stop_automated_movement = 1 - faction = list(FACTION_CULT) - status_flags = CANPUSH - loot = list(/obj/item/ectoplasm) - del_on_death = TRUE - initial_language_holder = /datum/language_holder/construct - -/mob/living/simple_animal/shade/Initialize(mapload) - . = ..() - AddElement(/datum/element/simple_flying) - add_traits(list(TRAIT_HEALS_FROM_CULT_PYLONS, TRAIT_SPACEWALK, TRAIT_VENTCRAWLER_ALWAYS), INNATE_TRAIT) - -/mob/living/simple_animal/shade/death() - if(death_message == initial(death_message)) - death_message = "lets out a contented sigh as [p_their()] form unwinds." - ..() - -/mob/living/simple_animal/shade/can_suicide() - if(istype(loc, /obj/item/soulstone)) //do not suicide inside the soulstone - return FALSE - return ..() - -/mob/living/simple_animal/shade/attack_animal(mob/living/simple_animal/user, list/modifiers) - if(isconstruct(user)) - var/mob/living/simple_animal/hostile/construct/doll = user - if(!doll.can_repair) - return - if(health < maxHealth) - adjustHealth(-25) - Beam(user,icon_state="sendbeam", time = 4) - user.visible_message(span_danger("[user] heals \the [src]."), \ - span_cult("You heal [src], leaving [src] at [health]/[maxHealth] health.")) - else - to_chat(user, span_cult("You cannot heal [src], as [p_theyre()] unharmed!")) - else if(src != user) - return ..() - -/mob/living/simple_animal/shade/attackby(obj/item/item, mob/user, params) //Marker -Agouri - if(istype(item, /obj/item/soulstone)) - var/obj/item/soulstone/stone = item - stone.capture_shade(src, user) - else - . = ..() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 09e3fe1f2546..bbe1275d90a7 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -136,10 +136,6 @@ ///Played when someone punches the creature. var/attacked_sound = SFX_PUNCH - ///If the creature has, and can use, hands. - var/dextrous = FALSE - var/dextrous_hud_type = /datum/hud/dextrous - ///The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever), AI_Z_OFF (Temporarily off due to nonpresence of players). var/AIStatus = AI_ON ///once we have become sentient, we can never go back. @@ -180,9 +176,6 @@ if(!loc) stack_trace("Simple animal being instantiated in nullspace") update_simplemob_varspeed() - if(dextrous) - AddComponent(/datum/component/personal_crafting) - add_traits(list(TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP), ROUNDSTART_TRAIT) ADD_TRAIT(src, TRAIT_NOFIRE_SPREAD, ROUNDSTART_TRAIT) if(length(weather_immunities)) add_traits(weather_immunities, ROUNDSTART_TRAIT) @@ -448,23 +441,19 @@ /mob/living/simple_animal/death(gibbed) drop_loot() - if(dextrous) - drop_all_held_items() - if(del_on_death) ..() //Prevent infinite loops if the mob Destroy() is overridden in such //a manner as to cause a call to death() again //Pain del_on_death = FALSE qdel(src) - return - - health = 0 - icon_state = icon_dead - if(flip_on_death) - transform = transform.Turn(180) - //ADD_TRAIT(src, TRAIT_UNDENSE, BASIC_MOB_DEATH_TRAIT) - return ..() + else + health = 0 + icon_state = icon_dead + if(flip_on_death) + transform = transform.Turn(180) + ADD_TRAIT(src, TRAIT_UNDENSE, BASIC_MOB_DEATH_TRAIT) + ..() /mob/living/simple_animal/proc/CanAttack(atom/the_target) if(see_invisible < the_target.invisibility) @@ -488,7 +477,7 @@ if(!.) return icon_state = icon_living - set_density(initial(density)) + REMOVE_TRAIT(src, TRAIT_UNDENSE, BASIC_MOB_DEATH_TRAIT) /mob/living/simple_animal/proc/make_babies() // <3 <3 <3 if(gender != FEMALE || stat || next_scan_time > world.time || !childtype || !animal_species || !SSticker.IsRoundInProgress()) @@ -509,7 +498,7 @@ else if(!is_child && M.gender == MALE && !(M.flags_1 & HOLOGRAM_1)) //Better safe than sorry ;_; partner = M - else if(isliving(M) && !faction_check_mob(M)) //shyness check. we're not shy in front of things that share a faction with us. + else if(isliving(M) && !faction_check_atom(M)) //shyness check. we're not shy in front of things that share a faction with us. return //we never mate when not alone, so just abort early if(alone && partner && children < 3) @@ -558,49 +547,12 @@ /mob/living/simple_animal/get_idcard(hand_first) return (..() || access_card) -/mob/living/simple_animal/can_hold_items(obj/item/I) - return dextrous && ..() - -/mob/living/simple_animal/activate_hand(selhand) - if(!dextrous) - return ..() - if(!selhand) - selhand = (active_hand_index % held_items.len)+1 - if(istext(selhand)) - selhand = lowertext(selhand) - if(selhand == "right" || selhand == "r") - selhand = 2 - if(selhand == "left" || selhand == "l") - selhand = 1 - if(selhand != active_hand_index) - swap_hand(selhand) - else - mode() - -/mob/living/simple_animal/perform_hand_swap(hand_index) - . = ..() - if(!.) - return - if(!dextrous) - return - if(!hand_index) - hand_index = (active_hand_index % held_items.len)+1 - var/oindex = active_hand_index - active_hand_index = hand_index - if(hud_used) - var/atom/movable/screen/inventory/hand/H - H = hud_used.hand_slots["[hand_index]"] - if(H) - H.update_appearance() - H = hud_used.hand_slots["[oindex]"] - if(H) - H.update_appearance() - /mob/living/simple_animal/put_in_hands(obj/item/I, del_on_fail = FALSE, merge_stacks = TRUE, ignore_animation = TRUE) . = ..() update_held_items() /mob/living/simple_animal/update_held_items() + . = ..() if(!client || !hud_used || hud_used.hud_version == HUD_STYLE_NOHUD) return var/turf/our_turf = get_turf(src) diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index ca578f949dfe..6f9d42fed1a8 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -1,5 +1,5 @@ /mob/living/simple_animal/slime/Life(seconds_per_tick = SSMOBS_DT, times_fired) - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return . = ..() if(!.) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index a84f4d22d0b2..c03105b7e62d 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -273,15 +273,6 @@ amount = -abs(amount) return ..() //Heals them -/mob/living/simple_animal/slime/bullet_act(obj/projectile/Proj, def_zone, piercing_hit = FALSE) - attacked += 10 - if((Proj.damage_type == BURN)) - adjustBruteLoss(-abs(Proj.damage)) //fire projectiles heals slimes. - Proj.on_hit(src, 0, piercing_hit) - else - . = ..(Proj) - . = . || BULLET_ACT_BLOCK - /mob/living/simple_animal/slime/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index d7300dcbabbc..2a3f855fc1a0 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -131,6 +131,9 @@ if(!client.patreon) client.patreon = new(client) + if(!client.twitch) + client.twitch = new(client) + if(!client.saved_tokens) client.saved_tokens = new(client) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 71e675ee5b97..6ae8c88d2acd 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -894,10 +894,45 @@ /// Performs the actual ritual of swapping hands, such as setting the held index variables /mob/proc/perform_hand_swap(held_index) PROTECTED_PROC(TRUE) + if (!HAS_TRAIT(src, TRAIT_CAN_HOLD_ITEMS)) + return FALSE + + if(!held_index) + held_index = (active_hand_index % held_items.len) + 1 + + if(!isnum(held_index)) + CRASH("You passed [held_index] into swap_hand instead of a number. WTF man") + + var/previous_index = active_hand_index + active_hand_index = held_index + if(hud_used) + var/atom/movable/screen/inventory/hand/held_location + held_location = hud_used.hand_slots["[previous_index]"] + if(!isnull(held_location)) + held_location.update_appearance() + held_location = hud_used.hand_slots["[held_index]"] + if(!isnull(held_location)) + held_location.update_appearance() return TRUE -/mob/proc/activate_hand(selhand) - return +/mob/proc/activate_hand(selected_hand) + if (!HAS_TRAIT(src, TRAIT_CAN_HOLD_ITEMS)) + return + + if(!selected_hand) + selected_hand = (active_hand_index % held_items.len)+1 + + if(istext(selected_hand)) + selected_hand = lowertext(selected_hand) + if(selected_hand == "right" || selected_hand == "r") + selected_hand = 2 + if(selected_hand == "left" || selected_hand == "l") + selected_hand = 1 + + if(selected_hand != active_hand_index) + swap_hand(selected_hand) + else + mode() /mob/proc/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //For sec bot threat assessment return 0 @@ -1028,21 +1063,7 @@ ///Can this mob use storage /mob/proc/canUseStorage() return FALSE -/** - * Check if the other mob has any factions the same as us - * - * If exact match is set, then all our factions must match exactly - */ -/mob/proc/faction_check_mob(mob/target, exact_match) - if(exact_match) //if we need an exact match, we need to do some bullfuckery. - var/list/faction_src = faction.Copy() - var/list/faction_target = target.faction.Copy() - if(!("[REF(src)]" in faction_target)) //if they don't have our ref faction, remove it from our factions list. - faction_src -= "[REF(src)]" //if we don't do this, we'll never have an exact match. - if(!("[REF(target)]" in faction_src)) - faction_target -= "[REF(target)]" //same thing here. - return faction_check(faction_src, faction_target, TRUE) - return faction_check(faction, target.faction, FALSE) + /* * Compare two lists of factions, returning true if any match * diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 35b780f3f587..32c44d320b59 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -20,6 +20,8 @@ // we never want to hide a turf because it's not lit // We can rely on the lighting plane to handle that for us see_in_dark = 1e6 + // A list of factions that this mob is currently in, for hostile mob targeting, amongst other things + faction = list(FACTION_NEUTRAL) /// The current client inhabiting this mob. Managed by login/logout /// This exists so we can do cleanup in logout for occasions where a client was transfere rather then destroyed /// We need to do this because the mob on logout never actually has a reference to client @@ -85,14 +87,6 @@ /// Tick time the mob can next move var/next_move = null - /** - * Magic var that stops you moving and interacting with anything - * - * Set when you're being turned into something else and also used in a bunch of places - * it probably shouldn't really be - */ - var/notransform = null //Carbon - /// What is the mobs real name (name is overridden for disguises etc) var/real_name = null @@ -156,9 +150,6 @@ /// What job does this mob have var/job = null//Living - /// A list of factions that this mob is currently in, for hostile mob targetting, amongst other things - var/list/faction = list(FACTION_NEUTRAL) - /// Can this mob enter shuttles var/move_on_shuttle = 1 diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 66e2e18350b9..b14cd0d97295 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -518,3 +518,51 @@ "[key_name(src)] manually changed selected zone", data, ) + +/** + * Returns an associative list of the logs of a certain amount of lines spoken recently by this mob + * copy_amount - number of lines to return + * line_chance - chance to return a line, if you don't want just the most recent x lines + */ +/mob/proc/copy_recent_speech(copy_amount = LING_ABSORB_RECENT_SPEECH, line_chance = 100) + var/list/recent_speech = list() + var/list/say_log = list() + var/log_source = logging + 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) + if(recent_speech.len >= copy_amount) + break + if(!prob(line_chance)) + continue + recent_speech[spoken_memory] = splittext(say_log[spoken_memory], "\"", 1, 0, TRUE)[3] + + var/list/raw_lines = list() + for (var/key as anything in recent_speech) + raw_lines += recent_speech[key] + + return raw_lines + +/// Takes in an associated list (key `/datum/action` typepaths, value is the AI blackboard key) and handles granting the action and adding it to the mob's AI controller blackboard. +/// This is only useful in instances where you don't want to store the reference to the action on a variable on the mob. +/// You can set the value to null if you don't want to add it to the blackboard (like in player controlled instances). Is also safe with null AI controllers. +/// Assumes that the action will be initialized and held in the mob itself, which is typically standard. +/mob/proc/grant_actions_by_list(list/input) + if(length(input) <= 0) + return + + for(var/action in input) + var/datum/action/ability = new action(src) + ability.Grant(src) + + var/blackboard_key = input[action] + if(isnull(blackboard_key)) + continue + + ai_controller?.set_blackboard_key(blackboard_key, ability) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 333eab324d52..67045a2a4a11 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -74,8 +74,8 @@ return FALSE if(!mob?.loc) return FALSE - if(mob.notransform) - return FALSE //This is sota the goto stop mobs from moving var + if(HAS_TRAIT(mob, TRAIT_NO_TRANSFORM)) + return FALSE //This is sorta the goto stop mobs from moving trait if(mob.control_object) return Move_object(direct) if(!isliving(mob)) @@ -255,9 +255,9 @@ if(salt) to_chat(L, span_warning("[salt] bars your passage!")) if(isrevenant(L)) - var/mob/living/simple_animal/revenant/R = L - R.reveal(20) - R.stun(20) + var/mob/living/basic/revenant/ghostie = L + ghostie.apply_status_effect(/datum/status_effect/revenant/revealed, 2 SECONDS) + ghostie.apply_status_effect(/datum/status_effect/incapacitating/paralyzed/revenant, 2 SECONDS) return if(stepTurf.turf_flags & NOJAUNT) to_chat(L, span_warning("Some strange aura is blocking the way.")) diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index 252d4362f967..27287834fe49 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -62,6 +62,7 @@ else desired_mob.key = key + SEND_SIGNAL(src, COMSIG_MOB_CHANGED_TYPE, desired_mob) if(delete_old_mob) QDEL_IN(src, 1) return desired_mob diff --git a/code/modules/mob/mob_update_icons.dm b/code/modules/mob/mob_update_icons.dm index 5ac1fd3105a8..bd17424d8482 100644 --- a/code/modules/mob/mob_update_icons.dm +++ b/code/modules/mob/mob_update_icons.dm @@ -29,7 +29,8 @@ ///Updates the held items overlay(s) & HUD element. /mob/proc/update_held_items() - return + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_MOB_UPDATE_HELD_ITEMS) ///Updates the mask overlay & HUD element. /mob/proc/update_worn_mask() diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index f80f072bcc4e..15e5c8fe525b 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -1,7 +1,11 @@ #define TRANSFORMATION_DURATION 22 +/// Will be removed once the transformation is complete. +#define TEMPORARY_TRANSFORMATION_TRAIT "temporary_transformation" +/// Considered "permanent" since we'll be deleting the old mob and the client will be inserted into a new one (without this trait) +#define PERMANENT_TRANSFORMATION_TRAIT "permanent_transformation" /mob/living/carbon/proc/monkeyize(instant = FALSE) - if (notransform || transformation_timer) + if (transformation_timer || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(ismonkey(src)) @@ -12,7 +16,7 @@ return //Make mob invisible and spawn animation - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) Paralyze(TRANSFORMATION_DURATION, ignore_canstun = TRUE) icon = null cut_overlays() @@ -23,8 +27,8 @@ /mob/living/carbon/proc/finish_monkeyize() transformation_timer = null - to_chat(src, "You are now a monkey.") - notransform = FALSE + to_chat(src, span_boldnotice("You are now a monkey.")) + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) icon = initial(icon) invisibility = 0 set_species(/datum/species/monkey) @@ -37,7 +41,7 @@ //Could probably be merged with monkeyize but other transformations got their own procs, too /mob/living/carbon/proc/humanize(species = /datum/species/human, instant = FALSE) - if (notransform || transformation_timer) + if (transformation_timer || HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return if(!ismonkey(src)) @@ -48,7 +52,7 @@ return //Make mob invisible and spawn animation - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) Paralyze(TRANSFORMATION_DURATION, ignore_canstun = TRUE) icon = null cut_overlays() @@ -59,8 +63,8 @@ /mob/living/carbon/proc/finish_humanize(species = /datum/species/human) transformation_timer = null - to_chat(src, "You are now a human.") - notransform = FALSE + to_chat(src, span_boldnotice("You are now a human.")) + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) icon = initial(icon) invisibility = 0 set_species(species) @@ -102,10 +106,10 @@ qdel(src) -/mob/living/carbon/AIize(transfer_after = TRUE, client/preference_source) - if (notransform) +/mob/living/carbon/AIize(client/preference_source, transfer_after = TRUE) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) Paralyze(1, ignore_canstun = TRUE) for(var/obj/item/W in src) dropItemToGround(W) @@ -114,8 +118,8 @@ invisibility = INVISIBILITY_MAXIMUM return ..() -/mob/living/carbon/human/AIize(transfer_after = TRUE, client/preference_source) - if (notransform) +/mob/living/carbon/human/AIize(client/preference_source, transfer_after = TRUE) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return for(var/t in bodyparts) qdel(t) @@ -123,9 +127,9 @@ return ..() /mob/proc/Robotize(delete_items = 0, transfer_after = TRUE) - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) var/mob/living/silicon/robot/new_borg = new /mob/living/silicon/robot(loc) new_borg.gender = gender @@ -158,9 +162,9 @@ qdel(src) /mob/living/Robotize(delete_items = 0, transfer_after = TRUE) - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) Paralyze(1, ignore_canstun = TRUE) for(var/obj/item/W in src) @@ -172,7 +176,7 @@ icon = null invisibility = INVISIBILITY_MAXIMUM - notransform = FALSE + REMOVE_TRAIT(src, TRAIT_NO_TRANSFORM, TEMPORARY_TRANSFORMATION_TRAIT) return ..() /mob/living/silicon/robot/proc/replace_banned_cyborg() @@ -187,9 +191,9 @@ //human -> alien /mob/living/carbon/human/proc/Alienize() - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), TRAIT_GENERIC) for(var/obj/item/W in src) dropItemToGround(W) @@ -213,14 +217,14 @@ new_xeno.key = key update_atom_languages() - to_chat(new_xeno, "You are now an alien.") - . = new_xeno + to_chat(new_xeno, span_boldnotice("You are now an alien.")) qdel(src) + return new_xeno /mob/living/carbon/human/proc/slimeize(reproduce as num) - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), TRAIT_GENERIC) for(var/obj/item/W in src) dropItemToGround(W) @@ -245,9 +249,9 @@ new_slime.set_combat_mode(TRUE) new_slime.key = key - to_chat(new_slime, "You are now a slime. Skreee!") - . = new_slime + to_chat(new_slime, span_boldnotice("You are now a slime. Skreee!")) qdel(src) + return new_slime /mob/proc/become_overmind(starting_points = OVERMIND_STARTING_POINTS) var/mob/camera/blob/B = new /mob/camera/blob(get_turf(src), starting_points) @@ -257,9 +261,9 @@ /mob/living/carbon/human/proc/corgize() - if (notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) Paralyze(1, ignore_canstun = TRUE) for(var/obj/item/W in src) dropItemToGround(W) @@ -273,14 +277,14 @@ new_corgi.set_combat_mode(TRUE) new_corgi.key = key - to_chat(new_corgi, "You are now a Corgi. Yap Yap!") - . = new_corgi + to_chat(new_corgi, span_boldnotice("You are now a Corgi. Yap Yap!")) qdel(src) + return new_corgi /mob/living/carbon/proc/gorillize() - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) Paralyze(1, ignore_canstun = TRUE) SSblackbox.record_feedback("amount", "gorillas_created", 1) @@ -293,15 +297,15 @@ regenerate_icons() icon = null invisibility = INVISIBILITY_MAXIMUM - var/mob/living/simple_animal/hostile/gorilla/new_gorilla = new (get_turf(src)) + var/mob/living/basic/gorilla/new_gorilla = new (get_turf(src)) new_gorilla.set_combat_mode(TRUE) if(mind) mind.transfer_to(new_gorilla) else new_gorilla.key = key - to_chat(new_gorilla, "You are now a gorilla. Ooga ooga!") - . = new_gorilla + to_chat(new_gorilla, span_boldnotice("You are now a gorilla. Ooga ooga!")) qdel(src) + return new_gorilla /mob/living/carbon/human/Animalize() @@ -313,9 +317,9 @@ to_chat(usr, span_danger("Sorry but this mob type is currently unavailable.")) return - if(notransform) + if(HAS_TRAIT(src, TRAIT_NO_TRANSFORM)) return - notransform = TRUE + ADD_TRAIT(src, TRAIT_NO_TRANSFORM, PERMANENT_TRANSFORMATION_TRAIT) Paralyze(1, ignore_canstun = TRUE) for(var/obj/item/W in src) @@ -334,8 +338,8 @@ new_mob.set_combat_mode(TRUE) to_chat(new_mob, span_boldnotice("You suddenly feel more... animalistic.")) - . = new_mob qdel(src) + return new_mob /mob/proc/Animalize() @@ -367,7 +371,7 @@ if(!MP) return FALSE //Sanity, this should never happen. - if(ispath(MP, /mob/living/simple_animal/hostile/construct)) + if(ispath(MP, /mob/living/basic/construct)) return FALSE //Verbs do not appear for players. //Good mobs! @@ -381,7 +385,7 @@ return TRUE if(ispath(MP, /mob/living/basic/mushroom)) return TRUE - if(ispath(MP, /mob/living/simple_animal/shade)) + if(ispath(MP, /mob/living/basic/shade)) return TRUE if(ispath(MP, /mob/living/basic/killer_tomato)) return TRUE @@ -389,10 +393,12 @@ return TRUE if(ispath(MP, /mob/living/basic/bear)) return TRUE - if(ispath(MP, /mob/living/simple_animal/parrot)) + if(ispath(MP, /mob/living/basic/parrot)) return TRUE //Parrots are no longer unfinished! -Nodrak //Not in here? Must be untested! return FALSE +#undef PERMANENT_TRANSFORMATION_TRAIT +#undef TEMPORARY_TRANSFORMATION_TRAIT #undef TRANSFORMATION_DURATION diff --git a/code/modules/mob_spawn/corpses/mining_corpses.dm b/code/modules/mob_spawn/corpses/mining_corpses.dm index c6e7525a92cc..373d326880b1 100644 --- a/code/modules/mob_spawn/corpses/mining_corpses.dm +++ b/code/modules/mob_spawn/corpses/mining_corpses.dm @@ -16,18 +16,21 @@ //Legion infested mobs -//dwarf type which spawns dwarfy versions -/obj/effect/mob_spawn/corpse/human/legioninfested/dwarf - -/obj/effect/mob_spawn/corpse/human/legioninfested/dwarf/special(mob/living/carbon/human/spawned_human) - . = ..() - spawned_human.dna.add_mutation(/datum/mutation/human/dwarfism) - -//main type, rolls a pool of legion victims +/// Mob spawner used by Legion to spawn costumed bodies /obj/effect/mob_spawn/corpse/human/legioninfested brute_damage = 1000 /obj/effect/mob_spawn/corpse/human/legioninfested/Initialize(mapload) + outfit = select_outfit() + return ..() + +/obj/effect/mob_spawn/corpse/human/legioninfested/special(mob/living/carbon/human/spawned_human) + . = ..() + var/obj/item/organ/internal/legion_tumour/cancer = new() + cancer.Insert(spawned_human, special = TRUE, drop_if_replaced = FALSE) + +/// Returns the outfit worn by our corpse +/obj/effect/mob_spawn/corpse/human/legioninfested/proc/select_outfit() var/corpse_theme = pick_weight(list( "Miner" = 66, "Ashwalker" = 10, @@ -40,24 +43,91 @@ "Shadow", )) = 4, )) + switch(corpse_theme) if("Miner") - outfit = /datum/outfit/consumed_miner + return /datum/outfit/consumed_miner if("Ashwalker") - outfit = /datum/outfit/consumed_ashwalker + return /datum/outfit/consumed_ashwalker + if("Golem") + return /datum/outfit/consumed_golem if("Clown") - outfit = /datum/outfit/consumed_clown + return /datum/outfit/consumed_clown if("Cultist") - outfit = /datum/outfit/consumed_cultist + return /datum/outfit/consumed_cultist if("Dame") - outfit = /datum/outfit/consumed_dame + return /datum/outfit/consumed_dame + if("Operative") + return /datum/outfit/syndicatecommandocorpse/lessenedgear + if("Shadow") + return /datum/outfit/consumed_shadowperson + +/// Corpse spawner used by dwarf legions to make small corpses +/obj/effect/mob_spawn/corpse/human/legioninfested/dwarf + +/obj/effect/mob_spawn/corpse/human/legioninfested/dwarf/special(mob/living/carbon/human/spawned_human) + . = ..() + spawned_human.dna.add_mutation(/datum/mutation/human/dwarfism) + +/// Corpse spawner used by snow legions with alternate costumes +/obj/effect/mob_spawn/corpse/human/legioninfested/snow + +/obj/effect/mob_spawn/corpse/human/legioninfested/snow/select_outfit() + var/corpse_theme = pick_weight(list( + "Miner" = 64, + "Clown" = 5, + "Golem" = 15, + "Settler" = 10, + pick(list( + "Cultist", + "Heremoth", + "Operative", + "Shadow", + )) = 4, + )) + + switch(corpse_theme) + if("Miner") + return /datum/outfit/consumed_miner + if("Settler") + return /datum/outfit/consumed_ice_settler + if("Heremoth") + return /datum/outfit/consumed_heremoth + if("Clown") + return /datum/outfit/consumed_clown + if("Cultist") + return /datum/outfit/consumed_cultist if("Golem") - outfit = /datum/outfit/consumed_golem + return /datum/outfit/consumed_golem if("Operative") - outfit = /datum/outfit/syndicatecommandocorpse + return /datum/outfit/syndicatecommandocorpse/lessenedgear if("Shadow") - outfit = /datum/outfit/consumed_shadowperson + return /datum/outfit/consumed_shadowperson + +/// Creates a dead legion-infested skeleton +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton + name = "legion-infested skeleton" + mob_name = "skeleton" + mob_species = /datum/species/skeleton + +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/select_outfit() + return null + +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/special(mob/living/carbon/human/spawned_human) . = ..() + spawned_human.gender = NEUTER + +/// Creates a dead and burned legion-infested skeleton +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/charred + name = "charred legion-infested skeleton" + mob_name = "charred skeleton" + brute_damage = 0 + burn_damage = 1000 + +/obj/effect/mob_spawn/corpse/human/legioninfested/skeleton/charred/special(mob/living/carbon/human/spawned_human) + . = ..() + spawned_human.color = "#454545" + /datum/outfit/consumed_miner name = "Legion-Consumed Miner" @@ -283,3 +353,53 @@ /obj/item/stack/sheet/runed_metal = 15, ) r_pocket = /obj/item/clothing/glasses/hud/health/night/cultblind + +/datum/outfit/consumed_heremoth + name = "Legion-Consumed Tribal Mothman" + suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch + head = /obj/item/clothing/head/hooded/cult_hoodie/eldritch + +/datum/outfit/consumed_heremoth/pre_equip(mob/living/carbon/human/moth, visualsOnly = FALSE) + if(!visualsOnly) + moth.set_species(/datum/species/moth) + if(prob(70)) + glasses = /obj/item/clothing/glasses/blindfold + if(prob(90)) + back = /obj/item/storage/backpack/cultpack + backpack_contents = list() + var/backpack_loot = pick(list( + /obj/item/flashlight/lantern = 1, + /obj/item/toy/plush/moth = 1, + /obj/item/toy/eldritch_book = 2, + /obj/item/knife/combat/survival = 2, + )) + backpack_contents += backpack_loot + +/datum/outfit/consumed_ice_settler + name = "Legion-Consumed Settler" + suit = /obj/item/clothing/suit/hooded/wintercoat + shoes = /obj/item/clothing/shoes/winterboots + mask = /obj/item/clothing/mask/breath + +/datum/outfit/consumed_ice_settler/pre_equip(mob/living/carbon/human/ice_settler, visualsOnly = FALSE) + if(prob(40)) + r_pocket = pick_weight(list( + /obj/item/coin/silver = 5, + /obj/item/fishing_hook = 2, + /obj/item/coin/gold = 2, + /obj/item/fishing_hook/shiny = 1, + )) + if(prob(30)) + back = pick_weight(list( + /obj/item/pickaxe = 4, + /obj/item/tank/internals/oxygen = 6, + )) + else + back = /obj/item/storage/backpack/satchel/explorer + backpack_contents = list() + var/backpack_loot = pick(list( + /obj/item/food/fishmeat = 89, + /obj/item/food/fishmeat/carp = 10, + /obj/item/skeleton_key = 1, + )) + backpack_contents += backpack_loot diff --git a/code/modules/mob_spawn/corpses/mob_corpses.dm b/code/modules/mob_spawn/corpses/mob_corpses.dm index 2e4901a2793d..0ad9d0bcd8ce 100644 --- a/code/modules/mob_spawn/corpses/mob_corpses.dm +++ b/code/modules/mob_spawn/corpses/mob_corpses.dm @@ -209,6 +209,21 @@ facial_haircolor = COLOR_WHITE skin_tone = "caucasian1" +/obj/effect/mob_spawn/corpse/human/wizard/red + outfit = /datum/outfit/wizardcorpse/red + +/obj/effect/mob_spawn/corpse/human/wizard/yellow + outfit = /datum/outfit/wizardcorpse/yellow + +/obj/effect/mob_spawn/corpse/human/wizard/black + outfit = /datum/outfit/wizardcorpse/black + +/obj/effect/mob_spawn/corpse/human/wizard/marisa + outfit = /datum/outfit/wizardcorpse/marisa + +/obj/effect/mob_spawn/corpse/human/wizard/tape + outfit = /datum/outfit/wizardcorpse/tape + /datum/outfit/wizardcorpse name = "Space Wizard Corpse" uniform = /obj/item/clothing/under/color/lightpurple @@ -216,6 +231,27 @@ shoes = /obj/item/clothing/shoes/sandal/magic head = /obj/item/clothing/head/wizard +/datum/outfit/wizardcorpse/red + suit = /obj/item/clothing/suit/wizrobe/red + head = /obj/item/clothing/head/wizard/red + +/datum/outfit/wizardcorpse/yellow + suit = /obj/item/clothing/suit/wizrobe/yellow + head = /obj/item/clothing/head/wizard/yellow + +/datum/outfit/wizardcorpse/black + suit = /obj/item/clothing/suit/wizrobe/black + head = /obj/item/clothing/head/wizard/black + +/datum/outfit/wizardcorpse/marisa + suit = /obj/item/clothing/suit/wizrobe/marisa + head = /obj/item/clothing/head/wizard/marisa + shoes = /obj/item/clothing/shoes/sneakers/marisa + +/datum/outfit/wizardcorpse/tape + suit = /obj/item/clothing/suit/wizrobe/tape + head = /obj/item/clothing/head/wizard/tape + /obj/effect/mob_spawn/corpse/human/wizard/dark name = "Dark Wizard Corpse" outfit = /datum/outfit/wizardcorpse/dark @@ -338,3 +374,7 @@ /datum/outfit/prey_pod_victim name = "Prey Pod Victim" uniform = /obj/item/clothing/under/rank/rnd/roboticist + +/obj/effect/mob_spawn/corpse/human/cyber_police + name = "Dead Cyber Police" + outfit = /datum/outfit/cyber_police diff --git a/code/modules/mob_spawn/ghost_roles/space_roles.dm b/code/modules/mob_spawn/ghost_roles/space_roles.dm index 3567857ed6a7..cc97da88536e 100644 --- a/code/modules/mob_spawn/ghost_roles/space_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/space_roles.dm @@ -97,7 +97,7 @@ /obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms/space/Initialize(mapload) . = ..() if(prob(85)) //only has a 15% chance of existing, otherwise it'll just be a NPC syndie. - new /mob/living/basic/syndicate/ranged(get_turf(src)) + new /mob/living/basic/trooper/syndicate/ranged(get_turf(src)) return INITIALIZE_HINT_QDEL ///battlecruiser stuff diff --git a/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm b/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm index 800a6089aa37..9ffca695497f 100644 --- a/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm +++ b/code/modules/mob_spawn/ghost_roles/venus_human_trap.dm @@ -4,7 +4,7 @@ desc = "A large pulsating plant..." icon = 'icons/effects/spacevines.dmi' icon_state = "bud0" - mob_type = /mob/living/simple_animal/hostile/venus_human_trap + mob_type = /mob/living/basic/venus_human_trap density = FALSE prompt_name = "venus human trap" you_are_text = "You are a venus human trap." @@ -23,7 +23,7 @@ flower_bud = null return ..() -/obj/effect/mob_spawn/ghost_role/venus_human_trap/equip(mob/living/simple_animal/hostile/venus_human_trap/spawned_human_trap) +/obj/effect/mob_spawn/ghost_role/venus_human_trap/equip(mob/living/basic/venus_human_trap/spawned_human_trap) if(spawned_human_trap && flower_bud) if(flower_bud.trait_flags & SPACEVINE_HEAT_RESISTANT) spawned_human_trap.unsuitable_heat_damage = 0 diff --git a/code/modules/mob_spawn/mob_spawn.dm b/code/modules/mob_spawn/mob_spawn.dm index 0548f0ee937b..806ec6cb7d80 100644 --- a/code/modules/mob_spawn/mob_spawn.dm +++ b/code/modules/mob_spawn/mob_spawn.dm @@ -11,8 +11,6 @@ var/mob_name ///the type of the mob, you best inherit this var/mob_type = /mob/living/basic/cockroach - ///Lazy string list of factions that the spawned mob will be in upon spawn - var/list/faction ////Human specific stuff. Don't set these if you aren't using a human, the unit tests will put a stop to your sinful hand. diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm index fd2732f7345f..849cb58e16f5 100644 --- a/code/modules/mod/mod_clothes.dm +++ b/code/modules/mod/mod_clothes.dm @@ -5,11 +5,13 @@ icon_state = "standard-helmet" base_icon_state = "helmet" worn_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + worn_icon_snouted = 'monkestation/icons/mob/mod.dmi' armor_type = /datum/armor/none body_parts_covered = HEAD heat_protection = HEAD cold_protection = HEAD obj_flags = IMMUTABLE_SLOW + supports_variations_flags = CLOTHING_SNOUTED_VARIATION /obj/item/clothing/suit/mod name = "MOD chestplate" @@ -18,6 +20,7 @@ icon_state = "standard-chestplate" base_icon_state = "chestplate" worn_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + worn_icon_digitigrade = 'monkestation/icons/mob/mod.dmi' blood_overlay_type = "armor" allowed = list( /obj/item/tank/internals, @@ -29,6 +32,7 @@ heat_protection = CHEST|GROIN cold_protection = CHEST|GROIN obj_flags = IMMUTABLE_SLOW + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION /obj/item/clothing/gloves/mod name = "MOD gauntlets" @@ -42,6 +46,7 @@ heat_protection = HANDS|ARMS cold_protection = HANDS|ARMS obj_flags = IMMUTABLE_SLOW + supports_variations_flags = NONE /obj/item/clothing/shoes/mod name = "MOD boots" @@ -50,6 +55,7 @@ icon_state = "standard-boots" base_icon_state = "boots" worn_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + worn_icon_digitigrade = 'monkestation/icons/mob/mod.dmi' armor_type = /datum/armor/none body_parts_covered = FEET|LEGS heat_protection = FEET|LEGS @@ -57,3 +63,4 @@ obj_flags = IMMUTABLE_SLOW item_flags = IGNORE_DIGITIGRADE can_be_tied = FALSE + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index f0a5085f4ec7..e33472006c4b 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -241,6 +241,12 @@ /obj/item/mod/module/jetpack/advanced, ) +/obj/item/mod/control/pre_equipped/nuclear/plasmaman + +/obj/item/mod/control/pre_equipped/nuclear/plasmaman/Initialize(mapload, new_theme, new_skin, new_core) + applied_modules += /obj/item/mod/module/plasma_stabilizer + return ..() + /obj/item/mod/control/pre_equipped/elite theme = /datum/mod_theme/elite applied_cell = /obj/item/stock_parts/cell/bluespace diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index c8fe571330c8..594528915f95 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -43,6 +43,14 @@ var/list/pinned_to = list() /// flags that let the module ability be used in odd circumstances var/allow_flags = NONE + /// The suit's supports_variations_flags, currently only for the chestplate and the helmet parts of the MODsuit. + var/suit_supports_variations_flags = NONE + /// Does this module have a separate head sprite? Useful for muzzled sprites + var/has_head_sprite = FALSE + /// Is the module's visuals head-only when active? Useful for visors and such, to avoid multiplying the amount of overlay with empty images + var/head_only_when_active = FALSE + /// Is the module's visuals head-only when inactive? Useful for visors and such, to avoid multiplying the amount of overlay with empty images + var/head_only_when_inactive = FALSE /// Timer for the cooldown COOLDOWN_DECLARE(cooldown_timer) @@ -404,3 +412,45 @@ /obj/item/mod/module/anomaly_locked/update_icon_state() icon_state = initial(icon_state) + (core ? "-core" : "") return ..() + +/** + * Proc that handles the mutable_appearances of the module on the MODsuits + * + * Arguments: + * * standing - The mutable_appearance we're taking as a reference for this one, mainly to use its layer. + * * module_icon_state - The name of the icon_state we'll be using for the module on the MODsuit. + */ +/obj/item/mod/module/proc/handle_module_icon(mutable_appearance/standing, module_icon_state) + . = list() + if(mod.wearer) + if(mod.chestplate && (mod.chestplate.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION) && (mod.wearer.dna.species.bodytype & BODYTYPE_DIGITIGRADE)) + suit_supports_variations_flags |= CLOTHING_DIGITIGRADE_VARIATION + + if(mod.helmet && (mod.helmet.supports_variations_flags & CLOTHING_SNOUTED_VARIATION) && (mod.wearer.dna.species.bodytype & BODYTYPE_SNOUTED)) + suit_supports_variations_flags |= CLOTHING_SNOUTED_VARIATION + + var/icon_to_use = 'icons/mob/clothing/modsuit/mod_modules.dmi' + var/icon_state_to_use = module_icon_state + var/add_overlay = TRUE + if(suit_supports_variations_flags && (supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) + icon_to_use = 'monkestation/icons/mob/mod.dmi' + icon_state_to_use = "[module_icon_state]_digi" + + if((active && head_only_when_active) | (!active && head_only_when_inactive)) + add_overlay = FALSE + + if(add_overlay) + var/mutable_appearance/module_icon = mutable_appearance(icon_to_use, icon_state_to_use, layer = standing.layer + 0.1) // Just changed the raw icon path to icon_to_use and the used_overlay to icon_state_to_use + module_icon.appearance_flags |= RESET_COLOR + . += module_icon + + if(has_head_sprite) + icon_to_use = 'monkestation/icons/mob/mod.dmi' + icon_state_to_use = "[module_icon_state]_head" + + if(suit_supports_variations_flags && (supports_variations_flags & CLOTHING_SNOUTED_VARIATION)) + icon_state_to_use = "[icon_state_to_use]_muzzled" + + var/mutable_appearance/additional_module_icon = mutable_appearance(icon_to_use, icon_state_to_use, layer = standing.layer + 0.1) + additional_module_icon.appearance_flags |= RESET_COLOR + . += additional_module_icon diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index 0c603350f640..338f8c0a2f9a 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -16,6 +16,9 @@ overlay_state_inactive = "module_armorbooster_off" overlay_state_active = "module_armorbooster_on" use_mod_colors = TRUE + suit_supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_SNOUTED_VARIATION + has_head_sprite = TRUE + head_only_when_active = TRUE /// Whether or not this module removes pressure protection. var/remove_pressure_protection = TRUE /// Speed added to the control unit. @@ -80,6 +83,8 @@ /obj/item/mod/module/armor_booster/generate_worn_overlay(mutable_appearance/standing) overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]" overlay_state_active = "[initial(overlay_state_active)]-[mod.skin]" + if((mod.wearer?.dna.species.bodytype & BODYTYPE_SNOUTED) && (suit_supports_variations_flags & CLOTHING_SNOUTED_VARIATION)) + overlay_icon_file = 'monkestation/icons/mob/mod.dmi' //if the user has a snout, and the module supports a snout, we'll shift to the digi/snout icon file instead return ..() ///Energy Shield - Gives you a rechargeable energy shield that nullifies attacks. diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index 4531b84f15a7..e41b35aa51ee 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -126,7 +126,7 @@ line = firer.Beam(src, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi', emissive = FALSE) ..() -/obj/projectile/tether/on_hit(atom/target) +/obj/projectile/tether/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(firer) firer.throw_at(target, 10, 1, firer, FALSE, FALSE, null, MOVE_FORCE_NORMAL, TRUE) diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm index 1dd924189213..46f698e0d5fb 100644 --- a/code/modules/mod/modules/modules_medical.dm +++ b/code/modules/mod/modules/modules_medical.dm @@ -181,7 +181,7 @@ organ = null return ..() -/obj/projectile/organ/on_hit(atom/target) +/obj/projectile/organ/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(!ishuman(target)) organ.forceMove(drop_location()) diff --git a/code/modules/mod/modules/modules_ninja.dm b/code/modules/mod/modules/modules_ninja.dm index 53426c67e5ad..4f8c1d94a9c7 100644 --- a/code/modules/mod/modules/modules_ninja.dm +++ b/code/modules/mod/modules/modules_ninja.dm @@ -340,6 +340,8 @@ use_power_cost = DEFAULT_CHARGE_DRAIN * 6 incompatible_modules = list(/obj/item/mod/module/energy_net) cooldown_time = 1.5 SECONDS + /// List of all energy nets this module made. + var/list/energy_nets = list() /obj/item/mod/module/energy_net/on_select_use(atom/target) . = ..() @@ -367,6 +369,55 @@ net.buckle_mob(living_target, force = TRUE) drain_power(use_power_cost) +/obj/item/mod/module/energy_net/proc/add_net(obj/structure/energy_net/net) + energy_nets += net + RegisterSignal(net, COMSIG_PARENT_QDELETING, PROC_REF(remove_net)) + +/obj/item/mod/module/energy_net/proc/remove_net(obj/structure/energy_net/net) + SIGNAL_HANDLER + energy_nets -= net + +/obj/projectile/energy_net + name = "energy net" + icon_state = "net_projectile" + icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' + damage = 0 + range = 9 + hitsound = 'sound/items/fultext_deploy.ogg' + hitsound_wall = 'sound/items/fultext_deploy.ogg' + /// Reference to the beam following the projectile. + var/line + /// Reference to the energy net module. + var/datum/weakref/net_module + +/obj/projectile/energy_net/Initialize(mapload, net_module) + . = ..() + src.net_module = WEAKREF(net_module) + +/obj/projectile/energy_net/fire(setAngle) + if(firer) + line = firer.Beam(src, "net_beam", 'icons/obj/clothing/modsuit/mod_modules.dmi') + return ..() + +/obj/projectile/energy_net/on_hit(mob/living/target, blocked = 0, pierce_hit) + . = ..() + if(!istype(target)) + return + if(locate(/obj/structure/energy_net) in get_turf(target)) + return + var/obj/structure/energy_net/net = new /obj/structure/energy_net(target.drop_location()) + var/obj/item/mod/module/energy_net/module = net_module?.resolve() + if(module) + module.add_net(net) + firer?.visible_message(span_danger("[firer] caught [target] with an energy net!"), span_notice("You caught [target] with an energy net!")) + if(target.buckled) + target.buckled.unbuckle_mob(target, force = TRUE) + net.buckle_mob(target, force = TRUE) + +/obj/projectile/energy_net/Destroy() + QDEL_NULL(line) + return ..() + ///Adrenaline Boost - Stops all stuns the ninja is affected with, increases his speed. /obj/item/mod/module/adrenaline_boost name = "MOD adrenaline boost module" diff --git a/code/modules/mod/modules/modules_timeline.dm b/code/modules/mod/modules/modules_timeline.dm index 4fa348659dad..fdf05b80a8a3 100644 --- a/code/modules/mod/modules/modules_timeline.dm +++ b/code/modules/mod/modules/modules_timeline.dm @@ -297,11 +297,14 @@ ///Reference to the tem... given by the tem! weakref because back in the day we didn't know about harddels- or maybe we didn't care. var/datum/weakref/tem_weakref -/obj/projectile/energy/chrono_beam/on_hit(atom/target) +/obj/projectile/energy/chrono_beam/on_hit(atom/target, blocked = 0, pierce_hit) var/obj/item/mod/module/tem/tem = tem_weakref.resolve() if(target && tem && isliving(target)) var/obj/structure/chrono_field/field = new(target.loc, target, tem) tem.field_connect(field) + return BULLET_ACT_HIT + + return ..() /obj/structure/chrono_field name = "eradication field" @@ -403,9 +406,10 @@ var/obj/item/mod/module/tem/linked_tem = beam.tem_weakref.resolve() if(linked_tem && istype(linked_tem)) linked_tem.field_connect(src) - else return BULLET_ACT_HIT + return ..() + /obj/structure/chrono_field/assume_air() return FALSE diff --git a/code/modules/modular_computers/file_system/programs/robocontrol.dm b/code/modules/modular_computers/file_system/programs/robocontrol.dm index 9d1f1542ae7e..baf6cafd7a2c 100644 --- a/code/modules/modular_computers/file_system/programs/robocontrol.dm +++ b/code/modules/modular_computers/file_system/programs/robocontrol.dm @@ -62,7 +62,7 @@ newbot["mule_check"] = TRUE botlist += list(newbot) - for(var/mob/living/simple_animal/drone/all_drones as anything in GLOB.drones_list) + for(var/mob/living/basic/drone/all_drones as anything in GLOB.drones_list) if(all_drones.hacked) continue if(!is_valid_z_level(current_turf, get_turf(all_drones))) diff --git a/code/modules/movespeed/modifiers/status_effects.dm b/code/modules/movespeed/modifiers/status_effects.dm index e8aad88c50d3..8a88d45a8179 100644 --- a/code/modules/movespeed/modifiers/status_effects.dm +++ b/code/modules/movespeed/modifiers/status_effects.dm @@ -37,3 +37,22 @@ /datum/movespeed_modifier/status_effect/tired_post_charge multiplicative_slowdown = 3 + +/// Get slower the more gold is in your system. +/datum/movespeed_modifier/status_effect/midas_blight + id = "midas_blight" + +/datum/movespeed_modifier/status_effect/midas_blight/soft + multiplicative_slowdown = 0.25 + +/datum/movespeed_modifier/status_effect/midas_blight/medium + multiplicative_slowdown = 0.75 + +/datum/movespeed_modifier/status_effect/midas_blight/hard + multiplicative_slowdown = 1.5 + +/datum/movespeed_modifier/status_effect/midas_blight/gold + multiplicative_slowdown = 2 + +/datum/movespeed_modifier/status_effect/guardian_shield + multiplicative_slowdown = 1 diff --git a/code/modules/pai/card.dm b/code/modules/pai/card.dm index a184c5da8032..ea82c35dc09f 100644 --- a/code/modules/pai/card.dm +++ b/code/modules/pai/card.dm @@ -110,6 +110,7 @@ name = pai.name, transmit = pai.can_transmit, receive = pai.can_receive, + range = pai.leash.distance, ) return data diff --git a/code/modules/pai/defense.dm b/code/modules/pai/defense.dm index 387f4026227a..f181e2c90101 100644 --- a/code/modules/pai/defense.dm +++ b/code/modules/pai/defense.dm @@ -55,11 +55,11 @@ if(user.put_in_hands(card)) user.visible_message(span_notice("[user] promptly scoops up [user.p_their()] pAI's card.")) -/mob/living/silicon/pai/bullet_act(obj/projectile/Proj) - if(Proj.stun) +/mob/living/silicon/pai/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit = FALSE) + . = ..() + if(. == BULLET_ACT_HIT && (hitting_projectile.stun || hitting_projectile.paralyze)) fold_in(force = TRUE) - src.visible_message(span_warning("The electrically-charged projectile disrupts [src]'s holomatrix, forcing [src] to fold in!")) - . = ..(Proj) + visible_message(span_warning("The electrically-charged projectile disrupts [src]'s holomatrix, forcing [p_them()] to fold in!")) /mob/living/silicon/pai/ignite_mob(silent) return FALSE @@ -72,18 +72,17 @@ to_chat(src, span_userdanger("The impact degrades your holochassis!")) return amount -/mob/living/silicon/pai/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) - return take_holo_damage(amount) - -/mob/living/silicon/pai/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE, required_bodytype) - return take_holo_damage(amount) +/// Called when we take burn or brute damage, pass it to the shell instead +/mob/living/silicon/pai/proc/on_shell_damaged(datum/hurt, type, amount, forced) + SIGNAL_HANDLER + take_holo_damage(amount) + return COMPONENT_IGNORE_CHANGE -/mob/living/silicon/pai/pre_stamina_change(diff as num, forced) - if(forced) - take_holo_damage(diff) - else - take_holo_damage(diff * 0.25) - return 0 +/// Called when we take stamina damage, pass it to the shell instead +/mob/living/silicon/pai/proc/on_shell_weakened(datum/hurt, type, amount, forced) + SIGNAL_HANDLER + take_holo_damage(amount * ((forced) ? 1 : 0.25)) + return COMPONENT_IGNORE_CHANGE /mob/living/silicon/pai/getBruteLoss() return HOLOCHASSIS_MAX_HEALTH - holochassis_health diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index dffa39483f0c..8659f505337f 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -65,6 +65,8 @@ var/ram = 100 /// Toggles whether the Security HUD is active or not var/secHUD = FALSE + /// The current leash to the owner + var/datum/component/leash/leash // Onboard Items /// Atmospheric analyzer @@ -225,14 +227,17 @@ var/newcardloc = pai_card pai_card = new(newcardloc) pai_card.set_personality(src) - forceMove(pai_card) card = pai_card + forceMove(pai_card) + leash = AddComponent(/datum/component/leash, pai_card, HOLOFORM_DEFAULT_RANGE, force_teleport_out_effect = /obj/effect/temp_visual/guardian/phase/out) addtimer(VARSET_WEAK_CALLBACK(src, holochassis_ready, TRUE), HOLOCHASSIS_INIT_TIME) if(!holoform) add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), PAI_FOLDED) desc = "A pAI hard-light holographics emitter. This one appears in the form of a [chassis]." RegisterSignal(src, COMSIG_LIVING_CULT_SACRIFICED, PROC_REF(on_cult_sacrificed)) + RegisterSignals(src, list(COMSIG_LIVING_ADJUST_BRUTE_DAMAGE, COMSIG_LIVING_ADJUST_BURN_DAMAGE), PROC_REF(on_shell_damaged)) + RegisterSignal(src, COMSIG_LIVING_ADJUST_STAMINA_DAMAGE, PROC_REF(on_shell_weakened)) /mob/living/silicon/pai/make_laws() laws = new /datum/ai_laws/pai() @@ -434,3 +439,10 @@ for(var/mob/living/cultist as anything in invokers) to_chat(cultist, span_cultitalic("You don't think this is what Nar'Sie had in mind when She asked for blood sacrifices...")) return STOP_SACRIFICE + +/// Updates the distance we can be from our pai card +/mob/living/silicon/pai/proc/increment_range(increment_amount) + var/new_distance = leash.distance + increment_amount + if (new_distance < HOLOFORM_MIN_RANGE || new_distance > HOLOFORM_MAX_RANGE) + return + leash.set_distance(new_distance) diff --git a/code/modules/pai/shell.dm b/code/modules/pai/shell.dm index 711e19ead51b..665727705eba 100644 --- a/code/modules/pai/shell.dm +++ b/code/modules/pai/shell.dm @@ -93,7 +93,7 @@ card.forceMove(target) forceMove(card) add_traits(list(TRAIT_IMMOBILIZED, TRAIT_HANDS_BLOCKED), PAI_FOLDED) - set_density(FALSE) + ADD_TRAIT(src, TRAIT_UNDENSE, PAI_FOLDED) set_light_on(FALSE) holoform = FALSE set_resting(resting) @@ -124,7 +124,7 @@ addtimer(VARSET_CALLBACK(src, holochassis_ready, TRUE), HOLOCHASSIS_COOLDOWN) REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, PAI_FOLDED) REMOVE_TRAIT(src, TRAIT_HANDS_BLOCKED, PAI_FOLDED) - set_density(TRUE) + REMOVE_TRAIT(src, TRAIT_UNDENSE, PAI_FOLDED) if(istype(card.loc, /obj/item/modular_computer)) var/obj/item/modular_computer/pc = card.loc pc.inserted_pai = null diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index bf9b9c5a7e86..e98ec70669f8 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -33,6 +33,7 @@ pickup_sound = 'sound/items/handling/paper_pickup.ogg' grind_results = list(/datum/reagent/cellulose = 3) color = COLOR_WHITE + item_flags = SKIP_FANTASY_ON_SPAWN /// Lazylist of raw, unsanitised, unparsed text inputs that have been made to the paper. var/list/datum/paper_input/raw_text_inputs diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index 4c124ca3ad90..74c5c3d063b3 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -139,8 +139,9 @@ to_chat(user, span_userdanger("You neatly cut [stored_paper][clumsy ? "... and your finger in the process!" : "."]")) if(clumsy) var/obj/item/bodypart/finger = user.get_active_hand() - var/datum/wound/slash/moderate/papercut = new - papercut.apply_wound(finger) + if (iscarbon(user)) + var/mob/living/carbon/carbon_user = user + carbon_user.cause_wound_of_type_and_severity(WOUND_SLASH, finger, WOUND_SEVERITY_MODERATE, wound_source = "paper cut") stored_paper = null qdel(stored_paper) new /obj/item/paper/paperslip(get_turf(src)) diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index ca409d31e185..7997d7c994e7 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -98,7 +98,7 @@ return ..() -/obj/item/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback, quickstart = TRUE) +/obj/item/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback, gentle, quickstart = TRUE) . = ..(target, range, speed, thrower, FALSE, diagonals_first, callback, quickstart = quickstart) /obj/item/paperplane/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) diff --git a/code/modules/photography/camera/other.dm b/code/modules/photography/camera/other.dm index b10af32bfd88..8a86d7f59deb 100644 --- a/code/modules/photography/camera/other.dm +++ b/code/modules/photography/camera/other.dm @@ -3,6 +3,7 @@ desc = "A polaroid camera, some say it can see ghosts!" see_ghosts = CAMERA_SEE_GHOSTS_BASIC + /obj/item/camera/spooky/badmin desc = "A polaroid camera, some say it can see ghosts! It seems to have an extra magnifier on the end." see_ghosts = CAMERA_SEE_GHOSTS_ORBIT diff --git a/code/modules/power/apc/apc_attack.dm b/code/modules/power/apc/apc_attack.dm index 7a82785da4e7..42d5a3470842 100644 --- a/code/modules/power/apc/apc_attack.dm +++ b/code/modules/power/apc/apc_attack.dm @@ -139,12 +139,14 @@ if(!(machine_stat & BROKEN || opened == APC_COVER_REMOVED || atom_integrity < max_integrity)) // There is nothing to repair balloon_alert(user, "no reason for repairs!") return - if(!(machine_stat & BROKEN) && opened == APC_COVER_REMOVED) // Cover is the only thing broken, we do not need to remove elctronicks to replace cover + if((machine_stat & BROKEN) && opened == APC_COVER_REMOVED && has_electronics && terminal) // Cover is the only thing broken, we do not need to remove elctronicks to replace cover user.visible_message(span_notice("[user.name] replaces missing APC's cover.")) balloon_alert(user, "replacing APC's cover...") if(do_after(user, 20, target = src)) // replacing cover is quicker than replacing whole frame balloon_alert(user, "cover replaced") qdel(attacking_object) + update_integrity(30) //needs to be welded to fully repair but can work without + set_machine_stat(machine_stat & ~(BROKEN|MAINT)) opened = APC_COVER_OPENED update_appearance() return @@ -261,7 +263,7 @@ /obj/machinery/power/apc/blob_act(obj/structure/blob/B) set_broken() -/obj/machinery/power/apc/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE) +/obj/machinery/power/apc/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armor_penetration = 0) // APC being at 0 integrity doesnt delete it outright. Combined with take_damage this might cause runtimes. if(machine_stat & BROKEN && atom_integrity <= 0) if(sound_effect) diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index c9f5ef087d9b..7c1bff1df33a 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -264,6 +264,11 @@ /obj/machinery/power/apc/examine(mob/user) . = ..() if(machine_stat & BROKEN) + if(opened != APC_COVER_REMOVED) + . += "The cover is broken and can probably be pried off with enough force." + return + if(terminal && has_electronics) + . += "The cover is missing but can be replaced using a new frame." return if(opened) if(has_electronics && terminal) diff --git a/code/modules/power/apc/apc_tool_act.dm b/code/modules/power/apc/apc_tool_act.dm index 0c1cf6652a2f..1a645c4ebe25 100644 --- a/code/modules/power/apc/apc_tool_act.dm +++ b/code/modules/power/apc/apc_tool_act.dm @@ -1,6 +1,19 @@ //attack with an item - open/close cover, insert cell, or (un)lock interface /obj/machinery/power/apc/crowbar_act(mob/user, obj/item/crowbar) . = TRUE + + //Prying off broken cover + if((opened == APC_COVER_CLOSED || opened == APC_COVER_OPENED) && (machine_stat & BROKEN)) + crowbar.play_tool_sound(src) + balloon_alert(user, "prying...") + if(!crowbar.use_tool(src, user, 5 SECONDS)) + return + opened = APC_COVER_REMOVED + balloon_alert(user, "cover removed") + update_appearance() + return + + //Opening and closing cover if((!opened && opened != APC_COVER_REMOVED) && !(machine_stat & BROKEN)) if(coverlocked && !(machine_stat & MAINT)) // locked... balloon_alert(user, "cover is locked!") @@ -20,6 +33,7 @@ update_appearance() return + //Taking out the electronics if(!opened || has_electronics != APC_ELECTRONICS_INSTALLED) return if(terminal) @@ -101,6 +115,24 @@ /obj/machinery/power/apc/welder_act(mob/living/user, obj/item/welder) . = ..() + + //repairing the cover + if((atom_integrity < max_integrity) && has_electronics) + if(opened == APC_COVER_REMOVED) + balloon_alert(user, "no cover to repair!") + return + if (machine_stat & BROKEN) + balloon_alert(user, "too damaged to repair!") + return + if(!welder.tool_start_check(user, amount=0)) + return + balloon_alert(user, "repairing...") + if(welder.use_tool(src, user, 4 SECONDS, volume = 50)) + update_integrity(min(atom_integrity += 50,max_integrity)) + balloon_alert(user, "repaired") + return TOOL_ACT_TOOLTYPE_SUCCESS + + //disassembling the frame if(!opened || has_electronics || terminal) return if(!welder.tool_start_check(user, amount=3)) diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 0cac3acbfed9..da375a77e61a 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -431,7 +431,7 @@ if(prob(12)) electrocute_mob(user, get_area(src), src, 0.3, TRUE) -/obj/machinery/light/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) +/obj/machinery/light/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) . = ..() if(. && !QDELETED(src)) if(prob(damage_amount * 5)) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 3029558d1677..57be64eb0e2c 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -384,10 +384,6 @@ if(!in_range(source, victim)) return FALSE - if(victim.wearing_shock_proof_gloves()) - SEND_SIGNAL(victim, COMSIG_LIVING_SHOCK_PREVENTED, power_source, source, siemens_coeff, dist_check) - return FALSE //to avoid spamming with insulated gloves on - var/list/powernet_info = get_powernet_info_from_source(power_source) if (!powernet_info) return FALSE @@ -395,20 +391,38 @@ var/datum/powernet/PN = powernet_info["powernet"] var/obj/item/stock_parts/cell/cell = powernet_info["cell"] - var/PN_damage = 0 - var/cell_damage = 0 - if (PN) - PN_damage = PN.get_electrocute_damage() - if (cell) - cell_damage = cell.get_electrocute_damage() - var/shock_damage = 0 - if (PN_damage >= cell_damage) - power_source = PN - shock_damage = PN_damage + if(victim.wearing_shock_proof_gloves() && (PN && PN?.netexcess < 100 MW)) + SEND_SIGNAL(victim, COMSIG_LIVING_SHOCK_PREVENTED, power_source, source, siemens_coeff, dist_check) + return FALSE //to avoid spamming with insulated gloves on + + var/drained_hp = 0 + if(!PN || (PN?.netexcess < 150 MW)) + var/PN_damage = 0 + var/cell_damage = 0 + if (PN) + PN_damage = PN.get_electrocute_damage() + if (cell) + cell_damage = cell.get_electrocute_damage() + var/shock_damage = 0 + if (PN_damage >= cell_damage) + power_source = PN + shock_damage = PN_damage + else + power_source = cell + shock_damage = cell_damage + drained_hp = victim.electrocute_act(shock_damage, source, siemens_coeff) //zzzzzzap! + else if(PN && (PN?.netexcess < 250 MW)) + tesla_zap(victim, 7, PN.netexcess) + drained_hp = PN.netexcess * 0.01 else - power_source = cell - shock_damage = cell_damage - var/drained_hp = victim.electrocute_act(shock_damage, source, siemens_coeff) //zzzzzzap! + var/obj/item/organ/internal/brain/carbon_brain = victim.get_organ_slot(ORGAN_SLOT_BRAIN) + var/turf/turf = get_turf(victim) + playsound(victim.loc, 'sound/magic/lightningbolt.ogg', 100, TRUE, extrarange = 30) + carbon_brain.forceMove(turf) + victim.visible_message(span_danger("[victim] turns to ash from the electrical shock!")) + victim.dust() + drained_hp = PN.netexcess * 0.1 + log_combat(source, victim, "electrocuted") var/drained_energy = drained_hp*20 diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 9b5fda50c127..adb79383be5b 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -115,7 +115,7 @@ return ..() /obj/narsie/attack_ghost(mob/user) - makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, user, cultoverride = TRUE, loc_override = loc) + makeNewConstruct(/mob/living/basic/construct/harvester, user, cultoverride = TRUE, loc_override = loc) /obj/narsie/process() var/datum/component/singularity/singularity_component = singularity.resolve() @@ -292,7 +292,7 @@ ///Helper to set the round to end asap. Current usage Cult round end code /proc/ending_helper() - SSticker.force_ending = TRUE + SSticker.force_ending = FORCE_END_ROUND /** * Selects cinematic to play as part of the cult end depending on the outcome then ends the round afterward diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index c20e8e38cab7..0508e3b1f880 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -167,7 +167,7 @@ dissipate(seconds_per_tick) radiation_pulse(src, 4, intensity = min(5000, (energy * 4.5) + 1000), should_rad_act = FALSE) for(var/obj/collector in range(5, src)) - if(!istype(collector, /obj/machinery/power/rad_collector)) + if(!istype(collector, /obj/machinery/power/rad_collector) && !isartifact(collector)) continue collector.rad_act(intensity = min(2500, (energy * 2) + 500)) check_energy() diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index dd8a3ab5b77a..843acc48782e 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -169,6 +169,9 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /// Only values greater or equal to the current one can change the strat. var/delam_priority = SM_DELAM_PRIO_NONE + /// Lazy list of the crazy engineers who managed to turn a cascading engine around. + var/list/datum/weakref/saviors = null + /obj/machinery/power/supermatter_crystal/Initialize(mapload) . = ..() gas_percentage = list() @@ -191,7 +194,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) RegisterSignal(src, COMSIG_ATOM_BSA_BEAM, PROC_REF(force_delam)) RegisterSignal(src, COMSIG_ATOM_TIMESTOP_FREEZE, PROC_REF(time_frozen)) RegisterSignal(src, COMSIG_ATOM_TIMESTOP_UNFREEZE, PROC_REF(time_unfrozen)) - + RegisterSignal(src, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(eat_bullets)) var/static/list/loc_connections = list( COMSIG_TURF_INDUSTRIAL_LIFT_ENTER = PROC_REF(tram_contents_consume), ) @@ -312,6 +315,16 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) processing_sound() handle_high_power() psychological_examination() + + // handle the engineers that saved the engine from cascading, if there were any + if(get_status() < SUPERMATTER_EMERGENCY && !isnull(saviors)) + for(var/datum/weakref/savior_ref as anything in saviors) + var/mob/living/savior = savior_ref.resolve() + if(!istype(savior)) // didn't live to tell the tale, sadly. + continue + savior.client?.give_award(/datum/award/achievement/jobs/theoretical_limits, savior) + LAZYNULL(saviors) + if(prob(15)) supermatter_pull(loc, min(internal_energy/850, 3))//850, 1700, 2550 update_appearance() @@ -512,6 +525,17 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(healed) final_countdown = FALSE + + if(!istype(delamination_strategy, /datum/sm_delam/cascade)) + return + + for(var/mob/living/lucky_engi as anything in mobs_in_area_type(list(/area/station/engineering/supermatter))) + if(isnull(lucky_engi.client)) + continue + if(isanimal_or_basicmob(lucky_engi)) + continue + LAZYADD(saviors, WEAKREF(lucky_engi)) + return // delam averted sleep(1 SECONDS) diff --git a/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm b/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm index a45c26c2f6d9..62fe18b9c76c 100644 --- a/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm +++ b/code/modules/power/supermatter/supermatter_delamination/cascade_delam_objects.dm @@ -36,6 +36,9 @@ if(our_turf) our_turf.opacity = FALSE + // Ideally this'd be part of the SM component, but the SM itself snowflakes bullets (emitters are bullets). + RegisterSignal(src, COMSIG_ATOM_PRE_BULLET_ACT, PROC_REF(eat_bullets)) + /obj/crystal_mass/process() if(!COOLDOWN_FINISHED(src, sm_wall_cooldown)) @@ -70,9 +73,18 @@ new /obj/crystal_mass(next_turf, get_dir(next_turf, src)) -/obj/crystal_mass/bullet_act(obj/projectile/projectile) - visible_message(span_notice("[src] is unscathed!")) - return BULLET_ACT_HIT +/obj/crystal_mass/proc/eat_bullets(datum/source, obj/projectile/hitting_projectile) + SIGNAL_HANDLER + + visible_message( + span_warning("[hitting_projectile] flies into [src] with a loud crack, before rapidly flashing into ash."), + null, + span_hear("You hear a loud crack as you are washed with a wave of heat."), + ) + + playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE) + qdel(hitting_projectile) + return COMPONENT_BULLET_BLOCKED /obj/crystal_mass/singularity_act() return @@ -166,4 +178,3 @@ span_hear("You hear a loud crack as a small distortion passes through you.")) qdel(consumed_object) - diff --git a/code/modules/power/supermatter/supermatter_delamination/delamination_effects.dm b/code/modules/power/supermatter/supermatter_delamination/delamination_effects.dm index d22f97578f9a..0709b983b0fe 100644 --- a/code/modules/power/supermatter/supermatter_delamination/delamination_effects.dm +++ b/code/modules/power/supermatter/supermatter_delamination/delamination_effects.dm @@ -211,7 +211,7 @@ sleep(10 SECONDS) SSticker.news_report = SUPERMATTER_CASCADE - SSticker.force_ending = TRUE + SSticker.force_ending = FORCE_END_ROUND /// Scatters crystal mass over the event spawns as long as they are at least 30 tiles away from whatever we want to avoid. /datum/sm_delam/proc/effect_crystal_mass(obj/machinery/power/supermatter_crystal/sm, avoid) diff --git a/code/modules/power/supermatter/supermatter_hit_procs.dm b/code/modules/power/supermatter/supermatter_hit_procs.dm index 5c68669e6e24..aec732c323b7 100644 --- a/code/modules/power/supermatter/supermatter_hit_procs.dm +++ b/code/modules/power/supermatter/supermatter_hit_procs.dm @@ -5,16 +5,20 @@ for(var/atom/thing_to_consume as anything in tram_contents) Bumped(thing_to_consume) -/obj/machinery/power/supermatter_crystal/bullet_act(obj/projectile/projectile) +/obj/machinery/power/supermatter_crystal/proc/eat_bullets(datum/source, obj/projectile/projectile) + SIGNAL_HANDLER + var/turf/local_turf = loc + if(!istype(local_turf)) + return NONE + var/kiss_power = 0 switch(projectile.type) if(/obj/projectile/kiss) kiss_power = 60 if(/obj/projectile/kiss/death) kiss_power = 20000 - if(!istype(local_turf)) - return FALSE + if(!istype(projectile.firer, /obj/machinery/power/emitter)) investigate_log("has been hit by [projectile] fired by [key_name(projectile.firer)]", INVESTIGATE_ENGINE) if(projectile.armor_flag != BULLET || kiss_power) @@ -29,7 +33,10 @@ var/damage_to_be = damage + external_damage_immediate * clamp((emergency_point - damage) / emergency_point, 0, 1) if(damage_to_be > danger_point) visible_message(span_notice("[src] compresses under stress, resisting further impacts!")) - return BULLET_ACT_HIT + + playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE) + qdel(projectile) + return COMPONENT_BULLET_BLOCKED /obj/machinery/power/supermatter_crystal/singularity_act() var/gain = 100 diff --git a/code/modules/procedural_mapping/mapGenerators/asteroid.dm b/code/modules/procedural_mapping/mapGenerators/asteroid.dm index ab2bc6f2ca42..bf6c84ebf883 100644 --- a/code/modules/procedural_mapping/mapGenerators/asteroid.dm +++ b/code/modules/procedural_mapping/mapGenerators/asteroid.dm @@ -22,7 +22,7 @@ spawnableAtoms = list( /mob/living/basic/mining/basilisk = 10, /mob/living/basic/mining/goliath/ancient = 10, - /mob/living/simple_animal/hostile/asteroid/hivelord = 10, + /mob/living/basic/mining/hivelord = 10, ) diff --git a/code/modules/procedural_mapping/mapGenerators/syndicate.dm b/code/modules/procedural_mapping/mapGenerators/syndicate.dm index b9dc00e13642..74d2d153d06a 100644 --- a/code/modules/procedural_mapping/mapGenerators/syndicate.dm +++ b/code/modules/procedural_mapping/mapGenerators/syndicate.dm @@ -17,10 +17,12 @@ /obj/structure/closet/syndicate = 25, /obj/machinery/suit_storage_unit/syndicate = 15) /datum/map_generator_module/splatter_layer/syndie_mobs - spawnableAtoms = list(/mob/living/basic/syndicate = 30, \ - /mob/living/basic/syndicate/melee = 20, \ - /mob/living/basic/syndicate/ranged = 20, \ - /mob/living/basic/viscerator = 30) + spawnableAtoms = list( + /mob/living/basic/trooper/syndicate = 30, + /mob/living/basic/trooper/syndicate/melee = 20, + /mob/living/basic/trooper/syndicate/ranged = 20, + /mob/living/basic/viscerator = 30 + ) spawnableTurfs = list() // Generators diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm index 38515fb78207..9d785ba091f2 100644 --- a/code/modules/projectiles/ammunition/ballistic/rifle.dm +++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm @@ -39,3 +39,18 @@ caliber = CALIBER_40MM icon_state = "40mmHE" projectile_type = /obj/projectile/bullet/a40mm + + +/obj/item/ammo_casing/a223 + name = ".223 bullet casing" + desc = "A .223 bullet casing." + caliber = CALIBER_A223 + projectile_type = /obj/projectile/bullet/a223 + +/obj/item/ammo_casing/a223/phasic + name = ".223 phasic bullet casing" + desc = "A .223 phasic bullet casing." + projectile_type = /obj/projectile/bullet/a223/phasic + +/obj/item/ammo_casing/a223/weak + projectile_type = /obj/projectile/bullet/a223/weak diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index b56576099580..005afe473eb9 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -27,16 +27,10 @@ /obj/item/ammo_casing/energy/laser/musket projectile_type = /obj/projectile/beam/laser/musket e_cost = 1000 - fire_sound = 'sound/weapons/lasercannonfire.ogg' //monke edit: sounds cooler /obj/item/ammo_casing/energy/laser/musket/prime projectile_type = /obj/projectile/beam/laser/musket/prime -/obj/item/ammo_casing/energy/laser/musket/syndicate//monke edit: syndicate laser musket - projectile_type = /obj/projectile/beam/laser/musket/syndicate - e_cost = 125 - fire_sound = 'sound/weapons/laser2.ogg' - /obj/item/ammo_casing/energy/laser/practice projectile_type = /obj/projectile/beam/practice select_name = "practice" diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm index bedfab7b2357..47f36877f053 100644 --- a/code/modules/projectiles/ammunition/energy/special.dm +++ b/code/modules/projectiles/ammunition/energy/special.dm @@ -20,15 +20,15 @@ harmful = FALSE /obj/item/ammo_casing/energy/flora/yield - projectile_type = /obj/projectile/energy/florayield + projectile_type = /obj/projectile/energy/flora/yield select_name = "yield" /obj/item/ammo_casing/energy/flora/mut - projectile_type = /obj/projectile/energy/floramut + projectile_type = /obj/projectile/energy/flora/mut select_name = "mutation" /obj/item/ammo_casing/energy/flora/revolution - projectile_type = /obj/projectile/energy/florarevolution + projectile_type = /obj/projectile/energy/flora/evolution select_name = "revolution" e_cost = 250 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index f7ea7e9c80f6..6273e651cee4 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -87,6 +87,16 @@ QDEL_NULL(suppressed) return ..() +/obj/item/gun/apply_fantasy_bonuses(bonus) + . = ..() + fire_delay = modify_fantasy_variable("fire_delay", fire_delay, -bonus, 0) + projectile_damage_multiplier = modify_fantasy_variable("projectile_damage_multiplier", projectile_damage_multiplier, bonus/10, 0.1) + +/obj/item/gun/remove_fantasy_bonuses(bonus) + fire_delay = reset_fantasy_variable("fire_delay", fire_delay) + projectile_damage_multiplier = reset_fantasy_variable("projectile_damage_multiplier", projectile_damage_multiplier) + return ..() + /// Handles adding [the seclite mount component][/datum/component/seclite_attachable] to the gun. /// If the gun shouldn't have a seclight mount, override this with a return. /// Or, if a child of a gun with a seclite mount has slightly different behavior or icons, extend this. @@ -191,8 +201,8 @@ /obj/item/gun/emp_act(severity) . = ..() if(!(. & EMP_PROTECT_CONTENTS)) - for(var/obj/O in contents) - O.emp_act(severity) + for(var/obj/inside in contents) + inside.emp_act(severity) /obj/item/gun/afterattack_secondary(mob/living/victim, mob/living/user, params) if(!isliving(victim) || !IN_GIVEN_RANGE(user, victim, GUNPOINT_SHOOTER_STRAY_RANGE)) diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index 60225e8db121..54ef35b05627 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -89,13 +89,13 @@ user.visible_message(span_warning("[user] aims [src] at the ground! It looks like [user.p_theyre()] performing a sick rocket jump!"), \ span_userdanger("You aim [src] at the ground to perform a bisnasty rocket jump...")) if(can_shoot()) - user.notransform = TRUE + ADD_TRAIT(user, TRAIT_NO_TRANSFORM, REF(src)) playsound(src, 'sound/vehicles/rocketlaunch.ogg', 80, TRUE, 5) animate(user, pixel_z = 300, time = 30, easing = LINEAR_EASING) sleep(7 SECONDS) animate(user, pixel_z = 0, time = 5, easing = LINEAR_EASING) sleep(0.5 SECONDS) - user.notransform = FALSE + REMOVE_TRAIT(user, TRAIT_NO_TRANSFORM, REF(src)) process_fire(user, user, TRUE) if(!QDELETED(user)) //if they weren't gibbed by the explosion, take care of them for good. user.gib() diff --git a/code/modules/projectiles/guns/energy/beam_rifle.dm b/code/modules/projectiles/guns/energy/beam_rifle.dm index 6fb7dc523d2c..b7dd4c657da9 100644 --- a/code/modules/projectiles/guns/energy/beam_rifle.dm +++ b/code/modules/projectiles/guns/energy/beam_rifle.dm @@ -74,6 +74,18 @@ var/mob/listeningTo +/obj/item/gun/energy/beam_rifle/apply_fantasy_bonuses(bonus) + . = ..() + delay = modify_fantasy_variable("delay", delay, -bonus * 2) + aiming_time = modify_fantasy_variable("aiming_time", aiming_time, -bonus * 2) + recoil = modify_fantasy_variable("aiming_time", aiming_time, round(-bonus / 2)) + +/obj/item/gun/energy/beam_rifle/remove_fantasy_bonuses(bonus) + delay = reset_fantasy_variable("delay", delay) + aiming_time = reset_fantasy_variable("aiming_time", aiming_time) + recoil = reset_fantasy_variable("recoil", recoil) + return ..() + /obj/item/gun/energy/beam_rifle/debug delay = 0 cell_type = /obj/item/stock_parts/cell/infinite @@ -496,8 +508,8 @@ if(!QDELETED(target)) handle_impact(target) -/obj/projectile/beam/beam_rifle/on_hit(atom/target, blocked = FALSE, piercing_hit = FALSE) - handle_hit(target, piercing_hit) +/obj/projectile/beam/beam_rifle/on_hit(atom/target, blocked = 0, pierce_hit) + handle_hit(target, pierce_hit) return ..() /obj/projectile/beam/beam_rifle/is_hostile_projectile() @@ -543,7 +555,8 @@ /obj/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit_pierce(atom/target) return PROJECTILE_DELETE_WITHOUT_HITTING -/obj/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit() +/obj/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit(atom/target, blocked = 0, pierce_hit) + SHOULD_CALL_PARENT(FALSE) // This is some snowflake stuff so whatever qdel(src) return BULLET_ACT_BLOCK diff --git a/code/modules/projectiles/guns/energy/crank_guns.dm b/code/modules/projectiles/guns/energy/crank_guns.dm index a455358dde65..70a726d81d2b 100644 --- a/code/modules/projectiles/guns/energy/crank_guns.dm +++ b/code/modules/projectiles/guns/energy/crank_guns.dm @@ -10,8 +10,9 @@ can_bayonet = TRUE knife_x_offset = 22 knife_y_offset = 11 - //monke edit:fully charges per crank because it was really confusing and unintuitive + //monke edit: fully charges per crank because it was really confusing and unintuitive //monke edit: increased cooldown time to compensate for increased charge + /obj/item/gun/energy/laser/musket/Initialize(mapload) . = ..() AddComponent(/datum/component/two_handed, require_twohands = TRUE, force_wielded = 10) @@ -43,26 +44,6 @@ charge_sound_cooldown_time = 1.8 SECONDS, \ ) -/obj/item/gun/energy/laser/musket/syndicate - name = "syndicate laser musket" - desc = "A powerful laser(?) weapon, its 4 tetradimensional capacitors can hold 2 shots each, totaling to 8 shots. \ - Putting your hand on the control panel gives you a strange tingling feeling, this is probably how you charge it." - icon_state = "musket_syndie" - inhand_icon_state = "musket_syndie" - worn_icon_state = "las_musket_syndie" - ammo_type = list(/obj/item/ammo_casing/energy/laser/musket/syndicate) - w_class = WEIGHT_CLASS_NORMAL -/obj/item/gun/energy/laser/musket/syndicate/Initialize(mapload) //it takes two hand slots and costs 12 tc, they deserve fast recharging - . = ..() - AddComponent( \ - /datum/component/gun_crank, \ - charging_cell = get_cell(), \ - charge_amount = 250, \ - cooldown_time = 1.5 SECONDS, \ - charge_sound = 'sound/weapons/laser_crank.ogg', \ - charge_sound_cooldown_time = 1.3 SECONDS, \ - ) - /obj/item/gun/energy/disabler/smoothbore name = "smoothbore disabler" desc = "A hand-crafted disabler, using a hard knock on an energy cell to fire the stunner laser. A lack of proper focusing means it has little accuracy." diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm index 054c11f3df66..bc2e7eadebcd 100644 --- a/code/modules/projectiles/guns/energy/dueling.dm +++ b/code/modules/projectiles/guns/energy/dueling.dm @@ -326,7 +326,7 @@ if(DUEL_SETTING_C) color = "blue" -/obj/projectile/energy/duel/on_hit(atom/target, blocked) +/obj/projectile/energy/duel/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() var/turf/T = get_turf(target) var/obj/effect/temp_visual/dueling_chaff/C = locate() in T diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 702b86c5475e..0520750627e4 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -16,6 +16,14 @@ var/list/modkits = list() gun_flags = NOT_A_REAL_GUN +/obj/item/gun/energy/recharge/kinetic_accelerator/apply_fantasy_bonuses(bonus) + . = ..() + max_mod_capacity = modify_fantasy_variable("max_mod_capacity", max_mod_capacity, bonus * 10) + +/obj/item/gun/energy/recharge/kinetic_accelerator/remove_fantasy_bonuses(bonus) + max_mod_capacity = reset_fantasy_variable("max_mod_capacity", max_mod_capacity) + return ..() + /obj/item/gun/energy/recharge/kinetic_accelerator/Initialize(mapload) . = ..() @@ -188,7 +196,7 @@ strike_thing() ..() -/obj/projectile/kinetic/on_hit(atom/target) +/obj/projectile/kinetic/on_hit(atom/target, blocked = 0, pierce_hit) strike_thing(target) . = ..() @@ -255,10 +263,10 @@ /obj/item/borg/upgrade/modkit/proc/install(obj/item/gun/energy/recharge/kinetic_accelerator/KA, mob/user, transfer_to_loc = TRUE) . = TRUE if(minebot_upgrade) - if(minebot_exclusive && !istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone)) + if(minebot_exclusive && !istype(KA.loc, /mob/living/basic/mining_drone)) to_chat(user, span_notice("The modkit you're trying to install is only rated for minebot use.")) return FALSE - else if(istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone)) + else if(istype(KA.loc, /mob/living/basic/mining_drone)) to_chat(user, span_notice("The modkit you're trying to install is not rated for minebot use.")) return FALSE if(denied_type) @@ -586,5 +594,12 @@ name = "adjustable tracer bolts" desc = "Causes kinetic accelerator bolts to have an adjustable-colored tracer trail and explosion. Use in-hand to change color." -/obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user) - bolt_color = input(user,"","Choose Color",bolt_color) as color|null +/obj/item/borg/upgrade/modkit/tracer/adjustable/interact(mob/user) + ..() + choose_bolt_color(user) + +/obj/item/borg/upgrade/modkit/tracer/adjustable/proc/choose_bolt_color(mob/user) + set waitfor = FALSE + + var/new_color = input(user,"","Choose Color",bolt_color) as color|null + bolt_color = new_color || bolt_color diff --git a/code/modules/projectiles/guns/energy/recharge.dm b/code/modules/projectiles/guns/energy/recharge.dm index 3e84b8761af6..e1ca0c34b3fd 100644 --- a/code/modules/projectiles/guns/energy/recharge.dm +++ b/code/modules/projectiles/guns/energy/recharge.dm @@ -18,6 +18,14 @@ /// Do we recharge slower with more of our type? var/unique_frequency = FALSE +/obj/item/gun/energy/recharge/apply_fantasy_bonuses(bonus) + . = ..() + recharge_time = modify_fantasy_variable("recharge_time", recharge_time, -bonus, minimum = 0.2 SECONDS) + +/obj/item/gun/energy/recharge/remove_fantasy_bonuses(bonus) + recharge_time = reset_fantasy_variable("recharge_time", recharge_time) + return ..() + /obj/item/gun/energy/recharge/Initialize(mapload) . = ..() if(!holds_charge) diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 762e95544c52..94c1e7502a8e 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -29,6 +29,17 @@ . = ..() RegisterSignal(src, COMSIG_ITEM_MAGICALLY_CHARGED, PROC_REF(on_magic_charge)) +/obj/item/gun/magic/apply_fantasy_bonuses(bonus) + . = ..() + recharge_rate = modify_fantasy_variable("recharge_rate", recharge_rate, -bonus, minimum = 1) + max_charges = modify_fantasy_variable("max_charges", max_charges, bonus) + charges = modify_fantasy_variable("charges", charges, bonus) + +/obj/item/gun/magic/remove_fantasy_bonuses(bonus) + recharge_rate = reset_fantasy_variable("recharge_rate", recharge_rate) + max_charges = reset_fantasy_variable("max_charges", max_charges) + charges = reset_fantasy_variable("charges", charges) + return ..() /obj/item/gun/magic/fire_sounds() var/frequency_to_use = sin((90/max_charges) * charges) diff --git a/code/modules/projectiles/guns/special/chem_gun.dm b/code/modules/projectiles/guns/special/chem_gun.dm index cf756f7649ba..46ebe99d6e26 100644 --- a/code/modules/projectiles/guns/special/chem_gun.dm +++ b/code/modules/projectiles/guns/special/chem_gun.dm @@ -17,6 +17,17 @@ var/max_syringes = 4 var/last_synth = 0 +/obj/item/gun/chem/apply_fantasy_bonuses(bonus) + . = ..() + max_syringes = modify_fantasy_variable("max_syringes", max_syringes, bonus, minimum = 1) + time_per_syringe = modify_fantasy_variable("time_per_syringe", time_per_syringe, -bonus * 10) + +/obj/item/gun/chem/remove_fantasy_bonuses(bonus) + max_syringes = reset_fantasy_variable("max_syringes", max_syringes) + time_per_syringe = reset_fantasy_variable("time_per_syringe", time_per_syringe) + return ..() + + /obj/item/gun/chem/Initialize(mapload) . = ..() chambered = new /obj/item/ammo_casing/chemgun(src) diff --git a/code/modules/projectiles/guns/special/grenade_launcher.dm b/code/modules/projectiles/guns/special/grenade_launcher.dm index 7aa6bc9a46c7..34861e981cb4 100644 --- a/code/modules/projectiles/guns/special/grenade_launcher.dm +++ b/code/modules/projectiles/guns/special/grenade_launcher.dm @@ -16,6 +16,14 @@ . = ..() . += "[grenades.len] / [max_grenades] grenades loaded." +/obj/item/gun/grenadelauncher/apply_fantasy_bonuses(bonus) + . = ..() + max_grenades = modify_fantasy_variable("max_syringes", max_grenades, bonus, minimum = 1) + +/obj/item/gun/grenadelauncher/remove_fantasy_bonuses(bonus) + max_grenades = reset_fantasy_variable("max_syringes", max_grenades) + return ..() + /obj/item/gun/grenadelauncher/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/grenade/c4)) diff --git a/code/modules/projectiles/guns/special/meat_hook.dm b/code/modules/projectiles/guns/special/meat_hook.dm index ac9e5361999e..e43fe21e70d1 100644 --- a/code/modules/projectiles/guns/special/meat_hook.dm +++ b/code/modules/projectiles/guns/special/meat_hook.dm @@ -50,7 +50,7 @@ ..() //TODO: root the firer until the chain returns -/obj/projectile/hook/on_hit(atom/target) +/obj/projectile/hook/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(ismovable(target)) var/atom/movable/A = target diff --git a/code/modules/projectiles/guns/special/syringe_gun.dm b/code/modules/projectiles/guns/special/syringe_gun.dm index 70e151fb6e06..31f6d2081f5f 100644 --- a/code/modules/projectiles/guns/special/syringe_gun.dm +++ b/code/modules/projectiles/guns/special/syringe_gun.dm @@ -30,6 +30,14 @@ chambered = new /obj/item/ammo_casing/syringegun(src) recharge_newshot() +/obj/item/gun/syringe/apply_fantasy_bonuses(bonus) + . = ..() + max_syringes = modify_fantasy_variable("max_syringes", max_syringes, bonus, minimum = 1) + +/obj/item/gun/syringe/remove_fantasy_bonuses(bonus) + max_syringes = reset_fantasy_variable("max_syringes", max_syringes) + return ..() + /obj/item/gun/syringe/handle_atom_del(atom/A) . = ..() if(A in syringes) diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index 32e3b4c8e2c8..c5a6996759a1 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -30,19 +30,19 @@ if(proximity_flag) if(isgun(target)) . |= AFTERATTACK_PROCESSED_ITEM - var/obj/item/gun/targetted_gun = target - var/obj/item/firing_pin/old_pin = targetted_gun.pin + var/obj/item/gun/targeted_gun = target + var/obj/item/firing_pin/old_pin = targeted_gun.pin if(old_pin?.pin_removable && (force_replace || old_pin.pin_hot_swappable)) if(Adjacent(user)) user.put_in_hands(old_pin) else - old_pin.forceMove(targetted_gun.drop_location()) + old_pin.forceMove(targeted_gun.drop_location()) old_pin.gun_remove(user) - if(!targetted_gun.pin) + if(!targeted_gun.pin) if(!user.temporarilyRemoveItemFromInventory(src)) return . - if(gun_insert(user, targetted_gun)) + if(gun_insert(user, targeted_gun)) if(old_pin) balloon_alert(user, "swapped firing pin") else @@ -223,12 +223,12 @@ color = "#FFD700" fail_message = "" ///list of account IDs which have accepted the license prompt. If this is the multi-payment pin, then this means they accepted the waiver that each shot will cost them money - var/list/gun_owners = list() + var/list/gun_owners = list() ///how much gets paid out to license yourself to the gun - var/payment_amount + var/payment_amount var/datum/bank_account/pin_owner ///if true, user has to pay everytime they fire the gun - var/multi_payment = FALSE + var/multi_payment = FALSE var/owned = FALSE ///purchase prompt to prevent spamming it, set to the user who opens to prompt to prevent locking the gun up for other users. var/active_prompt_user @@ -321,10 +321,10 @@ pin_owner.adjust_money(payment_amount, "Firing Pin: Gun License Bought") gun_owners += credit_card_details to_chat(user, span_notice("Gun license purchased, have a secure day!")) - - else + + else to_chat(user, span_warning("ERROR: User balance insufficent for successful transaction!")) - + if("No", null) to_chat(user, span_warning("ERROR: User has declined to purchase gun license!")) active_prompt_user = null diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index c0673b5d84db..ad0031678666 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -157,13 +157,15 @@ var/decayedRange //stores original range var/reflect_range_decrease = 5 //amount of original range that falls off when reflecting, so it doesn't go forever var/reflectable = NONE // Can it be reflected or not? + // Status effects applied on hit - var/stun = 0 - var/knockdown = 0 - var/paralyze = 0 - var/immobilize = 0 - var/unconscious = 0 - var/eyeblur = 0 + var/stun = 0 SECONDS + var/knockdown = 0 SECONDS + var/paralyze = 0 SECONDS + var/immobilize = 0 SECONDS + var/unconscious = 0 SECONDS + /// Seconds of blurry eyes applied on projectile hit + var/eyeblur = 0 SECONDS /// Drowsiness applied on projectile hit var/drowsy = 0 SECONDS /// Jittering applied on projectile hit @@ -241,14 +243,22 @@ /** * Called when the projectile hits something * - * @params - * target - thing hit - * blocked - percentage of hit blocked - * pierce_hit - are we piercing through or regular hitting + * By default parent call will always return [BULLET_ACT_HIT] (unless qdeleted) + * so it is save to assume a successful hit in children (though not necessarily successfully damaged - it could've been blocked) + * + * Arguments + * * target - thing hit + * * blocked - percentage of hit blocked (0 to 100) + * * pierce_hit - boolean, are we piercing through or regular hitting + * + * Returns + * * Returns [BULLET_ACT_HIT] if we hit something. Default return value. + * * Returns [BULLET_ACT_BLOCK] if we were hit but sustained no effects (blocked it). Note, Being "blocked" =/= "blocked is 100". + * * Returns [BULLET_ACT_FORCE_PIERCE] to have the projectile keep going instead of "hitting", as if we were not hit at all. */ -/obj/projectile/proc/on_hit(atom/target, blocked = FALSE, pierce_hit) - if(fired_from) - SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_ON_HIT, firer, target, Angle) +/obj/projectile/proc/on_hit(atom/target, blocked = 0, pierce_hit) + SHOULD_CALL_PARENT(TRUE) + // i know that this is probably more with wands and gun mods in mind, but it's a bit silly that the projectile on_hit signal doesn't ping the projectile itself. // maybe we care what the projectile thinks! See about combining these via args some time when it's not 5AM var/obj/item/bodypart/hit_limb @@ -258,8 +268,8 @@ SEND_SIGNAL(src, COMSIG_PROJECTILE_SELF_ON_HIT, firer, target, Angle, hit_limb) if(QDELETED(src)) // in case one of the above signals deleted the projectile for whatever reason - return - var/turf/target_loca = get_turf(target) + return BULLET_ACT_BLOCK + var/turf/target_turf = get_turf(target) var/hitx var/hity @@ -270,10 +280,10 @@ hitx = target.pixel_x + rand(-8, 8) hity = target.pixel_y + rand(-8, 8) - if(damage > 0 && (damage_type == BRUTE || damage_type == BURN) && iswallturf(target_loca) && prob(75)) - var/turf/closed/wall/W = target_loca + if(damage > 0 && (damage_type == BRUTE || damage_type == BURN) && iswallturf(target_turf) && prob(75)) + var/turf/closed/wall/W = target_turf if(impact_effect_type && !hitscan) - new impact_effect_type(target_loca, hitx, hity) + new impact_effect_type(target_turf, hitx, hity) W.add_dent(WALL_DENT_SHOT, hitx, hity) @@ -281,7 +291,7 @@ if(!isliving(target)) if(impact_effect_type && !hitscan) - new impact_effect_type(target_loca, hitx, hity) + new impact_effect_type(target_turf, hitx, hity) if(isturf(target) && hitsound_wall) var/volume = clamp(vol_by_damage() + 20, 0, 100) if(suppressed) @@ -295,15 +305,15 @@ if(damage && L.blood_volume && damage_type == BRUTE) var/splatter_dir = dir if(starting) - splatter_dir = get_dir(starting, target_loca) + splatter_dir = get_dir(starting, target_turf) if(isalien(L)) - new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir) + new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_turf, splatter_dir) else - new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir) + new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_turf, splatter_dir) if(prob(33)) - L.add_splatter_floor(target_loca) + L.add_splatter_floor(target_turf) else if(impact_effect_type && !hitscan) - new impact_effect_type(target_loca, hitx, hity) + new impact_effect_type(target_turf, hitx, hity) var/organ_hit_text = "" var/limb_hit = hit_limb @@ -320,9 +330,6 @@ playsound(src, hitsound, volume, TRUE, -1) L.visible_message(span_danger("[L] is hit by \a [src][organ_hit_text]!"), \ span_userdanger("You're hit by \a [src][organ_hit_text]!"), null, COMBAT_MESSAGE_RANGE) - if(L.is_blind()) - to_chat(L, span_userdanger("You feel something hit you[organ_hit_text]!")) - L.on_hit(src) var/reagent_note if(reagents?.reagent_list) @@ -1137,6 +1144,29 @@ return FALSE +///Checks if the projectile can embed into someone +/obj/projectile/proc/can_embed_into(atom/hit) + return embedding && shrapnel_type && iscarbon(hit) && !HAS_TRAIT(hit, TRAIT_PIERCEIMMUNE) + +/// Reflects the projectile off of something +/obj/projectile/proc/reflect(atom/hit_atom) + if(!starting) + return + var/new_x = starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/new_y = starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/turf/current_tile = get_turf(hit_atom) + + // redirect the projectile + original = locate(new_x, new_y, z) + starting = current_tile + firer = hit_atom + yo = new_y - current_tile.y + xo = new_x - current_tile.x + var/new_angle_s = Angle + rand(120,240) + while(new_angle_s > 180) // Translate to regular projectile degrees + new_angle_s -= 360 + set_angle(new_angle_s) + #undef MOVES_HITSCAN #undef MUZZLE_EFFECT_PIXEL_INCREMENT diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 0e79dfb0ba0f..e467a745f805 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -7,7 +7,7 @@ hitsound = 'sound/weapons/sear.ogg' hitsound_wall = 'sound/weapons/effects/searwall.ogg' armor_flag = LASER - eyeblur = 2 + eyeblur = 4 SECONDS impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser light_system = MOVABLE_LIGHT light_outer_range = 1 @@ -46,7 +46,7 @@ muzzle_type = /obj/effect/projectile/muzzle/heavy_laser impact_type = /obj/effect/projectile/impact/heavy_laser -/obj/projectile/beam/laser/on_hit(atom/target, blocked = FALSE) +/obj/projectile/beam/laser/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) var/mob/living/carbon/M = target @@ -58,24 +58,16 @@ name = "low-power laser" icon_state = "laser_musket" impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser - damage = 30 //monke edit: damage changed from 25 to 30 - stamina = 45 //monke edit: brought to disabler level as is on tg + damage = 25 + stamina = 40 light_color = COLOR_STRONG_VIOLET weak_against_armour = TRUE /obj/projectile/beam/laser/musket/prime name = "mid-power laser" - damage = 35 //monke edit: damage changed from 30 to 35 - stamina = 60 //monke edit: damage changed from 45 to 60 - weak_against_armour = FALSE - -/obj/projectile/beam/laser/musket/syndicate //monke edit: syndicate laser musket - name = "resonant laser" damage = 30 - stamina = 65 + stamina = 45 weak_against_armour = FALSE - armour_penetration = 25 //less powerful than armor piercing rounds - wound_bonus = 10 /obj/projectile/beam/weak damage = 15 @@ -114,8 +106,6 @@ stamina = 45 paralyze_timer = 5 SECONDS armor_flag = ENERGY - hitsound = 'sound/weapons/tap.ogg' - eyeblur = 0 impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE tracer_type = /obj/effect/projectile/tracer/disabler @@ -132,7 +122,7 @@ /obj/projectile/beam/disabler/smoothbore/prime name = "focused disabler beam" weak_against_armour = FALSE - stamina = 65 //monkie edit: changed from 35 to 65(Black market/ERT item only, even rarer is the book to make it) + stamina = 35 /obj/projectile/beam/pulse name = "pulse" @@ -145,7 +135,7 @@ impact_type = /obj/effect/projectile/impact/pulse wound_bonus = 10 -/obj/projectile/beam/pulse/on_hit(atom/target, blocked = FALSE) +/obj/projectile/beam/pulse/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if (!QDELETED(target) && (isturf(target) || isstructure(target))) if(isobj(target)) @@ -162,7 +152,7 @@ projectile_piercing = ALL var/pierce_hits = 2 -/obj/projectile/beam/pulse/heavy/on_hit(atom/target, blocked = FALSE) +/obj/projectile/beam/pulse/heavy/on_hit(atom/target, blocked = 0, pierce_hit) if(pierce_hits <= 0) projectile_piercing = NONE pierce_hits -= 1 @@ -206,7 +196,7 @@ impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser light_color = LIGHT_COLOR_BLUE -/obj/projectile/beam/lasertag/on_hit(atom/target, blocked = FALSE) +/obj/projectile/beam/lasertag/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(ishuman(target)) var/mob/living/carbon/human/M = target @@ -248,7 +238,7 @@ light_color = LIGHT_COLOR_BLUE var/shrink_time = 90 -/obj/projectile/beam/shrink/on_hit(atom/target, blocked = FALSE) +/obj/projectile/beam/shrink/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isopenturf(target) || isindestructiblewall(target))//shrunk floors wouldnt do anything except look weird, i-walls shouldn't be bypassable return diff --git a/code/modules/projectiles/projectile/bullets/_incendiary.dm b/code/modules/projectiles/projectile/bullets/_incendiary.dm index 857b6f037349..f9f7996c17d6 100644 --- a/code/modules/projectiles/projectile/bullets/_incendiary.dm +++ b/code/modules/projectiles/projectile/bullets/_incendiary.dm @@ -5,7 +5,7 @@ /// If TRUE, leaves a trail of hotspots as it flies, very very chaotic var/leaves_fire_trail = TRUE -/obj/projectile/bullet/incendiary/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/incendiary/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) var/mob/living/carbon/M = target @@ -41,7 +41,7 @@ wound_falloff_tile = -4 fire_stacks = 3 -/obj/projectile/bullet/incendiary/fire/on_hit(atom/target, blocked) +/obj/projectile/bullet/incendiary/fire/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() var/turf/location = get_turf(target) if(isopenturf(location)) diff --git a/code/modules/projectiles/projectile/bullets/cannonball.dm b/code/modules/projectiles/projectile/bullets/cannonball.dm index 11ffa603cbf7..2f57a3dcc99b 100644 --- a/code/modules/projectiles/projectile/bullets/cannonball.dm +++ b/code/modules/projectiles/projectile/bullets/cannonball.dm @@ -22,7 +22,7 @@ /// How much our object damage decreases on hit, similar to normal damage. var/object_damage_decrease_on_hit = 0 -/obj/projectile/bullet/cannonball/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/cannonball/on_hit(atom/target, blocked = 0, pierce_hit) damage -= damage_decrease_on_hit if(object_damage_decreases) object_damage -= min(damage, object_damage_decrease_on_hit) @@ -46,7 +46,7 @@ projectile_piercing = NONE damage = 40 //set to 30 before first mob impact, but they're gonna be gibbed by the explosion -/obj/projectile/bullet/cannonball/explosive/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/cannonball/explosive/on_hit(atom/target, blocked = 0, pierce_hit) explosion(target, devastation_range = 2, heavy_impact_range = 3, light_impact_range = 4, explosion_cause = src) . = ..() @@ -56,7 +56,7 @@ projectile_piercing = NONE damage = 15 //very low -/obj/projectile/bullet/cannonball/emp/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/cannonball/emp/on_hit(atom/target, blocked = 0, pierce_hit) empulse(src, 4, 10) . = ..() @@ -65,7 +65,7 @@ icon_state = "biggest_one" damage = 70 //low pierce -/obj/projectile/bullet/cannonball/biggest_one/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/cannonball/biggest_one/on_hit(atom/target, blocked = 0, pierce_hit) if(projectile_piercing == NONE) explosion(target, devastation_range = GLOB.MAX_EX_DEVESTATION_RANGE, heavy_impact_range = GLOB.MAX_EX_HEAVY_RANGE, light_impact_range = GLOB.MAX_EX_LIGHT_RANGE, flash_range = GLOB.MAX_EX_FLASH_RANGE, explosion_cause = src) . = ..() diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm index 1f853127858a..405552a8909c 100644 --- a/code/modules/projectiles/projectile/bullets/dart_syringe.dm +++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm @@ -10,7 +10,7 @@ . = ..() create_reagents(50, NO_REACT) -/obj/projectile/bullet/dart/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/dart/on_hit(atom/target, blocked = 0, pierce_hit) if(iscarbon(target)) var/mob/living/carbon/M = target if(blocked != 100) // not completely blocked diff --git a/code/modules/projectiles/projectile/bullets/dnainjector.dm b/code/modules/projectiles/projectile/bullets/dnainjector.dm index 139f20c339ca..fdb051e7f800 100644 --- a/code/modules/projectiles/projectile/bullets/dnainjector.dm +++ b/code/modules/projectiles/projectile/bullets/dnainjector.dm @@ -7,7 +7,7 @@ embedding = null shrapnel_type = null -/obj/projectile/bullet/dnainjector/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/dnainjector/on_hit(atom/target, blocked = 0, pierce_hit) if(iscarbon(target)) var/mob/living/carbon/M = target if(blocked != 100) diff --git a/code/modules/projectiles/projectile/bullets/grenade.dm b/code/modules/projectiles/projectile/bullets/grenade.dm index b1d7278228f7..a99a7b57ff3e 100644 --- a/code/modules/projectiles/projectile/bullets/grenade.dm +++ b/code/modules/projectiles/projectile/bullets/grenade.dm @@ -8,7 +8,7 @@ embedding = null shrapnel_type = null -/obj/projectile/bullet/a40mm/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/a40mm/on_hit(atom/target, blocked = 0, pierce_hit) ..() explosion(target, devastation_range = -1, light_impact_range = 2, flame_range = 3, flash_range = 1, adminlog = FALSE, explosion_cause = src) return BULLET_ACT_HIT diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm index dbfdbccffe28..7436ad2fa482 100644 --- a/code/modules/projectiles/projectile/bullets/revolver.dm +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -73,7 +73,7 @@ damage = 10 ricochets_max = 0 -/obj/projectile/bullet/c38/trac/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/c38/trac/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() var/mob/living/carbon/M = target if(!istype(M)) @@ -91,7 +91,7 @@ damage = 20 ricochets_max = 0 -/obj/projectile/bullet/c38/hotshot/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/c38/hotshot/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) var/mob/living/carbon/M = target @@ -104,7 +104,7 @@ var/temperature = 100 ricochets_max = 0 -/obj/projectile/bullet/c38/iceblox/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/c38/iceblox/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) var/mob/living/M = target diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index 712e4dcc0f22..c0fa5e2766c7 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -46,3 +46,19 @@ bare_wound_bonus = 80 embedding = list(embed_chance=100, fall_chance=3, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=10) wound_falloff_tile = -5 + +/obj/projectile/bullet/a223 + name = ".223 bullet" + damage = 35 + armour_penetration = 30 + wound_bonus = -40 + +/obj/projectile/bullet/a223/weak //centcom + damage = 20 + +/obj/projectile/bullet/a223/phasic + name = ".223 phasic bullet" + icon_state = "gaussphase" + damage = 30 + armour_penetration = 100 + projectile_phasing = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index cde530c6ed51..7c2f193df4c3 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -55,7 +55,7 @@ damage = 15 paralyze = 10 -/obj/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/shotgun_frag12/on_hit(atom/target, blocked = 0, pierce_hit) ..() explosion(target, devastation_range = -1, light_impact_range = 1, explosion_cause = src) return BULLET_ACT_HIT diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm index 8402e41fe367..a43426708644 100644 --- a/code/modules/projectiles/projectile/bullets/sniper.dm +++ b/code/modules/projectiles/projectile/bullets/sniper.dm @@ -14,7 +14,7 @@ ///Determines how much additional damage the round does to mechs. var/mecha_damage = 10 -/obj/projectile/bullet/p50/on_hit(atom/target, blocked = 0) +/obj/projectile/bullet/p50/on_hit(atom/target, blocked = 0, pierce_hit) if(isobj(target) && (blocked != 100)) var/obj/thing_to_break = target var/damage_to_deal = object_damage @@ -41,7 +41,7 @@ mecha_damage = 100 var/emp_radius = 2 -/obj/projectile/bullet/p50/disruptor/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/p50/disruptor/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if((blocked != 100) && isliving(target)) var/mob/living/living_guy = target @@ -60,7 +60,7 @@ object_damage = 30 mecha_damage = 0 -/obj/projectile/bullet/p50/incendiary/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/p50/incendiary/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) var/mob/living/carbon/poor_burning_dork = target diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm index 59bb27e34eb4..49e8a03022c0 100644 --- a/code/modules/projectiles/projectile/bullets/special.dm +++ b/code/modules/projectiles/projectile/bullets/special.dm @@ -16,7 +16,7 @@ . = ..() SpinAnimation() -/obj/projectile/bullet/honker/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/honker/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() var/mob/M = target if(istype(M)) @@ -30,7 +30,7 @@ /obj/projectile/bullet/mime damage = 40 -/obj/projectile/bullet/mime/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/mime/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(!isliving(target)) return diff --git a/code/modules/projectiles/projectile/energy/ebow.dm b/code/modules/projectiles/projectile/energy/ebow.dm index 73faaffc22f5..e1da23495f4a 100644 --- a/code/modules/projectiles/projectile/energy/ebow.dm +++ b/code/modules/projectiles/projectile/energy/ebow.dm @@ -4,7 +4,7 @@ damage = 15 damage_type = TOX stamina = 60 - eyeblur = 10 + eyeblur = 20 SECONDS knockdown = 10 slur = 10 SECONDS diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm index a3b0941964b4..74a0e3eaec75 100644 --- a/code/modules/projectiles/projectile/energy/net_snare.dm +++ b/code/modules/projectiles/projectile/energy/net_snare.dm @@ -10,7 +10,7 @@ . = ..() SpinAnimation() -/obj/projectile/energy/net/on_hit(atom/target, blocked = FALSE) +/obj/projectile/energy/net/on_hit(atom/target, blocked = 0, pierce_hit) if(isliving(target)) var/turf/Tloc = get_turf(target) if(!locate(/obj/effect/nettingportal) in Tloc) @@ -64,7 +64,7 @@ hitsound = 'sound/weapons/taserhit.ogg' range = 4 -/obj/projectile/energy/trap/on_hit(atom/target, blocked = FALSE) +/obj/projectile/energy/trap/on_hit(atom/target, blocked = 0, pierce_hit) if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - drop a trap new/obj/item/restraints/legcuffs/beartrap/energy(get_turf(loc)) else if(iscarbon(target)) @@ -82,7 +82,7 @@ hitsound = 'sound/weapons/taserhit.ogg' range = 10 -/obj/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = FALSE) +/obj/projectile/energy/trap/cyborg/on_hit(atom/target, blocked = 0, pierce_hit) if(!ismob(target) || blocked >= 100) do_sparks(1, TRUE, src) qdel(src) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 03cf5f85d84d..7f36bf437ed6 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -11,7 +11,7 @@ muzzle_type = /obj/effect/projectile/muzzle/stun impact_type = /obj/effect/projectile/impact/stun -/obj/projectile/energy/electrode/on_hit(atom/target, blocked = FALSE) +/obj/projectile/energy/electrode/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks! do_sparks(1, TRUE, src) diff --git a/code/modules/projectiles/projectile/energy/tesla.dm b/code/modules/projectiles/projectile/energy/tesla.dm index 9afb816088ff..4a9a9a1068b4 100644 --- a/code/modules/projectiles/projectile/energy/tesla.dm +++ b/code/modules/projectiles/projectile/energy/tesla.dm @@ -7,7 +7,7 @@ var/zap_range = 3 var/power = 10000 -/obj/projectile/energy/tesla/on_hit(atom/target) +/obj/projectile/energy/tesla/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() tesla_zap(src, zap_range, power, zap_flags) qdel(src) @@ -32,7 +32,7 @@ speed = 1.5 var/shock_damage = 5 -/obj/projectile/energy/tesla_cannon/on_hit(atom/target) +/obj/projectile/energy/tesla_cannon/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) var/mob/living/victim = target diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 9957c802c79d..fa6e255a99ed 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -31,7 +31,7 @@ name = "bolt of death" icon_state = "pulse1_bl" -/obj/projectile/magic/death/on_hit(atom/target) +/obj/projectile/magic/death/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) @@ -57,7 +57,7 @@ name = "bolt of resurrection" icon_state = "ion" -/obj/projectile/magic/resurrection/on_hit(atom/target) +/obj/projectile/magic/resurrection/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) @@ -85,7 +85,7 @@ var/inner_tele_radius = 0 var/outer_tele_radius = 6 -/obj/projectile/magic/teleport/on_hit(mob/target) +/obj/projectile/magic/teleport/on_hit(mob/target, blocked = 0, pierce_hit) . = ..() var/teleammount = 0 var/teleloc = target @@ -104,7 +104,7 @@ name = "bolt of safety" icon_state = "bluespace" -/obj/projectile/magic/safety/on_hit(atom/target) +/obj/projectile/magic/safety/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isturf(target)) return BULLET_ACT_HIT @@ -123,7 +123,7 @@ icon_state = "energy" var/list/door_types = list(/obj/structure/mineral_door/wood, /obj/structure/mineral_door/iron, /obj/structure/mineral_door/silver, /obj/structure/mineral_door/gold, /obj/structure/mineral_door/uranium, /obj/structure/mineral_door/sandstone, /obj/structure/mineral_door/transparent/plasma, /obj/structure/mineral_door/transparent/diamond) -/obj/projectile/magic/door/on_hit(atom/target) +/obj/projectile/magic/door/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(istype(target, /obj/machinery/door)) OpenDoor(target) @@ -153,7 +153,7 @@ /// If set, this projectile will only pass certain changeflags to wabbajack var/set_wabbajack_changeflags -/obj/projectile/magic/change/on_hit(atom/target) +/obj/projectile/magic/change/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) @@ -171,7 +171,7 @@ icon_state = "red_1" damage_type = BURN -/obj/projectile/magic/animate/on_hit(atom/target, blocked = FALSE) +/obj/projectile/magic/animate/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() target.animate_atom_living(firer) @@ -251,7 +251,7 @@ target.forceMove(src) return PROJECTILE_PIERCE_PHASE -/obj/projectile/magic/locker/on_hit(target) +/obj/projectile/magic/locker/on_hit(atom/target, blocked = 0, pierce_hit) if(created) return ..() if(LAZYLEN(contents)) @@ -313,7 +313,7 @@ name = "bolt of flying" icon_state = "flight" -/obj/projectile/magic/flying/on_hit(mob/living/target) +/obj/projectile/magic/flying/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) var/atom/throw_target = get_edge_target_turf(target, angle2dir(Angle)) @@ -323,7 +323,7 @@ name = "bolt of bounty" icon_state = "bounty" -/obj/projectile/magic/bounty/on_hit(mob/living/target) +/obj/projectile/magic/bounty/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) target.apply_status_effect(/datum/status_effect/bounty, firer) @@ -332,16 +332,16 @@ name = "bolt of antimagic" icon_state = "antimagic" -/obj/projectile/magic/antimagic/on_hit(mob/living/target) +/obj/projectile/magic/antimagic/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() - if(isliving(target)) + if(istype(target)) target.apply_status_effect(/datum/status_effect/song/antimagic) /obj/projectile/magic/fetch name = "bolt of fetching" icon_state = "fetch" -/obj/projectile/magic/fetch/on_hit(mob/living/target) +/obj/projectile/magic/fetch/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) var/atom/throw_target = get_edge_target_turf(target, get_dir(target, firer)) @@ -351,7 +351,7 @@ name = "bolt of babel" icon_state = "babel" -/obj/projectile/magic/babel/on_hit(mob/living/carbon/target) +/obj/projectile/magic/babel/on_hit(mob/living/carbon/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) if(curse_of_babel(target)) @@ -361,7 +361,7 @@ name = "bolt of necropotence" icon_state = "necropotence" -/obj/projectile/magic/necropotence/on_hit(mob/living/target) +/obj/projectile/magic/necropotence/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if(!isliving(target)) return @@ -378,7 +378,7 @@ name = "bolt of possession" icon_state = "wipe" -/obj/projectile/magic/wipe/on_hit(mob/living/carbon/target) +/obj/projectile/magic/wipe/on_hit(mob/living/carbon/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) for(var/x in target.get_traumas())//checks to see if the victim is already going through possession @@ -494,7 +494,7 @@ chain = firer.Beam(src, icon_state = "lightning[rand(1, 12)]") return ..() -/obj/projectile/magic/aoe/lightning/on_hit(target) +/obj/projectile/magic/aoe/lightning/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() tesla_zap(src, zap_range, zap_power, zap_flags) @@ -522,7 +522,7 @@ /// Flash radius of the fireball var/exp_flash = 3 -/obj/projectile/magic/fireball/on_hit(atom/target, blocked = FALSE, pierce_hit) +/obj/projectile/magic/fireball/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) var/mob/living/mob_target = target @@ -577,7 +577,7 @@ speed = 1 pixel_speed_multiplier = 1/7 -/obj/projectile/magic/aoe/juggernaut/on_hit(atom/target, blocked) +/obj/projectile/magic/aoe/juggernaut/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() var/turf/target_turf = get_turf(src) playsound(target_turf, 'sound/weapons/resonator_blast.ogg', 100, FALSE) diff --git a/code/modules/projectiles/projectile/reusable/_reusable.dm b/code/modules/projectiles/projectile/reusable/_reusable.dm index ab7d89573eeb..73825c9b1395 100644 --- a/code/modules/projectiles/projectile/reusable/_reusable.dm +++ b/code/modules/projectiles/projectile/reusable/_reusable.dm @@ -7,7 +7,7 @@ var/ammo_type = /obj/item/ammo_casing/caseless var/dropped = FALSE -/obj/projectile/bullet/reusable/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/reusable/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() handle_drop() diff --git a/code/modules/projectiles/projectile/special/floral.dm b/code/modules/projectiles/projectile/special/floral.dm index 0fef1ef7443d..608679bf6da2 100644 --- a/code/modules/projectiles/projectile/special/floral.dm +++ b/code/modules/projectiles/projectile/special/floral.dm @@ -1,59 +1,67 @@ -/obj/projectile/energy/floramut - name = "alpha somatoray" - icon_state = "energy" +/obj/projectile/energy/flora damage = 0 damage_type = TOX armor_flag = ENERGY -/obj/projectile/energy/floramut/on_hit(atom/target, blocked = FALSE) +/obj/projectile/energy/flora/on_hit(atom/target, blocked, pierce_hit) + if(!isliving(target)) + return ..() + + var/mob/living/hit_plant = target + if(!(hit_plant.mob_biotypes & MOB_PLANT)) + hit_plant.show_message(span_notice("The radiation beam dissipates harmlessly through your body.")) + return BULLET_ACT_BLOCK + . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.mob_biotypes & MOB_PLANT) - if(prob(15)) - L.adjustToxLoss(rand(3, 6)) - L.Paralyze(100) - L.visible_message(span_warning("[L] writhes in pain as [L.p_their()] vacuoles boil."), span_userdanger("You writhe in pain as your vacuoles boil!"), span_hear("You hear the crunching of leaves.")) - if(iscarbon(L) && L.has_dna()) - var/mob/living/carbon/C = L - if(prob(80)) - C.easy_random_mutate(NEGATIVE + MINOR_NEGATIVE) - else - C.easy_random_mutate(POSITIVE) - C.random_mutate_unique_identity() - C.random_mutate_unique_features() - C.domutcheck() - else - L.adjustFireLoss(rand(5, 15)) - L.show_message(span_userdanger("The radiation beam singes you!")) - -/obj/projectile/energy/florayield + if(. == BULLET_ACT_HIT && blocked < 100) + on_hit_plant_effect(target) + + return . + +/// Called when we hit a mob with plant biotype +/obj/projectile/energy/flora/proc/on_hit_plant_effect(mob/living/hit_plant) + return + +/obj/projectile/energy/flora/mut + name = "alpha somatoray" + icon_state = "energy" + +/obj/projectile/energy/flora/mut/on_hit_plant_effect(mob/living/hit_plant) + if(prob(85)) + hit_plant.adjustFireLoss(rand(5, 15)) + hit_plant.show_message(span_userdanger("The radiation beam singes you!")) + return + + hit_plant.adjustToxLoss(rand(3, 6)) + hit_plant.Paralyze(10 SECONDS) + hit_plant.visible_message( + span_warning("[hit_plant] writhes in pain as [hit_plant.p_their()] vacuoles boil."), + span_userdanger("You writhe in pain as your vacuoles boil!"), + span_hear("You hear the crunching of leaves."), + ) + if(iscarbon(hit_plant) && hit_plant.has_dna()) + var/mob/living/carbon/carbon_plant = hit_plant + if(prob(80)) + carbon_plant.easy_random_mutate(NEGATIVE + MINOR_NEGATIVE) + else + carbon_plant.easy_random_mutate(POSITIVE) + carbon_plant.random_mutate_unique_identity() + carbon_plant.random_mutate_unique_features() + carbon_plant.domutcheck() + +/obj/projectile/energy/flora/yield name = "beta somatoray" icon_state = "energy2" - damage = 0 - damage_type = TOX - armor_flag = ENERGY -/obj/projectile/energy/florayield/on_hit(atom/target, blocked = FALSE) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.mob_biotypes & MOB_PLANT) - L.set_nutrition(min(L.nutrition + 30, NUTRITION_LEVEL_FULL)) +/obj/projectile/energy/flora/yield/on_hit_plant_effect(mob/living/hit_plant) + hit_plant.set_nutrition(min(hit_plant.nutrition + 30, NUTRITION_LEVEL_FULL)) -/obj/projectile/energy/florarevolution +/obj/projectile/energy/flora/evolution name = "gamma somatoray" icon_state = "energy3" - damage = 0 - damage_type = TOX - armor_flag = ENERGY -/obj/projectile/energy/florarevolution/on_hit(atom/target, blocked = FALSE) - . = ..() - if(isliving(target)) - var/mob/living/L = target - if(L.mob_biotypes & MOB_PLANT) - L.show_message(span_notice("The radiation beam leaves you feeling disoriented!")) - L.set_dizzy_if_lower(30 SECONDS) - L.emote("flip") - L.emote("spin") +/obj/projectile/energy/flora/evolution/on_hit_plant_effect(mob/living/hit_plant) + hit_plant.show_message(span_notice("The radiation beam leaves you feeling disoriented!")) + hit_plant.set_dizzy_if_lower(30 SECONDS) + hit_plant.emote("flip") + hit_plant.emote("spin") diff --git a/code/modules/projectiles/projectile/special/gravity.dm b/code/modules/projectiles/projectile/special/gravity.dm index 2a0df1b510b5..1a23b653a051 100644 --- a/code/modules/projectiles/projectile/special/gravity.dm +++ b/code/modules/projectiles/projectile/special/gravity.dm @@ -16,7 +16,7 @@ if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items power = min(C.gun?.power, 15) -/obj/projectile/gravityrepulse/on_hit() +/obj/projectile/gravityrepulse/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() T = get_turf(src) for(var/atom/movable/A in range(T, power)) @@ -50,7 +50,7 @@ if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items power = min(C.gun?.power, 15) -/obj/projectile/gravityattract/on_hit() +/obj/projectile/gravityattract/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() T = get_turf(src) for(var/atom/movable/A in range(T, power)) @@ -83,7 +83,7 @@ if(istype(C)) //Hard-coded maximum power so servers can't be crashed by trying to throw the entire Z level's items power = min(C.gun?.power, 15) -/obj/projectile/gravitychaos/on_hit() +/obj/projectile/gravitychaos/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() T = get_turf(src) for(var/atom/movable/A in range(T, power)) diff --git a/code/modules/projectiles/projectile/special/ion.dm b/code/modules/projectiles/projectile/special/ion.dm index 6dc0246d35bb..9d25f1504cde 100644 --- a/code/modules/projectiles/projectile/special/ion.dm +++ b/code/modules/projectiles/projectile/special/ion.dm @@ -7,7 +7,7 @@ impact_effect_type = /obj/effect/temp_visual/impact_effect/ion var/emp_radius = 1 -/obj/projectile/ion/on_hit(atom/target, blocked = FALSE) +/obj/projectile/ion/on_hit(atom/target, blocked = 0, pierce_hit) ..() empulse(target, emp_radius, emp_radius) return BULLET_ACT_HIT diff --git a/code/modules/projectiles/projectile/special/meteor.dm b/code/modules/projectiles/projectile/special/meteor.dm index a0020a573d37..7cecbecc6aa3 100644 --- a/code/modules/projectiles/projectile/special/meteor.dm +++ b/code/modules/projectiles/projectile/special/meteor.dm @@ -9,7 +9,7 @@ damage_type = BRUTE armor_flag = BULLET -/obj/projectile/meteor/on_hit(atom/target, blocked = FALSE) +/obj/projectile/meteor/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(. == BULLET_ACT_HIT && isliving(target)) explosion(target, devastation_range = -1, light_impact_range = 2, flame_range = 0, flash_range = 1, adminlog = FALSE) diff --git a/code/modules/projectiles/projectile/special/mindflayer.dm b/code/modules/projectiles/projectile/special/mindflayer.dm index 54889bbced1c..9f15e9389d59 100644 --- a/code/modules/projectiles/projectile/special/mindflayer.dm +++ b/code/modules/projectiles/projectile/special/mindflayer.dm @@ -1,7 +1,7 @@ /obj/projectile/beam/mindflayer name = "flayer ray" -/obj/projectile/beam/mindflayer/on_hit(atom/target, blocked = FALSE) +/obj/projectile/beam/mindflayer/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(ishuman(target)) var/mob/living/carbon/human/human_hit = target diff --git a/code/modules/projectiles/projectile/special/neurotoxin.dm b/code/modules/projectiles/projectile/special/neurotoxin.dm index aa59cb114c8f..6cfe13bd75dd 100644 --- a/code/modules/projectiles/projectile/special/neurotoxin.dm +++ b/code/modules/projectiles/projectile/special/neurotoxin.dm @@ -7,7 +7,7 @@ armor_flag = BIO impact_effect_type = /obj/effect/temp_visual/impact_effect/neurotoxin -/obj/projectile/neurotoxin/on_hit(atom/target, blocked = FALSE) +/obj/projectile/neurotoxin/on_hit(atom/target, blocked = 0, pierce_hit) if(isalien(target)) knockdown = 0 SECONDS //monkestation edit: from paralyze to knockdown damage = 0 diff --git a/code/modules/projectiles/projectile/special/plasma.dm b/code/modules/projectiles/projectile/special/plasma.dm index cf8778fe4deb..5564ba14dab0 100644 --- a/code/modules/projectiles/projectile/special/plasma.dm +++ b/code/modules/projectiles/projectile/special/plasma.dm @@ -11,7 +11,7 @@ muzzle_type = /obj/effect/projectile/muzzle/plasma_cutter impact_type = /obj/effect/projectile/impact/plasma_cutter -/obj/projectile/plasma/on_hit(atom/target) +/obj/projectile/plasma/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(ismineralturf(target)) var/turf/closed/mineral/M = target diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm index 1c8c8d4267e1..06a3135197f3 100644 --- a/code/modules/projectiles/projectile/special/rocket.dm +++ b/code/modules/projectiles/projectile/special/rocket.dm @@ -5,7 +5,7 @@ embedding = null shrapnel_type = null -/obj/projectile/bullet/gyro/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/gyro/on_hit(atom/target, blocked = 0, pierce_hit) ..() explosion(target, devastation_range = -1, light_impact_range = 2, explosion_cause = src) return BULLET_ACT_HIT @@ -22,7 +22,7 @@ /// Whether the rocket is capable of instantly killing a living target var/random_crits_enabled = TRUE // Worst thing Valve ever added -/obj/projectile/bullet/rocket/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/rocket/on_hit(atom/target, blocked = 0, pierce_hit) if(isliving(target) && prob(1) && random_crits_enabled) var/mob/living/gibbed_dude = target if(gibbed_dude.stat < HARD_CRIT) diff --git a/code/modules/projectiles/projectile/special/temperature.dm b/code/modules/projectiles/projectile/special/temperature.dm index 7eae3edfa203..10c652b77b51 100644 --- a/code/modules/projectiles/projectile/special/temperature.dm +++ b/code/modules/projectiles/projectile/special/temperature.dm @@ -9,7 +9,7 @@ /obj/projectile/temp/is_hostile_projectile() return temperature != 0 // our damage is done by cooling or heating (casting to boolean here) -/obj/projectile/temp/on_hit(atom/target, blocked = 0) +/obj/projectile/temp/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) var/mob/living/carbon/hit_mob = target diff --git a/code/modules/projectiles/projectile/special/wormhole.dm b/code/modules/projectiles/projectile/special/wormhole.dm index 26873daac871..90eadd0bb097 100644 --- a/code/modules/projectiles/projectile/special/wormhole.dm +++ b/code/modules/projectiles/projectile/special/wormhole.dm @@ -22,9 +22,11 @@ gun = casing.gun -/obj/projectile/beam/wormhole/on_hit(atom/target) +/obj/projectile/beam/wormhole/on_hit(atom/target, blocked = 0, pierce_hit) var/obj/item/gun/energy/wormhole_projector/projector = gun.resolve() if(!projector) qdel(src) - return + return BULLET_ACT_BLOCK + + . = ..() projector.create_portal(src, get_turf(src)) diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm index c7848d5559d8..b2776171fdd5 100644 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm @@ -45,12 +45,11 @@ if(good_kind_of_healing && !reaping && SPT_PROB(0.00005, seconds_per_tick)) //janken with the grim reaper! reaping = TRUE - var/list/RockPaperScissors = list("rock" = "paper", "paper" = "scissors", "scissors" = "rock") //choice = loses to if(affected_mob.apply_status_effect(/datum/status_effect/necropolis_curse, CURSE_BLINDING)) helbent = TRUE to_chat(affected_mob, span_hierophant("Malevolent spirits appear before you, bartering your life in a 'friendly' game of rock, paper, scissors. Which do you choose?")) var/timeisticking = world.time - var/RPSchoice = tgui_alert(affected_mob, "Janken Time! You have 60 Seconds to Choose!", "Rock Paper Scissors", RockPaperScissors, 60) + var/RPSchoice = tgui_alert(affected_mob, "Janken Time! You have 60 Seconds to Choose!", "Rock Paper Scissors", list("rock" , "paper" , "scissors"), 60) if(QDELETED(affected_mob) || (timeisticking+(1.1 MINUTES) < world.time)) reaping = FALSE return //good job, you ruined it @@ -58,21 +57,21 @@ to_chat(affected_mob, span_hierophant("You decide to not press your luck, but the spirits remain... hopefully they'll go away soon.")) reaping = FALSE return - var/grim = pick(RockPaperScissors) - if(grim == RPSchoice) //You Tied! - to_chat(affected_mob, span_hierophant("You tie, and the malevolent spirits disappear... for now.")) - reaping = FALSE - else if(RockPaperScissors[RPSchoice] == grim) //You lost! - to_chat(affected_mob, span_hierophant("You lose, and the malevolent spirits smirk eerily as they surround your body.")) - affected_mob.investigate_log("has lost rock paper scissors with the grim reaper and been dusted.", INVESTIGATE_DEATHS) - affected_mob.dust() - return - else //VICTORY ROYALE - to_chat(affected_mob, span_hierophant("You win, and the malevolent spirits fade away as well as your wounds.")) - affected_mob.client.give_award(/datum/award/achievement/misc/helbitaljanken, affected_mob) - affected_mob.revive(HEAL_ALL) - holder.del_reagent(type) - return + switch(rand(1,3)) + if(1) //You Tied! + to_chat(affected_mob, span_hierophant("You tie, and the malevolent spirits disappear... for now.")) + reaping = FALSE + if(2) //You lost! + to_chat(affected_mob, span_hierophant("You lose, and the malevolent spirits smirk eerily as they surround your body.")) + affected_mob.investigate_log("has lost rock paper scissors with the grim reaper and been dusted.", INVESTIGATE_DEATHS) + affected_mob.dust() + return + if(3) //VICTORY ROYALE + to_chat(affected_mob, span_hierophant("You win, and the malevolent spirits fade away as well as your wounds.")) + affected_mob.client.give_award(/datum/award/achievement/jobs/helbitaljanken, affected_mob) + affected_mob.revive(HEAL_ALL) + holder.del_reagent(type) + return ..() return diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 6e07dd6e6a88..7452315dd32c 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -249,7 +249,7 @@ /datum/reagent/medicine/oxandrolone name = "Oxandrolone" - description = "Stimulates the healing of severe burns. Extremely rapidly heals severe burns and slowly heals minor ones. Overdose will worsen existing burns." + description = "stimulates the healing of severe burns. Extremely rapidly heals severe burns and slowly heals minor ones. Overdose will worsen existing burns." reagent_state = LIQUID color = "#1E8BFF" metabolization_rate = 0.5 * REAGENTS_METABOLISM @@ -500,7 +500,7 @@ /datum/reagent/medicine/sal_acid name = "Salicylic Acid" - description = "Stimulates the healing of severe bruises. Extremely rapidly heals severe bruising and slowly heals minor ones. Overdose will worsen existing bruising." + description = "stimulates the healing of severe bruises. Extremely rapidly heals severe bruising and slowly heals minor ones. Overdose will worsen existing bruising." reagent_state = LIQUID color = "#D2D2D2" metabolization_rate = 0.5 * REAGENTS_METABOLISM @@ -1322,6 +1322,7 @@ /datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/metabolizer, seconds_per_tick, times_fired) ..() + metabolizer.exit_stamina_stun() metabolizer.AdjustAllImmobility(-20 * REM * seconds_per_tick) metabolizer.stamina.adjust(10 * REM * seconds_per_tick, 0) metabolizer.set_jitter_if_lower(20 SECONDS * REM * seconds_per_tick) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 5d1671e75354..2fddba00e8b2 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1415,6 +1415,7 @@ taste_description = "slime" penetrates_skin = NONE ph = 11 + restricted = TRUE //so they cant roll on maint pills, if this has other sides effects then this can be reworked to a global blacklist /datum/reagent/fungalspores/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) . = ..() @@ -2609,11 +2610,12 @@ color = "#9A6750" //RGB: 154, 103, 80 taste_description = "inner peace" penetrates_skin = NONE + var/datum/disease/transformation/gondola_disease = /datum/disease/transformation/gondola /datum/reagent/gondola_mutation_toxin/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) . = ..() if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) - exposed_mob.ForceContractDisease(new /datum/disease/transformation/gondola(), FALSE, TRUE) + exposed_mob.ForceContractDisease(new gondola_disease, FALSE, TRUE) /datum/reagent/spider_extract diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 054d432d8f34..59af8d3920c2 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -125,16 +125,16 @@ ///special size for anti cult effect var/effective_size = round(created_volume/48) playsound(T, 'sound/effects/pray.ogg', 80, FALSE, effective_size) - for(var/mob/living/simple_animal/revenant/R in get_hearers_in_view(7,T)) + for(var/mob/living/basic/revenant/ghostie in get_hearers_in_view(7,T)) var/deity if(GLOB.deity) deity = GLOB.deity else deity = "Christ" - to_chat(R, span_userdanger("The power of [deity] compels you!")) - R.stun(20) - R.reveal(100) - R.adjustHealth(50) + to_chat(ghostie, span_userdanger("The power of [deity] compels you!")) + ghostie.apply_status_effect(/datum/status_effect/incapacitating/paralyzed/revenant, 2 SECONDS) + ghostie.apply_status_effect(/datum/status_effect/revenant/revealed, 10 SECONDS) + ghostie.adjust_health(50) for(var/mob/living/carbon/C in get_hearers_in_view(effective_size,T)) if(IS_CULTIST(C)) to_chat(C, span_userdanger("The divine explosion sears you!")) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 692dade04b63..d33eb213f792 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -38,6 +38,18 @@ /// The icon file to take fill icon appearances from var/fill_icon = 'icons/obj/reagentfillings.dmi' +/obj/item/reagent_containers/apply_fantasy_bonuses(bonus) + . = ..() + if(reagents) + reagents.maximum_volume = modify_fantasy_variable("maximum_volume", reagents.maximum_volume, bonus * 10, minimum = 5) + volume = modify_fantasy_variable("maximum_volume_beaker", volume, bonus * 10, minimum = 5) + +/obj/item/reagent_containers/remove_fantasy_bonuses(bonus) + if(reagents) + reagents.maximum_volume = reset_fantasy_variable("maximum_volume", reagents.maximum_volume) + volume = reset_fantasy_variable("maximum_volume_beaker", volume) + return ..() + /obj/item/reagent_containers/Initialize(mapload, vol) . = ..() if(isnum(vol) && vol > 0) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 91dd646455b8..c0e0f5194f82 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -255,7 +255,7 @@ return to_chat(user,span_notice("You start manually releasing the low-pressure gauge...")) - if(!do_after(user, 0.5 SECONDS, affected_mob, interaction_key = DOAFTER_SOURCE_SURVIVALPEN)) + if(!do_after(user, 10 SECONDS, affected_mob, interaction_key = DOAFTER_SOURCE_SURVIVALPEN)) return amount_per_transfer_from_this = initial(amount_per_transfer_from_this) * 0.5 diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm index a667ae731aa2..fbd33d089433 100644 --- a/code/modules/recycling/conveyor.dm +++ b/code/modules/recycling/conveyor.dm @@ -37,6 +37,10 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) //Direction -> if we have a conveyor belt in that direction var/list/neighbors +/obj/machinery/conveyor/Initialize(mapload) + . = ..() + AddElement(/datum/element/footstep_override, priority = STEP_SOUND_CONVEYOR_PRIORITY) + /obj/machinery/conveyor/examine(mob/user) . = ..() if(inverted) diff --git a/code/modules/religion/burdened/psyker.dm b/code/modules/religion/burdened/psyker.dm index 537d163161d0..9a8a9d2100f5 100644 --- a/code/modules/religion/burdened/psyker.dm +++ b/code/modules/religion/burdened/psyker.dm @@ -185,7 +185,8 @@ /obj/item/gun/ballistic/revolver/chaplain/Initialize(mapload) . = ..() - AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE_HOLY) + AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY) + AddElement(/datum/element/bane, target_type = /mob/living/basic/revenant, damage_multiplier = 0, added_damage = 25) name = pick(possible_names) desc = possible_names[name] diff --git a/code/modules/religion/festival/instrument_rites.dm b/code/modules/religion/festival/instrument_rites.dm index 83b064a63984..a1c94c92425d 100644 --- a/code/modules/religion/festival/instrument_rites.dm +++ b/code/modules/religion/festival/instrument_rites.dm @@ -90,7 +90,7 @@ /datum/religion_rites/song_tuner/pain/finish_effect(mob/living/carbon/human/listener, atom/song_source) var/obj/item/bodypart/sliced_limb = pick(listener.bodyparts) - sliced_limb.force_wound_upwards(/datum/wound/slash/moderate/many_cuts) + sliced_limb.force_wound_upwards(/datum/wound/slash/flesh/moderate/many_cuts) /datum/religion_rites/song_tuner/lullaby name = "Spiritual Lullaby" diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm index 8817de3f23b1..959900054d6c 100644 --- a/code/modules/religion/religion_sects.dm +++ b/code/modules/religion/religion_sects.dm @@ -161,7 +161,7 @@ eth_stomach.adjust_charge(60) did_we_charge = TRUE - //if we're not targetting a robot part we stop early + //if we're not targeting a robot part we stop early var/obj/item/bodypart/bodypart = blessed.get_bodypart(chap.zone_selected) if(!IS_ORGANIC_LIMB(bodypart)) if(!did_we_charge) diff --git a/code/modules/religion/sparring/sparring_datum.dm b/code/modules/religion/sparring/sparring_datum.dm index 00aac29a3557..39409935cd8a 100644 --- a/code/modules/religion/sparring/sparring_datum.dm +++ b/code/modules/religion/sparring/sparring_datum.dm @@ -216,7 +216,7 @@ var/mob/living/carbon/human/branded = interfering to_chat(interfering, span_warning("[GLOB.deity] brands your flesh for interfering with [chaplain]'s sparring match!!")) var/obj/item/bodypart/branded_limb = pick(branded.bodyparts) - branded_limb.force_wound_upwards(/datum/wound/burn/severe/brand) + branded_limb.force_wound_upwards(/datum/wound/burn/flesh/severe/brand, wound_source = "divine intervention") branded.emote("scream") flubs-- diff --git a/code/modules/research/designs/autolathe/service_designs.dm b/code/modules/research/designs/autolathe/service_designs.dm index ee90d6a73198..f1f590eb93e8 100644 --- a/code/modules/research/designs/autolathe/service_designs.dm +++ b/code/modules/research/designs/autolathe/service_designs.dm @@ -142,6 +142,18 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE +/datum/design/tongs + name = "Tongs" + id = "tongs" + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = 1000) + build_path = /obj/item/kitchen/tongs + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_KITCHEN, + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE + /datum/design/tray name = "Serving Tray" id = "servingtray" diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index a4040dba92d8..3e22dc279489 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -338,16 +338,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE -/datum/design/board/experimentor - name = "E.X.P.E.R.I-MENTOR Board" - desc = "The circuit board for an E.X.P.E.R.I-MENTOR." - id = "experimentor" - build_path = /obj/item/circuitboard/machine/experimentor - category = list( - RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH - ) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE - /datum/design/board/protolathe name = "Protolathe Board" desc = "The circuit board for a protolathe." @@ -1105,3 +1095,24 @@ RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ROBOTICS ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING + + +/datum/design/board/artifact_xray + name = "Artifact XRay Board" + desc = "The circuit board for a xray machine for artifacts" + id = "artifact_xray" + build_path = /obj/item/circuitboard/machine/artifactxray + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/artifact_heater + name = "Artifact Heating Pad Board" + desc = "The circuit board for a heating pad for artifact" + id = "artifact_heater" + build_path = /obj/item/circuitboard/machine/artifactheater + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 8f1d6d37f293..d7a23cd193dd 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -126,40 +126,6 @@ departmental_flags = DEPARTMENT_BITFLAG_SECURITY autolathe_exportable = FALSE -/datum/design/mag_autorifle - name = "WT-550 Autorifle Magazine (4.6x30mm) (Lethal)" - desc = "A 20 round magazine for the out of date WT-550 Autorifle." - id = "mag_autorifle" - build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = 4000) - build_path = /obj/item/ammo_box/magazine/wt550m9 - category = list( - RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO - ) - departmental_flags = DEPARTMENT_BITFLAG_SECURITY - -/datum/design/mag_autorifle/ap_mag - name = "WT-550 Autorifle Armour Piercing Magazine (4.6x30mm AP) (Lethal)" - desc = "A 20 round armour piercing magazine for the out of date WT-550 Autorifle." - id = "mag_autorifle_ap" - materials = list(/datum/material/iron = 6000, /datum/material/silver = 600) - build_path = /obj/item/ammo_box/magazine/wt550m9/wtap - category = list( - RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO - ) - departmental_flags = DEPARTMENT_BITFLAG_SECURITY - -/datum/design/mag_autorifle/ic_mag - name = "WT-550 Autorifle Incendiary Magazine (4.6x30mm IC) (Lethal/Highly Destructive)" - desc = "A 20 round armour piercing magazine for the out of date WT-550 Autorifle." - id = "mag_autorifle_ic" - materials = list(/datum/material/iron = 6000, /datum/material/silver = 600, /datum/material/glass = 1000) - build_path = /obj/item/ammo_box/magazine/wt550m9/wtic - category = list( - RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO - ) - departmental_flags = DEPARTMENT_BITFLAG_SECURITY - /datum/design/pin_testing name = "Test-Range Firing Pin" desc = "This safety firing pin allows firearms to be operated within proximity to a firing range." diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm deleted file mode 100644 index 98abd12ee750..000000000000 --- a/code/modules/research/experimentor.dm +++ /dev/null @@ -1,712 +0,0 @@ -//this is designed to replace the destructive analyzer - -//NEEDS MAJOR CODE CLEANUP - -#define SCANTYPE_POKE 1 -#define SCANTYPE_IRRADIATE 2 -#define SCANTYPE_GAS 3 -#define SCANTYPE_HEAT 4 -#define SCANTYPE_COLD 5 -#define SCANTYPE_OBLITERATE 6 -#define SCANTYPE_DISCOVER 7 - -#define EFFECT_PROB_VERYLOW 20 -#define EFFECT_PROB_LOW 35 -#define EFFECT_PROB_MEDIUM 50 -#define EFFECT_PROB_HIGH 75 -#define EFFECT_PROB_VERYHIGH 95 - -#define FAIL 8 -/obj/machinery/rnd/experimentor - name = "\improper E.X.P.E.R.I-MENTOR" - desc = "A \"replacement\" for the destructive analyzer with a slight tendency to catastrophically fail." - icon = 'icons/obj/machines/heavy_lathe.dmi' - icon_state = "h_lathe" - base_icon_state = "h_lathe" - density = TRUE - use_power = IDLE_POWER_USE - circuit = /obj/item/circuitboard/machine/experimentor - var/recentlyExperimented = 0 - /// Weakref to the first ian we can find at init - var/datum/weakref/tracked_ian_ref - /// Weakref to the first runtime we can find at init - var/datum/weakref/tracked_runtime_ref - ///Determines the probability of a malfunction. - var/malfunction_probability_coeff = 0 - ///Keeps track of how many times we've had a critical reaction - var/malfunction_probability_coeff_modifier = 0 - var/resetTime = 15 - var/cloneMode = FALSE - var/list/item_reactions - var/static/list/valid_items //valid items for special reactions like transforming - var/list/critical_items_typecache //items that can cause critical reactions - -/obj/machinery/rnd/experimentor/proc/ConvertReqString2List(list/source_list) - var/list/temp_list = params2list(source_list) - for(var/O in temp_list) - temp_list[O] = text2num(temp_list[O]) - return temp_list - -/obj/machinery/rnd/experimentor/proc/valid_items() - RETURN_TYPE(/list) - - if (isnull(valid_items)) - generate_valid_items_and_item_reactions() - - return valid_items - -/obj/machinery/rnd/experimentor/proc/item_reactions() - RETURN_TYPE(/list) - - if (isnull(item_reactions)) - generate_valid_items_and_item_reactions() - - return item_reactions - -/obj/machinery/rnd/experimentor/proc/generate_valid_items_and_item_reactions() - var/static/list/banned_typecache = typecacheof(list( - /obj/item/stock_parts/cell/infinite, - /obj/item/grenade/chem_grenade/tuberculosis - )) - - item_reactions = list() - valid_items = list() - - for(var/I in typesof(/obj/item)) - if(ispath(I, /obj/item/relic)) - item_reactions["[I]"] = SCANTYPE_DISCOVER - else - item_reactions["[I]"] = pick(SCANTYPE_POKE,SCANTYPE_IRRADIATE,SCANTYPE_GAS,SCANTYPE_HEAT,SCANTYPE_COLD,SCANTYPE_OBLITERATE) - - if(is_type_in_typecache(I, banned_typecache)) - continue - - if(ispath(I, /obj/item/stock_parts) || ispath(I, /obj/item/grenade/chem_grenade) || ispath(I, /obj/item/knife)) - var/obj/item/tempCheck = I - if(initial(tempCheck.icon_state) != null) //check it's an actual usable item, in a hacky way - valid_items["[I]"] += 15 - - if(ispath(I, /obj/item/food)) - var/obj/item/tempCheck = I - if(initial(tempCheck.icon_state) != null) //check it's an actual usable item, in a hacky way - valid_items["[I]"] += rand(1,4) - -/obj/machinery/rnd/experimentor/Initialize(mapload) - . = ..() - - tracked_ian_ref = WEAKREF(locate(/mob/living/basic/pet/dog/corgi/ian) in GLOB.mob_living_list) - tracked_runtime_ref = WEAKREF(locate(/mob/living/simple_animal/pet/cat/runtime) in GLOB.mob_living_list) - - critical_items_typecache = typecacheof(list( - /obj/item/construction/rcd, - /obj/item/grenade, - /obj/item/aicard, - /obj/item/storage/backpack/holding, - /obj/item/slime_extract, - /obj/item/onetankbomb, - /obj/item/transfer_valve)) - -/obj/machinery/rnd/experimentor/RefreshParts() - . = ..() - malfunction_probability_coeff = malfunction_probability_coeff_modifier - resetTime = initial(resetTime) - for(var/datum/stock_part/manipulator/manipulator in component_parts) - resetTime = max(1, resetTime - manipulator.tier) - for(var/datum/stock_part/scanning_module/scanning_module in component_parts) - malfunction_probability_coeff += scanning_module.tier * 2 - for(var/datum/stock_part/micro_laser/micro_laser in component_parts) - malfunction_probability_coeff += micro_laser.tier - -/obj/machinery/rnd/experimentor/examine(mob/user) - . = ..() - if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Malfunction probability reduced by [malfunction_probability_coeff]%.
Cooldown interval between experiments at [resetTime*0.1] seconds.") - -/obj/machinery/rnd/experimentor/proc/checkCircumstances(obj/item/O) - //snowflake check to only take "made" bombs - if(istype(O, /obj/item/transfer_valve)) - var/obj/item/transfer_valve/T = O - if(!T.tank_one || !T.tank_two || !T.attached_device) - return FALSE - return TRUE - -/obj/machinery/rnd/experimentor/Insert_Item(obj/item/O, mob/living/user) - if(!(user.istate & ISTATE_HARM)) - . = 1 - if(!is_insertion_ready(user)) - return - if(!user.transferItemToLoc(O, src)) - return - loaded_item = O - to_chat(user, span_notice("You add [O] to the machine.")) - flick("h_lathe_load", src) - -/obj/machinery/rnd/experimentor/default_deconstruction_crowbar(obj/item/O) - ejectItem() - . = ..(O) - -/obj/machinery/rnd/experimentor/ui_interact(mob/user) - var/list/dat = list("
") - if(loaded_item) - dat += "Loaded Item: [loaded_item]" - - dat += "
Available tests:" - dat += "Poke" - dat += "Irradiate" - dat += "Gas" - dat += "Burn" - dat += "Freeze" - dat += "Destroy
" - if(istype(loaded_item,/obj/item/relic)) - dat += "Discover" - dat += "Eject" - var/list/listin = techweb_item_boost_check(src) - if(listin) - var/list/output = list("Research Boost Data:") - var/list/res = list("Already researched:") - var/list/boosted = list("Already boosted:") - for(var/node_id in listin) - var/datum/techweb_node/N = SSresearch.techweb_node_by_id(node_id) - var/str = "[N.display_name]: [listin[N]] points." - if(SSresearch.science_tech.researched_nodes[N.id]) - res += str - else if(SSresearch.science_tech.boosted_nodes[N.id]) - boosted += str - if(SSresearch.science_tech.visible_nodes[N.id]) //JOY OF DISCOVERY! - output += str - output += boosted + res - dat += output - else - dat += "Nothing loaded." - dat += "Refresh" - dat += "Close
" - var/datum/browser/popup = new(user, "experimentor","Experimentor", 700, 400, src) - popup.set_content(dat.Join("
")) - popup.open() - onclose(user, "experimentor") - -/obj/machinery/rnd/experimentor/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - - var/scantype = href_list["function"] - var/obj/item/process = locate(href_list["item"]) in src - - if(href_list["close"]) - usr << browse(null, "window=experimentor") - return - else if(scantype == "eject") - ejectItem() - else if(scantype == "refresh") - updateUsrDialog() - else - if(recentlyExperimented) - to_chat(usr, span_warning("[src] has been used too recently!")) - else if(!loaded_item) - to_chat(usr, span_warning("[src] is not currently loaded!")) - else if(!process || process != loaded_item) //Interface exploit protection (such as hrefs or swapping items with interface set to old item) - to_chat(usr, span_danger("Interface failure detected in [src]. Please try again.")) - else - var/dotype - if(text2num(scantype) == SCANTYPE_DISCOVER) - dotype = SCANTYPE_DISCOVER - else - dotype = matchReaction(process,scantype) - experiment(dotype,process) - use_power(750) - if(dotype != FAIL) - var/list/nodes = techweb_item_boost_check(process) - var/picked = pick_weight(nodes) //This should work. - stored_research.boost_with_item(SSresearch.techweb_node_by_id(picked), process.type) - updateUsrDialog() - -/obj/machinery/rnd/experimentor/proc/matchReaction(matching,reaction) - var/obj/item/D = matching - if(D) - var/list/item_reactions = item_reactions() - if(item_reactions.Find("[D.type]")) - var/tor = item_reactions["[D.type]"] - if(tor == text2num(reaction)) - return tor - else - return FAIL - else - return FAIL - else - return FAIL - -/obj/machinery/rnd/experimentor/proc/ejectItem(delete=FALSE) - if(loaded_item) - if(cloneMode) - visible_message(span_notice("A duplicate [loaded_item] pops out!")) - var/type_to_make = loaded_item.type - new type_to_make(get_turf(pick(oview(1,src)))) - cloneMode = FALSE - return - var/turf/dropturf = get_turf(pick(view(1,src))) - if(!dropturf) //Failsafe to prevent the object being lost in the void forever. - dropturf = drop_location() - loaded_item.forceMove(dropturf) - if(delete) - qdel(loaded_item) - loaded_item = null - -/obj/machinery/rnd/experimentor/proc/throwSmoke(turf/where) - var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(0, holder = src, location = where) - smoke.start() - - -/obj/machinery/rnd/experimentor/proc/experiment(exp,obj/item/exp_on) - recentlyExperimented = 1 - icon_state = "[base_icon_state]_wloop" - var/chosenchem - var/criticalReaction = is_type_in_typecache(exp_on, critical_items_typecache) - //////////////////////////////////////////////////////////////////////////////////////////////// - if(exp == SCANTYPE_POKE) - visible_message(span_notice("[src] prods at [exp_on] with mechanical arms.")) - if(prob(EFFECT_PROB_LOW) && criticalReaction) - visible_message(span_notice("[exp_on] is gripped in just the right way, enhancing its focus.")) - malfunction_probability_coeff_modifier++ - RefreshParts() //recalculate malfunction_probability_coeff - else if(prob(EFFECT_PROB_VERYLOW-malfunction_probability_coeff)) - visible_message(span_danger("[src] malfunctions and destroys [exp_on], lashing its arms out at nearby people!")) - for(var/mob/living/m in oview(1, src)) - m.apply_damage(15, BRUTE, pick(BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_CHEST)) - investigate_log("Experimentor dealt minor brute to [m].", INVESTIGATE_EXPERIMENTOR) - ejectItem(TRUE) - else if(prob(EFFECT_PROB_LOW-malfunction_probability_coeff)) - visible_message(span_warning("[src] malfunctions!")) - exp = SCANTYPE_OBLITERATE - else if(prob(EFFECT_PROB_MEDIUM-malfunction_probability_coeff)) - visible_message(span_danger("[src] malfunctions, throwing the [exp_on]!")) - var/mob/living/target = locate(/mob/living) in oview(7,src) - if(target) - var/obj/item/throwing = loaded_item - investigate_log("Experimentor has thrown [loaded_item] at [key_name(target)]", INVESTIGATE_EXPERIMENTOR) - ejectItem() - if(throwing) - throwing.throw_at(target, 10, 1) - //////////////////////////////////////////////////////////////////////////////////////////////// - if(exp == SCANTYPE_IRRADIATE) - visible_message(span_danger("[src] reflects radioactive rays at [exp_on]!")) - if(prob(EFFECT_PROB_LOW) && criticalReaction) - visible_message(span_notice("[exp_on] has activated an unknown subroutine!")) - cloneMode = TRUE - investigate_log("Experimentor has made a clone of [exp_on]", INVESTIGATE_EXPERIMENTOR) - ejectItem() - else if(prob(EFFECT_PROB_VERYLOW-malfunction_probability_coeff)) - visible_message(span_danger("[src] malfunctions, melting [exp_on] and leaking radiation!")) - radiation_pulse(src, max_range = 6, threshold = 0.3) - ejectItem(TRUE) - else if(prob(EFFECT_PROB_LOW-malfunction_probability_coeff)) - visible_message(span_warning("[src] malfunctions, spewing toxic waste!")) - for(var/turf/T in oview(1, src)) - if(!T.density) - if(prob(EFFECT_PROB_VERYHIGH) && !(locate(/obj/effect/decal/cleanable/greenglow) in T)) - var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T) - reagentdecal.reagents.add_reagent(/datum/reagent/uranium/radium, 7) - else if(prob(EFFECT_PROB_MEDIUM-malfunction_probability_coeff)) - var/savedName = "[exp_on]" - ejectItem(TRUE) - var/newPath = text2path(pick_weight(valid_items())) - loaded_item = new newPath(src) - visible_message(span_warning("[src] malfunctions, transforming [savedName] into [loaded_item]!")) - investigate_log("Experimentor has transformed [savedName] into [loaded_item]", INVESTIGATE_EXPERIMENTOR) - if(istype(loaded_item, /obj/item/grenade/chem_grenade)) - var/obj/item/grenade/chem_grenade/CG = loaded_item - CG.detonate() - ejectItem() - //////////////////////////////////////////////////////////////////////////////////////////////// - if(exp == SCANTYPE_GAS) - visible_message(span_warning("[src] fills its chamber with gas, [exp_on] included.")) - if(prob(EFFECT_PROB_LOW) && criticalReaction) - visible_message(span_notice("[exp_on] achieves the perfect mix!")) - new /obj/item/stack/sheet/mineral/plasma(get_turf(pick(oview(1,src)))) - else if(prob(EFFECT_PROB_VERYLOW-malfunction_probability_coeff)) - visible_message(span_danger("[src] destroys [exp_on], leaking dangerous gas!")) - chosenchem = pick(/datum/reagent/carbon,/datum/reagent/uranium/radium,/datum/reagent/toxin,/datum/reagent/consumable/condensedcapsaicin,/datum/reagent/drug/mushroomhallucinogen,/datum/reagent/drug/space_drugs,/datum/reagent/consumable/ethanol,/datum/reagent/consumable/ethanol/beepsky_smash) - var/datum/reagents/tmp_holder = new/datum/reagents(50) - tmp_holder.my_atom = src - tmp_holder.add_reagent(chosenchem , 50) - investigate_log("Experimentor has released [chosenchem] smoke.", INVESTIGATE_EXPERIMENTOR) - var/datum/effect_system/fluid_spread/smoke/chem/smoke = new - smoke.set_up(0, holder = src, location = src, carry = tmp_holder, silent = TRUE) - playsound(src, 'sound/effects/smoke.ogg', 50, TRUE, -3) - smoke.start() - qdel(tmp_holder) - ejectItem(TRUE) - else if(prob(EFFECT_PROB_VERYLOW-malfunction_probability_coeff)) - visible_message(span_danger("[src]'s chemical chamber has sprung a leak!")) - chosenchem = pick(/datum/reagent/mutationtoxin/classic,/datum/reagent/cyborg_mutation_nanomachines,/datum/reagent/toxin/acid) - var/datum/reagents/tmp_holder = new/datum/reagents(50) - tmp_holder.my_atom = src - tmp_holder.add_reagent(chosenchem , 50) - var/datum/effect_system/fluid_spread/smoke/chem/smoke = new - smoke.set_up(0, holder = src, location = src, carry = tmp_holder, silent = TRUE) - playsound(src, 'sound/effects/smoke.ogg', 50, TRUE, -3) - smoke.start() - qdel(tmp_holder) - ejectItem(TRUE) - warn_admins(usr, "[chosenchem] smoke") - investigate_log("Experimentor has released [chosenchem] smoke!", INVESTIGATE_EXPERIMENTOR) - else if(prob(EFFECT_PROB_LOW-malfunction_probability_coeff)) - visible_message(span_warning("[src] malfunctions, spewing harmless gas.")) - throwSmoke(loc) - else if(prob(EFFECT_PROB_MEDIUM-malfunction_probability_coeff)) - visible_message(span_warning("[src] melts [exp_on], ionizing the air around it!")) - empulse(loc, 4, 6) - investigate_log("Experimentor has generated an Electromagnetic Pulse.", INVESTIGATE_EXPERIMENTOR) - ejectItem(TRUE) - //////////////////////////////////////////////////////////////////////////////////////////////// - if(exp == SCANTYPE_HEAT) - visible_message(span_notice("[src] raises [exp_on]'s temperature.")) - if(prob(EFFECT_PROB_LOW) && criticalReaction) - visible_message(span_warning("[src]'s emergency coolant system gives off a small ding!")) - playsound(src, 'sound/machines/ding.ogg', 50, TRUE) - var/obj/item/reagent_containers/cup/glass/coffee/C = new /obj/item/reagent_containers/cup/glass/coffee(get_turf(pick(oview(1,src)))) - chosenchem = pick(/datum/reagent/toxin/plasma,/datum/reagent/consumable/capsaicin,/datum/reagent/consumable/ethanol) - C.reagents.remove_any(25) - C.reagents.add_reagent(chosenchem , 50) - C.name = "Cup of Suspicious Liquid" - C.desc = "It has a large hazard symbol printed on the side in fading ink." - investigate_log("Experimentor has made a cup of [chosenchem] coffee.", INVESTIGATE_EXPERIMENTOR) - else if(prob(EFFECT_PROB_VERYLOW-malfunction_probability_coeff)) - var/turf/start = get_turf(src) - var/mob/M = locate(/mob/living) in view(src, 3) - var/turf/MT = get_turf(M) - if(MT) - visible_message(span_danger("[src] dangerously overheats, launching a flaming fuel orb!")) - investigate_log("Experimentor has launched a fireball at [M]!", INVESTIGATE_EXPERIMENTOR) - var/obj/projectile/magic/fireball/FB = new /obj/projectile/magic/fireball(start) - FB.preparePixelProjectile(MT, start) - FB.fire() - else if(prob(EFFECT_PROB_LOW-malfunction_probability_coeff)) - visible_message(span_danger("[src] malfunctions, melting [exp_on] and releasing a burst of flame!")) - explosion(src, devastation_range = -1, flame_range = 2, adminlog = FALSE) - investigate_log("Experimentor started a fire.", INVESTIGATE_EXPERIMENTOR) - ejectItem(TRUE) - else if(prob(EFFECT_PROB_MEDIUM-malfunction_probability_coeff)) - visible_message(span_warning("[src] malfunctions, melting [exp_on] and leaking hot air!")) - var/datum/gas_mixture/env = loc.return_air() - if(env) - var/heat_capacity = max(env.heat_capacity(), 1) - env.temperature = min((env.temperature * heat_capacity + 100000) / heat_capacity, 1000) - air_update_turf(FALSE, FALSE) - investigate_log("Experimentor has released hot air.", INVESTIGATE_EXPERIMENTOR) - ejectItem(TRUE) - else if(prob(EFFECT_PROB_MEDIUM-malfunction_probability_coeff)) - visible_message(span_warning("[src] malfunctions, activating its emergency coolant systems!")) - throwSmoke(loc) - for(var/mob/living/m in oview(1, src)) - m.apply_damage(5, BURN, pick(BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_CHEST)) - investigate_log("Experimentor has dealt minor burn damage to [key_name(m)]", INVESTIGATE_EXPERIMENTOR) - ejectItem() - //////////////////////////////////////////////////////////////////////////////////////////////// - if(exp == SCANTYPE_COLD) - visible_message(span_notice("[src] lowers [exp_on]'s temperature.")) - if(prob(EFFECT_PROB_LOW) && criticalReaction) - visible_message(span_warning("[src]'s emergency coolant system gives off a small ding!")) - var/obj/item/reagent_containers/cup/glass/coffee/C = new /obj/item/reagent_containers/cup/glass/coffee(get_turf(pick(oview(1,src)))) - playsound(src, 'sound/machines/ding.ogg', 50, TRUE) //Ding! Your death coffee is ready! - chosenchem = pick(/datum/reagent/uranium,/datum/reagent/consumable/frostoil,/datum/reagent/medicine/ephedrine) - C.reagents.remove_any(25) - C.reagents.add_reagent(chosenchem , 50) - C.name = "Cup of Suspicious Liquid" - C.desc = "It has a large hazard symbol printed on the side in fading ink." - investigate_log("Experimentor has made a cup of [chosenchem] coffee.", INVESTIGATE_EXPERIMENTOR) - else if(prob(EFFECT_PROB_VERYLOW-malfunction_probability_coeff)) - visible_message(span_danger("[src] malfunctions, shattering [exp_on] and releasing a dangerous cloud of coolant!")) - var/datum/reagents/tmp_holder = new/datum/reagents(50) - tmp_holder.my_atom = src - tmp_holder.add_reagent(/datum/reagent/consumable/frostoil, 50) - investigate_log("Experimentor has released frostoil gas.", INVESTIGATE_EXPERIMENTOR) - var/datum/effect_system/fluid_spread/smoke/chem/smoke = new - smoke.set_up(0, holder = src, location = src, carry = tmp_holder, silent = TRUE) - playsound(src, 'sound/effects/smoke.ogg', 50, TRUE, -3) - smoke.start() - qdel(tmp_holder) - ejectItem(TRUE) - else if(prob(EFFECT_PROB_LOW-malfunction_probability_coeff)) - visible_message(span_warning("[src] malfunctions, shattering [exp_on] and leaking cold air!")) - var/datum/gas_mixture/env = loc.return_air() - if(env) - var/heat_capacity = max(env.heat_capacity(), 1) - env.temperature = max((env.temperature * heat_capacity - 75000) / heat_capacity, TCMB) - air_update_turf(FALSE, FALSE) - investigate_log("Experimentor has released cold air.", INVESTIGATE_EXPERIMENTOR) - ejectItem(TRUE) - else if(prob(EFFECT_PROB_MEDIUM-malfunction_probability_coeff)) - visible_message(span_warning("[src] malfunctions, releasing a flurry of chilly air as [exp_on] pops out!")) - var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(0, holder = src, location = loc) - smoke.start() - ejectItem() - //////////////////////////////////////////////////////////////////////////////////////////////// - if(exp == SCANTYPE_OBLITERATE) - visible_message(span_warning("[exp_on] activates the crushing mechanism, [exp_on] is destroyed!")) - if(prob(EFFECT_PROB_LOW) && criticalReaction) - visible_message(span_warning("[src]'s crushing mechanism slowly and smoothly descends, flattening the [exp_on]!")) - new /obj/item/stack/sheet/plasteel(get_turf(pick(oview(1,src)))) - else if(prob(EFFECT_PROB_VERYLOW-malfunction_probability_coeff)) - visible_message(span_danger("[src]'s crusher goes way too many levels too high, crushing right through space-time!")) - playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE, -3) - investigate_log("Experimentor has triggered the 'throw things' reaction.", INVESTIGATE_EXPERIMENTOR) - for(var/atom/movable/AM in oview(7,src)) - if(!AM.anchored) - AM.throw_at(src,10,1) - else if(prob(EFFECT_PROB_LOW-malfunction_probability_coeff)) - visible_message(span_danger("[src]'s crusher goes one level too high, crushing right into space-time!")) - playsound(src, 'sound/effects/supermatter.ogg', 50, TRUE, -3) - investigate_log("Experimentor has triggered the 'minor throw things' reaction.", INVESTIGATE_EXPERIMENTOR) - var/list/throwAt = list() - for(var/atom/movable/AM in oview(7,src)) - if(!AM.anchored) - throwAt.Add(AM) - for(var/counter in 1 to throwAt.len) - var/atom/movable/cast = throwAt[counter] - cast.throw_at(pick(throwAt),10,1) - ejectItem(TRUE) - //////////////////////////////////////////////////////////////////////////////////////////////// - if(exp == FAIL) - var/a = pick("rumbles","shakes","vibrates","shudders","honks") - var/b = pick("crushes","spins","viscerates","smashes","insults") - visible_message(span_warning("[exp_on] [a], and [b], the experiment was a failure.")) - - if(exp == SCANTYPE_DISCOVER) - visible_message(span_notice("[src] scans the [exp_on], revealing its true nature!")) - playsound(src, 'sound/effects/supermatter.ogg', 50, 3, -1) - var/obj/item/relic/R = loaded_item - R.reveal() - investigate_log("Experimentor has revealed a relic with [span_danger("[R.realProc]")] effect.", INVESTIGATE_EXPERIMENTOR) - ejectItem() - - //Global reactions - if(prob(EFFECT_PROB_VERYLOW-malfunction_probability_coeff) && loaded_item) - var/globalMalf = rand(1,100) - if(globalMalf < 15) - visible_message(span_warning("[src]'s onboard detection system has malfunctioned!")) - item_reactions()["[exp_on.type]"] = pick(SCANTYPE_POKE,SCANTYPE_IRRADIATE,SCANTYPE_GAS,SCANTYPE_HEAT,SCANTYPE_COLD,SCANTYPE_OBLITERATE) - ejectItem() - if(globalMalf > 16 && globalMalf < 35) - visible_message(span_warning("[src] melts [exp_on], ian-izing the air around it!")) - throwSmoke(loc) - var/mob/living/tracked_ian = tracked_ian_ref?.resolve() - if(tracked_ian) - throwSmoke(tracked_ian.loc) - tracked_ian.forceMove(loc) - investigate_log("Experimentor has stolen Ian!", INVESTIGATE_EXPERIMENTOR) //...if anyone ever fixes it... - else - new /mob/living/basic/pet/dog/corgi(loc) - investigate_log("Experimentor has spawned a new corgi.", INVESTIGATE_EXPERIMENTOR) - ejectItem(TRUE) - if(globalMalf > 36 && globalMalf < 50) - visible_message(span_warning("Experimentor draws the life essence of those nearby!")) - for(var/mob/living/m in view(4,src)) - to_chat(m, span_danger("You feel your flesh being torn from you, mists of blood drifting to [src]!")) - m.apply_damage(50, BRUTE, BODY_ZONE_CHEST) - investigate_log("Experimentor has taken 50 brute a blood sacrifice from [m]", INVESTIGATE_EXPERIMENTOR) - if(globalMalf > 51 && globalMalf < 75) - visible_message(span_warning("[src] encounters a run-time error!")) - throwSmoke(loc) - var/mob/living/tracked_runtime = tracked_runtime_ref?.resolve() - if(tracked_runtime) - throwSmoke(tracked_runtime.loc) - tracked_runtime.forceMove(drop_location()) - investigate_log("Experimentor has stolen Runtime!", INVESTIGATE_EXPERIMENTOR) - else - new /mob/living/simple_animal/pet/cat(loc) - investigate_log("Experimentor failed to steal runtime, and instead spawned a new cat.", INVESTIGATE_EXPERIMENTOR) - ejectItem(TRUE) - if(globalMalf > 76 && globalMalf < 98) - visible_message(span_warning("[src] begins to smoke and hiss, shaking violently!")) - use_power(500000) - investigate_log("Experimentor has drained power from its APC", INVESTIGATE_EXPERIMENTOR) - if(globalMalf == 99) - visible_message(span_warning("[src] begins to glow and vibrate. It's going to blow!")) - addtimer(CALLBACK(src, PROC_REF(boom)), 50) - if(globalMalf == 100) - visible_message(span_warning("[src] begins to glow and vibrate. It's going to blow!")) - addtimer(CALLBACK(src, PROC_REF(honk)), 50) - - addtimer(CALLBACK(src, PROC_REF(reset_exp)), resetTime) - -/obj/machinery/rnd/experimentor/proc/boom() - explosion(src, devastation_range = 1, heavy_impact_range = 5, light_impact_range = 10, flash_range = 5, adminlog = TRUE) - -/obj/machinery/rnd/experimentor/proc/honk() - playsound(src, 'sound/items/bikehorn.ogg', 500) - new /obj/item/grown/bananapeel(loc) - -/obj/machinery/rnd/experimentor/proc/reset_exp() - update_appearance() - recentlyExperimented = FALSE - -/obj/machinery/rnd/experimentor/update_icon_state() - icon_state = base_icon_state - return ..() - -/obj/machinery/rnd/experimentor/proc/warn_admins(user, ReactionName) - var/turf/T = get_turf(user) - message_admins("Experimentor reaction: [ReactionName] generated by [ADMIN_LOOKUPFLW(user)] at [ADMIN_VERBOSEJMP(T)]") - log_game("Experimentor reaction: [ReactionName] generated by [key_name(user)] in [AREACOORD(T)]") - -#undef SCANTYPE_POKE -#undef SCANTYPE_IRRADIATE -#undef SCANTYPE_GAS -#undef SCANTYPE_HEAT -#undef SCANTYPE_COLD -#undef SCANTYPE_OBLITERATE -#undef SCANTYPE_DISCOVER - -#undef EFFECT_PROB_VERYLOW -#undef EFFECT_PROB_LOW -#undef EFFECT_PROB_MEDIUM -#undef EFFECT_PROB_HIGH -#undef EFFECT_PROB_VERYHIGH - -#undef FAIL - - -//////////////////////////////////SPECIAL ITEMS//////////////////////////////////////// - -/obj/item/relic - name = "strange object" - desc = "What mysteries could this hold? Maybe Research & Development could find out." - icon = 'icons/obj/assemblies/assemblies.dmi' - var/realName = "defined object" - var/revealed = FALSE - var/realProc - var/reset_timer = 60 - COOLDOWN_DECLARE(cooldown) - -/obj/item/relic/Initialize(mapload) - . = ..() - icon_state = pick("shock_kit","armor-igniter-analyzer","infra-igniter0","infra-igniter1","radio-multitool","prox-radio1","radio-radio","timer-multitool0","radio-igniter-tank") - realName = "[pick("broken","twisted","spun","improved","silly","regular","badly made")] [pick("device","object","toy","illegal tech","weapon")]" - - -/obj/item/relic/proc/reveal() - if(revealed) //Re-rolling your relics seems a bit overpowered, yes? - return - revealed = TRUE - name = realName - reset_timer = rand(reset_timer, reset_timer * 5) - realProc = pick(PROC_REF(teleport), PROC_REF(explode), PROC_REF(rapidDupe), PROC_REF(petSpray), PROC_REF(flash), PROC_REF(clean), PROC_REF(corgicannon)) - -/obj/item/relic/attack_self(mob/user) - if(!revealed) - to_chat(user, span_notice("You aren't quite sure what this is. Maybe R&D knows what to do with it?")) - return - if(!COOLDOWN_FINISHED(src, cooldown)) - to_chat(user, span_warning("[src] does not react!")) - return - if(loc != user) - return - COOLDOWN_START(src, cooldown, reset_timer) - call(src,realProc)(user) - -//////////////// RELIC PROCS ///////////////////////////// - -/obj/item/relic/proc/throwSmoke(turf/where) - var/datum/effect_system/fluid_spread/smoke/smoke = new - smoke.set_up(0, holder = src, location = get_turf(where)) - smoke.start() - -/obj/item/relic/proc/corgicannon(mob/user) - playsound(src, SFX_SPARKS, rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - var/mob/living/basic/pet/dog/corgi/sad_corgi = new(get_turf(user)) - sad_corgi.throw_at(pick(oview(10,user)), 10, rand(3,8), callback = CALLBACK(src, PROC_REF(throwSmoke), sad_corgi)) - warn_admins(user, "Corgi Cannon", 0) - -/obj/item/relic/proc/clean(mob/user) - playsound(src, SFX_SPARKS, rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - var/obj/item/grenade/chem_grenade/cleaner/CL = new/obj/item/grenade/chem_grenade/cleaner(get_turf(user)) - CL.detonate() - qdel(CL) - warn_admins(user, "Foam", 0) - -/obj/item/relic/proc/flash(mob/user) - playsound(src, SFX_SPARKS, rand(25,50), TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - var/obj/item/grenade/flashbang/CB = new/obj/item/grenade/flashbang(user.loc) - CB.detonate() - warn_admins(user, "Flash") - -/obj/item/relic/proc/petSpray(mob/user) - var/message = span_danger("[src] begins to shake, and in the distance the sound of rampaging animals arises!") - visible_message(message) - to_chat(user, message) - - var/static/list/valid_animals = list( - /mob/living/basic/bear, - /mob/living/basic/bee, - /mob/living/basic/butterfly, - /mob/living/basic/carp, - /mob/living/basic/crab, - /mob/living/basic/lizard, - /mob/living/basic/mouse, - /mob/living/basic/pet/dog/corgi, - /mob/living/basic/pet/dog/pug, - /mob/living/basic/pet/fox, - /mob/living/basic/crab, - /mob/living/simple_animal/parrot/natural, - /mob/living/simple_animal/pet/cat, - ) - for(var/counter in 1 to rand(1, 25)) - var/mobType = pick(valid_animals) - new mobType(get_turf(src)) - - warn_admins(user, "Mass Mob Spawn") - if(prob(60)) - to_chat(user, span_warning("[src] falls apart!")) - qdel(src) - -/obj/item/relic/proc/rapidDupe(mob/user) - audible_message("[src] emits a loud pop!") - var/list/dupes = list() - for(var/counter in 1 to rand(5,10)) - var/obj/item/relic/R = new type(get_turf(src)) - R.name = name - R.desc = desc - R.realName = realName - R.realProc = realProc - R.revealed = TRUE - dupes += R - R.throw_at(pick(oview(7,get_turf(src))),10,1) - - QDEL_LIST_IN(dupes, rand(10, 100)) - warn_admins(user, "Rapid duplicator", 0) - -/obj/item/relic/proc/explode(mob/user) - to_chat(user, span_danger("[src] begins to heat up!")) - addtimer(CALLBACK(src, PROC_REF(do_explode), user), rand(35, 100)) - -/obj/item/relic/proc/do_explode(mob/user) - if(loc == user) - visible_message(span_notice("\The [src]'s top opens, releasing a powerful blast!")) - explosion(src, heavy_impact_range = rand(1,5), light_impact_range = rand(1,5), flame_range = 2, flash_range = rand(1,5), adminlog = TRUE) - warn_admins(user, "Explosion") - qdel(src) //Comment this line to produce a light grenade (the bomb that keeps on exploding when used)!! - -/obj/item/relic/proc/teleport(mob/user) - to_chat(user, span_notice("[src] begins to vibrate!")) - addtimer(CALLBACK(src, PROC_REF(do_the_teleport), user), rand(10, 30)) - -/obj/item/relic/proc/do_the_teleport(mob/user) - var/turf/userturf = get_turf(user) - if(loc == user && !is_centcom_level(userturf.z)) //Because Nuke Ops bringing this back on their shuttle, then looting the ERT area is 2fun4you! - visible_message(span_notice("[src] twists and bends, relocating itself!")) - throwSmoke(userturf) - do_teleport(user, userturf, 8, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) - throwSmoke(get_turf(user)) - warn_admins(user, "Teleport", 0) - -//Admin Warning proc for relics -/obj/item/relic/proc/warn_admins(mob/user, RelicType, priority = 1) - var/turf/T = get_turf(src) - var/log_msg = "[RelicType] relic used by [key_name(user)] in [AREACOORD(T)]" - if(priority) //For truly dangerous relics that may need an admin's attention. BWOINK! - message_admins("[RelicType] relic activated by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(T)]") - log_game(log_msg) - investigate_log(log_msg, "experimentor") diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 9ac8341b478c..2dab4b816059 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -148,7 +148,7 @@ if(HDD_OVERLOADED) . += "The front panel is dangling open. The hdd inside is destroyed and the wires are all burned." -/obj/machinery/rnd/server/master/tool_act(mob/living/user, obj/item/tool, tool_type) +/obj/machinery/rnd/server/master/tool_act(mob/living/user, obj/item/tool, tool_type, is_right_clicking) // Only antags are given the training and knowledge to disassemble this thing. if(is_special_character(user)) return ..() diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 5de5ffa07f7c..e01124c6d69a 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -46,7 +46,6 @@ "earmuffs", "electropack", "experi_scanner", - "experimentor", "extinguisher", "fax", "fishing_rod", @@ -119,6 +118,7 @@ "titaniumglass", "toner_large", "toner", + "tongs", "toy_armblade", "toy_balloon", "toygun", @@ -641,6 +641,8 @@ design_ids = list( "anomaly_neutralizer", "reactive_armour", + "artifact_heater", + "artifact_xray", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) @@ -1485,7 +1487,6 @@ "seclite", "zipties", "inspector", - "mag_autorifle", "rubber_c35", //monkestation edit: taco sec ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) @@ -1526,7 +1527,8 @@ design_ids = list( "pin_testing", "tele_shield", - "lethal_c35", //monkestation edit: taco sec + "lethal_c35", //monkestation edit: paco sec + "mag_autorifle_rub", //monkestation edit: autorifles ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) discount_experiments = list(/datum/experiment/ordnance/explosive/pressurebomb = 5000) @@ -1538,6 +1540,8 @@ prereq_ids = list("adv_engi", "weaponry") design_ids = list( "pin_loyalty", + "mag_autorifle", //monkestation edit: autorifles + "mag_autorifle_salt", //monkestation edit: autorifles ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 10000) discount_experiments = list(/datum/experiment/scanning/points/machinery_tiered_scan/tier3_mechbay = 2500) @@ -1605,8 +1609,6 @@ "c38_hotshot", "c38_iceblox", "techshotshell", - "mag_autorifle_ap", - "mag_autorifle_ic", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index c3ad4ed3e1a6..a68a6fafae35 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -989,7 +989,7 @@ healing_types += CLONE if(length(healing_types)) - owner.apply_damage_type(-heal_amount, damagetype = pick(healing_types)) + owner.heal_damage_type(heal_amount, damagetype = pick(healing_types)) owner.adjust_nutrition(3) drained.adjustCloneLoss(heal_amount * DRAIN_DAMAGE_MULTIPLIER) diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 4e2adcb958be..1bbdd4b14820 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -127,7 +127,7 @@ Slimecrossing Weapons icon_state = "pulse0_bl" hitsound = 'sound/effects/splat.ogg' -/obj/projectile/magic/bloodchill/on_hit(mob/living/target) +/obj/projectile/magic/bloodchill/on_hit(mob/living/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) target.apply_status_effect(/datum/status_effect/bloodchill) diff --git a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm index a23a7d75ec3c..cb903c84d625 100644 --- a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm +++ b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm @@ -226,7 +226,7 @@ /datum/reagent/consumable/corn_syrup = -6, /datum/reagent/sulfur = -3) //sulfur repels snakes according to professor google. - resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/snake = 1) + resulting_atoms = list(/mob/living/basic/snake = 1) /////////////////////////////////////////// @@ -265,7 +265,7 @@ /datum/reagent/napalm = -4) virus_suspectibility = 0 - resulting_atoms = list(/mob/living/simple_animal/hostile/blob/blobspore/independent = 2) //These are useless so we might as well spawn 2. + resulting_atoms = list(/mob/living/basic/blob_minion/spore = 2) //These are useless so we might as well spawn 2. /datum/micro_organism/cell_line/blobbernaut desc = "Blobular myocytes" @@ -284,7 +284,7 @@ suppressive_reagents = list(/datum/reagent/consumable/tinlux = -6) virus_suspectibility = 0 - resulting_atoms = list(/mob/living/simple_animal/hostile/blob/blobbernaut/independent = 1) + resulting_atoms = list(/mob/living/basic/blob_minion/blobbernaut = 1) /datum/micro_organism/cell_line/gelatinous_cube desc = "Cubic ooze particles" @@ -482,7 +482,7 @@ /datum/micro_organism/cell_line/clown/fuck_up_growing(obj/machinery/plumbing/growing_vat/vat) vat.visible_message(span_warning("The biological sample in [vat] seems to have created something horrific!")) - var/mob/selected_mob = pick(list(/mob/living/simple_animal/hostile/retaliate/clown/mutant/slow, /mob/living/simple_animal/hostile/retaliate/clown/fleshclown)) + var/mob/selected_mob = pick(list(/mob/living/basic/clown/mutant/slow, /mob/living/basic/clown/fleshclown)) new selected_mob(get_turf(vat)) if(SEND_SIGNAL(vat.biological_sample, COMSIG_SAMPLE_GROWTH_COMPLETED) & SPARE_SAMPLE) @@ -510,7 +510,7 @@ /datum/reagent/consumable/nothing = -2, /datum/reagent/fuel/oil = -1) - resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/banana = 1) + resulting_atoms = list(/mob/living/basic/clown/banana = 1) /datum/micro_organism/cell_line/clown/glutton desc = "hyperadipogenic clown stem cells" @@ -537,7 +537,7 @@ /datum/reagent/consumable/nothing = -2, /datum/reagent/toxin/bad_food = -1) - resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton = 1) + resulting_atoms = list(/mob/living/basic/clown/mutant/glutton = 1) /datum/micro_organism/cell_line/clown/longclown desc = "long clown bits" @@ -560,7 +560,7 @@ /datum/reagent/consumable/nothing = -2, /datum/reagent/sulfur = -1) - resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/longface = 1) + resulting_atoms = list(/mob/living/basic/clown/longface = 1) /datum/micro_organism/cell_line/frog desc = "anura amphibian cells" diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index cdf14a69c006..1512055d0c97 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -55,11 +55,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth, 26) /obj/machinery/keycard_auth/ui_status(mob/user) if(isdrone(user)) return UI_CLOSE - if(!isanimal(user)) + if(!isanimal_or_basicmob(user)) return ..() - var/mob/living/simple_animal/A = user - if(!A.dextrous) - to_chat(user, span_warning("You are too primitive to use this device!")) + if(!HAS_TRAIT(user, TRAIT_CAN_HOLD_ITEMS)) + balloon_alert(user, "no hands!") return UI_CLOSE return ..() diff --git a/code/modules/security_levels/security_level_datums.dm b/code/modules/security_levels/security_level_datums.dm index ea78000ab099..f2e6a856529b 100644 --- a/code/modules/security_levels/security_level_datums.dm +++ b/code/modules/security_levels/security_level_datums.dm @@ -41,7 +41,7 @@ * No threats */ /datum/security_level/green - name = "green" + name = "chimpcon 1" sound = 'sound/misc/notice2.ogg' // Friendly beep number_level = SEC_LEVEL_GREEN lowering_to_configuration_key = /datum/config_entry/string/alert_green @@ -53,7 +53,7 @@ * Caution advised */ /datum/security_level/blue - name = "blue" + name = "chimpcon 2" sound = 'sound/misc/notice1.ogg' // Angry alarm number_level = SEC_LEVEL_BLUE lowering_to_configuration_key = /datum/config_entry/string/alert_blue_downto @@ -66,7 +66,7 @@ * Hostile threats */ /datum/security_level/red - name = "red" + name = "chimpcon 4" sound = 'sound/misc/notice1.ogg' // The same angry alarm number_level = SEC_LEVEL_RED lowering_to_configuration_key = /datum/config_entry/string/alert_red_downto @@ -79,7 +79,7 @@ * Station destruction is imminent */ /datum/security_level/delta - name = "delta" + name = "chimpcon 5" sound = 'sound/misc/notice1.ogg' // The same angry alarm, again number_level = SEC_LEVEL_DELTA elevating_to_configuration_key = /datum/config_entry/string/alert_delta diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 70eccdc78828..a9f22d0eb2d9 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -181,9 +181,6 @@ /obj/machinery/computer/emergency_shuttle/proc/increase_hijack_stage() var/obj/docking_port/mobile/emergency/shuttle = SSshuttle.emergency - // Begin loading this early, prevents a delay when the shuttle goes to land - INVOKE_ASYNC(SSmapping, TYPE_PROC_REF(/datum/controller/subsystem/mapping, lazy_load_template), LAZY_TEMPLATE_KEY_NUKIEBASE) - shuttle.hijack_status++ if(hijack_announce) announce_hijack_stage() @@ -548,7 +545,6 @@ var/destination_dock = "emergency_away" if(is_hijacked() || elimination_hijack()) // just double check - SSmapping.lazy_load_template(LAZY_TEMPLATE_KEY_NUKIEBASE) destination_dock = "emergency_syndicate" minor_announce("Corruption detected in \ shuttle navigation protocols. Please contact your \ diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index ad97d57fc6c3..47e62be1ebaa 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -70,7 +70,7 @@ /obj/docking_port/has_gravity(turf/current_turf) return TRUE -/obj/docking_port/take_damage() +/obj/docking_port/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) return /obj/docking_port/singularity_pull() @@ -797,7 +797,7 @@ if(sunset_mobs.mind && !istype(get_area(sunset_mobs), /area/shuttle/escape/brig)) sunset_mobs.mind.force_escaped = TRUE // Ghostize them and put them in nullspace stasis (for stat & possession checks) - sunset_mobs.notransform = TRUE + ADD_TRAIT(sunset_mobs, TRAIT_NO_TRANSFORM, REF(src)) sunset_mobs.ghostize(FALSE) sunset_mobs.moveToNullspace() diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 3a49beab926c..b801c171feaa 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -154,7 +154,7 @@ // Bar staff, GODMODE mobs(as long as they stay in the shuttle) that just want to make sure people have drinks // and a good time. -/mob/living/simple_animal/drone/snowflake/bardrone +/mob/living/basic/drone/snowflake/bardrone name = "Bardrone" desc = "A barkeeping drone, a robot built to tend bars." hacked = TRUE @@ -166,12 +166,9 @@ initial_language_holder = /datum/language_holder/universal default_storage = null -/mob/living/simple_animal/drone/snowflake/bardrone/Initialize(mapload) +/mob/living/basic/drone/snowflake/bardrone/Initialize(mapload) . = ..() - access_card.add_access(list(ACCESS_CENT_BAR)) - become_area_sensitive(ROUNDSTART_TRAIT) - RegisterSignal(src, COMSIG_ENTER_AREA, PROC_REF(check_barstaff_godmode)) - check_barstaff_godmode() + AddComponentFrom(ROUNDSTART_TRAIT, /datum/component/area_based_godmode, area_type = /area/shuttle/escape, allow_area_subtypes = TRUE) /mob/living/simple_animal/hostile/alien/maid/barmaid gold_core_spawnable = NO_SPAWN @@ -192,22 +189,12 @@ access_card.add_access(cap_trim.access + cap_trim.wildcard_access + list(ACCESS_CENT_BAR)) ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) - become_area_sensitive(ROUNDSTART_TRAIT) - RegisterSignal(src, COMSIG_ENTER_AREA, PROC_REF(check_barstaff_godmode)) - check_barstaff_godmode() + AddComponentFrom(ROUNDSTART_TRAIT, /datum/component/area_based_godmode, area_type = /area/shuttle/escape, allow_area_subtypes = TRUE) /mob/living/simple_animal/hostile/alien/maid/barmaid/Destroy() qdel(access_card) . = ..() -/mob/living/simple_animal/proc/check_barstaff_godmode() - SIGNAL_HANDLER - - if(istype(get_area(loc), /area/shuttle/escape)) - status_flags |= GODMODE - else - status_flags &= ~GODMODE - // Bar table, a wooden table that kicks you in a direction if you're not // barstaff (defined as someone who was a roundstart bartender or someone // with CENTCOM_BARSTAFF) @@ -242,6 +229,9 @@ if(is_bartender_job(human_user.mind?.assigned_role)) return TRUE + if(istype(user, /mob/living/basic/drone/snowflake/bardrone)) + return TRUE + var/obj/item/card/id/ID = user.get_idcard(FALSE) if(ID && (ACCESS_CENT_BAR in ID.access)) return TRUE diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index fd0a21fb53bb..683bdc2d647c 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -1,37 +1,38 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /mob/living, - /obj/structure/blob, - /obj/effect/rune, - /obj/item/disk/nuclear, - /obj/machinery/nuclearbomb, - /obj/item/beacon, - /obj/narsie, - /obj/tear_in_reality, - /obj/machinery/teleport/station, - /obj/machinery/teleport/hub, - /obj/machinery/quantumpad, - /obj/effect/mob_spawn, + /obj/docking_port, /obj/effect/hierophant, - /obj/structure/receiving_pad, - /obj/item/warp_cube, - /obj/machinery/rnd/production, //print tracking beacons, send shuttle - /obj/machinery/autolathe, //same - /obj/projectile/beam/wormhole, + /obj/effect/mob_spawn, /obj/effect/portal, - /obj/item/shared_storage, - /obj/structure/extraction_point, - /obj/machinery/syndicatebomb, + /obj/effect/rune, + /obj/item/beacon, + /obj/item/disk/nuclear, + /obj/item/gps, /obj/item/hilbertshotel, - /obj/item/swapper, - /obj/docking_port, - /obj/machinery/launchpad, - /obj/machinery/disposal, - /obj/structure/disposalpipe, /obj/item/mail, + /obj/item/shared_storage, + /obj/item/swapper, + /obj/item/warp_cube, + /obj/machinery/autolathe, // In case you manage to get it to print a beacon while in transit /obj/machinery/camera, - /obj/item/gps, + /obj/machinery/disposal, + /obj/machinery/exodrone_launcher, + /obj/machinery/fax, + /obj/machinery/launchpad, + /obj/machinery/nuclearbomb, + /obj/machinery/quantumpad, + /obj/machinery/rnd/production, + /obj/machinery/syndicatebomb, + /obj/machinery/teleport/hub, + /obj/machinery/teleport/station, + /obj/narsie, + /obj/projectile/beam/wormhole, + /obj/structure/blob, /obj/structure/checkoutmachine, - /obj/machinery/fax + /obj/structure/disposalpipe, + /obj/structure/extraction_point, + /obj/structure/guardian_beacon, + /obj/tear_in_reality, ))) /// How many goody orders we can fit in a lockbox before we upgrade to a crate @@ -265,7 +266,10 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( continue empty_turfs += shuttle_floor - new /obj/structure/closet/crate/mail/economy(pick(empty_turfs)) + var/obj/structure/closet/crate/mail/economy/new_create = new /obj/structure/closet/crate/mail/economy(pick(empty_turfs)) + + if(length(SSmapping.levels_by_trait(ZTRAIT_OSHAN))) + SSeconomy.mail_crate = new_create #undef GOODY_FREE_SHIPPING_MAX #undef CRATE_TAX diff --git a/code/modules/spells/spell_types/conjure/simian.dm b/code/modules/spells/spell_types/conjure/simian.dm index 556a78e50127..aa9aabc68100 100644 --- a/code/modules/spells/spell_types/conjure/simian.dm +++ b/code/modules/spells/spell_types/conjure/simian.dm @@ -14,14 +14,18 @@ invocation_type = INVOCATION_SHOUT summon_radius = 2 - summon_type = list(/mob/living/carbon/human/species/monkey/angry, /mob/living/carbon/human/species/monkey/angry, /mob/living/simple_animal/hostile/gorilla/lesser) + summon_type = list( + /mob/living/basic/gorilla/lesser, + /mob/living/carbon/human/species/monkey/angry, + /mob/living/carbon/human/species/monkey/angry, // Listed twice so it's twice as likely, this class doesn't use pick weight + ) summon_amount = 4 /datum/action/cooldown/spell/conjure/simian/level_spell(bypass_cap) . = ..() summon_amount++ // MORE, MOOOOORE if(spell_level == spell_max_level) // We reward the faithful. - summon_type = list(/mob/living/carbon/human/species/monkey/angry, /mob/living/simple_animal/hostile/gorilla) + summon_type = list(/mob/living/carbon/human/species/monkey/angry, /mob/living/basic/gorilla) spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC // Max level lets you cast it naked, for monkey larp. to_chat(owner, span_notice("Your simian power has reached maximum capacity! You can now cast this spell naked, and you will create adult Gorillas with each cast.")) diff --git a/code/modules/spells/spell_types/conjure_item/lighting_packet.dm b/code/modules/spells/spell_types/conjure_item/lighting_packet.dm index 5901c268c2c8..2badfdd46dff 100644 --- a/code/modules/spells/spell_types/conjure_item/lighting_packet.dm +++ b/code/modules/spells/spell_types/conjure_item/lighting_packet.dm @@ -32,7 +32,7 @@ hit_living.electrocute_act(80, src, flags = SHOCK_ILLUSION | SHOCK_NOGLOVES) qdel(src) -/obj/item/spellpacket/lightningbolt/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, quickstart = TRUE) +/obj/item/spellpacket/lightningbolt/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, gentle, quickstart = TRUE) . = ..() if(ishuman(thrower)) var/mob/living/carbon/human/human_thrower = thrower diff --git a/code/modules/spells/spell_types/jaunt/bloodcrawl.dm b/code/modules/spells/spell_types/jaunt/bloodcrawl.dm index ce514b004a50..e17d64fb8734 100644 --- a/code/modules/spells/spell_types/jaunt/bloodcrawl.dm +++ b/code/modules/spells/spell_types/jaunt/bloodcrawl.dm @@ -83,10 +83,10 @@ var/turf/jaunt_turf = get_turf(blood) // Begin the jaunt - jaunter.notransform = TRUE + ADD_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) var/obj/effect/dummy/phased_mob/holder = enter_jaunt(jaunter, jaunt_turf) if(!holder) - jaunter.notransform = FALSE + REMOVE_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) return FALSE RegisterSignal(holder, COMSIG_MOVABLE_MOVED, PROC_REF(update_status_on_signal)) @@ -104,7 +104,7 @@ playsound(jaunt_turf, 'sound/magic/enter_blood.ogg', 50, TRUE, -1) jaunter.extinguish_mob() - jaunter.notransform = FALSE + REMOVE_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) return TRUE /** @@ -113,7 +113,7 @@ */ /datum/action/cooldown/spell/jaunt/bloodcrawl/proc/try_exit_jaunt(obj/effect/decal/cleanable/blood, mob/living/jaunter, forced = FALSE) if(!forced) - if(jaunter.notransform) + if(HAS_TRAIT(jaunter, TRAIT_NO_TRANSFORM)) to_chat(jaunter, span_warning("You cannot exit yet!!")) return FALSE @@ -196,9 +196,9 @@ blind_message = span_notice("You hear a splash."), ) - jaunter.notransform = TRUE + ADD_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) consume_victim(victim, jaunter) - jaunter.notransform = FALSE + REMOVE_TRAIT(jaunter, TRAIT_NO_TRANSFORM, REF(src)) return TRUE diff --git a/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm b/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm index b4414c99796d..43e1f9036ee4 100644 --- a/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm +++ b/code/modules/spells/spell_types/jaunt/ethereal_jaunt.dm @@ -49,9 +49,9 @@ /datum/action/cooldown/spell/jaunt/ethereal_jaunt/proc/do_jaunt(mob/living/cast_on) // Makes sure they don't die or get jostled or something during the jaunt entry // Honestly probably not necessary anymore, but better safe than sorry - cast_on.notransform = TRUE + ADD_TRAIT(cast_on, TRAIT_NO_TRANSFORM, REF(src)) var/obj/effect/dummy/phased_mob/holder = enter_jaunt(cast_on) - cast_on.notransform = FALSE + REMOVE_TRAIT(cast_on, TRAIT_NO_TRANSFORM, REF(src)) if(!holder) CRASH("[type] attempted do_jaunt but failed to create a jaunt holder via enter_jaunt.") @@ -167,9 +167,10 @@ /datum/action/cooldown/spell/jaunt/ethereal_jaunt/proc/end_jaunt(mob/living/cast_on, obj/effect/dummy/phased_mob/spell_jaunt/holder, turf/final_point) if(QDELETED(cast_on) || QDELETED(holder) || QDELETED(src)) return - cast_on.notransform = TRUE + + ADD_TRAIT(cast_on, TRAIT_NO_TRANSFORM, REF(src)) exit_jaunt(cast_on) - cast_on.notransform = FALSE + REMOVE_TRAIT(cast_on, TRAIT_NO_TRANSFORM, REF(src)) REMOVE_TRAIT(cast_on, TRAIT_IMMOBILIZED, REF(src)) diff --git a/code/modules/spells/spell_types/pointed/_pointed.dm b/code/modules/spells/spell_types/pointed/_pointed.dm index b18669d6f9ef..976e18e2731e 100644 --- a/code/modules/spells/spell_types/pointed/_pointed.dm +++ b/code/modules/spells/spell_types/pointed/_pointed.dm @@ -64,17 +64,17 @@ build_all_button_icons() return TRUE -/datum/action/cooldown/spell/pointed/InterceptClickOn(mob/living/caller, params, atom/click_target) +/datum/action/cooldown/spell/pointed/InterceptClickOn(mob/living/caller, params, atom/target) var/atom/aim_assist_target - if(aim_assist && isturf(click_target)) + if(aim_assist && isturf(target)) // Find any human in the list. We aren't picky, it's aim assist after all - aim_assist_target = locate(/mob/living/carbon/human) in click_target + aim_assist_target = locate(/mob/living/carbon/human) in target if(!aim_assist_target) // If we didn't find a human, we settle for any living at all - aim_assist_target = locate(/mob/living) in click_target + aim_assist_target = locate(/mob/living) in target - return ..(caller, params, aim_assist_target || click_target) + return ..(caller, params, aim_assist_target || target) /datum/action/cooldown/spell/pointed/is_valid_target(atom/cast_on) if(cast_on == owner) diff --git a/code/modules/spells/spell_types/pointed/mind_transfer.dm b/code/modules/spells/spell_types/pointed/mind_transfer.dm index 6c73f664fbfd..f0e0a9adb2c5 100644 --- a/code/modules/spells/spell_types/pointed/mind_transfer.dm +++ b/code/modules/spells/spell_types/pointed/mind_transfer.dm @@ -59,7 +59,7 @@ to_chat(owner, span_warning("This creature is too [pick("powerful", "strange", "arcane", "obscene")] to control!")) return FALSE if(isguardian(cast_on)) - var/mob/living/simple_animal/hostile/guardian/stand = cast_on + var/mob/living/basic/guardian/stand = cast_on if(stand.summoner && stand.summoner == owner) to_chat(owner, span_warning("Swapping minds with your own guardian would just put you back into your own head!")) return FALSE @@ -86,7 +86,7 @@ var/mob/living/to_swap = cast_on if(isguardian(cast_on)) - var/mob/living/simple_animal/hostile/guardian/stand = cast_on + var/mob/living/basic/guardian/stand = cast_on if(stand.summoner) to_swap = stand.summoner diff --git a/code/modules/spells/spell_types/pointed/swap.dm b/code/modules/spells/spell_types/pointed/swap.dm index 55e5a67c6250..904c2d36c6ee 100644 --- a/code/modules/spells/spell_types/pointed/swap.dm +++ b/code/modules/spells/spell_types/pointed/swap.dm @@ -35,27 +35,27 @@ return FALSE return TRUE -/datum/action/cooldown/spell/pointed/swap/InterceptClickOn(mob/living/caller, params, atom/click_target) +/datum/action/cooldown/spell/pointed/swap/InterceptClickOn(mob/living/caller, params, atom/target) if((caller.istate & ISTATE_SECONDARY)) if(!IsAvailable(feedback = TRUE)) return FALSE if(!target) return FALSE - if(!isliving(click_target) || isturf(click_target)) + if(!isliving(target) || isturf(target)) // Find any living being in the list. We aren't picky, it's aim assist after all - click_target = locate(/mob/living) in click_target - if(!click_target) + target = locate(/mob/living) in target + if(!target) to_chat(owner, span_warning("You can only select living beings as secondary target!")) return FALSE - if(click_target == owner) + if(target == owner) if(!isnull(second_target)) to_chat(owner, span_notice("You cancel your secondary swap target!")) second_target = null else to_chat(owner, span_warning("You have no secondary swap target!")) return FALSE - second_target = click_target - to_chat(owner, span_notice("You select [click_target.name] as a secondary swap target!")) + second_target = target + to_chat(owner, span_notice("You select [target.name] as a secondary swap target!")) return FALSE return ..() diff --git a/code/modules/spells/spell_types/self/rod_form.dm b/code/modules/spells/spell_types/self/rod_form.dm index fd9a52be412f..5336036cd2c5 100644 --- a/code/modules/spells/spell_types/self/rod_form.dm +++ b/code/modules/spells/spell_types/self/rod_form.dm @@ -138,9 +138,8 @@ our_wizard = WEAKREF(wizard) wizard.forceMove(src) - wizard.notransform = TRUE wizard.status_flags |= GODMODE - ADD_TRAIT(wizard, TRAIT_MAGICALLY_PHASED, REF(src)) + wizard.add_traits(list(TRAIT_MAGICALLY_PHASED, TRAIT_NO_TRANSFORM), REF(src)) /** * Eject our current wizard, removing them from the rod @@ -152,9 +151,8 @@ return wizard.status_flags &= ~GODMODE - wizard.notransform = FALSE + wizard.remove_traits(list(TRAIT_MAGICALLY_PHASED, TRAIT_NO_TRANSFORM), REF(src)) wizard.forceMove(get_turf(src)) our_wizard = null - REMOVE_TRAIT(wizard, TRAIT_MAGICALLY_PHASED, REF(src)) #undef BASE_WIZ_ROD_RANGE diff --git a/code/modules/spells/spell_types/shapeshift/_shape_status.dm b/code/modules/spells/spell_types/shapeshift/_shape_status.dm index 620a91bf58da..24d41b859a31 100644 --- a/code/modules/spells/spell_types/shapeshift/_shape_status.dm +++ b/code/modules/spells/spell_types/shapeshift/_shape_status.dm @@ -32,7 +32,7 @@ /datum/status_effect/shapechange_mob/on_apply() caster_mob.mind?.transfer_to(owner) caster_mob.forceMove(owner) - caster_mob.notransform = TRUE + ADD_TRAIT(caster_mob, TRAIT_NO_TRANSFORM, REF(src)) caster_mob.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_SHAPECHANGE_EFFECT) RegisterSignal(owner, COMSIG_LIVING_PRE_WABBAJACKED, PROC_REF(on_wabbajacked)) @@ -77,7 +77,7 @@ UnregisterSignal(caster_mob, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH)) caster_mob.forceMove(owner.loc) - caster_mob.notransform = FALSE + REMOVE_TRAIT(caster_mob, TRAIT_NO_TRANSFORM, REF(src)) caster_mob.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_SHAPECHANGE_EFFECT) owner.mind?.transfer_to(caster_mob) diff --git a/code/modules/spells/spell_types/shapeshift/shapechange.dm b/code/modules/spells/spell_types/shapeshift/shapechange.dm index bfe3ee0d91c9..d7ff71e0425d 100644 --- a/code/modules/spells/spell_types/shapeshift/shapechange.dm +++ b/code/modules/spells/spell_types/shapeshift/shapechange.dm @@ -11,10 +11,10 @@ spell_requirements = SPELL_REQUIRES_NO_ANTIMAGIC possible_shapes = list( + /mob/living/basic/carp/magic/chaos, + /mob/living/basic/construct/juggernaut/mystic, /mob/living/basic/mouse, /mob/living/basic/pet/dog/corgi, - /mob/living/basic/carp/magic/chaos, - /mob/living/simple_animal/bot/secbot/ed209, /mob/living/basic/spider/giant/viper/wizard, - /mob/living/simple_animal/hostile/construct/juggernaut/mystic, + /mob/living/simple_animal/bot/secbot/ed209, ) diff --git a/code/modules/spells/spell_types/touch/scream_for_me.dm b/code/modules/spells/spell_types/touch/scream_for_me.dm index 941885e75776..231b6927e504 100644 --- a/code/modules/spells/spell_types/touch/scream_for_me.dm +++ b/code/modules/spells/spell_types/touch/scream_for_me.dm @@ -21,7 +21,7 @@ span_userdanger("The spell bounces from [victim]'s skin back into your arm!"), ) var/obj/item/bodypart/to_wound = caster.get_holding_bodypart_of_item(hand) - to_wound.force_wound_upwards(/datum/wound/slash/critical) + caster.cause_wound_of_type_and_severity(WOUND_SLASH, to_wound, WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_CRITICAL) /datum/action/cooldown/spell/touch/scream_for_me/cast_on_hand_hit(obj/item/melee/touch_attack/hand, mob/living/victim, mob/living/carbon/caster) if(!ishuman(victim)) @@ -29,7 +29,7 @@ var/mob/living/carbon/human/human_victim = victim human_victim.emote("scream") for(var/obj/item/bodypart/to_wound as anything in human_victim.bodyparts) - to_wound.force_wound_upwards(/datum/wound/slash/critical) + human_victim.cause_wound_of_type_and_severity(WOUND_SLASH, to_wound, WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_CRITICAL) return TRUE /obj/item/melee/touch_attack/scream_for_me diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 2eec7eb2285b..1ce9e26203d8 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -1,3 +1,6 @@ +#define AUGGED_LIMB_EMP_BRUTE_DAMAGE 3 +#define AUGGED_LIMB_EMP_BURN_DAMAGE 2 + /obj/item/bodypart name = "limb" desc = "Why is it detached..." @@ -22,14 +25,15 @@ /// DO NOT MODIFY DIRECTLY. Use set_owner() var/mob/living/carbon/owner + /// If this limb can be scarred. + var/scarrable = TRUE + /** * A bitfield of biological states, exclusively used to determine which wounds this limb will get, * as well as how easily it will happen. - * Set to BIO_FLESH_BONE because most species have both flesh and bone in their limbs. - * - * This currently has absolutely no meaning for robotic limbs. + * Set to BIO_STANDARD_UNJOINTED because most species have both flesh bone and blood in their limbs. */ - var/biological_state = BIO_FLESH_BONE + var/biological_state = BIO_STANDARD_UNJOINTED ///A bitfield of bodytypes for clothing, surgery, and misc information var/bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC ///Defines when a bodypart should not be changed. Example: BP_BLOCK_CHANGE_SPECIES prevents the limb from being overwritten on species gain @@ -88,11 +92,11 @@ ///Gradually increases while burning when at full damage, destroys the limb when at 100 var/cremation_progress = 0 - // Damage reduction variables for damage handled on the limb level. Handled after worn armor. - ///Amount subtracted from brute damage inflicted on the limb. - var/brute_reduction = 0 - ///Amount subtracted from burn damage inflicted on the limb. - var/burn_reduction = 0 + //Multiplicative damage modifiers + /// Brute damage gets multiplied by this on receive_damage() + var/brute_modifier = 1 + /// Burn damage gets multiplied by this on receive_damage() + var/burn_modifier = 1 //Coloring and proper item icon update var/skin_tone = "" @@ -178,6 +182,35 @@ var/list/bodypart_traits = list() /// The name of the trait source that the organ gives. Should not be altered during the events of gameplay, and will cause problems if it is. var/bodypart_trait_source = BODYPART_TRAIT + /// List of the above datums which have actually been instantiated, managed automatically + var/list/feature_offsets = list() + + /// In the case we dont have dismemberable features, or literally cant get wounds, we will use this percent to determine when we can be dismembered. + /// Compared to our ABSOLUTE maximum. Stored in decimal; 0.8 = 80%. + var/hp_percent_to_dismemberable = 0.8 + /// If true, we will use [hp_percent_to_dismemberable] even if we are dismemberable via wounds. Useful for things with extreme wound resistance. + var/use_alternate_dismemberment_calc_even_if_mangleable = FALSE + /// If false, no wound that can be applied to us can mangle our exterior. Used for determining if we should use [hp_percent_to_dismemberable] instead of normal dismemberment. + var/any_existing_wound_can_mangle_our_exterior + /// If false, no wound that can be applied to us can mangle our interior. Used for determining if we should use [hp_percent_to_dismemberable] instead of normal dismemberment. + var/any_existing_wound_can_mangle_our_interior + +/obj/item/bodypart/apply_fantasy_bonuses(bonus) + . = ..() + unarmed_damage_low = modify_fantasy_variable("unarmed_damage_low", unarmed_damage_low, bonus, minimum = 1) + unarmed_damage_high = modify_fantasy_variable("unarmed_damage_high", unarmed_damage_high, bonus, minimum = 1) + brute_modifier = modify_fantasy_variable("brute_modifier", brute_modifier, bonus * 0.02, minimum = 0.7) + burn_modifier = modify_fantasy_variable("burn_modifier", burn_modifier, bonus * 0.02, minimum = 0.7) + wound_resistance = modify_fantasy_variable("wound_resistance", wound_resistance, bonus) + +/obj/item/bodypart/remove_fantasy_bonuses(bonus) + unarmed_damage_low = reset_fantasy_variable("unarmed_damage_low", unarmed_damage_low) + unarmed_damage_high = reset_fantasy_variable("unarmed_damage_high", unarmed_damage_high) + brute_modifier = reset_fantasy_variable("brute_modifier", brute_modifier) + burn_modifier = reset_fantasy_variable("burn_modifier", burn_modifier) + wound_resistance = reset_fantasy_variable("wound_resistance", wound_resistance) + return ..() + /obj/item/bodypart/Initialize(mapload) . = ..() @@ -403,7 +436,7 @@ //Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all. //Damage will not exceed max_damage using this proc //Cannot apply negative damage -/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, blocked = 0, updating_health = TRUE, required_bodytype = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null) +/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, blocked = 0, updating_health = TRUE, forced = FALSE, required_bodytype = null, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, damage_source) SHOULD_CALL_PARENT(TRUE) var/area/target_area = get_area(src.owner) if(target_area) @@ -413,16 +446,18 @@ var/hit_percent = (100-blocked)/100 if((!brute && !burn) || hit_percent <= 0) return FALSE - if(owner && (owner.status_flags & GODMODE)) - return FALSE //godmode - if(required_bodytype && !(bodytype & required_bodytype)) - return FALSE + if (!forced) + if(!isnull(owner)) + if (owner.status_flags & GODMODE) + return FALSE + if (SEND_SIGNAL(owner, COMSIG_CARBON_LIMB_DAMAGED, src, brute, burn) & COMPONENT_PREVENT_LIMB_DAMAGE) + return FALSE + if(required_bodytype && !(bodytype & required_bodytype)) + return FALSE var/dmg_multi = CONFIG_GET(number/damage_multiplier) * hit_percent - brute = round(max(brute * dmg_multi, 0),DAMAGE_PRECISION) - burn = round(max(burn * dmg_multi, 0),DAMAGE_PRECISION) - brute = max(0, brute - brute_reduction) - burn = max(0, burn - burn_reduction) + brute = round(max(brute * dmg_multi * brute_modifier, 0), DAMAGE_PRECISION) + burn = round(max(burn * dmg_multi * burn_modifier, 0), DAMAGE_PRECISION) if(!brute && !burn) return FALSE @@ -447,43 +482,42 @@ else if (sharpness & SHARP_POINTY) wounding_type = WOUND_PIERCE - if(owner) + if(owner) // i tried to modularize the below, but the modifications to wounding_dmg and wounding_type cant be extracted to a proc var/mangled_state = get_mangled_state() var/easy_dismember = HAS_TRAIT(owner, TRAIT_EASYDISMEMBER) // if we have easydismember, we don't reduce damage when redirecting damage to different types (slashing weapons on mangled/skinless limbs attack at 100% instead of 50%) - //Handling for bone only/flesh only(none right now)/flesh and bone targets - switch(biological_state) - // if we're fleshless, all cutting attacks go straight to the bone - if(BIO_BONE, BIO_INORGANIC) - if(wounding_type == WOUND_SLASH) - wounding_type = WOUND_BLUNT - wounding_dmg *= (easy_dismember ? 1 : 0.6) - else if(wounding_type == WOUND_PIERCE) - wounding_type = WOUND_BLUNT - wounding_dmg *= (easy_dismember ? 1 : 0.75) - if(((mangled_state & BODYPART_MANGLED_BONE) || biological_state == BIO_INORGANIC) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)) - return - // note that there's no handling for BIO_FLESH since we don't have any that are that right now (slimepeople maybe someday) - // standard humanoids - if(BIO_FLESH_BONE) - // if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate - // So a big sharp weapon is still all you need to destroy a limb - if((mangled_state & BODYPART_MANGLED_FLESH) && !(mangled_state & BODYPART_MANGLED_BONE) && sharpness) - playsound(src, "sound/effects/wounds/crackandbleed.ogg", 100) - if(wounding_type == WOUND_SLASH && !easy_dismember) - wounding_dmg *= 0.6 // edged weapons pass along 60% of their wounding damage to the bone since the power is spread out over a larger area - if(wounding_type == WOUND_PIERCE && !easy_dismember) - wounding_dmg *= 0.75 // piercing weapons pass along 75% of their wounding damage to the bone since it's more concentrated - wounding_type = WOUND_BLUNT - else if((mangled_state & BODYPART_MANGLED_FLESH) && (mangled_state & BODYPART_MANGLED_BONE) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)) - return + var/bio_status = get_bio_state_status() + var/has_exterior = ((bio_status & ANATOMY_EXTERIOR)) + var/has_interior = ((bio_status & ANATOMY_INTERIOR)) + + var/exterior_ready_to_dismember = (!has_exterior || ((mangled_state & BODYPART_MANGLED_EXTERIOR))) + + // if we're bone only, all cutting attacks go straight to the bone + if(!has_exterior && has_interior) + if(wounding_type == WOUND_SLASH) + wounding_type = WOUND_BLUNT + wounding_dmg *= (easy_dismember ? 1 : 0.6) + else if(wounding_type == WOUND_PIERCE) + wounding_type = WOUND_BLUNT + wounding_dmg *= (easy_dismember ? 1 : 0.75) + else + // if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate + // So a big sharp weapon is still all you need to destroy a limb + if(has_interior && exterior_ready_to_dismember && !(mangled_state & BODYPART_MANGLED_INTERIOR) && sharpness) + if(wounding_type == WOUND_SLASH && !easy_dismember) + wounding_dmg *= 0.6 // edged weapons pass along 60% of their wounding damage to the bone since the power is spread out over a larger area + if(wounding_type == WOUND_PIERCE && !easy_dismember) + wounding_dmg *= 0.75 // piercing weapons pass along 75% of their wounding damage to the bone since it's more concentrated + wounding_type = WOUND_BLUNT + if ((dismemberable_by_wound() || dismemberable_by_total_damage()) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)) + return // now we have our wounding_type and are ready to carry on with wounds and dealing the actual damage if(wounding_dmg >= WOUND_MINIMUM_DAMAGE && wound_bonus != CANT_WOUND) check_wounding(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus, attack_direction) for(var/datum/wound/iter_wound as anything in wounds) - iter_wound.receive_damage(wounding_type, wounding_dmg, wound_bonus) + iter_wound.receive_damage(wounding_type, wounding_dmg, wound_bonus, damage_source) /* // END WOUND HANDLING @@ -510,6 +544,83 @@ owner.updatehealth() return update_bodypart_damage_state() || . +/// Returns a bitflag using ANATOMY_EXTERIOR or ANATOMY_INTERIOR. Used to determine if we as a whole have a interior or exterior biostate, or both. +/obj/item/bodypart/proc/get_bio_state_status() + SHOULD_BE_PURE(TRUE) + + var/bio_status = NONE + + for (var/state as anything in GLOB.bio_state_anatomy) + var/flag = text2num(state) + if (!(biological_state & flag)) + continue + + var/value = GLOB.bio_state_anatomy[state] + if (value & ANATOMY_EXTERIOR) + bio_status |= ANATOMY_EXTERIOR + if (value & ANATOMY_INTERIOR) + bio_status |= ANATOMY_INTERIOR + + if ((bio_status & ANATOMY_EXTERIOR_AND_INTERIOR) == ANATOMY_EXTERIOR_AND_INTERIOR) + break + + return bio_status + +/// Returns if our current mangling status allows us to be dismembered. Requires both no exterior/mangled exterior and no interior/mangled interior. +/obj/item/bodypart/proc/dismemberable_by_wound() + SHOULD_BE_PURE(TRUE) + + var/mangled_state = get_mangled_state() + + var/bio_status = get_bio_state_status() + + var/has_exterior = ((bio_status & ANATOMY_EXTERIOR)) + var/has_interior = ((bio_status & ANATOMY_INTERIOR)) + + var/exterior_ready_to_dismember = (!has_exterior || ((mangled_state & BODYPART_MANGLED_EXTERIOR))) + var/interior_ready_to_dismember = (!has_interior || ((mangled_state & BODYPART_MANGLED_INTERIOR))) + + return (exterior_ready_to_dismember && interior_ready_to_dismember) + +/// Returns TRUE if our total percent damage is more or equal to our dismemberable percentage, but FALSE if a wound can cause us to be dismembered. +/obj/item/bodypart/proc/dismemberable_by_total_damage() + + update_wound_theory() + + var/bio_status = get_bio_state_status() + + var/has_interior = ((bio_status & ANATOMY_INTERIOR)) + var/can_theoretically_be_dismembered_by_wound = (any_existing_wound_can_mangle_our_interior || (any_existing_wound_can_mangle_our_exterior && has_interior)) + + var/wound_dismemberable = dismemberable_by_wound() + var/ready_to_use_alternate_formula = (use_alternate_dismemberment_calc_even_if_mangleable || (!wound_dismemberable && !can_theoretically_be_dismembered_by_wound)) + + if (ready_to_use_alternate_formula) + var/percent_to_total_max = (get_damage() / max_damage) + if (percent_to_total_max >= hp_percent_to_dismemberable) + return TRUE + + return FALSE + +/// Updates our "can be theoretically dismembered by wounds" variables by iterating through all wound static data. +/obj/item/bodypart/proc/update_wound_theory() + // We put this here so we dont increase init time by doing this all at once on initialization + // Effectively, we "lazy load" + if (isnull(any_existing_wound_can_mangle_our_interior) || isnull(any_existing_wound_can_mangle_our_exterior)) + any_existing_wound_can_mangle_our_interior = FALSE + any_existing_wound_can_mangle_our_exterior = FALSE + for (var/datum/wound/wound_type as anything in GLOB.all_wound_pregen_data) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[wound_type] + if (!pregen_data.can_be_applied_to(src, random_roll = TRUE)) // we only consider randoms because non-randoms are usually really specific + continue + if (initial(pregen_data.wound_path_to_generate.wound_flags) & MANGLES_EXTERIOR) + any_existing_wound_can_mangle_our_exterior = TRUE + if (initial(pregen_data.wound_path_to_generate.wound_flags) & MANGLES_INTERIOR) + any_existing_wound_can_mangle_our_interior = TRUE + + if (any_existing_wound_can_mangle_our_interior && any_existing_wound_can_mangle_our_exterior) + break + //Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all. //Damage cannot go below zero. //Cannot remove negative damage (i.e. apply damage) @@ -772,12 +883,12 @@ species_flags_list = owner_species.species_traits limb_gender = (human_owner.physique == MALE) ? "m" : "f" - if(owner_species.use_skintones || owner_species.use_fur) + if(owner_species.use_skintones) skin_tone = human_owner.skin_tone else skin_tone = "" - if(((MUTCOLORS in owner_species.species_traits) || (DYNCOLORS in owner_species.species_traits))) //Ethereal code. Motherfuckers. + if(((MUTCOLORS in owner_species.species_traits) || (DYNCOLORS in owner_species.species_traits) || (SPECIES_FUR in owner_species.species_traits))) //Ethereal code. Motherfuckers. if(owner_species.fixed_mut_color) species_color = owner_species.fixed_mut_color else @@ -987,7 +1098,7 @@ if(!owner) return - if(HAS_TRAIT(owner, TRAIT_NOBLOOD) || (!IS_ORGANIC_LIMB(src) && !HAS_TRAIT(src.owner, TRAIT_ROBOT_CAN_BLEED))) + if(!can_bleed()) if(cached_bleed_rate != old_bleed_rate) update_part_wound_overlay() return @@ -1002,9 +1113,6 @@ for(var/datum/wound/iter_wound as anything in wounds) cached_bleed_rate += iter_wound.blood_flow - if(!cached_bleed_rate) - QDEL_NULL(grasped_by) - // Our bleed overlay is based directly off bleed_rate, so go aheead and update that would you? if(cached_bleed_rate != old_bleed_rate) update_part_wound_overlay() @@ -1028,7 +1136,7 @@ /obj/item/bodypart/proc/update_part_wound_overlay() if(!owner) return FALSE - if(HAS_TRAIT(owner, TRAIT_NOBLOOD) || !IS_ORGANIC_LIMB(src)) + if(!can_bleed()) if(bleed_overlay_icon) bleed_overlay_icon = null owner.update_wound_overlays() @@ -1061,6 +1169,11 @@ #undef BLEED_OVERLAY_MED #undef BLEED_OVERLAY_GUSH +/obj/item/bodypart/proc/can_bleed() + SHOULD_BE_PURE(TRUE) + + return ((biological_state & BIO_BLOODED) && (!owner || !HAS_TRAIT(owner, TRAIT_NOBLOOD))) + /** * apply_gauze() is used to- well, apply gauze to a bodypart * @@ -1146,3 +1259,47 @@ owner.update_body_parts() else update_icon_dropped() + +/obj/item/bodypart/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_WIRES || !IS_ROBOTIC_LIMB(src)) + return FALSE + owner.visible_message(span_danger("[owner]'s [src.name] seems to malfunction!")) + + // with defines at the time of writing, this is 3 brute and 2 burn + // 3 + 2 = 5, with 6 limbs thats 30, on a heavy 60 + // 60 * 0.8 = 48 + var/time_needed = 10 SECONDS + var/brute_damage = AUGGED_LIMB_EMP_BRUTE_DAMAGE + var/burn_damage = AUGGED_LIMB_EMP_BURN_DAMAGE + if(severity == EMP_HEAVY) + time_needed *= 2 + brute_damage *= 2 + burn_damage *= 2 + + receive_damage(brute_damage, burn_damage) + do_sparks(number = 1, cardinal_only = FALSE, source = owner) + ADD_TRAIT(src, TRAIT_PARALYSIS, EMP_TRAIT) + addtimer(CALLBACK(src, PROC_REF(un_paralyze)), time_needed) + return TRUE + +/obj/item/bodypart/proc/un_paralyze() + REMOVE_TRAITS_IN(src, EMP_TRAIT) + +/// Returns the generic description of our BIO_EXTERNAL feature(s), prioritizing certain ones over others. Returns error on failure. +/obj/item/bodypart/proc/get_external_description() + if (biological_state & BIO_FLESH) + return "flesh" + if (biological_state & BIO_WIRED) + return "wiring" + + return "error" + +/// Returns the generic description of our BIO_INTERNAL feature(s), prioritizing certain ones over others. Returns error on failure. +/obj/item/bodypart/proc/get_internal_description() + if (biological_state & BIO_BONE) + return "bone" + if (biological_state & BIO_METAL) + return "metal" + + return "error" diff --git a/code/modules/surgery/bodyparts/digitigrade.dm b/code/modules/surgery/bodyparts/digitigrade.dm new file mode 100644 index 000000000000..1d297c33fcb8 --- /dev/null +++ b/code/modules/surgery/bodyparts/digitigrade.dm @@ -0,0 +1,42 @@ +/obj/item/bodypart/leg/proc/set_digitigrade(is_digi) + if(is_digi) + if(!can_be_digitigrade) + return FALSE + + bodytype |= BODYTYPE_DIGITIGRADE + . = TRUE + else + if(!(bodytype & BODYTYPE_DIGITIGRADE)) + return FALSE + + bodytype &= ~BODYTYPE_DIGITIGRADE + if(old_limb_id) + limb_id = old_limb_id + . = TRUE + + if(.) + if(owner) + synchronize_bodytypes(owner) + owner.update_body_parts() + else + update_icon_dropped() + + +/obj/item/bodypart/leg/update_limb(dropping_limb, is_creating) + . = ..() + if(!ishuman(owner) || !(bodytype & BODYTYPE_DIGITIGRADE)) + return + + var/mob/living/carbon/human/human_owner = owner + var/uniform_compatible = FALSE + var/suit_compatible = FALSE + if(!(human_owner.w_uniform) || (human_owner.w_uniform.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON))) //Checks uniform compatibility + uniform_compatible = TRUE + if((!human_owner.wear_suit) || (human_owner.wear_suit.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON)) || !(human_owner.wear_suit.body_parts_covered & LEGS)) //Checks suit compatability + suit_compatible = TRUE + + if((uniform_compatible && suit_compatible) || (suit_compatible && human_owner.wear_suit?.flags_inv & HIDEJUMPSUIT)) //If the uniform is hidden, it doesnt matter if its compatible + old_limb_id = limb_id + limb_id = digitigrade_id + else + limb_id = old_limb_id diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index c64204193ea0..58eb7c8fbc0d 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -1,11 +1,11 @@ /obj/item/bodypart/proc/can_dismember(obj/item/item) - if(bodypart_flags & BODYPART_UNREMOVABLE) + if(bodypart_flags & BODYPART_UNREMOVABLE || (owner && HAS_TRAIT(owner, TRAIT_NODISMEMBER))) return FALSE return TRUE ///Remove target limb from it's owner, with side effects. -/obj/item/bodypart/proc/dismember(dam_type = BRUTE, silent=TRUE) +/obj/item/bodypart/proc/dismember(dam_type = BRUTE, silent=TRUE, wounding_type) if(!owner || (bodypart_flags & BODYPART_UNREMOVABLE)) return FALSE var/mob/living/carbon/limb_owner = owner @@ -22,11 +22,15 @@ playsound(get_turf(limb_owner), 'sound/effects/dismember.ogg', 80, TRUE) limb_owner.add_mood_event("dismembered", /datum/mood_event/dismembered) limb_owner.add_mob_memory(/datum/memory/was_dismembered, lost_limb = src) + + if (wounding_type) + LAZYSET(limb_owner.body_zone_dismembered_by, body_zone, wounding_type) + drop_limb() limb_owner.update_equipment_speed_mods() // Update in case speed affecting item unequipped by dismemberment var/turf/owner_location = limb_owner.loc - if(istype(owner_location)) + if(wounding_type != WOUND_BURN && istype(owner_location) && can_bleed()) limb_owner.add_splatter_floor(owner_location) if(QDELETED(src)) //Could have dropped into lava/explosion/chasm/whatever @@ -34,8 +38,9 @@ if(dam_type == BURN) burn() return TRUE - add_mob_blood(limb_owner) - limb_owner.bleed(rand(20, 40)) + if (can_bleed()) + add_mob_blood(limb_owner) + limb_owner.bleed(rand(20, 40)) var/direction = pick(GLOB.cardinals) var/t_range = rand(2,max(throw_range/2, 2)) var/turf/target_turf = get_turf(src) @@ -47,10 +52,10 @@ if(new_turf.density) break throw_at(target_turf, throw_range, throw_speed) - return TRUE + return TRUE -/obj/item/bodypart/chest/dismember() +/obj/item/bodypart/chest/dismember(dam_type = BRUTE, silent=TRUE, wounding_type) if(!owner) return FALSE var/mob/living/carbon/chest_owner = owner @@ -59,7 +64,7 @@ if(HAS_TRAIT(chest_owner, TRAIT_NODISMEMBER)) return FALSE . = list() - if(isturf(chest_owner.loc)) + if(wounding_type != WOUND_BURN && isturf(chest_owner.loc) && can_bleed()) chest_owner.add_splatter_floor(chest_owner.loc) playsound(get_turf(chest_owner), 'sound/misc/splort.ogg', 80, TRUE) for(var/obj/item/organ/organ as anything in chest_owner.organs) @@ -81,8 +86,6 @@ . += cavity_item cavity_item = null - - ///limb removal. The "special" argument is used for swapping a limb with a new one without the effects of losing a limb kicking in. /obj/item/bodypart/proc/drop_limb(special, dismembered) if(!owner) @@ -160,16 +163,16 @@ * Dismemberment for flesh and bone requires the victim to have the skin on their bodypart destroyed (either a critical cut or piercing wound), and at least a hairline fracture * (severe bone), at which point we can start rolling for dismembering. The attack must also deal at least 10 damage, and must be a brute attack of some kind (sorry for now, cakehat, maybe later) * - * Returns: BODYPART_MANGLED_NONE if we're fine, BODYPART_MANGLED_FLESH if our skin is broken, BODYPART_MANGLED_BONE if our bone is broken, or BODYPART_MANGLED_BOTH if both are broken and we're up for dismembering + * Returns: BODYPART_MANGLED_NONE if we're fine, BODYPART_MANGLED_EXTERIOR if our skin is broken, BODYPART_MANGLED_INTERIOR if our bone is broken, or BODYPART_MANGLED_BOTH if both are broken and we're up for dismembering */ /obj/item/bodypart/proc/get_mangled_state() . = BODYPART_MANGLED_NONE for(var/datum/wound/iter_wound as anything in wounds) - if((iter_wound.wound_flags & MANGLES_BONE)) - . |= BODYPART_MANGLED_BONE - if((iter_wound.wound_flags & MANGLES_FLESH)) - . |= BODYPART_MANGLED_FLESH + if((iter_wound.wound_flags & MANGLES_INTERIOR)) + . |= BODYPART_MANGLED_INTERIOR + if((iter_wound.wound_flags & MANGLES_EXTERIOR)) + . |= BODYPART_MANGLED_EXTERIOR /** * try_dismember() is used, once we've confirmed that a flesh and bone bodypart has both the skin and bone mangled, to actually roll for it @@ -185,14 +188,17 @@ * * bare_wound_bonus: ditto above */ /obj/item/bodypart/proc/try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus) + if (!can_dismember()) + return + if(wounding_dmg < DISMEMBER_MINIMUM_DAMAGE) return var/base_chance = wounding_dmg base_chance += (get_damage() / max_damage * 50) // how much damage we dealt with this blow, + 50% of the damage percentage we already had on this bodypart - if(locate(/datum/wound/blunt/critical) in wounds) // we only require a severe bone break, but if there's a critical bone break, we'll add 15% more - base_chance += 15 + for (var/datum/wound/iterated_wound as anything in wounds) + base_chance += iterated_wound.get_dismember_chance_bonus(base_chance) if(prob(base_chance)) var/datum/wound/loss/dismembering = new @@ -340,6 +346,8 @@ hand.update_appearance() new_limb_owner.update_worn_gloves() + LAZYREMOVE(new_limb_owner.body_zone_dismembered_by, body_zone) + if(special) //non conventional limb attachment for(var/datum/surgery/attach_surgery as anything in new_limb_owner.surgeries) //if we had an ongoing surgery to attach a new limb, we stop it. var/surgery_zone = check_zone(attach_surgery.location) @@ -443,12 +451,15 @@ /mob/living/carbon/proc/regenerate_limbs(list/excluded_zones = list()) SEND_SIGNAL(src, COMSIG_CARBON_REGENERATE_LIMBS, excluded_zones) var/list/zone_list = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) + + var/list/dismembered_by_copy = body_zone_dismembered_by?.Copy() + if(length(excluded_zones)) zone_list -= excluded_zones for(var/limb_zone in zone_list) - regenerate_limb(limb_zone) + regenerate_limb(limb_zone, dismembered_by_copy) -/mob/living/carbon/proc/regenerate_limb(limb_zone) +/mob/living/carbon/proc/regenerate_limb(limb_zone, list/dismembered_by_copy = body_zone_dismembered_by?.Copy()) var/obj/item/bodypart/limb if(get_bodypart(limb_zone)) return FALSE @@ -458,9 +469,16 @@ qdel(limb) return FALSE limb.update_limb(is_creating = TRUE) - var/datum/scar/scaries = new - var/datum/wound/loss/phantom_loss = new // stolen valor, really - scaries.generate(limb, phantom_loss) + if (LAZYLEN(dismembered_by_copy)) + var/datum/scar/scaries = new + var/datum/wound/loss/phantom_loss = new // stolen valor, really + phantom_loss.loss_wounding_type = dismembered_by_copy?[limb_zone] + if (phantom_loss.loss_wounding_type) + scaries.generate(limb, phantom_loss) + LAZYREMOVE(dismembered_by_copy, limb_zone) // in case we're using a passed list + else + qdel(scaries) + qdel(phantom_loss) //Copied from /datum/species/proc/on_species_gain() for(var/obj/item/organ/external/organ_path as anything in dna.species.external_organs) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 57001668ec8b..5aeb7363ddf3 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -174,15 +174,12 @@ /obj/item/bodypart/head/update_limb(dropping_limb, is_creating) . = ..() - - real_name = owner.real_name - if(HAS_TRAIT(owner, TRAIT_HUSK)) - real_name = "Unknown" - hair_style = "Bald" - facial_hairstyle = "Shaved" - lip_style = null - stored_lipstick_trait = null - update_hair_and_lips() + if(!isnull(owner)) + if(HAS_TRAIT(owner, TRAIT_HUSK)) + real_name = "Unknown" + else + real_name = owner.real_name + update_hair_and_lips(dropping_limb, is_creating) ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index 89c7634cb5a9..f441643ba768 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -31,7 +31,7 @@ if(cavity_item) cavity_item.forceMove(drop_location()) cavity_item = null - ..() + return ..() /obj/item/bodypart/chest/monkey icon = 'icons/mob/species/monkey/bodyparts.dmi' @@ -88,6 +88,11 @@ unarmed_stun_threshold = 10 body_zone = BODY_ZONE_L_ARM + biological_state = BIO_STANDARD_JOINTED + +/obj/item/bodypart/arm/Destroy() + return ..() + /obj/item/bodypart/arm/left name = "left arm" desc = "Did you know that the word 'sinister' stems originally from the \ @@ -301,7 +306,7 @@ desc = "This item shouldn't exist. Talk about breaking a leg. Badum-Tss!" attack_verb_continuous = list("kicks", "stomps") attack_verb_simple = list("kick", "stomp") - bodytype = BODYTYPE_HUMANOID | BODYTYPE_MONKEY | BODYTYPE_ORGANIC + bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC max_damage = 50 body_damage_coeff = 0.75 can_be_disabled = TRUE @@ -312,6 +317,17 @@ unarmed_damage_high = 15 unarmed_stun_threshold = 10 + /// Can these legs be digitigrade? See digitigrade.dm + var/can_be_digitigrade = FALSE + ///Set limb_id to this when in "digi mode". MUST BE UNIQUE LIKE ALL LIMB IDS + var/digitigrade_id + /// Used solely by digitigrade limbs to remember what their old limb ID was. + var/old_limb_id + biological_state = BIO_STANDARD_JOINTED + +/obj/item/bodypart/leg/Destroy() + return ..() + /obj/item/bodypart/leg/left name = "left leg" desc = "Some athletes prefer to tie their left shoelaces first for good \ diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index e4663d271ed9..f0d40f495c75 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -26,8 +26,8 @@ change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 5 - burn_reduction = 4 + brute_modifier = 0.8 + burn_modifier = 0.8 light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG @@ -37,6 +37,8 @@ medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG + biological_state = (BIO_ROBOTIC|BIO_JOINTED) + damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) disabling_threshold_percentage = 1 @@ -56,8 +58,8 @@ change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 5 - burn_reduction = 4 + brute_modifier = 0.8 + burn_modifier = 0.8 disabling_threshold_percentage = 1 light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG @@ -68,6 +70,8 @@ medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG + biological_state = (BIO_ROBOTIC|BIO_JOINTED) + damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) /obj/item/bodypart/leg/left/robot @@ -86,8 +90,8 @@ change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 5 - burn_reduction = 4 + brute_modifier = 0.8 + burn_modifier = 0.8 disabling_threshold_percentage = 1 light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG @@ -98,6 +102,8 @@ medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG + biological_state = (BIO_ROBOTIC|BIO_JOINTED) + damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) /obj/item/bodypart/leg/right/robot @@ -116,8 +122,8 @@ change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 5 - burn_reduction = 4 + brute_modifier = 0.8 + burn_modifier = 0.8 disabling_threshold_percentage = 1 light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG @@ -128,6 +134,8 @@ medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG + biological_state = (BIO_ROBOTIC|BIO_JOINTED) + damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) /obj/item/bodypart/chest/robot @@ -145,8 +153,8 @@ change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 5 - burn_reduction = 4 + brute_modifier = 0.8 + burn_modifier = 0.8 light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG @@ -156,6 +164,8 @@ medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG + biological_state = (BIO_ROBOTIC) + damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) var/wired = FALSE @@ -257,8 +267,8 @@ change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 5 - burn_reduction = 4 + brute_modifier = 0.8 + burn_modifier = 0.8 light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG @@ -268,6 +278,8 @@ medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG + biological_state = (BIO_ROBOTIC) + damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) var/obj/item/assembly/flash/handheld/flash1 = null @@ -347,43 +359,56 @@ +// Prosthetics - Cheap, mediocre, and worse than organic limbs +// The fact they dont have a internal biotype means theyre a lot weaker defensively, +// since they skip slash and go right to blunt +// They are VERY easy to delimb as a result +// HP is also reduced just in case this isnt enough /obj/item/bodypart/arm/left/robot/surplus name = "surplus prosthetic left arm" desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing." icon_static = 'icons/mob/augmentation/surplus_augments.dmi' icon = 'icons/mob/augmentation/surplus_augments.dmi' - brute_reduction = 0 - burn_reduction = 0 + burn_modifier = 1 + brute_modifier = 1 max_damage = 20 + biological_state = (BIO_METAL|BIO_JOINTED) + /obj/item/bodypart/arm/right/robot/surplus name = "surplus prosthetic right arm" desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing." icon_static = 'icons/mob/augmentation/surplus_augments.dmi' icon = 'icons/mob/augmentation/surplus_augments.dmi' - brute_reduction = 0 - burn_reduction = 0 + burn_modifier = 1 + brute_modifier = 1 max_damage = 20 + biological_state = (BIO_METAL|BIO_JOINTED) + /obj/item/bodypart/leg/left/robot/surplus name = "surplus prosthetic left leg" desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing." icon_static = 'icons/mob/augmentation/surplus_augments.dmi' icon = 'icons/mob/augmentation/surplus_augments.dmi' - brute_reduction = 0 - burn_reduction = 0 + brute_modifier = 1 + burn_modifier = 1 max_damage = 20 + biological_state = (BIO_METAL|BIO_JOINTED) + /obj/item/bodypart/leg/right/robot/surplus name = "surplus prosthetic right leg" desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing." icon_static = 'icons/mob/augmentation/surplus_augments.dmi' icon = 'icons/mob/augmentation/surplus_augments.dmi' - brute_reduction = 0 - burn_reduction = 0 + brute_modifier = 1 + burn_modifier = 1 max_damage = 20 + biological_state = (BIO_METAL|BIO_JOINTED) + #undef ROBOTIC_LIGHT_BRUTE_MSG #undef ROBOTIC_MEDIUM_BRUTE_MSG #undef ROBOTIC_HEAVY_BRUTE_MSG diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm index 1c24a849e39b..233afcd9b19b 100644 --- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm @@ -6,7 +6,7 @@ /obj/item/bodypart/chest/lizard icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' limb_id = SPECIES_LIZARD - is_dimorphic = TRUE + is_dimorphic = FALSE /obj/item/bodypart/arm/left/lizard icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' @@ -33,59 +33,11 @@ /obj/item/bodypart/leg/left/lizard icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' limb_id = SPECIES_LIZARD + can_be_digitigrade = TRUE + digitigrade_id = "digitigrade" /obj/item/bodypart/leg/right/lizard icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' limb_id = SPECIES_LIZARD - -/obj/item/bodypart/leg/left/digitigrade - icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' - limb_id = BODYPART_ID_DIGITIGRADE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE - -/obj/item/bodypart/leg/left/digitigrade/update_limb(dropping_limb = FALSE, is_creating = FALSE) - . = ..() - if(ishuman(owner)) - var/mob/living/carbon/human/human_owner = owner - var/obj/item/clothing/shoes/worn_shoes = human_owner.get_item_by_slot(ITEM_SLOT_FEET) - var/uniform_compatible = FALSE - var/suit_compatible = FALSE - var/shoes_compatible = FALSE - if(!(human_owner.w_uniform) || (human_owner.w_uniform.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON))) //Checks uniform compatibility - uniform_compatible = TRUE - if((!human_owner.wear_suit) || (human_owner.wear_suit.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON)) || !(human_owner.wear_suit.body_parts_covered & LEGS)) //Checks suit compatability - suit_compatible = TRUE - if((worn_shoes == null) || (worn_shoes.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON))) - shoes_compatible = TRUE - - if((uniform_compatible && suit_compatible && shoes_compatible) || (suit_compatible && shoes_compatible && human_owner.wear_suit?.flags_inv & HIDEJUMPSUIT)) //If the uniform is hidden, it doesnt matter if its compatible - limb_id = BODYPART_ID_DIGITIGRADE - - else - limb_id = SPECIES_LIZARD - -/obj/item/bodypart/leg/right/digitigrade - icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' - limb_id = BODYPART_ID_DIGITIGRADE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE - -/obj/item/bodypart/leg/right/digitigrade/update_limb(dropping_limb = FALSE, is_creating = FALSE) - . = ..() - if(ishuman(owner)) - var/mob/living/carbon/human/human_owner = owner - var/obj/item/clothing/shoes/worn_shoes = human_owner.get_item_by_slot(ITEM_SLOT_FEET) - var/uniform_compatible = FALSE - var/suit_compatible = FALSE - var/shoes_compatible = FALSE - if(!(human_owner.w_uniform) || (human_owner.w_uniform.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON))) //Checks uniform compatibility - uniform_compatible = TRUE - if((!human_owner.wear_suit) || (human_owner.wear_suit.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON)) || !(human_owner.wear_suit.body_parts_covered & LEGS)) //Checks suit compatability - suit_compatible = TRUE - if((worn_shoes == null) || (worn_shoes.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON))) - shoes_compatible = TRUE - - if((uniform_compatible && suit_compatible && shoes_compatible) || (suit_compatible && shoes_compatible && human_owner.wear_suit?.flags_inv & HIDEJUMPSUIT)) //If the uniform is hidden, it doesnt matter if its compatible - limb_id = BODYPART_ID_DIGITIGRADE - - else - limb_id = SPECIES_LIZARD + can_be_digitigrade = TRUE + digitigrade_id = "digitigrade" diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm index 491daa46cba8..0d156b2a707c 100644 --- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm @@ -28,124 +28,118 @@ ///ABDUCTOR /obj/item/bodypart/head/abductor - biological_state = BIO_INORGANIC //i have no fucking clue why these mfs get no wounds but SURE limb_id = SPECIES_ABDUCTOR is_dimorphic = FALSE should_draw_greyscale = FALSE /obj/item/bodypart/chest/abductor - biological_state = BIO_INORGANIC limb_id = SPECIES_ABDUCTOR is_dimorphic = FALSE should_draw_greyscale = FALSE /obj/item/bodypart/arm/left/abductor - biological_state = BIO_INORGANIC limb_id = SPECIES_ABDUCTOR should_draw_greyscale = FALSE bodypart_traits = list(TRAIT_CHUNKYFINGERS) /obj/item/bodypart/arm/right/abductor - biological_state = BIO_INORGANIC limb_id = SPECIES_ABDUCTOR should_draw_greyscale = FALSE bodypart_traits = list(TRAIT_CHUNKYFINGERS) /obj/item/bodypart/leg/left/abductor - biological_state = BIO_INORGANIC limb_id = SPECIES_ABDUCTOR should_draw_greyscale = FALSE /obj/item/bodypart/leg/right/abductor - biological_state = BIO_INORGANIC limb_id = SPECIES_ABDUCTOR should_draw_greyscale = FALSE ///JELLY /obj/item/bodypart/head/jelly - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED) limb_id = SPECIES_JELLYPERSON is_dimorphic = TRUE dmg_overlay_type = null /obj/item/bodypart/chest/jelly - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED) limb_id = SPECIES_JELLYPERSON is_dimorphic = TRUE dmg_overlay_type = null /obj/item/bodypart/arm/left/jelly - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_JELLYPERSON dmg_overlay_type = null /obj/item/bodypart/arm/right/jelly - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_JELLYPERSON dmg_overlay_type = null /obj/item/bodypart/leg/left/jelly - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_JELLYPERSON dmg_overlay_type = null /obj/item/bodypart/leg/right/jelly - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_JELLYPERSON dmg_overlay_type = null ///SLIME /obj/item/bodypart/head/slime - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED) limb_id = SPECIES_SLIMEPERSON is_dimorphic = FALSE /obj/item/bodypart/chest/slime - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED) limb_id = SPECIES_SLIMEPERSON is_dimorphic = TRUE /obj/item/bodypart/arm/left/slime - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_SLIMEPERSON /obj/item/bodypart/arm/right/slime - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_SLIMEPERSON /obj/item/bodypart/leg/left/slime - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED) limb_id = SPECIES_SLIMEPERSON /obj/item/bodypart/leg/right/slime - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_SLIMEPERSON ///LUMINESCENT /obj/item/bodypart/head/luminescent - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED) limb_id = SPECIES_LUMINESCENT is_dimorphic = TRUE /obj/item/bodypart/chest/luminescent - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED) limb_id = SPECIES_LUMINESCENT is_dimorphic = TRUE /obj/item/bodypart/arm/left/luminescent - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_LUMINESCENT /obj/item/bodypart/arm/right/luminescent - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_LUMINESCENT /obj/item/bodypart/leg/left/luminescent - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_LUMINESCENT /obj/item/bodypart/leg/right/luminescent - biological_state = BIO_INORGANIC + biological_state = (BIO_FLESH|BIO_BLOODED|BIO_JOINTED) limb_id = SPECIES_LUMINESCENT ///ZOMBIE @@ -233,34 +227,28 @@ ///SHADOW /obj/item/bodypart/head/shadow - biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW is_dimorphic = FALSE should_draw_greyscale = FALSE /obj/item/bodypart/chest/shadow - biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW is_dimorphic = FALSE should_draw_greyscale = FALSE /obj/item/bodypart/arm/left/shadow - biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW should_draw_greyscale = FALSE /obj/item/bodypart/arm/right/shadow - biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW should_draw_greyscale = FALSE /obj/item/bodypart/leg/left/shadow - biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW should_draw_greyscale = FALSE /obj/item/bodypart/leg/right/shadow - biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW should_draw_greyscale = FALSE @@ -286,25 +274,25 @@ dmg_overlay_type = null /obj/item/bodypart/arm/left/skeleton - biological_state = BIO_BONE + biological_state = (BIO_BONE|BIO_JOINTED) limb_id = SPECIES_SKELETON should_draw_greyscale = FALSE dmg_overlay_type = null /obj/item/bodypart/arm/right/skeleton - biological_state = BIO_BONE + biological_state = (BIO_BONE|BIO_JOINTED) limb_id = SPECIES_SKELETON should_draw_greyscale = FALSE dmg_overlay_type = null /obj/item/bodypart/leg/left/skeleton - biological_state = BIO_BONE + biological_state = (BIO_BONE|BIO_JOINTED) limb_id = SPECIES_SKELETON should_draw_greyscale = FALSE dmg_overlay_type = null /obj/item/bodypart/leg/right/skeleton - biological_state = BIO_BONE + biological_state = (BIO_BONE|BIO_JOINTED) limb_id = SPECIES_SKELETON should_draw_greyscale = FALSE dmg_overlay_type = null @@ -345,20 +333,24 @@ ///GOLEMS (i hate xenobio SO FUCKING MUCH) (from 2022: Yeah I fucking feel your pain brother) /obj/item/bodypart/head/golem - biological_state = BIO_INORGANIC + biological_state = BIO_BONE + bodytype = BODYTYPE_ORGANIC limb_id = SPECIES_GOLEM is_dimorphic = FALSE dmg_overlay_type = null /obj/item/bodypart/chest/golem - biological_state = BIO_INORGANIC + biological_state = BIO_BONE + acceptable_bodytype = BODYTYPE_ORGANIC + bodytype = BODYTYPE_ORGANIC limb_id = SPECIES_GOLEM is_dimorphic = TRUE dmg_overlay_type = null bodypart_traits = list(TRAIT_NO_JUMPSUIT) /obj/item/bodypart/arm/left/golem - biological_state = BIO_INORGANIC + biological_state = (BIO_BONE|BIO_JOINTED) + bodytype = BODYTYPE_ORGANIC limb_id = SPECIES_GOLEM dmg_overlay_type = null bodypart_traits = list(TRAIT_CHUNKYFINGERS) @@ -378,7 +370,8 @@ old_owner.RemoveComponentSource(REF(src), /datum/component/shovel_hands) /obj/item/bodypart/arm/right/golem - biological_state = BIO_INORGANIC + biological_state = (BIO_BONE|BIO_JOINTED) + bodytype = BODYTYPE_ORGANIC limb_id = SPECIES_GOLEM dmg_overlay_type = null bodypart_traits = list(TRAIT_CHUNKYFINGERS) @@ -398,7 +391,8 @@ old_owner.RemoveComponentSource(REF(src), /datum/component/shovel_hands) /obj/item/bodypart/leg/left/golem - biological_state = BIO_INORGANIC + biological_state = (BIO_BONE|BIO_JOINTED) + bodytype = BODYTYPE_ORGANIC limb_id = SPECIES_GOLEM dmg_overlay_type = null unarmed_damage_low = 7 @@ -406,7 +400,8 @@ unarmed_stun_threshold = 11 /obj/item/bodypart/leg/right/golem - biological_state = BIO_INORGANIC + biological_state = (BIO_BONE|BIO_JOINTED) + bodytype = BODYTYPE_ORGANIC limb_id = SPECIES_GOLEM dmg_overlay_type = null unarmed_damage_low = 7 diff --git a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm index 8adc098844d6..3756cee1e8b3 100644 --- a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm @@ -22,7 +22,7 @@ icon = 'icons/mob/species/plasmaman/bodyparts.dmi' icon_state = "plasmaman_l_arm" icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi' - biological_state = BIO_BONE + biological_state = (BIO_BONE|BIO_JOINTED) limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE dmg_overlay_type = null @@ -31,7 +31,7 @@ icon = 'icons/mob/species/plasmaman/bodyparts.dmi' icon_state = "plasmaman_r_arm" icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi' - biological_state = BIO_BONE + biological_state = (BIO_BONE|BIO_JOINTED) limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE dmg_overlay_type = null @@ -40,7 +40,7 @@ icon = 'icons/mob/species/plasmaman/bodyparts.dmi' icon_state = "plasmaman_l_leg" icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi' - biological_state = BIO_BONE + biological_state = (BIO_BONE|BIO_JOINTED) limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE dmg_overlay_type = null @@ -49,7 +49,7 @@ icon = 'icons/mob/species/plasmaman/bodyparts.dmi' icon_state = "plasmaman_r_leg" icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi' - biological_state = BIO_BONE + biological_state = (BIO_BONE|BIO_JOINTED) limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE dmg_overlay_type = null diff --git a/code/modules/surgery/bodyparts/wounds.dm b/code/modules/surgery/bodyparts/wounds.dm index 11ff3ff248e7..3d2a6c4056eb 100644 --- a/code/modules/surgery/bodyparts/wounds.dm +++ b/code/modules/surgery/bodyparts/wounds.dm @@ -1,47 +1,40 @@ /// Allows us to roll for and apply a wound without actually dealing damage. Used for aggregate wounding power with pellet clouds -/obj/item/bodypart/proc/painless_wound_roll(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus, sharpness=NONE) +/obj/item/bodypart/proc/painless_wound_roll(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus, sharpness=NONE) SHOULD_CALL_PARENT(TRUE) - if(!owner || phantom_wounding_dmg <= WOUND_MINIMUM_DAMAGE || wound_bonus == CANT_WOUND) + if(!owner || wounding_dmg <= WOUND_MINIMUM_DAMAGE || wound_bonus == CANT_WOUND || (owner.status_flags & GODMODE)) return var/mangled_state = get_mangled_state() var/easy_dismember = HAS_TRAIT(owner, TRAIT_EASYDISMEMBER) // if we have easydismember, we don't reduce damage when redirecting damage to different types (slashing weapons on mangled/skinless limbs attack at 100% instead of 50%) - if(wounding_type == WOUND_BLUNT && sharpness) - if(sharpness & SHARP_EDGED) - wounding_type = WOUND_SLASH - else if (sharpness & SHARP_POINTY) - wounding_type = WOUND_PIERCE + var/bio_status = get_bio_state_status() - //Handling for bone only/flesh only(none right now)/flesh and bone targets - switch(biological_state) - // if we're bone only, all cutting attacks go straight to the bone - if(BIO_BONE) - if(wounding_type == WOUND_SLASH) - wounding_type = WOUND_BLUNT - phantom_wounding_dmg *= (easy_dismember ? 1 : 0.6) - else if(wounding_type == WOUND_PIERCE) - wounding_type = WOUND_BLUNT - phantom_wounding_dmg *= (easy_dismember ? 1 : 0.75) - if((mangled_state & BODYPART_MANGLED_BONE) && try_dismember(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus)) - return - // note that there's no handling for BIO_FLESH since we don't have any that are that right now (slimepeople maybe someday) - // standard humanoids - if(BIO_FLESH_BONE) - // if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate - // So a big sharp weapon is still all you need to destroy a limb - if((mangled_state & BODYPART_MANGLED_FLESH) && !(mangled_state & BODYPART_MANGLED_BONE) && sharpness) - playsound(src, "sound/effects/wounds/crackandbleed.ogg", 100) - if(wounding_type == WOUND_SLASH && !easy_dismember) - phantom_wounding_dmg *= 0.6 // edged weapons pass along 60% of their wounding damage to the bone since the power is spread out over a larger area - if(wounding_type == WOUND_PIERCE && !easy_dismember) - phantom_wounding_dmg *= 0.75 // piercing weapons pass along 75% of their wounding damage to the bone since it's more concentrated - wounding_type = WOUND_BLUNT - else if((mangled_state & BODYPART_MANGLED_FLESH) && (mangled_state & BODYPART_MANGLED_BONE) && try_dismember(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus)) - return - - check_wounding(wounding_type, phantom_wounding_dmg, wound_bonus, bare_wound_bonus) + var/has_exterior = ((bio_status & ANATOMY_EXTERIOR)) + var/has_interior = ((bio_status & ANATOMY_INTERIOR)) + + var/exterior_ready_to_dismember = (!has_exterior || ((mangled_state & BODYPART_MANGLED_EXTERIOR))) + + // if we're bone only, all cutting attacks go straight to the bone + if(!has_exterior && has_interior) + if(wounding_type == WOUND_SLASH) + wounding_type = WOUND_BLUNT + wounding_dmg *= (easy_dismember ? 1 : 0.6) + else if(wounding_type == WOUND_PIERCE) + wounding_type = WOUND_BLUNT + wounding_dmg *= (easy_dismember ? 1 : 0.75) + else + // if we've already mangled the skin (critical slash or piercing wound), then the bone is exposed, and we can damage it with sharp weapons at a reduced rate + // So a big sharp weapon is still all you need to destroy a limb + if(has_interior && exterior_ready_to_dismember && !(mangled_state & BODYPART_MANGLED_INTERIOR) && sharpness) + if(wounding_type == WOUND_SLASH && !easy_dismember) + wounding_dmg *= 0.6 // edged weapons pass along 60% of their wounding damage to the bone since the power is spread out over a larger area + if(wounding_type == WOUND_PIERCE && !easy_dismember) + wounding_dmg *= 0.75 // piercing weapons pass along 75% of their wounding damage to the bone since it's more concentrated + wounding_type = WOUND_BLUNT + if ((dismemberable_by_wound() || dismemberable_by_total_damage()) && try_dismember(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus)) + return + return check_wounding(wounding_type, wounding_dmg, wound_bonus, bare_wound_bonus) /** * check_wounding() is where we handle rolling for, selecting, and applying a wound if we meet the criteria @@ -55,7 +48,7 @@ * * wound_bonus- The wound_bonus of an attack * * bare_wound_bonus- The bare_wound_bonus of an attack */ -/obj/item/bodypart/proc/check_wounding(woundtype, damage, wound_bonus, bare_wound_bonus, attack_direction) +/obj/item/bodypart/proc/check_wounding(woundtype, damage, wound_bonus, bare_wound_bonus, attack_direction, damage_source) SHOULD_CALL_PARENT(TRUE) RETURN_TYPE(/datum/wound) @@ -77,12 +70,18 @@ var/base_roll = rand(1, round(damage ** WOUND_DAMAGE_EXPONENT)) var/injury_roll = base_roll injury_roll += check_woundings_mods(woundtype, damage, wound_bonus, bare_wound_bonus) + var/list/series_wounding_mods = check_series_wounding_mods() + if(injury_roll > WOUND_DISMEMBER_OUTRIGHT_THRESH && prob(get_damage() / max_damage * 100)) var/datum/wound/loss/dismembering = new dismembering.apply_dismember(src, woundtype, outright = TRUE, attack_direction = attack_direction) return - var/list/wounds_checking = GLOB.global_wound_types[woundtype] + var/list/datum/wound/possible_wounds = list() + for (var/datum/wound/type as anything in GLOB.all_wound_pregen_data) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[type] + if (pregen_data.can_be_applied_to(src, list(woundtype), random_roll = TRUE)) + possible_wounds[type] = pregen_data.get_weight(src, woundtype, damage, attack_direction, damage_source) // quick re-check to see if bare_wound_bonus applies, for the benefit of log_wound(), see about getting the check from check_woundings_mods() somehow if(ishuman(owner)) var/mob/living/carbon/human/human_wearer = owner @@ -93,39 +92,137 @@ bare_wound_bonus = 0 break - //cycle through the wounds of the relevant category from the most severe down - for(var/datum/wound/possible_wound as anything in wounds_checking) + for (var/datum/wound/iterated_path as anything in possible_wounds) + for (var/datum/wound/existing_wound as anything in wounds) + if (iterated_path == existing_wound.type) + possible_wounds -= iterated_path + break // breaks out of the nested loop + + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[iterated_path] + var/specific_injury_roll = (injury_roll + series_wounding_mods[pregen_data.wound_series]) + if (pregen_data.get_threshold_for(src, attack_direction, damage_source) > specific_injury_roll) + possible_wounds -= iterated_path + continue + + if (pregen_data.compete_for_wounding) + for (var/datum/wound/other_path as anything in possible_wounds) + if (other_path == iterated_path) + continue + if (initial(iterated_path.severity) == initial(other_path.severity) && pregen_data.overpower_wounds_of_even_severity) + possible_wounds -= other_path + continue + else if (pregen_data.competition_mode == WOUND_COMPETITION_OVERPOWER_LESSERS) + if (initial(iterated_path.severity) > initial(other_path.severity)) + possible_wounds -= other_path + continue + else if (pregen_data.competition_mode == WOUND_COMPETITION_OVERPOWER_GREATERS) + if (initial(iterated_path.severity) < initial(other_path.severity)) + possible_wounds -= other_path + continue + + while (length(possible_wounds)) + var/datum/wound/possible_wound = pick_weight(possible_wounds) + var/datum/wound_pregen_data/possible_pregen_data = GLOB.all_wound_pregen_data[possible_wound] + possible_wounds -= possible_wound + var/datum/wound/replaced_wound for(var/datum/wound/existing_wound as anything in wounds) - if(existing_wound.type in wounds_checking) + var/datum/wound_pregen_data/existing_pregen_data = GLOB.all_wound_pregen_data[existing_wound.type] + if(existing_pregen_data.wound_series == possible_pregen_data.wound_series) if(existing_wound.severity >= initial(possible_wound.severity)) - return + continue else replaced_wound = existing_wound + // if we get through this whole loop without continuing, we found our winner - if(initial(possible_wound.threshold_minimum) < injury_roll) - var/datum/wound/new_wound - if(replaced_wound) - new_wound = replaced_wound.replace_wound(possible_wound, attack_direction = attack_direction) - else - new_wound = new possible_wound - new_wound.apply_wound(src, attack_direction = attack_direction) - log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) // dismembering wounds are logged in the apply_wound() for loss wounds since they delete themselves immediately, these will be immediately returned - return new_wound + var/datum/wound/new_wound = new possible_wound + if(replaced_wound) + new_wound = replaced_wound.replace_wound(new_wound, attack_direction = attack_direction) + else + new_wound.apply_wound(src, attack_direction = attack_direction, wound_source = damage_source) + log_wound(owner, new_wound, damage, wound_bonus, bare_wound_bonus, base_roll) // dismembering wounds are logged in the apply_wound() for loss wounds since they delete themselves immediately, these will be immediately returned + return new_wound // try forcing a specific wound, but only if there isn't already a wound of that severity or greater for that type on this bodypart -/obj/item/bodypart/proc/force_wound_upwards(specific_woundtype, smited = FALSE) +/obj/item/bodypart/proc/force_wound_upwards(datum/wound/potential_wound, smited = FALSE, wound_source) SHOULD_NOT_OVERRIDE(TRUE) - var/datum/wound/potential_wound = specific_woundtype + if (isnull(potential_wound)) + return + + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[potential_wound] for(var/datum/wound/existing_wound as anything in wounds) - if(existing_wound.wound_type == initial(potential_wound.wound_type)) + var/datum/wound_pregen_data/existing_pregen_data = existing_wound.get_pregen_data() + if (existing_pregen_data.wound_series == pregen_data.wound_series) if(existing_wound.severity < initial(potential_wound.severity)) // we only try if the existing one is inferior to the one we're trying to force - existing_wound.replace_wound(potential_wound, smited) + existing_wound.replace_wound(new potential_wound, smited) return var/datum/wound/new_wound = new potential_wound - new_wound.apply_wound(src, smited = smited) + new_wound.apply_wound(src, smited = smited, wound_source = wound_source) + return new_wound + +/** + * A simple proc to force a type of wound onto this mob. If you just want to force a specific mainline (fractures, bleeding, etc.) wound, you only need to care about the first 3 args. + * + * Args: + * * wounding_type: The wounding_type, e.g. WOUND_BLUNT, WOUND_SLASH to force onto the mob. Can be a list. + * * obj/item/bodypart/limb: The limb we wil be applying the wound to. If null, a random bodypart will be picked. + * * min_severity: The minimum severity that will be considered. + * * max_severity: The maximum severity that will be considered. + * * severity_pick_mode: The "pick mode" to be used. See get_corresponding_wound_type's documentation + * * wound_source: The source of the wound to be applied. Nullable. + * + * For the rest of the args, refer to get_corresponding_wound_type(). + * + * Returns: + * A new wound instance if the application was successful, null otherwise. +*/ +/mob/living/carbon/proc/cause_wound_of_type_and_severity(wounding_type, obj/item/bodypart/limb, min_severity, max_severity = min_severity, severity_pick_mode = WOUND_PICK_HIGHEST_SEVERITY, wound_source) + if (isnull(limb)) + limb = pick(bodyparts) + + var/list/type_list = wounding_type + if (!islist(type_list)) + type_list = list(type_list) + + var/datum/wound/corresponding_typepath = get_corresponding_wound_type(type_list, limb, min_severity, max_severity, severity_pick_mode) + if (corresponding_typepath) + return limb.force_wound_upwards(corresponding_typepath, wound_source = wound_source) + +/// Limb is nullable, but picks a random one. Defers to limb.get_wound_threshold_of_wound_type, see it for documentation. +/mob/living/carbon/proc/get_wound_threshold_of_wound_type(wounding_type, severity, default, obj/item/bodypart/limb, wound_source) + if (isnull(limb)) + limb = pick(bodyparts) + + if (!limb) + return default + + return limb.get_wound_threshold_of_wound_type(wounding_type, severity, default, wound_source) + +/** + * A simple proc that gets the best wound to fit the criteria laid out, then returns its wound threshold. + * + * Args: + * * wounding_type: The wounding_type, e.g. WOUND_BLUNT, WOUND_SLASH to force onto the mob. Can be a list of wounding_types. + * * severity: The severity that will be considered. + * * return_value_if_no_wound: If no wound is found, we will return this instead. (It is reccomended to use named args for this one, as its unclear what it is without) + * * wound_source: The theoretical source of the wound. Nullable. + * + * Returns: + * return_value_if_no_wound if no wound is found - if one IS found, the wound threshold for that wound. + */ +/obj/item/bodypart/proc/get_wound_threshold_of_wound_type(wounding_type, severity, return_value_if_no_wound, wound_source) + var/list/type_list = wounding_type + if (!islist(type_list)) + type_list = list(type_list) + + var/datum/wound/wound_path = get_corresponding_wound_type(type_list, src, severity, duplicates_allowed = TRUE, care_about_existing_wounds = FALSE) + if (wound_path) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[wound_path] + return pregen_data.get_threshold_for(src, damage_source = wound_source) + + return return_value_if_no_wound /** * check_wounding_mods() is where we handle the various modifiers of a wound roll @@ -171,7 +268,20 @@ return injury_mod - /// Get whatever wound of the given type is currently attached to this limb, if any +/// Should return an assoc list of (wound_series -> penalty). Will be used in determining series-specific penalties for wounding. +/obj/item/bodypart/proc/check_series_wounding_mods() + RETURN_TYPE(/list) + + var/list/series_mods = list() + + for (var/datum/wound/iterated_wound as anything in wounds) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[iterated_wound.type] + + series_mods[pregen_data.wound_series] += iterated_wound.series_threshold_penalty + + return series_mods + +/// Get whatever wound of the given type is currently attached to this limb, if any /obj/item/bodypart/proc/get_wound_type(checking_type) RETURN_TYPE(checking_type) SHOULD_NOT_OVERRIDE(TRUE) @@ -196,10 +306,6 @@ var/dam_mul = 1 //initial(wound_damage_multiplier) - // we can (normally) only have one wound per type, but remember there's multiple types (smites like :B:loodless can generate multiple cuts on a limb) - for(var/datum/wound/iter_wound as anything in wounds) - dam_mul *= iter_wound.damage_mulitplier_penalty - if(!LAZYLEN(wounds) && current_gauze && !replaced) // no more wounds = no need for the gauze anymore owner.visible_message(span_notice("\The [current_gauze.name] on [owner]'s [name] falls away."), span_notice("The [current_gauze.name] on your [parse_zone(body_zone)] falls away.")) QDEL_NULL(current_gauze) diff --git a/code/modules/surgery/bone_mending.dm b/code/modules/surgery/bone_mending.dm index f500319a49ee..6a34a3e13145 100644 --- a/code/modules/surgery/bone_mending.dm +++ b/code/modules/surgery/bone_mending.dm @@ -4,8 +4,8 @@ ///// Repair Hairline Fracture (Severe) /datum/surgery/repair_bone_hairline name = "Repair bone fracture (hairline)" - surgery_flags = SURGERY_SELF_OPERABLE | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB - targetable_wound = /datum/wound/blunt/severe + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB + targetable_wound = /datum/wound/blunt/bone/severe possible_locs = list( BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, @@ -27,11 +27,12 @@ return(targeted_bodypart.get_wound_type(targetable_wound)) +///// Repair Compound Fracture (Critical) ///// Repair Compound Fracture (Critical) /datum/surgery/repair_bone_compound name = "Repair Compound Fracture" - surgery_flags = SURGERY_SELF_OPERABLE | SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB - targetable_wound = /datum/wound/blunt/critical + surgery_flags = SURGERY_REQUIRE_RESTING | SURGERY_REQUIRE_LIMB | SURGERY_REQUIRES_REAL_LIMB + targetable_wound = /datum/wound/blunt/bone/critical possible_locs = list( BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, diff --git a/code/modules/surgery/burn_dressing.dm b/code/modules/surgery/burn_dressing.dm index b3047d75065d..817772ca8b65 100644 --- a/code/modules/surgery/burn_dressing.dm +++ b/code/modules/surgery/burn_dressing.dm @@ -24,7 +24,7 @@ return FALSE if(..()) var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) - var/datum/wound/burn/burn_wound = targeted_bodypart.get_wound_type(targetable_wound) + var/datum/wound/burn/flesh/burn_wound = targeted_bodypart.get_wound_type(targetable_wound) return(burn_wound && burn_wound.infestation > 0) //SURGERY STEPS @@ -48,7 +48,7 @@ var/infestation_removed = 4 /// To give the surgeon a heads up how much work they have ahead of them -/datum/surgery_step/debride/proc/get_progress(mob/user, mob/living/carbon/target, datum/wound/burn/burn_wound) +/datum/surgery_step/debride/proc/get_progress(mob/user, mob/living/carbon/target, datum/wound/burn/flesh/burn_wound) if(!burn_wound?.infestation || !infestation_removed) return var/estimated_remaining_steps = burn_wound.infestation / infestation_removed @@ -68,7 +68,7 @@ /datum/surgery_step/debride/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(surgery.operated_wound) - var/datum/wound/burn/burn_wound = surgery.operated_wound + var/datum/wound/burn/flesh/burn_wound = surgery.operated_wound if(burn_wound.infestation <= 0) to_chat(user, span_notice("[target]'s [parse_zone(user.zone_selected)] has no infected flesh to remove!")) surgery.status++ @@ -86,7 +86,7 @@ user.visible_message(span_notice("[user] looks for [target]'s [parse_zone(user.zone_selected)]."), span_notice("You look for [target]'s [parse_zone(user.zone_selected)]...")) /datum/surgery_step/debride/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/datum/wound/burn/burn_wound = surgery.operated_wound + var/datum/wound/burn/flesh/burn_wound = surgery.operated_wound if(burn_wound) var/progress_text = get_progress(user, target, burn_wound) display_results( @@ -120,7 +120,7 @@ /datum/surgery_step/debride/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) if(!..()) return - var/datum/wound/burn/burn_wound = surgery.operated_wound + var/datum/wound/burn/flesh/burn_wound = surgery.operated_wound while(burn_wound && burn_wound.infestation > 0.25) if(!..()) break @@ -139,7 +139,7 @@ /datum/surgery_step/dress/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/datum/wound/burn/burn_wound = surgery.operated_wound + var/datum/wound/burn/flesh/burn_wound = surgery.operated_wound if(burn_wound) display_results( user, @@ -153,7 +153,7 @@ user.visible_message(span_notice("[user] looks for [target]'s [parse_zone(user.zone_selected)]."), span_notice("You look for [target]'s [parse_zone(user.zone_selected)]...")) /datum/surgery_step/dress/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/datum/wound/burn/burn_wound = surgery.operated_wound + var/datum/wound/burn/flesh/burn_wound = surgery.operated_wound if(burn_wound) display_results( user, diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm index 9370a4f719c9..7f43d56ffb1b 100644 --- a/code/modules/surgery/implant_removal.dm +++ b/code/modules/surgery/implant_removal.dm @@ -1,5 +1,6 @@ /datum/surgery/implant_removal - name = "Implant removal" + name = "Implant Removal" + target_mobtypes = list(/mob/living) possible_locs = list(BODY_ZONE_CHEST) steps = list( /datum/surgery_step/incise, @@ -20,7 +21,7 @@ success_sound = 'sound/surgery/hemostat1.ogg' var/obj/item/implant/implant -/datum/surgery_step/extract_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) +/datum/surgery_step/extract_implant/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) for(var/obj/item/object in target.implants) implant = object break @@ -42,7 +43,7 @@ span_notice("[user] looks for something in [target]'s [target_zone]."), ) -/datum/surgery_step/extract_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) +/datum/surgery_step/extract_implant/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) if(implant) display_results( user, @@ -79,8 +80,9 @@ return ..() /datum/surgery/implant_removal/mechanic - name = "implant removal" + name = "Implant Removal" requires_bodypart_type = BODYTYPE_ROBOTIC + target_mobtypes = list(/mob/living/carbon/human) // Simpler mobs don't have bodypart types steps = list( /datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, diff --git a/code/modules/surgery/organs/_organ.dm b/code/modules/surgery/organs/_organ.dm index 4f5ad281ea1c..1a1885c5423b 100644 --- a/code/modules/surgery/organs/_organ.dm +++ b/code/modules/surgery/organs/_organ.dm @@ -41,10 +41,30 @@ var/failure_time = 0 ///Do we effect the appearance of our mob. Used to save time in preference code var/visual = TRUE + ///If the organ is cosmetic only, it loses all organ functionality. + var/cosmetic_only = FALSE /// Traits that are given to the holder of the organ. If you want an effect that changes this, don't add directly to this. Use the add_organ_trait() proc - var/list/organ_traits + var/list/organ_traits = list() /// Status Effects that are given to the holder of the organ. var/list/organ_effects + ///Sometimes we need multiple layers, for like the back, middle and front of the person + var/list/layers + ///Defines what kind of 'organ' we're looking at. Sprites have names like 'm_mothwings_firemoth'. 'mothwings' would then be feature_key + var/feature_key = "" + ///Similar to feature key, but overrides it in the case you need more fine control over the iconstate, like with Tails. + var/render_key = "" + ///Stores the dna.features[feature_key], used for external organs that can be surgically removed or inserted. + var/stored_feature_id = "" + /// The savefile_key of the preference this relates to. Used for the preferences UI. + var/preference + ///Sprite datum we use to draw on the bodypart + var/datum/sprite_accessory/sprite_datum + ///With what DNA block do we mutate in mutate_feature() ? For genetics + var/dna_block + ///Does this organ have any bodytypes to pass to it's ownerlimb? + var/external_bodytypes = NONE + /// String displayed when the organ has decayed. + var/failing_desc = "has decayed for too long, and has turned a sickly color. It probably won't work without repairs." // Players can look at prefs before atoms SS init, and without this // they would not be able to see external organs, such as moth wings. @@ -52,7 +72,7 @@ // any nonhumans created in that time would experience the same effect. INITIALIZE_IMMEDIATE(/obj/item/organ) -/obj/item/organ/Initialize(mapload) +/obj/item/organ/Initialize(mapload, mob_sprite) . = ..() if(organ_flags & ORGAN_EDIBLE) AddComponent(/datum/component/edible,\ @@ -61,6 +81,20 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) volume = reagent_vol,\ after_eat = CALLBACK(src, PROC_REF(OnEatFrom))) + if(cosmetic_only) //Cosmetic organs don't process. + if(mob_sprite) + set_sprite(mob_sprite) + +/obj/item/organ/proc/set_sprite(sprite_name) + stored_feature_id = sprite_name + sprite_datum = get_global_feature_list()[sprite_name] + if(!sprite_datum && stored_feature_id) + stack_trace("External organ has no valid sprite datum for name [sprite_name]") + +///Return a dumb glob list for this specific feature (called from parse_sprite) +/obj/item/organ/proc/get_global_feature_list() + CRASH("External organ has no feature list, it will render invisible") + /* * Insert the organ into the select mob. * diff --git a/code/modules/surgery/organs/external/_external_organs.dm b/code/modules/surgery/organs/external/_external_organs.dm index ca747f498879..b22d325f4c4d 100644 --- a/code/modules/surgery/organs/external/_external_organs.dm +++ b/code/modules/surgery/organs/external/_external_organs.dm @@ -17,16 +17,9 @@ ///If not null, overrides the appearance with this sprite accessory datum var/sprite_accessory_override - /// The savefile_key of the preference this relates to. Used for the preferences UI. - var/preference - ///With what DNA block do we mutate in mutate_feature() ? For genetics - var/dna_block - ///Set to EXTERNAL_BEHIND, EXTERNAL_FRONT or EXTERNAL_ADJACENT if you want to draw one of those layers as the object sprite. FALSE to use your own ///This will not work if it doesn't have a limb to generate it's icon with var/use_mob_sprite_as_obj_sprite = FALSE - ///Does this organ have any bodytypes to pass to it's ownerlimb? - var/external_bodytypes = NONE ///Which flags does a 'modification tool' need to have to restyle us, if it all possible (located in code/_DEFINES/mobs) var/restyle_flags = NONE @@ -221,9 +214,15 @@ desc = "Take a closer look at that snout!" icon_state = "snout" + organ_flags = ORGAN_UNREMOVABLE | ORGAN_EDIBLE + visual = TRUE + cosmetic_only = TRUE + zone = BODY_ZONE_HEAD slot = ORGAN_SLOT_EXTERNAL_SNOUT + layers = list(BODY_ADJ_LAYER) + feature_key = "snout" preference = "feature_lizard_snout" external_bodytypes = BODYTYPE_SNOUTED diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm old mode 100755 new mode 100644 diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 8dd9af374c5f..2571034a06b6 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -265,7 +265,7 @@ return var/ratio = (breath.gases[/datum/gas/oxygen][MOLES] / safe_oxygen_max) * 10 - breather.apply_damage_type(clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type) + breather.apply_damage(clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type, spread_damage = TRUE) breather.throw_alert(ALERT_TOO_MUCH_OXYGEN, /atom/movable/screen/alert/too_much_oxy) /// Handles NOT having too much o2. only relevant if safe_oxygen_max has a value @@ -321,10 +321,10 @@ breather.throw_alert(ALERT_TOO_MUCH_CO2, /atom/movable/screen/alert/too_much_co2) breather.Unconscious(6 SECONDS) // Lets hurt em a little, let them know we mean business. - breather.apply_damage_type(3, co2_damage_type) + breather.apply_damage(3, co2_damage_type, spread_damage = TRUE) // They've been in here 30s now, start to kill them for their own good! if((world.time - breather.co2overloadtime) > 30 SECONDS) - breather.apply_damage_type(8, co2_damage_type) + breather.apply_damage(8, co2_damage_type, spread_damage = TRUE) /// Handles NOT having too much co2. only relevant if safe_co2_max has a value /obj/item/organ/internal/lungs/proc/safe_co2(mob/living/carbon/breather, datum/gas_mixture/breath, old_co2_pp) @@ -365,7 +365,7 @@ breather.throw_alert(ALERT_TOO_MUCH_PLASMA, /atom/movable/screen/alert/too_much_plas) var/ratio = (breath.gases[/datum/gas/plasma][MOLES] / safe_plasma_max) * 10 - breather.apply_damage_type(clamp(ratio, plas_breath_dam_min, plas_breath_dam_max), plas_damage_type) + breather.apply_damage(clamp(ratio, plas_breath_dam_min, plas_breath_dam_max), plas_damage_type, spread_damage = TRUE) /// Resets plasma side effects /obj/item/organ/internal/lungs/proc/safe_plasma(mob/living/carbon/breather, datum/gas_mixture/breath, old_plasma_pp) @@ -754,11 +754,11 @@ if(!HAS_TRAIT(breather, TRAIT_RESISTCOLD)) // COLD DAMAGE var/cold_modifier = breather.dna.species.coldmod if(breath_temperature < cold_level_3_threshold) - breather.apply_damage_type(cold_level_3_damage*cold_modifier, cold_damage_type) + breather.apply_damage(cold_level_3_damage*cold_modifier, cold_damage_type, spread_damage = TRUE) if(breath_temperature > cold_level_3_threshold && breath_temperature < cold_level_2_threshold) - breather.apply_damage_type(cold_level_2_damage*cold_modifier, cold_damage_type) + breather.apply_damage(cold_level_2_damage*cold_modifier, cold_damage_type, spread_damage = TRUE) if(breath_temperature > cold_level_2_threshold && breath_temperature < cold_level_1_threshold) - breather.apply_damage_type(cold_level_1_damage*cold_modifier, cold_damage_type) + breather.apply_damage(cold_level_1_damage*cold_modifier, cold_damage_type, spread_damage = TRUE) if(breath_temperature < cold_level_1_threshold) if(prob(20)) to_chat(breather, span_warning("You feel [cold_message] in your [name]!")) @@ -766,11 +766,11 @@ if(!HAS_TRAIT(breather, TRAIT_RESISTHEAT)) // HEAT DAMAGE var/heat_modifier = breather.dna.species.heatmod if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold) - breather.apply_damage_type(heat_level_1_damage*heat_modifier, heat_damage_type) + breather.apply_damage(heat_level_1_damage*heat_modifier, heat_damage_type, spread_damage = TRUE) if(breath_temperature > heat_level_2_threshold && breath_temperature < heat_level_3_threshold) - breather.apply_damage_type(heat_level_2_damage*heat_modifier, heat_damage_type) + breather.apply_damage(heat_level_2_damage*heat_modifier, heat_damage_type, spread_damage = TRUE) if(breath_temperature > heat_level_3_threshold) - breather.apply_damage_type(heat_level_3_damage*heat_modifier, heat_damage_type) + breather.apply_damage(heat_level_3_damage*heat_modifier, heat_damage_type, spread_damage = TRUE) if(breath_temperature > heat_level_1_threshold) if(prob(20)) to_chat(breather, span_warning("You feel [hot_message] in your [name]!")) @@ -819,6 +819,7 @@ /obj/item/organ/internal/lungs/cybernetic name = "basic cybernetic lungs" desc = "A basic cybernetic version of the lungs found in traditional humanoid entities." + failing_desc = "seems to be broken." icon_state = "lungs-c" organ_flags = ORGAN_SYNTHETIC maxHealth = STANDARD_ORGAN_THRESHOLD * 0.5 diff --git a/code/modules/surgery/repair_puncture.dm b/code/modules/surgery/repair_puncture.dm index 9c395d9b40f4..c61eeeaa8bdd 100644 --- a/code/modules/surgery/repair_puncture.dm +++ b/code/modules/surgery/repair_puncture.dm @@ -32,7 +32,7 @@ . = ..() if(.) var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) - var/datum/wound/burn/pierce_wound = targeted_bodypart.get_wound_type(targetable_wound) + var/datum/wound/burn/flesh/pierce_wound = targeted_bodypart.get_wound_type(targetable_wound) return(pierce_wound && pierce_wound.blood_flow > 0) //SURGERY STEPS @@ -47,7 +47,7 @@ time = 3 SECONDS /datum/surgery_step/repair_innards/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/datum/wound/pierce/pierce_wound = surgery.operated_wound + var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound if(!pierce_wound) user.visible_message(span_notice("[user] looks for [target]'s [parse_zone(user.zone_selected)]."), span_notice("You look for [target]'s [parse_zone(user.zone_selected)]...")) return @@ -67,7 +67,7 @@ display_pain(target, "You feel a horrible stabbing pain in your [parse_zone(user.zone_selected)]!") /datum/surgery_step/repair_innards/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/datum/wound/pierce/pierce_wound = surgery.operated_wound + var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound if(!pierce_wound) to_chat(user, span_warning("[target] has no puncture wound there!")) return ..() @@ -112,7 +112,7 @@ return TRUE /datum/surgery_step/seal_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/datum/wound/pierce/pierce_wound = surgery.operated_wound + var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound if(!pierce_wound) user.visible_message(span_notice("[user] looks for [target]'s [parse_zone(user.zone_selected)]."), span_notice("You look for [target]'s [parse_zone(user.zone_selected)]...")) return @@ -126,7 +126,7 @@ display_pain(target, "You're being burned inside your [parse_zone(user.zone_selected)]!") /datum/surgery_step/seal_veins/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/datum/wound/pierce/pierce_wound = surgery.operated_wound + var/datum/wound/pierce/bleed/pierce_wound = surgery.operated_wound if(!pierce_wound) to_chat(user, span_warning("[target] has no puncture there!")) return ..() diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 397c6afb63a3..5a217060f33f 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -119,7 +119,7 @@ surgery.complete(user) if(target.stat == DEAD && was_sleeping && user.client) - user.client.give_award(/datum/award/achievement/misc/sandman, user) + user.client.give_award(/datum/award/achievement/jobs/sandman, user) surgery.step_in_progress = FALSE return advance diff --git a/code/modules/tgui/states/notcontained.dm b/code/modules/tgui/states/notcontained.dm index 018e0fa0304c..b144a375757d 100644 --- a/code/modules/tgui/states/notcontained.dm +++ b/code/modules/tgui/states/notcontained.dm @@ -28,5 +28,5 @@ GLOBAL_DATUM_INIT(notcontained_state, /datum/ui_state/notcontained_state, new) /mob/living/silicon/notcontained_can_use_topic(src_object) return default_can_use_topic(src_object) // Silicons use default bevhavior. -/mob/living/simple_animal/drone/notcontained_can_use_topic(src_object) +/mob/living/basic/drone/notcontained_can_use_topic(src_object) return default_can_use_topic(src_object) // Drones use default bevhavior. diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 4143f1b8e5bc..79ac97f3dd4b 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -86,6 +86,7 @@ #include "baseturfs.dm" #include "bespoke_id.dm" #include "binary_insert.dm" +#include "bitrunning.dm" #include "blindness.dm" #include "bloody_footprints.dm" #include "breath.dm" @@ -132,6 +133,7 @@ #include "json_savefile_importing.dm" #include "keybinding_init.dm" #include "knockoff_component.dm" +#include "leash.dm" #include "lesserform.dm" #include "limbsanity.dm" #include "lungs.dm" @@ -144,6 +146,7 @@ #include "merge_type.dm" #include "mindbound_actions.dm" #include "missing_icons.dm" +#include "mob_chains.dm" #include "mob_faction.dm" #include "mob_spawn.dm" #include "modsuit.dm" @@ -159,7 +162,6 @@ #include "orderable_items.dm" #include "organs.dm" #include "organ_set_bonus.dm" -#include "outfit_sanity.dm" #include "paintings.dm" #include "pills.dm" #include "plane_double_transform.dm" diff --git a/code/modules/unit_tests/achievements.dm b/code/modules/unit_tests/achievements.dm index 652d65898fa8..44e1384c2e01 100644 --- a/code/modules/unit_tests/achievements.dm +++ b/code/modules/unit_tests/achievements.dm @@ -10,4 +10,7 @@ if(!init_icon || !(init_icon in award_icons)) TEST_FAIL("Award [initial(award.name)] has an unexistent icon: \"[init_icon || "null"]\"") if(length(initial(award.database_id)) > 32) //sql schema limit - TEST_FAIL("Award [initial(award.name)] database id is is too long") + TEST_FAIL("Award [initial(award.name)] database id is too long") + var/init_category = initial(award.category) + if(!(init_category in GLOB.achievement_categories)) + TEST_FAIL("Award [initial(award.name)] has unsupported category: \"[init_category || "null"]\". Update GLOB.achievement_categories") diff --git a/code/modules/unit_tests/bitrunning.dm b/code/modules/unit_tests/bitrunning.dm new file mode 100644 index 000000000000..568eeeed8c13 --- /dev/null +++ b/code/modules/unit_tests/bitrunning.dm @@ -0,0 +1,15 @@ +/// Ensures settings on vdoms are correct +/datum/unit_test/bitrunner_vdom_settings + +/datum/unit_test/bitrunner_vdom_settings/Run() + var/obj/structure/closet/crate/secure/bitrunning/decrypted/cache = allocate(/obj/structure/closet/crate/secure/bitrunning/decrypted) + + for(var/path in subtypesof(/datum/lazy_template/virtual_domain)) + var/datum/lazy_template/virtual_domain/vdom = new path + TEST_ASSERT_NOTNULL(vdom.key, "[path] should have a key") + TEST_ASSERT_NOTNULL(vdom.map_name, "[path] should have a map name") + + if(!length(vdom.extra_loot)) + continue + + TEST_ASSERT_EQUAL(cache.spawn_loot(vdom.extra_loot), TRUE, "[path] didn't spawn loot. Extra loot should be an associative list") diff --git a/code/modules/unit_tests/breath.dm b/code/modules/unit_tests/breath.dm index faba1a08e22e..8bd6e3ce9b3d 100644 --- a/code/modules/unit_tests/breath.dm +++ b/code/modules/unit_tests/breath.dm @@ -86,6 +86,8 @@ /datum/unit_test/breath/breath_sanity_ashwalker /datum/unit_test/breath/breath_sanity_ashwalker/Run() + if(SSmapping.config.map_name == "Oshan Station") + return var/mob/living/carbon/human/species/lizard/ashwalker/lab_rat = allocate(/mob/living/carbon/human/species/lizard/ashwalker) lab_rat.forceMove(run_loc_floor_bottom_left) var/turf/open/to_fill = run_loc_floor_bottom_left diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm index 84cac3a57480..bcfebef4693e 100644 --- a/code/modules/unit_tests/create_and_destroy.dm +++ b/code/modules/unit_tests/create_and_destroy.dm @@ -119,6 +119,7 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) ///we also dont want weathers or weather events as they will hold refs to alot of stuff as they shouldn't be deleted ignore += typesof(/datum/weather_event) ignore += typesof(/datum/particle_weather) + ignore += typesof(/mob/living/basic/aquatic) var/list/cached_contents = spawn_at.contents.Copy() var/original_turf_type = spawn_at.type @@ -198,6 +199,8 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) //Alright, time to see if anything messed up var/list/cache_for_sonic_speed = SSgarbage.items for(var/path in cache_for_sonic_speed) + if(path in ignore) + continue var/datum/qdel_item/item = cache_for_sonic_speed[path] if(item.failures) TEST_FAIL("[item.name] hard deleted [item.failures] times out of a total del count of [item.qdels]") diff --git a/code/modules/unit_tests/dragon_expiration.dm b/code/modules/unit_tests/dragon_expiration.dm index 7b36b5762911..45262dc9d609 100644 --- a/code/modules/unit_tests/dragon_expiration.dm +++ b/code/modules/unit_tests/dragon_expiration.dm @@ -2,9 +2,12 @@ /datum/unit_test/contents_barfer /datum/unit_test/contents_barfer/Run() - var/mob/living/simple_animal/hostile/space_dragon/dragon_time = allocate(/mob/living/simple_animal/hostile/space_dragon) + var/mob/living/basic/space_dragon/dragon_time = allocate(/mob/living/basic/space_dragon) var/mob/living/carbon/human/to_be_consumed = allocate(/mob/living/carbon/human/consistent) + to_be_consumed.adjust_fire_stacks(5) + to_be_consumed.ignite_mob() TEST_ASSERT(dragon_time.eat(to_be_consumed), "The space dragon failed to consume the dummy!") + TEST_ASSERT(!to_be_consumed.has_status_effect(/datum/status_effect/fire_handler/fire_stacks), "The space dragon failed to extinguish the dummy!") TEST_ASSERT_EQUAL(to_be_consumed.loc, dragon_time, "The dummy's location, after being successfuly consumed, was not within the space dragon's contents!") dragon_time.death() TEST_ASSERT(isturf(to_be_consumed.loc), "After dying, the space dragon did not eject the consumed dummy content barfer element.") @@ -13,7 +16,7 @@ /datum/unit_test/space_dragon_expiration /datum/unit_test/space_dragon_expiration/Run() - var/mob/living/simple_animal/hostile/space_dragon/dragon_time = allocate(/mob/living/simple_animal/hostile/space_dragon) + var/mob/living/basic/space_dragon/dragon_time = allocate(/mob/living/basic/space_dragon) var/mob/living/carbon/human/to_be_consumed = allocate(/mob/living/carbon/human/consistent) dragon_time.mind_initialize() diff --git a/code/modules/unit_tests/leash.dm b/code/modules/unit_tests/leash.dm new file mode 100644 index 000000000000..2372ebca7df5 --- /dev/null +++ b/code/modules/unit_tests/leash.dm @@ -0,0 +1,102 @@ +/datum/unit_test/leash + abstract_type = /datum/unit_test/leash + + var/atom/movable/owner + var/atom/movable/pet + + var/max_distance = 3 + + var/forcibly_teleported = FALSE + var/datum/leash_wait/leash_wait + +/datum/unit_test/leash/New() + . = ..() + + owner = allocate(/obj/item/pen) + pet = allocate(/obj/item/pen) + + pet.AddComponent(/datum/component/leash, owner, max_distance) + + RegisterSignal(pet, COMSIG_LEASH_FORCE_TELEPORT, PROC_REF(on_leash_force_teleport)) + RegisterSignal(pet, COMSIG_LEASH_PATH_STARTED, PROC_REF(on_leash_path_started)) + RegisterSignal(pet, COMSIG_LEASH_PATH_COMPLETE, PROC_REF(on_leash_path_complete)) + +/datum/unit_test/leash/Destroy() + QDEL_NULL(owner) + QDEL_NULL(pet) + + return ..() + +/datum/unit_test/leash/proc/on_leash_force_teleport() + SIGNAL_HANDLER + forcibly_teleported = TRUE + +/datum/unit_test/leash/proc/on_leash_path_complete() + SIGNAL_HANDLER + leash_wait?.completed() + +/datum/unit_test/leash/proc/on_leash_path_started() + SIGNAL_HANDLER + leash_wait?.started() + +/datum/unit_test/leash/proc/move_away(atom/movable/mover, distance) + RETURN_TYPE(/datum/leash_wait) + leash_wait = new + + for (var/_ in 1 to distance) + mover.Move(get_step(mover, EAST)) + + return leash_wait + +/datum/leash_wait + var/completed = FALSE + var/started = FALSE + + var/timed_out = FALSE + +/datum/leash_wait/New() + addtimer(VARSET_CALLBACK(src, timed_out, TRUE), 1 SECONDS) + +/datum/leash_wait/proc/completed() + completed = TRUE + +/datum/leash_wait/proc/started() + started = TRUE + +/datum/leash_wait/proc/assert_unmoved() + ASSERT(!started, "Leash started to move when it should not have") + +/datum/leash_wait/proc/wait() + ASSERT(started, "Leash doesn't plan on moving") + + UNTIL(completed || timed_out) + ASSERT(!timed_out, "Waiting for leash movement timed out, it didn't want to move") + +/// Validates the leash component will keep its parent within range without teleporting +/// when possible. +/datum/unit_test/leash/no_teleport + +/datum/unit_test/leash/no_teleport/Run() + move_away(owner, 1).assert_unmoved() + TEST_ASSERT_EQUAL(get_dist(owner, pet), 1, "Pet should not have moved") + + move_away(owner, max_distance).wait() // max_distance + 1 = we move closer, but don't teleport + TEST_ASSERT_EQUAL(get_dist(owner, pet), max_distance, "Pet should have stayed directly outside range of owner") + + TEST_ASSERT(!forcibly_teleported, "Pet should not have been forcibly teleported") + +/// Validates that the leash component will forcibly teleport when necessary +/datum/unit_test/leash/will_teleport + +/datum/unit_test/leash/will_teleport/Run() + leash_wait = new + owner.forceMove(locate(1, 1, 1)) + leash_wait.wait() + TEST_ASSERT(forcibly_teleported, "Pet should have been forcibly teleported, since they are too far away with no valid path") + +/// Validates that the leashed object cannot move outside of the max distance from owner +/datum/unit_test/leash/limit_range + +/datum/unit_test/leash/limit_range/Run() + move_away(pet, max_distance + 1) + TEST_ASSERT_EQUAL(get_dist(owner, pet), max_distance, "Pet should not have moved farther than max_distance") diff --git a/code/modules/unit_tests/lungs.dm b/code/modules/unit_tests/lungs.dm index 4f9b7ceb4429..3d9a800adc97 100644 --- a/code/modules/unit_tests/lungs.dm +++ b/code/modules/unit_tests/lungs.dm @@ -61,6 +61,8 @@ /datum/unit_test/lungs/lungs_sanity_ashwalker/Run() // Gas mix resembling one cell of lavaland's atmosphere. + if(SSmapping.config.map_name == "Oshan Station") + return var/datum/gas_mixture/lavaland_test_mix = create_lavaland_mix() var/obj/item/organ/internal/lungs/lavaland/test_lungs = allocate(/obj/item/organ/internal/lungs/lavaland) var/mob/living/carbon/human/lab_rat = allocate(/mob/living/carbon/human/consistent) diff --git a/code/modules/unit_tests/mapload_space_verification.dm b/code/modules/unit_tests/mapload_space_verification.dm index 80772b8a633c..6ff32145efa1 100644 --- a/code/modules/unit_tests/mapload_space_verification.dm +++ b/code/modules/unit_tests/mapload_space_verification.dm @@ -23,6 +23,8 @@ /area/shuttle/abandoned, // Solars have lattices over space turfs, and are a valid placement for space turfs in a station area. /area/station/solars, + // magnet area is designed specifically to hold the asteroid + /area/station/cargo/mining/asteroid_magnet, )) // We aren't planetary, so let's check area placements and ensure stuff lines up. diff --git a/code/modules/unit_tests/medical_wounds.dm b/code/modules/unit_tests/medical_wounds.dm index 56c7a43104f1..161492a726a9 100644 --- a/code/modules/unit_tests/medical_wounds.dm +++ b/code/modules/unit_tests/medical_wounds.dm @@ -12,17 +12,18 @@ var/i = 1 var/list/iter_test_wound_list - for(iter_test_wound_list in list(list(/datum/wound/blunt/moderate, /datum/wound/blunt/severe, /datum/wound/blunt/critical),\ - list(/datum/wound/slash/moderate, /datum/wound/slash/severe, /datum/wound/slash/critical),\ - list(/datum/wound/pierce/moderate, /datum/wound/pierce/severe, /datum/wound/pierce/critical),\ - list(/datum/wound/burn/moderate, /datum/wound/burn/severe, /datum/wound/burn/critical))) + for(iter_test_wound_list in list(list(/datum/wound/blunt/bone/moderate, /datum/wound/blunt/bone/severe, /datum/wound/blunt/bone/critical),\ + list(/datum/wound/slash/flesh/moderate, /datum/wound/slash/flesh/severe, /datum/wound/slash/flesh/critical),\ + list(/datum/wound/pierce/bleed/moderate, /datum/wound/pierce/bleed/severe, /datum/wound/pierce/bleed/critical),\ + list(/datum/wound/burn/flesh/moderate, /datum/wound/burn/flesh/severe, /datum/wound/burn/flesh/critical))) TEST_ASSERT_EQUAL(length(victim.all_wounds), 0, "Patient is somehow wounded before test") var/datum/wound/iter_test_wound + var/datum/wound_pregen_data/iter_pregen_data = GLOB.all_wound_pregen_data[iter_test_wound] var/threshold_penalty = 0 for(iter_test_wound in iter_test_wound_list) - var/threshold = initial(iter_test_wound.threshold_minimum) - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty + var/threshold = iter_pregen_data.threshold_minimum - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty if(dam_types[i] == BRUTE) tested_part.receive_damage(WOUND_MINIMUM_DAMAGE, 0, wound_bonus = threshold, sharpness=sharps[i]) else if(dam_types[i] == BURN) @@ -52,30 +53,33 @@ var/list/iter_test_wound_list tested_part.biological_state &= ~BIO_FLESH // take away the base limb's flesh (ouchie!) ((not actually ouchie, this just affects their wounds and dismemberment handling)) - for(iter_test_wound_list in list(list(/datum/wound/blunt/moderate, /datum/wound/blunt/severe, /datum/wound/blunt/critical),\ - list(/datum/wound/slash/moderate, /datum/wound/slash/severe, /datum/wound/slash/critical),\ - list(/datum/wound/pierce/moderate, /datum/wound/pierce/severe, /datum/wound/pierce/critical),\ - list(/datum/wound/burn/moderate, /datum/wound/burn/severe, /datum/wound/burn/critical))) + for(iter_test_wound_list in list(list(/datum/wound/blunt/bone/moderate, /datum/wound/blunt/bone/severe, /datum/wound/blunt/bone/critical),\ + list(/datum/wound/slash/flesh/moderate, /datum/wound/slash/flesh/severe, /datum/wound/slash/flesh/critical),\ + list(/datum/wound/pierce/bleed/moderate, /datum/wound/pierce/bleed/severe, /datum/wound/pierce/bleed/critical),\ + list(/datum/wound/burn/flesh/moderate, /datum/wound/burn/flesh/severe, /datum/wound/burn/flesh/critical))) TEST_ASSERT_EQUAL(length(victim.all_wounds), 0, "Patient is somehow wounded before test") var/datum/wound/iter_test_wound + var/datum/wound_pregen_data/iter_pregen_data = GLOB.all_wound_pregen_data[iter_test_wound] var/threshold_penalty = 0 for(iter_test_wound in iter_test_wound_list) - var/threshold = initial(iter_test_wound.threshold_minimum) - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty + var/threshold = iter_pregen_data.threshold_minimum - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty if(dam_types[i] == BRUTE) tested_part.receive_damage(WOUND_MINIMUM_DAMAGE, 0, wound_bonus = threshold, sharpness=sharps[i]) else if(dam_types[i] == BURN) tested_part.receive_damage(0, WOUND_MINIMUM_DAMAGE, wound_bonus = threshold, sharpness=sharps[i]) // so if we just tried to deal a flesh wound, make sure we didn't actually suffer it. We may have suffered a bone wound instead, but we just want to make sure we don't have a flesh wound - if(initial(iter_test_wound.wound_flags) & FLESH_WOUND) + var/datum/wound_pregen_data/pregen_data = GLOB.all_wound_pregen_data[iter_test_wound] + if (pregen_data.required_limb_biostate & BIO_FLESH) if(!length(victim.all_wounds)) // not having a wound is good news continue else // we have to check that it's actually a bone wound and not the intended wound type TEST_ASSERT_EQUAL(length(victim.all_wounds), 1, "Patient has more than one wound when only one is expected. Severity: [initial(iter_test_wound.severity)]") var/datum/wound/actual_wound = victim.all_wounds[1] - TEST_ASSERT((actual_wound.wound_flags & ~FLESH_WOUND), "Limb has flesh wound despite no BIO_FLESH biological_state, expected either no wound or bone wound. Offending wound: [actual_wound]") + var/datum/wound_pregen_data/actual_pregen_data = GLOB.all_wound_pregen_data[actual_wound.type] + TEST_ASSERT((actual_pregen_data.required_limb_biostate & ~BIO_FLESH), "Limb has flesh wound despite no BIO_FLESH biological_state, expected either no wound or bone wound. Offending wound: [actual_wound]") threshold_penalty = actual_wound.threshold_penalty else // otherwise if it's a bone wound, check that we have it per usual TEST_ASSERT(length(victim.all_wounds), "Patient has no wounds when one wound is expected. Severity: [initial(iter_test_wound.severity)]") diff --git a/code/modules/unit_tests/mob_chains.dm b/code/modules/unit_tests/mob_chains.dm new file mode 100644 index 000000000000..503c80cf91bf --- /dev/null +++ b/code/modules/unit_tests/mob_chains.dm @@ -0,0 +1,31 @@ +/// Checks if mobs who are linked together with the mob chain component react as expected +/datum/unit_test/mob_chains + +/datum/unit_test/mob_chains/Run() + var/mob/living/centipede_head = allocate(/mob/living/basic/pet/dog) + var/list/segments = list(centipede_head) + centipede_head.AddComponent(/datum/component/mob_chain) + var/mob/living/centipede_tail = centipede_head + for (var/i in 1 to 2) + var/mob/living/new_segment = allocate(/mob/living/basic/pet/dog) + new_segment.AddComponent(/datum/component/mob_chain, front = centipede_tail) + segments += new_segment + centipede_tail = new_segment + + var/test_damage = 15 + centipede_head.apply_damage(test_damage, BRUTE) + TEST_ASSERT_EQUAL(centipede_head.bruteloss, 0, "Centipede head took damage which should have been passed to its tail.") + TEST_ASSERT_EQUAL(centipede_tail.bruteloss, test_damage, "Centipede tail did not take damage which should have originated from its head.") + + var/expected_damage = 5 + for (var/mob/living/segment as anything in segments) + segment.istate |= ISTATE_HARM + segment.melee_damage_lower = expected_damage + segment.melee_damage_upper = expected_damage + + var/mob/living/victim = allocate(/mob/living/basic/pet/dog) + centipede_head.ClickOn(victim) + TEST_ASSERT_EQUAL(victim.bruteloss, expected_damage * 3, "Centipede failed to do damage with all of its segments.") + + centipede_head.death() + TEST_ASSERT_EQUAL(centipede_tail.stat, DEAD, "Centipede tail failed to die with head.") diff --git a/code/modules/unit_tests/modify_fantasy_variable.dm b/code/modules/unit_tests/modify_fantasy_variable.dm new file mode 100644 index 000000000000..d78c1d1dac74 --- /dev/null +++ b/code/modules/unit_tests/modify_fantasy_variable.dm @@ -0,0 +1,21 @@ +// Unit test to make sure that there are no duplicate keys when modify_fantasy_variable is called when applying fantasy bonuses. +// Also to make sure the fantasy_modifications list is null when fantasy bonuses are removed. +/datum/unit_test/modify_fantasy_variable/Run() + + for(var/obj/item/path as anything in subtypesof(/obj/item)) + var/obj/item/object = allocate(path) + // Try positive + object.apply_fantasy_bonuses(bonus = 5) + object.remove_fantasy_bonuses(bonus = 5) + TEST_ASSERT_NULL(object.fantasy_modifications) + // Then negative + object.apply_fantasy_bonuses(bonus = -5) + object.remove_fantasy_bonuses(bonus = -5) + TEST_ASSERT_NULL(object.fantasy_modifications) + // Now try the extremes of each + object.apply_fantasy_bonuses(bonus = 500) + object.remove_fantasy_bonuses(bonus = 500) + TEST_ASSERT_NULL(object.fantasy_modifications) + object.apply_fantasy_bonuses(bonus = -500) + object.remove_fantasy_bonuses(bonus = -500) + TEST_ASSERT_NULL(object.fantasy_modifications) diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_cyberpolice.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_cyberpolice.png index ac8a6347bbd7..2a2adf34765a 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_cyberpolice.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_cyberpolice.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_floran.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_floran.png new file mode 100644 index 000000000000..945f46a2153b Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_floran.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard.png index 3bd5efdc3896..8d4ce08d1afd 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_ashwalker.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_ashwalker.png index 92b82d57d685..47533d89deb4 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_ashwalker.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_ashwalker.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_silverscale.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_silverscale.png index 5d2f36315973..5cdf85338431 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_silverscale.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_silverscale.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_simian.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_simian.png index 079c292cb9bb..e7bea2e1bb64 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_simian.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_simian.png differ diff --git a/code/modules/unit_tests/spell_shapeshift.dm b/code/modules/unit_tests/spell_shapeshift.dm index 4e2ce6590037..d99c7f576f0d 100644 --- a/code/modules/unit_tests/spell_shapeshift.dm +++ b/code/modules/unit_tests/spell_shapeshift.dm @@ -87,7 +87,7 @@ shift.shapeshift_type = shift.possible_shapes[1] shift.Grant(dummy) - var/mob/living/simple_animal/hostile/guardian/test_stand = allocate(/mob/living/simple_animal/hostile/guardian) + var/mob/living/basic/guardian/test_stand = allocate(/mob/living/basic/guardian) test_stand.set_summoner(dummy) // The stand's summoner is dummy. diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index efd1290d00db..0f21d7a243fc 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -221,7 +221,7 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) fdel(file_name) file(file_name) << json_encode(test_results) - SSticker.force_ending = TRUE + SSticker.force_ending = ADMIN_FORCE_END_ROUND //We have to call this manually because del_text can preceed us, and SSticker doesn't fire in the post game SSticker.declare_completion() diff --git a/code/modules/uplink/uplink_items/badass.dm b/code/modules/uplink/uplink_items/badass.dm index 1fb7fab4964e..c1f4ac3a695e 100644 --- a/code/modules/uplink/uplink_items/badass.dm +++ b/code/modules/uplink/uplink_items/badass.dm @@ -82,3 +82,16 @@ desc = "Contains 8 random stickers precisely engineered to resemble suspicious objects, which may or may not be useful for fooling crew." item = /obj/item/storage/box/syndie_kit/stickers cost = 1 + +/datum/uplink_item/badass/demotivational_posters + name = "Syndicate Demotivational Poster Pack" + desc = "Contains a selection of demotivational posters to minimise productivity and maximise apathy in the workplace." + item = /obj/item/storage/box/syndie_kit/poster_box + cost = 1 + +/datum/uplink_item/badass/syndie_spraycan + name = "Syndicate Spraycan" + desc = "A stylish Syndicate spraycan. \ + Contains enough special solution to spray a single super-size seditious symbol, subjecting station staff to slippery suffering." + item = /obj/item/traitor_spraycan + cost = 1 diff --git a/code/modules/uplink/uplink_items/bundle.dm b/code/modules/uplink/uplink_items/bundle.dm index 2ce0de0f5733..708d255ea8a1 100644 --- a/code/modules/uplink/uplink_items/bundle.dm +++ b/code/modules/uplink/uplink_items/bundle.dm @@ -17,19 +17,26 @@ /datum/uplink_item/bundles_tc/random/purchase(mob/user, datum/uplink_handler/handler, atom/movable/source) var/list/possible_items = list() + var/ignore_locked = check_ignore_locked(handler) //monkestation edit for(var/datum/uplink_item/item_path as anything in SStraitor.uplink_items_by_type) var/datum/uplink_item/uplink_item = SStraitor.uplink_items_by_type[item_path] if(src == uplink_item || !uplink_item.item) continue - if(!handler.can_purchase_item(user, uplink_item)) + if(!handler.can_purchase_item(user, uplink_item, ignore_locked)) //monkestation edit: adds ignore_locked continue possible_items += uplink_item +//monkestation edit start, this is the less snowflakey more janky way to handle this + var/debug_mode = handler.debug_mode + if(ignore_locked) + handler.debug_mode = TRUE +//monkestation edit end if(possible_items.len) var/datum/uplink_item/uplink_item = pick(possible_items) log_uplink("[key_name(user)] purchased a random uplink item from [handler.owner]'s uplink with [handler.telecrystals] telecrystals remaining") SSblackbox.record_feedback("tally", "traitor_random_uplink_items_gotten", 1, initial(uplink_item.name)) handler.purchase_item(user, uplink_item) + handler.debug_mode = debug_mode //monkestation edit /datum/uplink_item/bundles_tc/telecrystal name = "1 Raw Telecrystal" @@ -80,24 +87,25 @@ name = "Syndicate Surplus Crate" desc = "A dusty crate from the back of the Syndicate warehouse delivered directly to you via Supply Pod. \ If the rumors are true, it will fill it's contents based on your current reputation. Get on that grind. \ - Contents are sorted to always be worth 30 TC. The Syndicate will only provide one surplus item per agent." + Contents are sorted to always be worth 40 TC. The Syndicate will only provide one surplus item per agent." item = /obj/structure/closet/crate // will be replaced in purchase() cost = 20 purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) stock_key = UPLINK_SHARED_STOCK_SURPLUS /// Value of items inside the crate in TC - var/crate_tc_value = 30 + var/crate_tc_value = 40 //monkestation edit: from 30 to 40 /// crate that will be used for the surplus crate var/crate_type = /obj/structure/closet/crate /// generates items that can go inside crates, edit this proc to change what items could go inside your specialized crate -/datum/uplink_item/bundles_tc/surplus/proc/generate_possible_items(mob/user, datum/uplink_handler/handler) +/// monkestation edit: set unrestricted to TRUE if you want to pick from all uplink items +/datum/uplink_item/bundles_tc/surplus/proc/generate_possible_items(mob/user, datum/uplink_handler/handler, unrestricted = FALSE) //monkestation edit: adds unrestricted var/list/possible_items = list() for(var/datum/uplink_item/item_path as anything in SStraitor.uplink_items_by_type) var/datum/uplink_item/uplink_item = SStraitor.uplink_items_by_type[item_path] if(src == uplink_item || !uplink_item.item) continue - if(!handler.check_if_restricted(uplink_item)) + if(!unrestricted && !handler.check_if_restricted(uplink_item)) //monkestation edit: adds the unrestricted check continue if(!uplink_item.surplus) continue @@ -130,6 +138,13 @@ CRASH("crate_type is not a crate") var/list/possible_items = generate_possible_items(user, handler) +//monkestation edit start + if(!possible_items || !length(possible_items)) + handler.telecrystals += cost + to_chat(user, span_warning("You get the feeling something went wrong and that you should inform syndicate command")) + qdel(surplus_crate) + CRASH("surplus crate failed to generate possible items") +//monkestation edit end fill_crate(surplus_crate, possible_items) podspawn(list( @@ -143,13 +158,13 @@ name = "United Surplus Crate" desc = "A shiny and large crate to be delivered directly to you via Supply Pod. It has an advanced locking mechanism with an anti-tampering protocol. \ It is recommended that you only attempt to open it by having another agent purchase a Surplus Crate Key. Unite and fight. \ - Rumored to contain a valuable assortment of items based on your current reputation, but you never know. Contents are sorted to always be worth 80 TC. \ + Rumored to contain a valuable assortment of items based on your current reputation, but you never know. Contents are sorted to always be worth 100 TC. \ The Syndicate will only provide one surplus item per agent." cost = 20 item = /obj/structure/closet/crate/syndicrate progression_minimum = 30 MINUTES stock_key = UPLINK_SHARED_STOCK_SURPLUS - crate_tc_value = 80 + crate_tc_value = 100 //monkestation edit: from 80 to 100 crate_type = /obj/structure/closet/crate/syndicrate /// edited version of fill crate for super surplus to ensure it can only be unlocked with the syndicrate key diff --git a/code/modules/uplink/uplink_items/dangerous.dm b/code/modules/uplink/uplink_items/dangerous.dm index b9f9bdd08f63..5452b60d9a67 100644 --- a/code/modules/uplink/uplink_items/dangerous.dm +++ b/code/modules/uplink/uplink_items/dangerous.dm @@ -12,7 +12,7 @@ darts effective at incapacitating a target." item = /obj/item/gun/ballistic/automatic/pistol/toy/riot cost = 2 - surplus = 10 + surplus = 50 //monkestation edit: from 10 to 50 purchasable_from = ~UPLINK_NUKE_OPS /datum/uplink_item/dangerous/pistol @@ -84,9 +84,9 @@ desc = "Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, they require an \ organic host as a home base and source of fuel. Holoparasites come in various types and share damage with their host." progression_minimum = 30 MINUTES - item = /obj/item/guardiancreator/tech/choose/traitor + item = /obj/item/guardian_creator/tech cost = 18 - surplus = 0 + surplus = 40 //monkestation edit: from 0 to 40 purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) restricted = TRUE @@ -98,14 +98,3 @@ cost = 13 surplus = 50 purchasable_from = ~UPLINK_CLOWN_OPS - -/datum/uplink_item/dangerous/laser_musket - name = "Syndicate Laser Musket" - desc = "An exprimental 'rifle' designed by Aethrofusion. This laser(probably) uses alien technology to fit 4 high energy capacitors \ - into a small rifle which can be stored safely(?) in any backpack. To charge, simply press down on the main control panel. \ - Rumors of this 'siphoning power off your lifeforce' are greatly exaggerated, and Aethrofusion assures safety for up to 2 years of use." - item = /obj/item/gun/energy/laser/musket/syndicate - progression_minimum = 30 MINUTES - cost = 12 - surplus = 40 - purchasable_from = ~UPLINK_CLOWN_OPS diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm index b5012ab4f885..aff270bd80fa 100644 --- a/code/modules/uplink/uplink_items/device_tools.dm +++ b/code/modules/uplink/uplink_items/device_tools.dm @@ -69,7 +69,7 @@ name = "Briefcase Launchpad" desc = "A briefcase containing a launchpad, a device able to teleport items and people to and from targets up to eight tiles away from the briefcase. \ Also includes a remote control, disguised as an ordinary folder. Touch the briefcase with the remote to link it." - surplus = 0 + surplus = 30 //monkestation edit: from 0 to 30 item = /obj/item/storage/briefcase/launchpad cost = 6 @@ -245,7 +245,7 @@ progression_minimum = 30 MINUTES item = /obj/item/sbeacondrop cost = 10 - surplus = 0 // not while there isnt one on any station + surplus = 50 // not while there isnt one on any station, monkestation edit: from 0 to 50, we have them purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) /datum/uplink_item/device_tools/powersink diff --git a/code/modules/uplink/uplink_items/explosive.dm b/code/modules/uplink/uplink_items/explosive.dm index 27145ccf004d..095b2e4cea65 100644 --- a/code/modules/uplink/uplink_items/explosive.dm +++ b/code/modules/uplink/uplink_items/explosive.dm @@ -67,7 +67,7 @@ progression_minimum = 30 MINUTES item = /obj/item/pizzabox/bomb cost = 6 - surplus = 8 + surplus = 30 //monkestation edit: from 8 to 30 /datum/uplink_item/explosives/syndicate_minibomb name = "Syndicate Minibomb" diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index b754ed2ff94f..fad2f28193c3 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -23,7 +23,7 @@ limited_stock = 1 item = /obj/item/devices/bureaucratic_error_remote restricted_roles = list(JOB_HEAD_OF_PERSONNEL, JOB_QUARTERMASTER) - surplus = 5 + surplus = 40 //monkestation edit: from 5 to 40 /datum/uplink_item/role_restricted/clumsinessinjector //clown ops can buy this too, but it's in the pointless badassery section for them name = "Clumsiness Injector" @@ -57,7 +57,7 @@ item = /obj/item/firing_pin/clown/ultra restricted_roles = list(JOB_CLOWN) illegal_tech = FALSE - surplus = 25 + surplus = 0 //monkestation edit: from 25 to 0 /datum/uplink_item/role_restricted/clownsuperpin name = "Super Ultra Hilarious Firing Pin" @@ -66,7 +66,7 @@ item = /obj/item/firing_pin/clown/ultra/selfdestruct restricted_roles = list(JOB_CLOWN) illegal_tech = FALSE - surplus = 25 + surplus = 0 //monkestation edit: from 25 to 0 /datum/uplink_item/role_restricted/syndimmi name = "Syndicate Brand MMI" @@ -99,7 +99,7 @@ The acid only affects carbon-based creatures." item = /obj/item/storage/box/syndie_kit/ez_clean cost = 6 - surplus = 20 + surplus = 40 //monkestation edit: from 20 to 40 restricted_roles = list(JOB_JANITOR) /datum/uplink_item/role_restricted/reverse_bear_trap @@ -238,7 +238,7 @@ item = /obj/item/sbeacondrop/clownbomb cost = 15 restricted_roles = list(JOB_CLOWN) - surplus = 10 + surplus = 50 //monkestation edit: from 10 to 50 /datum/uplink_item/role_restricted/clown_bomb/New() . = ..() @@ -311,3 +311,10 @@ cost = 14 //High cost because of the potential for extreme damage in the hands of a skilled scientist. restricted_roles = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST) surplus = 5 + +/datum/uplink_item/role_restricted/evil_seedling + name = "Evil Seedling" + desc = "A rare seed we have recovered that grows into a dangerous species that will aid you with your tasks!" + item = /obj/item/seeds/seedling/evil + cost = 8 + restricted_roles = list(JOB_BOTANIST) diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index 70ca0377e8ce..85362d74506a 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -70,7 +70,7 @@ and returning to you even if you miss. WARNING: DO NOT ATTEMPT TO STAND ON SHIELD WHILE DEPLOYED, EVEN IF WEARING ANTI-SLIP SHOES." item = /obj/item/shield/energy/bananium cost = 16 - surplus = 0 + surplus = 40 //monkestation edit: from 0 to 40 purchasable_from = UPLINK_CLOWN_OPS /datum/uplink_item/dangerous/clownsword @@ -79,7 +79,7 @@ impact, or just stepping on it. Beware friendly fire, as even anti-slip shoes will not protect against it." item = /obj/item/melee/energy/sword/bananium cost = 3 - surplus = 0 + surplus = 100 //monkestation edit: from 0 to 100(its funny) purchasable_from = UPLINK_CLOWN_OPS /datum/uplink_item/dangerous/clownoppin @@ -122,7 +122,7 @@ against other attacks. Pair with an Energy Sword for a killer combination." item = /obj/item/shield/energy cost = 16 - surplus = 20 + surplus = 40 //monkestation edit: from 20 to 40 purchasable_from = UPLINK_NUKE_OPS /datum/uplink_item/dangerous/machinegun @@ -131,7 +131,7 @@ This deadly weapon has a massive 50-round magazine of devastating 7.12x82mm ammunition." item = /obj/item/gun/ballistic/automatic/l6_saw cost = 18 - surplus = 0 + surplus = 10 //monkestation edit: from 0 to 10 purchasable_from = UPLINK_NUKE_OPS /datum/uplink_item/dangerous/carbine @@ -172,7 +172,7 @@ desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade darts with a 20-round magazine." item = /obj/item/gun/ballistic/automatic/c20r/toy cost = 5 - surplus = 0 + surplus = 70 //monkestation edit: from 0 to 70 purchasable_from = UPLINK_CLOWN_OPS /datum/uplink_item/dangerous/foammachinegun @@ -181,7 +181,7 @@ riot grade darts, that can briefly incapacitate someone in just one volley." item = /obj/item/gun/ballistic/automatic/l6_saw/toy cost = 10 - surplus = 0 + surplus = 70 //monkestation edit: from 0 to 70 purchasable_from = UPLINK_CLOWN_OPS /datum/uplink_item/stealthy_weapons/cqc @@ -190,7 +190,7 @@ item = /obj/item/book/granter/martial/cqc purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS cost = 13 - surplus = 0 + surplus = 60 //monkestation edit: from 0 to 60 /datum/uplink_item/ammo/pistol_nukeop name = "10mm Handgun Magazine" @@ -440,7 +440,7 @@ a few seconds after the banana is eaten." item = /obj/item/food/grown/banana/bombanana cost = 4 //it is a bit cheaper than a minibomb because you have to take off your helmet to eat it, which is how you arm it - surplus = 0 + surplus = 60 //monkestation edit: from 0 to 60 purchasable_from = UPLINK_CLOWN_OPS /datum/uplink_item/explosives/clown_bomb_clownops @@ -485,7 +485,7 @@ item = /obj/item/storage/belt/grenade/full purchasable_from = UPLINK_NUKE_OPS cost = 22 - surplus = 0 + surplus = 70 //monkestation edit: from 0 to 70 /datum/uplink_item/explosives/syndicate_detonator name = "Syndicate Detonator" @@ -503,7 +503,7 @@ remain attached to the face of all targets for one minute, preventing the use of breath masks and other such devices." item = /obj/item/grenade/chem_grenade/teargas/moustache cost = 3 - surplus = 0 + surplus = 80 //monkestation edit: from 0 to 80 purchasable_from = UPLINK_CLOWN_OPS /datum/uplink_item/explosives/viscerators @@ -522,7 +522,7 @@ purchasable_from = UPLINK_CLOWN_OPS limited_stock = 1 cost = 12 //This is effectively the clown ops version of the grenadier belt where you should on average get 8 explosives if you use a weapon with exactly 10 force. - surplus = 0 + surplus = 60 //monkestation edit: from 0 to 60 //Support and Mechs /datum/uplink_category/support @@ -615,7 +615,7 @@ squeak significantly louder." item = /obj/item/clothing/shoes/clown_shoes/banana_shoes/combat cost = 6 - surplus = 0 + surplus = 100 //monkestation edit: from 0 to 100 HONK purchasable_from = UPLINK_CLOWN_OPS /datum/uplink_item/stealthy_tools/syndigaloshes/nuke @@ -717,7 +717,7 @@ desc = "This implant will help you get back up on your feet faster after being stunned. Comes with an autosurgeon." item = /obj/item/autosurgeon/syndicate/anti_stun cost = 12 - surplus = 0 + surplus = 40 //monkestation edit: from 0 to 40 purchasable_from = UPLINK_NUKE_OPS /datum/uplink_item/implants/microbomb @@ -743,7 +743,7 @@ desc = "This implant will attempt to revive and heal you if you lose consciousness. Comes with an autosurgeon." item = /obj/item/autosurgeon/syndicate/reviver cost = 8 - surplus = 0 + surplus = 30 //monkestation edit: from 0 to 30 purchasable_from = UPLINK_NUKE_OPS /datum/uplink_item/implants/thermals @@ -751,7 +751,7 @@ desc = "These cybernetic eyes will give you thermal vision. Comes with a free autosurgeon." item = /obj/item/autosurgeon/syndicate/thermal_eyes cost = 8 - surplus = 0 + surplus = 40 //monkestation edit: from 0 to 40 purchasable_from = UPLINK_NUKE_OPS /datum/uplink_item/implants/xray @@ -759,7 +759,7 @@ desc = "These cybernetic eyes will give you X-ray vision. Comes with an autosurgeon." item = /obj/item/autosurgeon/syndicate/xray_eyes cost = 10 - surplus = 0 + surplus = 30 //monkestation edit: from 0 to 30 purchasable_from = UPLINK_NUKE_OPS /datum/uplink_item/implants/deathrattle diff --git a/code/modules/uplink/uplink_items/species.dm b/code/modules/uplink/uplink_items/species.dm index aa9c727d6e8b..fa42da23dc9b 100644 --- a/code/modules/uplink/uplink_items/species.dm +++ b/code/modules/uplink/uplink_items/species.dm @@ -13,6 +13,6 @@ cost = 2 item = /obj/item/flashlight/lantern/syndicate restricted_species = list(SPECIES_MOTH) - surplus = 0 + surplus = 80 //monkestation edit: from 0 to 80 diff --git a/code/modules/uplink/uplink_items/stealthy.dm b/code/modules/uplink/uplink_items/stealthy.dm index 54c9bbe9adcf..005384c3f762 100644 --- a/code/modules/uplink/uplink_items/stealthy.dm +++ b/code/modules/uplink/uplink_items/stealthy.dm @@ -67,7 +67,7 @@ item = /obj/item/storage/box/syndie_kit/origami_bundle progression_minimum = 10 MINUTES cost = 4 - surplus = 0 + surplus = 50 //monkestation edit: from 0 to 50 purchasable_from = ~UPLINK_NUKE_OPS //clown ops intentionally left in, because that seems like some s-tier shenanigans. @@ -78,7 +78,7 @@ item = /obj/item/book/granter/martial/carp progression_minimum = 30 MINUTES cost = 13 - surplus = 0 + surplus = 30 //monkestation edit: from 0 to 30 purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) /datum/uplink_item/stealthy_weapons/crossbow @@ -90,7 +90,16 @@ slur as if inebriated. It can produce an infinite number \ of bolts, but takes time to automatically recharge after each shot." item = /obj/item/gun/energy/recharge/ebow - progression_minimum = 30 MINUTES cost = 10 surplus = 50 purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + +/datum/uplink_item/stealthy_weapons/contrabaton + name = "Contractor Baton" + desc = "A compact, specialised baton assigned to Syndicate contractors. Applies light electrical shocks to targets. \ + These shocks are capable of affecting the inner circuitry of most robots as well, applying a short stun. \ + Has the added benefit of affecting the vocal cords of your victim, causing them to slur as if inebriated." + item = /obj/item/melee/baton/telescopic/contractor_baton + cost = 12 + surplus = 50 + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index d2d5b3a6af30..abebe8264925 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -117,12 +117,11 @@ smoke.start() /obj/vehicle/ridden/atv/bullet_act(obj/projectile/P) - if(prob(50) || !buckled_mobs) + if(prob(50) || !LAZYLEN(buckled_mobs)) return ..() - for(var/m in buckled_mobs) - var/mob/buckled_mob = m + for(var/mob/buckled_mob as anything in buckled_mobs) buckled_mob.bullet_act(P) - return TRUE + return BULLET_ACT_HIT /obj/vehicle/ridden/atv/atom_destruction() explosion(src, devastation_range = -1, light_impact_range = 2, flame_range = 3, flash_range = 4) diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index b90cb6267468..edf25bb96982 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -119,11 +119,11 @@ if(prob(35)) //Note: The randomstep on dump_mobs throws occupants into each other and often causes wounds regardless. continue for(var/obj/item/bodypart/head/head_to_wound as anything in carbon_occupant.bodyparts) - var/type_wound = pick(list( - /datum/wound/blunt/moderate, - /datum/wound/blunt/severe, - )) - head_to_wound.force_wound_upwards(type_wound) + var/pick_mode = text2num(pick(list( + "[WOUND_PICK_LOWEST_SEVERITY]", + "[WOUND_PICK_HIGHEST_SEVERITY]" + ))) + carbon_occupant.cause_wound_of_type_and_severity(WOUND_BLUNT, head_to_wound, WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_SEVERE, pick_mode) carbon_occupant.playsound_local(src, 'sound/weapons/flash_ring.ogg', 50) carbon_occupant.set_eye_blur_if_lower(rand(10 SECONDS, 20 SECONDS)) diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index 8d3af6041c22..4de7cd72f65b 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -261,7 +261,7 @@ own integrity back to max. Shield is automatically dropped if we run out of powe setDir(newdir) -/obj/durand_shield/take_damage() +/obj/durand_shield/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) if(!chassis) qdel(src) return diff --git a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm index 08a996fbd88f..8ea4ac076358 100644 --- a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm +++ b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm @@ -292,7 +292,7 @@ /** * ## end_missile_targeting * - * Called by the ivanov strike datum action or other actions that would end targetting + * Called by the ivanov strike datum action or other actions that would end targeting * Unhooks signals into clicking to call drop_missile plus other flavor like the overlay */ /datum/action/vehicle/sealed/mecha/ivanov_strike/proc/end_missile_targeting() diff --git a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm index e925710397ff..4c766d669d44 100644 --- a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm +++ b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm @@ -111,7 +111,7 @@ * Cooldown proc variant for using do_afters between activations instead of timers * Example of usage is mech drills, rcds * arguments: - * * target: targetted atom for action activation + * * target: targeted atom for action activation * * user: occupant to display do after for * * interaction_key: interaction key to pass to [/proc/do_after] */ diff --git a/code/modules/vehicles/mecha/mecha_construction_paths.dm b/code/modules/vehicles/mecha/mecha_construction_paths.dm index 7df97650d0ea..bab8f3fe3536 100644 --- a/code/modules/vehicles/mecha/mecha_construction_paths.dm +++ b/code/modules/vehicles/mecha/mecha_construction_paths.dm @@ -493,7 +493,7 @@ list( "key" = /obj/item/circuitboard/mecha/honker/targeting, "action" = ITEM_DELETE, - "desc" = "Prank targetting board can be added!", + "desc" = "Prank targeting board can be added!", "forward_message" = "added prank" ), list( diff --git a/code/modules/vehicles/mecha/mecha_damage.dm b/code/modules/vehicles/mecha/mecha_damage.dm index bc5d95d552c9..85d93e0ac50f 100644 --- a/code/modules/vehicles/mecha/mecha_damage.dm +++ b/code/modules/vehicles/mecha/mecha_damage.dm @@ -9,7 +9,7 @@ * Pretty simple, adds armor, you can choose against what * ## Internal damage * When taking damage will force you to take some time to repair, encourages improvising in a fight - * Targetting different def zones will damage them to encurage a more strategic approach to fights + * Targeting different def zones will damage them to encurage a more strategic approach to fights * where they target the "dangerous" modules */ diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index bf48b1b8267c..7db061b0383d 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -9,11 +9,11 @@ * Pretty simple, adds armor, you can choose against what * ## Internal damage * When taking damage will force you to take some time to repair, encourages improvising in a fight - * Targetting different def zones will damage them to encurage a more strategic approach to fights + * Targeting different def zones will damage them to encurage a more strategic approach to fights * where they target the "dangerous" modules */ -/// tries to damage mech equipment depending on damage and where is being targetted +/// tries to damage mech equipment depending on damage and where is being targeted /obj/vehicle/sealed/mecha/proc/try_damage_component(damage, def_zone) if(damage < component_damage_threshold) return @@ -114,10 +114,19 @@ return ..() /obj/vehicle/sealed/mecha/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit) //wrapper - if(!enclosed && LAZYLEN(occupants) && !(mecha_flags & SILICON_PILOT) && (hitting_projectile.def_zone == BODY_ZONE_HEAD || hitting_projectile.def_zone == BODY_ZONE_CHEST)) //allows bullets to hit the pilot of open-canopy mechs + . = ..() + if(. != BULLET_ACT_HIT) + return . + + //allows bullets to hit the pilot of open-canopy mechs + if(!enclosed \ + && LAZYLEN(occupants) \ + && !(mecha_flags & SILICON_PILOT) \ + && (def_zone == BODY_ZONE_HEAD || def_zone == BODY_ZONE_CHEST)) for(var/mob/living/hitmob as anything in occupants) hitmob.bullet_act(hitting_projectile, def_zone, piercing_hit) //If the sides are open, the occupant can be hit return BULLET_ACT_HIT + log_message("Hit by projectile. Type: [hitting_projectile]([hitting_projectile.damage_type]).", LOG_MECHA, color="red") // yes we *have* to run the armor calc proc here I love tg projectile code too try_damage_component(run_atom_armor( @@ -126,8 +135,7 @@ damage_flag = hitting_projectile.armor_flag, attack_dir = REVERSE_DIR(hitting_projectile.dir), armour_penetration = hitting_projectile.armour_penetration, - ), hitting_projectile.def_zone) - return ..() + ), def_zone) /obj/vehicle/sealed/mecha/ex_act(severity, target) log_message("Affected by explosion of severity: [severity].", LOG_MECHA, color="red") diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 270ced11cec0..810af6e0d1a4 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -74,9 +74,14 @@ ///The ref of the last mob to shop with us var/last_shopper var/tilted = FALSE + /// If tilted, this variable should always be the rotation that was applied when we were tilted. Stored for the purposes of unapplying it. + var/tilted_rotation = 0 var/tiltable = TRUE var/squish_damage = 75 - var/forcecrit = 0 + /// The chance, in percent, of this vendor performing a critical hit on anything it crushes via [tilt]. + var/crit_chance = 15 + /// If set to a critical define in crushing.dm, anything this vendor crushes will always be hit with that effect. + var/forcecrit = null var/num_shards = 7 var/list/pinned_mobs = list() ///Icon for the maintenance panel overlay @@ -629,10 +634,8 @@ freebie(user, 1) if(26 to 75) return - if(76 to 90) + if(76 to 100) tilt(user) - if(91 to 100) - tilt(user, crit=TRUE) /obj/machinery/vending/proc/freebie(mob/fatty, freebies) visible_message(span_notice("[src] yields [freebies > 1 ? "several free goodies" : "a free goody"]!")) @@ -655,119 +658,324 @@ R.amount-- break -///Tilts ontop of the atom supplied, if crit is true some extra shit can happen. Returns TRUE if it dealt damage to something. -/obj/machinery/vending/proc/tilt(atom/fatty, crit=FALSE) +/// Tilts ontop of the atom supplied, if crit is true some extra shit can happen. See [fall_and_crush] for return values. +/obj/machinery/vending/proc/tilt(atom/fatty, local_crit_chance = crit_chance, forced_crit = forcecrit) if(QDELETED(src) || !has_gravity(src)) return - visible_message(span_danger("[src] tips over!")) - tilted = TRUE - layer = ABOVE_MOB_LAYER - SET_PLANE_IMPLICIT(src, GAME_PLANE_UPPER) - var/crit_case - if(crit) - crit_case = rand(1,6) + . = NONE - if(forcecrit) - crit_case = forcecrit + var/picked_rotation = pick(90, 270) + if(Adjacent(fatty)) + . = fall_and_crush(get_turf(fatty), squish_damage, local_crit_chance, forced_crit, 6 SECONDS, rotation = picked_rotation) - . = FALSE + if (. & SUCCESSFULLY_FELL_OVER) + visible_message(span_danger("[src] tips over!")) + tilted = TRUE + tilted_rotation = picked_rotation + layer = ABOVE_MOB_LAYER + SET_PLANE_IMPLICIT(src, GAME_PLANE_UPPER) - if(Adjacent(fatty)) - for(var/mob/living/L in get_turf(fatty)) - var/was_alive = (L.stat != DEAD) - var/mob/living/carbon/C = L - - SEND_SIGNAL(L, COMSIG_ON_VENDOR_CRUSH) - - - if(istype(C)) - var/crit_rebate = 0 // lessen the normal damage we deal for some of the crits - - if(crit_case < 5) // the body/head asplode case has its own description - C.visible_message(span_danger("[C] is crushed by [src]!"), \ - span_userdanger("You are crushed by [src]!")) - - switch(crit_case) // only carbons can have the fun crits - if(1) // shatter their legs and bleed 'em - crit_rebate = 60 - C.bleed(150) - var/obj/item/bodypart/leg/left/l = C.get_bodypart(BODY_ZONE_L_LEG) - if(l) - l.receive_damage(brute=200) - var/obj/item/bodypart/leg/right/r = C.get_bodypart(BODY_ZONE_R_LEG) - if(r) - r.receive_damage(brute=200) - if(l || r) - C.visible_message(span_danger("[C]'s legs shatter with a sickening crunch!"), \ - span_userdanger("Your legs shatter with a sickening crunch!")) - if(2) // pin them beneath the machine until someone untilts it - forceMove(get_turf(C)) - buckle_mob(C, force=TRUE) - C.visible_message(span_danger("[C] is pinned underneath [src]!"), \ - span_userdanger("You are pinned down by [src]!")) - if(3) // glass candy - crit_rebate = 50 - for(var/i in 1 to num_shards) - var/obj/item/shard/shard = new /obj/item/shard(get_turf(C)) - shard.embedding = list(embed_chance = 100, ignore_throwspeed_threshold = TRUE, impact_pain_mult=1, pain_chance=5) - shard.updateEmbedding() - C.hitby(shard, skipcatch = TRUE, hitpush = FALSE) - shard.embedding = list() - shard.updateEmbedding() - if(4) // paralyze this binch - // the new paraplegic gets like 4 lines of losing their legs so skip them - visible_message(span_danger("[C]'s spinal cord is obliterated with a sickening crunch!"), ignored_mobs = list(C)) - C.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic) - if(5) // limb squish! - for(var/i in C.bodyparts) - var/obj/item/bodypart/squish_part = i - if(IS_ORGANIC_LIMB(squish_part)) - var/type_wound = pick(list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate)) - squish_part.force_wound_upwards(type_wound) - else - squish_part.receive_damage(brute=30) - C.visible_message(span_danger("[C]'s body is maimed underneath the mass of [src]!"), \ - span_userdanger("Your body is maimed underneath the mass of [src]!")) - if(6) // skull squish! - var/obj/item/bodypart/head/O = C.get_bodypart(BODY_ZONE_HEAD) - if(O) - if(O.dismember()) - C.visible_message(span_danger("[O] explodes in a shower of gore beneath [src]!"), \ - span_userdanger("Oh f-")) - O.drop_organs() - qdel(O) - new /obj/effect/gibspawner/human/bodypartless(get_turf(C)) - - if(prob(30)) - C.apply_damage(max(0, squish_damage - crit_rebate), forced=TRUE, spread_damage=TRUE) // the 30% chance to spread the damage means you escape breaking any bones + if(get_turf(fatty) != get_turf(src)) + throw_at(get_turf(fatty), 1, 1, spin = FALSE, quickstart = FALSE) + +/** + * Exists for the purposes of custom behavior. + * Called directly after [crushed] is crushed. + * + * Args: + * * mob/living/crushed: The mob that was crushed. + * * was_alive: Boolean. True if the mob was alive before the crushing. + */ +/atom/movable/proc/post_crush_living(mob/living/crushed, was_alive) + return + +/** + * Exists for the purposes of custom behavior. + * Called directly after src actually rotates and falls over. + */ +/atom/movable/proc/post_tilt() + return + +/obj/machinery/vending/post_crush_living(mob/living/crushed, was_alive) + + if(was_alive && crushed.stat == DEAD && crushed.client) + crushed.client.give_award(/datum/award/achievement/misc/vendor_squish, crushed) // good job losing a fight with an inanimate object idiot + + add_memory_in_range(crushed, 7, /datum/memory/witness_vendor_crush, protagonist = crushed, antagonist = src) + + return ..() + + +/obj/machinery/vending/apply_crit_crush(crit_case, atom_target) + . = ..() + + if (.) + return TRUE + + switch (crit_case) + if (VENDOR_CRUSH_CRIT_GLASSCANDY) + if (!iscarbon(atom_target)) + return FALSE + var/mob/living/carbon/carbon_target = atom_target + for(var/i in 1 to num_shards) + var/obj/item/shard/shard = new /obj/item/shard(get_turf(carbon_target)) + shard.embedding = list(embed_chance = 100, ignore_throwspeed_threshold = TRUE, impact_pain_mult = 1, pain_chance = 5) + shard.updateEmbedding() + carbon_target.hitby(shard, skipcatch = TRUE, hitpush = FALSE) + shard.embedding = list() + shard.updateEmbedding() + return TRUE + if (VENDOR_CRUSH_CRIT_PIN) // pin them beneath the machine until someone untilts it + if (!isliving(atom_target)) + return FALSE + var/mob/living/living_target = atom_target + forceMove(get_turf(living_target)) + buckle_mob(living_target, force=TRUE) + living_target.visible_message(span_danger("[living_target] is pinned underneath [src]!"), span_userdanger("You are pinned down by [src]!")) + return TRUE + + return FALSE + +/** + * Causes src to fall onto [target], crushing everything on it (including itself) with [damage] + * and a small chance to do a spectacular effect per entity (if a chance above 0 is provided). + * + * Args: + * * turf/target: The turf to fall onto. Cannot be null. + * * damage: The raw numerical damage to do by default. + * * chance_to_crit: The percent chance of a critical hit occuring. Default: 0 + * * forced_crit_case: If given a value from crushing.dm, [target] and it's contents will always be hit with that specific critical hit. Default: null + * * paralyze_time: The time, in deciseconds, a given mob/living will be paralyzed for if crushed. + * * crush_dir: The direction the crush is coming from. Default: dir of src to [target]. + * * damage_type: The type of damage to do. Default: BRUTE + * * damage_flag: The attack flag for armor purposes. Default: MELEE + * * rotation: The angle of which to rotate src's transform by on a successful tilt. Default: 90. + * + * Returns: A collection of bitflags defined in crushing.dm. Read that file's documentation for info. + */ +/atom/movable/proc/fall_and_crush(turf/target, damage, chance_to_crit = 0, forced_crit_case = null, paralyze_time, crush_dir = get_dir(get_turf(src), target), damage_type = BRUTE, damage_flag = MELEE, rotation = 90) + + ASSERT(!isnull(target)) + + var/flags_to_return = NONE + + if (!target.is_blocked_turf(TRUE, src, list(src))) + for(var/atom/atom_target in (target.contents) + target) + if (isarea(atom_target)) + continue + + if (SEND_SIGNAL(atom_target, COMSIG_PRE_TILT_AND_CRUSH, src) & COMPONENT_IMMUNE_TO_TILT_AND_CRUSH) + continue + + var/crit_case = forced_crit_case + if (isnull(crit_case) && chance_to_crit > 0) + if (prob(chance_to_crit)) + crit_case = pick_weight(get_crit_crush_chances()) + var/crit_rebate_mult = 1 // lessen the normal damage we deal for some of the crits + + if (!isnull(crit_case)) + crit_rebate_mult = fall_and_crush_crit_rebate_table(crit_case) + apply_crit_crush(crit_case, atom_target) + + var/adjusted_damage = damage * crit_rebate_mult + var/crushed + if (isliving(atom_target)) + crushed = TRUE + var/mob/living/carbon/living_target = atom_target + var/was_alive = (living_target.stat != DEAD) + var/blocked = living_target.run_armor_check(attack_flag = damage_flag) + if (iscarbon(living_target)) + var/mob/living/carbon/carbon_target = living_target + if(prob(30)) + carbon_target.apply_damage(max(0, adjusted_damage), damage_type, blocked = blocked, forced = TRUE, spread_damage = TRUE, attack_direction = crush_dir) // the 30% chance to spread the damage means you escape breaking any bones + else + var/brute = (damage_type == BRUTE ? damage : 0) * 0.5 + var/burn = (damage_type == BURN ? damage : 0) * 0.5 + carbon_target.take_bodypart_damage(brute, burn, check_armor = TRUE, wound_bonus = 5) // otherwise, deal it to 2 random limbs (or the same one) which will likely shatter something + carbon_target.take_bodypart_damage(brute, burn, check_armor = TRUE, wound_bonus = 5) + carbon_target.AddElement(/datum/element/squish, 80 SECONDS) else - C.take_bodypart_damage((squish_damage - crit_rebate)*0.5, wound_bonus = 5) // otherwise, deal it to 2 random limbs (or the same one) which will likely shatter something - C.take_bodypart_damage((squish_damage - crit_rebate)*0.5, wound_bonus = 5) - C.AddElement(/datum/element/squish, 80 SECONDS) - else - L.visible_message(span_danger("[L] is crushed by [src]!"), \ - span_userdanger("You are crushed by [src]!")) - L.apply_damage(squish_damage, forced=TRUE) - if(crit_case) - L.apply_damage(squish_damage, forced=TRUE) - if(was_alive && L.stat == DEAD && L.client) - L.client.give_award(/datum/award/achievement/misc/vendor_squish, L) // good job losing a fight with an inanimate object idiot - - L.Paralyze(60) - L.emote("scream") - . = TRUE - playsound(L, 'sound/effects/blobattack.ogg', 40, TRUE) - playsound(L, 'sound/effects/splat.ogg', 50, TRUE) - add_memory_in_range(L, 7, /datum/memory/witness_vendor_crush, protagonist = L, antagonist = src) - - var/matrix/M = matrix() - M.Turn(pick(90, 270)) - transform = M + living_target.apply_damage(adjusted_damage, damage_type, blocked = blocked, forced = TRUE, attack_direction = crush_dir) + + living_target.Paralyze(paralyze_time) + living_target.emote("scream") + playsound(living_target, 'sound/effects/blobattack.ogg', 40, TRUE) + playsound(living_target, 'sound/effects/splat.ogg', 50, TRUE) + post_crush_living(living_target, was_alive) + flags_to_return |= (SUCCESSFULLY_CRUSHED_MOB|SUCCESSFULLY_CRUSHED_ATOM) + + else if (atom_target.uses_integrity && !(atom_target.invisibility > SEE_INVISIBLE_LIVING) && !(is_type_in_typecache(atom_target, GLOB.WALLITEMS_INTERIOR) || is_type_in_typecache(atom_target, GLOB.WALLITEMS_EXTERIOR))) + atom_target.take_damage(adjusted_damage, damage_type, damage_flag, FALSE, crush_dir) + crushed = TRUE + flags_to_return |= SUCCESSFULLY_CRUSHED_ATOM + + if (crushed) + atom_target.visible_message(span_danger("[atom_target] is crushed by [src]!"), span_userdanger("You are crushed by [src]!")) + SEND_SIGNAL(atom_target, COMSIG_POST_TILT_AND_CRUSH, src) + + var/matrix/to_turn = turn(transform, rotation) + animate(src, transform = to_turn, 0.2 SECONDS) + playsound(src, 'sound/effects/bang.ogg', 40) + + visible_message(span_danger("[src] tips over, slamming hard onto [target]!")) + flags_to_return |= SUCCESSFULLY_FELL_OVER + post_tilt() + else + visible_message(span_danger("[src] rebounds comically as it fails to slam onto [target]!")) - if(get_turf(fatty) != get_turf(src)) - throw_at(get_turf(fatty), 1, 1, spin=FALSE, quickstart=FALSE) + Move(target, crush_dir) // we still TRY to move onto it for shit like teleporters + return flags_to_return + + +/obj/machinery/vending/post_crush_living(mob/living/crushed, was_alive) + if(was_alive && crushed.stat == DEAD && crushed.client) + crushed.client.give_award(/datum/award/achievement/misc/vendor_squish, crushed) // good job losing a fight with an inanimate object idiot + + add_memory_in_range(crushed, 7, /datum/memory/witness_vendor_crush, protagonist = crushed, antagonist = src) + + return ..() + +/** + * Allows damage to be reduced on certain crit cases. + * Args: + * * crit_case: The critical case chosen. + */ +/atom/movable/proc/fall_and_crush_crit_rebate_table(crit_case) + + ASSERT(!isnull(crit_case)) + + switch(crit_case) + if (CRUSH_CRIT_SHATTER_LEGS) + return 0.2 + else + return 1 + +/obj/machinery/vending/fall_and_crush_crit_rebate_table(crit_case) + + if (crit_case == VENDOR_CRUSH_CRIT_GLASSCANDY) + return 0.33 + + return ..() + +/** + * Returns a assoc list of (critcase -> num), where critcase is a critical define in crushing.dm and num is a weight. + * Use with pickweight to acquire a random critcase. + */ +/atom/movable/proc/get_crit_crush_chances() + RETURN_TYPE(/list) + + var/list/weighted_crits = list() + + weighted_crits[CRUSH_CRIT_SHATTER_LEGS] = 100 + weighted_crits[CRUSH_CRIT_PARAPALEGIC] = 80 + weighted_crits[CRUSH_CRIT_HEADGIB] = 20 + weighted_crits[CRUSH_CRIT_SQUISH_LIMB] = 100 + + return weighted_crits + +/obj/machinery/vending/get_crit_crush_chances() + var/list/weighted_crits = ..() + + weighted_crits[VENDOR_CRUSH_CRIT_GLASSCANDY] = 100 + weighted_crits[VENDOR_CRUSH_CRIT_PIN] = 100 + + return weighted_crits + +/** + * Should be where critcase effects are actually implemented. Use this to apply critcases. + * Args: + * * crit_case: The chosen critcase, defined in crushing.dm. + * * atom/atom_target: The target to apply the critical hit to. Cannot be null. Can be anything except /area. + * + * Returns: + * TRUE if a crit case is successfully applied, FALSE otherwise. + */ +/atom/movable/proc/apply_crit_crush(crit_case, atom/atom_target) + switch (crit_case) + if(CRUSH_CRIT_SHATTER_LEGS) // shatter their legs and bleed 'em + if (!iscarbon(atom_target)) + return FALSE + var/mob/living/carbon/carbon_target = atom_target + carbon_target.bleed(150) + var/obj/item/bodypart/leg/left/left_leg = carbon_target.get_bodypart(BODY_ZONE_L_LEG) + if(left_leg) + left_leg.receive_damage(brute = 200) + var/obj/item/bodypart/leg/right/right_leg = carbon_target.get_bodypart(BODY_ZONE_R_LEG) + if(right_leg) + right_leg.receive_damage(brute = 200) + if(left_leg || right_leg) + carbon_target.visible_message(span_danger("[carbon_target]'s legs shatter with a sickening crunch!"), span_userdanger("Your legs shatter with a sickening crunch!")) + return TRUE + if(CRUSH_CRIT_PARAPALEGIC) // paralyze this binch + // the new paraplegic gets like 4 lines of losing their legs so skip them + if (!iscarbon(atom_target)) + return FALSE + var/mob/living/carbon/carbon_target = atom_target + visible_message(span_danger("[carbon_target]'s spinal cord is obliterated with a sickening crunch!"), ignored_mobs = list(carbon_target)) + carbon_target.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic) + return TRUE + if(CRUSH_CRIT_SQUISH_LIMB) // limb squish! + if (!iscarbon(atom_target)) + return FALSE + var/mob/living/carbon/carbon_target = atom_target + for(var/obj/item/bodypart/squish_part in carbon_target.bodyparts) + var/severity = pick(WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_SEVERE, WOUND_SEVERITY_CRITICAL) + if (!carbon_target.cause_wound_of_type_and_severity(WOUND_BLUNT, squish_part, severity, wound_source = "crushed by [src]")) + squish_part.receive_damage(brute = 30) + carbon_target.visible_message(span_danger("[carbon_target]'s body is maimed underneath the mass of [src]!"), span_userdanger("Your body is maimed underneath the mass of [src]!")) + return TRUE + if(CRUSH_CRIT_HEADGIB) // skull squish! + if (!iscarbon(atom_target)) + return FALSE + var/mob/living/carbon/carbon_target = atom_target + var/obj/item/bodypart/head/carbon_head = carbon_target.get_bodypart(BODY_ZONE_HEAD) + if(carbon_head) + if(carbon_head.dismember()) + carbon_target.visible_message(span_danger("[carbon_head] explodes in a shower of gore beneath [src]!"), span_userdanger("Oh f-")) + carbon_head.drop_organs() + qdel(carbon_head) + new /obj/effect/gibspawner/human/bodypartless(get_turf(carbon_target)) + return TRUE + + return FALSE + +/obj/machinery/vending/apply_crit_crush(crit_case, atom_target) + . = ..() + + if (.) + return TRUE + + switch (crit_case) + if (VENDOR_CRUSH_CRIT_GLASSCANDY) + if (!iscarbon(atom_target)) + return FALSE + var/mob/living/carbon/carbon_target = atom_target + for(var/i in 1 to num_shards) + var/obj/item/shard/shard = new /obj/item/shard(get_turf(carbon_target)) + shard.embedding = list(embed_chance = 100, ignore_throwspeed_threshold = TRUE, impact_pain_mult = 1, pain_chance = 5) + shard.updateEmbedding() + carbon_target.hitby(shard, skipcatch = TRUE, hitpush = FALSE) + shard.embedding = list() + shard.updateEmbedding() + return TRUE + if (VENDOR_CRUSH_CRIT_PIN) // pin them beneath the machine until someone untilts it + if (!isliving(atom_target)) + return FALSE + var/mob/living/living_target = atom_target + forceMove(get_turf(living_target)) + buckle_mob(living_target, force=TRUE) + living_target.visible_message(span_danger("[living_target] is pinned underneath [src]!"), span_userdanger("You are pinned down by [src]!")) + return TRUE + + return FALSE + +/** + * Rights the vendor up, unpinning mobs under it, if any. + * Arguments: + * user - mob that has untilted the vendor + */ /obj/machinery/vending/proc/untilt(mob/user) if(user) user.visible_message(span_notice("[user] rights [src]."), \ @@ -779,9 +987,9 @@ layer = initial(layer) SET_PLANE_IMPLICIT(src, initial(plane)) - var/matrix/M = matrix() - M.Turn(0) - transform = M + var/matrix/to_turn = turn(transform, -tilted_rotation) + animate(src, transform = to_turn, 0.2 SECONDS) + tilted_rotation = 0 /obj/machinery/vending/proc/loadingAttempt(obj/item/I, mob/user) . = TRUE diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 0dc1ef941f89..7f1022606e63 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -58,6 +58,8 @@ /obj/item/clothing/glasses/eyepatch = 1, /obj/item/clothing/glasses/eyepatch/medical = 1, /obj/item/clothing/under/costume/gi = 1, + /obj/item/clothing/neck/worldchampioncape = 1, + /obj/item/clothing/under/costume/worldchampiongi = 1, ), ), list( @@ -77,6 +79,7 @@ /obj/item/clothing/head/costume/shrine_wig = 1, /obj/item/clothing/suit/costume/shrine_maiden = 1, /obj/item/gohei = 1, + /obj/item/clothing/under/costume/skeleton = 1, ), ), list( @@ -107,6 +110,8 @@ /obj/item/clothing/under/suit/white_on_white = 1, /obj/item/clothing/head/tragic = 2, /obj/item/clothing/under/costume/tragic = 2, + /obj/item/clothing/mask/gas/clown_hat/yellow = 1, + /obj/item/clothing/shoes/clown_shoes/yellow = 1, /obj/item/clothing/head/knowingclown = 2, /obj/item/clothing/under/knowingclown = 2, ), @@ -124,6 +129,7 @@ /obj/item/clothing/under/dress/skirt = 1, /obj/item/clothing/neck/tie = 3, /obj/item/clothing/head/hats/tophat = 1, + /obj/item/clothing/head/wonka = 1, /obj/item/clothing/under/costume/kilt = 1, /obj/item/clothing/glasses/monocle =1, /obj/item/clothing/head/hats/bowler = 1, @@ -134,6 +140,7 @@ /obj/item/clothing/suit/costume/changshan_blue = 1, /obj/item/clothing/suit/costume/cheongsam_red = 1, /obj/item/clothing/suit/costume/cheongsam_blue = 1, + /obj/item/clothing/under/wonka = 1, ), ), list( @@ -147,6 +154,7 @@ /obj/item/clothing/suit/hooded/carp_costume = 1, /obj/item/clothing/suit/hooded/ian_costume = 1, /obj/item/clothing/suit/hooded/bee_costume = 1, + /obj/item/clothing/suit/hooded/dinojammies = 1, /obj/item/clothing/mask/animal/small/bat = 1, /obj/item/clothing/mask/animal/small/bee = 1, /obj/item/clothing/mask/animal/small/bear = 1, @@ -158,6 +166,7 @@ /obj/item/clothing/mask/animal/pig = 1, /obj/item/clothing/mask/animal/cowmask = 1, /obj/item/clothing/mask/animal/horsehead = 1, + /obj/item/clothing/head/lizard = 1, ), ), list( diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index 1421c0cbf36a..b79a05b30c49 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -60,8 +60,21 @@ /obj/item/reagent_containers/cup/glass/flask = 3, /obj/item/reagent_containers/cup/glass/bottle = 15, /obj/item/reagent_containers/cup/glass/bottle/small = 15, + /obj/item/reagent_containers/cup/glass/modglass/small = 10, + /obj/item/reagent_containers/cup/glass/modglass = 10, + /obj/item/reagent_containers/cup/glass/modglass/large = 10, ), ), + list( + "name" = "Garnishes", + "icon" = "fa-umbrella", + "products" = list( + /obj/item/garnish/olives = 10, + /obj/item/garnish/umbrellared = 10, + /obj/item/garnish/umbrellablue = 10, + /obj/item/garnish/umbrellagreen = 10 + ) + ) ) contraband = list( diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 5edda6de07fc..a0cc45debc0b 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -21,6 +21,7 @@ /obj/item/clothing/neck/scarf = 6, /obj/item/clothing/neck/large_scarf = 6, /obj/item/clothing/neck/infinity_scarf = 6, + /obj/item/clothing/neck/ascot = 6, /obj/item/clothing/neck/tie = 6, /obj/item/clothing/head/rasta = 3, /obj/item/clothing/head/chaplain/kippah = 3, @@ -138,6 +139,7 @@ /obj/item/clothing/under/ethereal_tunic = 3, /obj/item/clothing/suit/costume/ianshirt = 1, + /obj/item/clothing/suit/hooded/dinojammies = 3, /obj/item/clothing/head/costume/irs = 20, /obj/item/clothing/head/costume/tmc = 20, /obj/item/clothing/head/costume/deckers = 20, diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/drinnerware.dm index e7492f43d94d..006ecb1eb672 100644 --- a/code/modules/vending/drinnerware.dm +++ b/code/modules/vending/drinnerware.dm @@ -4,27 +4,61 @@ product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." icon_state = "dinnerware" panel_type = "panel4" - products = list( - /obj/item/storage/bag/tray = 8, - /obj/item/reagent_containers/cup/bowl = 30, - /obj/item/reagent_containers/cup/soup_pot = 3, - /obj/item/kitchen/fork = 6, - /obj/item/kitchen/spoon = 10, - /obj/item/kitchen/spoon/soup_ladle = 3, - /obj/item/reagent_containers/cup/glass/drinkingglass = 8, - /obj/item/reagent_containers/condiment/pack/ketchup = 5, - /obj/item/reagent_containers/condiment/pack/hotsauce = 5, - /obj/item/reagent_containers/condiment/pack/astrotame = 5, - /obj/item/reagent_containers/condiment/saltshaker = 5, - /obj/item/reagent_containers/condiment/peppermill = 5, - /obj/item/clothing/suit/apron/chef = 2, - /obj/item/kitchen/rollingpin = 2, - /obj/item/knife/kitchen = 2, - /obj/item/book/granter/crafting_recipe/cooking_sweets_101 = 2, - /obj/item/skillchip/chefs_kiss = 2, - /obj/item/plate/small = 5, - /obj/item/plate = 10, - /obj/item/plate/large = 5, + product_categories = list( + list( + "name" = "Kitchen Utensils", + "icon" = FA_ICON_KITCHEN_SET, + "products" = list( + /obj/item/storage/bag/tray = 8, + /obj/item/reagent_containers/cup/soup_pot = 3, + /obj/item/kitchen/spoon/soup_ladle = 3, + /obj/item/clothing/suit/apron/chef = 2, + /obj/item/kitchen/rollingpin = 2, + /obj/item/kitchen/tongs = 2, + /obj/item/knife/kitchen = 2, + ), + ), + list( + "name" = "Eating Utensils", + "icon" = FA_ICON_UTENSILS, + "products" = list( + /obj/item/kitchen/fork = 6, + /obj/item/kitchen/spoon = 10, + ), + ), + list( + "name" = "Dinnerware", + "icon" = FA_ICON_PLATE_WHEAT, + "products" = list( + /obj/item/plate/small = 5, + /obj/item/plate = 10, + /obj/item/plate/large = 5, + /obj/item/reagent_containers/cup/bowl = 30, + /obj/item/reagent_containers/cup/glass/drinkingglass = 8, + ), + ), + list( + "name" = "Condiments", + "icon" = FA_ICON_BOTTLE_DROPLET, + "products" = list( + /obj/item/reagent_containers/condiment/pack/ketchup = 5, + /obj/item/reagent_containers/condiment/pack/hotsauce = 5, + /obj/item/reagent_containers/condiment/pack/astrotame = 5, + /obj/item/reagent_containers/condiment/saltshaker = 5, + /obj/item/reagent_containers/condiment/peppermill = 5, + ), + ), + list( + "name" = "Recipes", + "icon" = FA_ICON_BOOK_OPEN_READER, + "products" = list( + /obj/item/book/granter/crafting_recipe/cooking_sweets_101 = 2, + ), + ), + ) + + premium = list( + /obj/item/skillchip/chefs_kiss = 2 ) contraband = list( /obj/item/kitchen/rollingpin/illegal = 2, diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm index c58c8cba1726..56b642f2ea47 100644 --- a/code/modules/vending/megaseed.dm +++ b/code/modules/vending/megaseed.dm @@ -20,6 +20,7 @@ /obj/item/seeds/cocoapod = 3, /obj/item/seeds/eggplant = 3, /obj/item/seeds/grape = 3, + /obj/item/seeds/lanternfruit = 3, /obj/item/seeds/lemon = 3, /obj/item/seeds/lime = 3, /obj/item/seeds/olive = 3, diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index 01fff9bdf6db..220bd1acdb7d 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -32,6 +32,9 @@ /obj/item/watertank/pepperspray = 2, /obj/item/storage/belt/holster/energy = 4, /obj/item/ammo_box/magazine/m35 = 5, //monkestation edit: Paco sec + /obj/item/clothing/head/guardmanhelmet = 1, //monkestation edit: Guardman + /obj/item/clothing/under/guardmanuniform = 1, //monkestation edit: Guardman + /obj/item/clothing/suit/armor/guardmanvest = 1, //monkestation edit: Guardman ) refill_canister = /obj/item/vending_refill/security default_price = PAYCHECK_CREW diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index f05b5f4e3a69..9441315dc6e8 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -169,6 +169,11 @@ /obj/item/clothing/head/costume/mailman = 1, /obj/item/clothing/under/misc/mailman = 1, ) + contraband = list( + /obj/item/clothing/under/wonka = 1, + /obj/item/clothing/head/wonka = 1, + /obj/item/cane = 1 + ) refill_canister = /obj/item/vending_refill/wardrobe/cargo_wardrobe payment_department = ACCOUNT_CAR diff --git a/code/modules/wiremod/components/action/pathfind.dm b/code/modules/wiremod/components/action/pathfind.dm index e7dcb1602074..9820d9b81e07 100644 --- a/code/modules/wiremod/components/action/pathfind.dm +++ b/code/modules/wiremod/components/action/pathfind.dm @@ -56,9 +56,11 @@ if(isnull(target_Y)) return - var/atom/path_id = id_card.value - if(path_id && !isidcard(path_id)) - path_id = null + var/list/access = list() + if(isidcard(id_card.value)) + var/obj/item/card/id/id = id_card.value + access = id.GetAccess() + else if (id_card.value) failed.set_output(COMPONENT_SIGNAL) reason_failed.set_output("Object marked is not an ID! Using no ID instead.") @@ -98,7 +100,7 @@ TIMER_COOLDOWN_END(parent, COOLDOWN_CIRCUIT_PATHFIND_SAME) old_dest = destination - path = get_path_to(src, destination, max_range, id=path_id) + path = get_path_to(src, destination, max_range, access=access) if(length(path) == 0 || !path)// Check if we can even path there next_turf = null failed.set_output(COMPONENT_SIGNAL) diff --git a/config/events.json b/config/events.json new file mode 100644 index 000000000000..a30ccaf58ab5 --- /dev/null +++ b/config/events.json @@ -0,0 +1,13 @@ +{ + "/datum/round_event_control": + { + "weight" : 10, + "min_players" : 0, + "max_occurrences" : 100, + "earliest_start" : 20, + "track" : "Moderate", + "cost" : 1, + "reoccurence_penalty_multiplier" : 1, + "shared_occurence_type" : null + } +} diff --git a/config/game_options.txt b/config/game_options.txt index 3ae8297a30c6..68a8f1f1d132 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -355,6 +355,7 @@ ROUNDSTART_RACES arachnid ## Races that are better than humans in some ways, but worse in others ROUNDSTART_RACES ethereal ROUNDSTART_RACES goblin +ROUNDSTART_RACES floran #ROUNDSTART_RACES jelly #ROUNDSTART_RACES abductor #ROUNDSTART_RACES synth @@ -425,6 +426,9 @@ OVERFLOW_JOB Assistant ## Overflow slot cap. Set to -1 for unlimited. If limited, it will still open up if every other job is full. OVERFLOW_CAP -1 +## Enables Spooktober jobs. +SPOOKTOBER_ENABLED + ## Uncomment to bring back old grey suit assistants instead of the now default rainbow colored assistants. #GREY_ASSISTANTS @@ -537,3 +541,50 @@ MAXFINE 2000 METACURRENCY_NAME Metacoin TWITCH_KEY mrhouse + +## Gamemode configurations + +## Multipliers for points gained over time for event tracks. +MUNDANE_POINT_GAIN_MULTIPLIER 1 +MODERATE_POINT_GAIN_MULTIPLIER 1 +MAJOR_POINT_GAIN_MULTIPLIER 1 +ROLESET_POINT_GAIN_MULTIPLIER 1 +OBJECTIVES_POINT_GAIN_MULTIPLIER 1 + +## Multipliers for points to spend on roundstart events. +MUNDANE_ROUNDSTART_POINT_MULTIPLIER 1 +MODERATE_ROUNDSTART_POINT_MULTIPLIER 1 +MAJOR_ROUNDSTART_POINT_MULTIPLIER 1 +ROLESET_ROUNDSTART_POINT_MULTIPLIER 1 +OBJECTIVES_ROUNDSTART_POINT_MULTIPLIER 1 + +## Minimum population caps for event tracks to run their events. +MUNDANE_MIN_POP 0 +MODERATE_MIN_POP 0 +MAJOR_MIN_POP 0 +ROLESET_MIN_POP 0 +OBJECTIVES_MIN_POP 0 + +## Point thresholds for tracks to run events. The lesser the more frequent events will be. +MUNDANE_POINT_THRESHOLD 25 +MODERATE_POINT_THRESHOLD 50 +MAJOR_POINT_THRESHOLD 90 +ROLESET_POINT_THRESHOLD 120 +OBJECTIVES_POINT_THRESHOLD 130 + +## Allows the storyteller to scale event frequencies based on population +ALLOW_STORYTELLER_POP_SCALING + +## Thresholds that population frequency scalling penalize up to. +MUNDANE_POP_SCALE_THRESHOLD 10 +MODERATE_POP_SCALE_THRESHOLD 15 +MAJOR_POP_SCALE_THRESHOLD 40 +ROLESET_POP_SCALE_THRESHOLD 45 +OBJECTIVES_POP_SCALE_THRESHOLD 40 + +## The maximum penalties population scalling will apply to the tracks for having less pop than POP_SCALE_THRESHOLD. This is treated as percentages +MUNDANE_POP_SCALE_PENALTY 30 +MODERATE_POP_SCALE_PENALTY 30 +MAJOR_POP_SCALE_PENALTY 30 +ROLESET_POP_SCALE_PENALTY 30 +OBJECTIVES_POP_SCALE_PENALTY 30 diff --git a/config/interviews.txt b/config/interviews.txt index 2b234cc61905..1e845093085f 100644 --- a/config/interviews.txt +++ b/config/interviews.txt @@ -8,5 +8,5 @@ INTERVIEW_WELCOME_MSG Welcome to our server. As you have not played here before, INTERVIEW_QUESTIONS Why have you joined the server today? INTERVIEW_QUESTIONS Have you played space-station 13 before? If so, on what servers? INTERVIEW_QUESTIONS Do you know anybody on the server today? If so, who? -INTERVIEW_QUESTIONS Have you read and understood our [rules](https://tgstation13.org/wiki/Rules)? +INTERVIEW_QUESTIONS Have you read and understood our [rules](https://wiki.monkestation.com/)? INTERVIEW_QUESTIONS Do you have any additional comments or questions? diff --git a/config/lavaruinblacklist.txt b/config/lavaruinblacklist.txt index c75ac5573421..91edbecce1fd 100644 --- a/config/lavaruinblacklist.txt +++ b/config/lavaruinblacklist.txt @@ -23,12 +23,21 @@ #_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm ##MISC +#_maps/RandomRuins/AnywhereRuins/fountain_hall.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_automated_trade_outpost.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_mookvillage.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_phonebooth.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_ww_vault.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_automated_trade_outpost.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_wwiioutpost.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_tomb.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm @@ -39,3 +48,4 @@ #_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm #_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm #_maps/RandomRuins/AnywhereRuins/fountain_hall.dmm +#_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm diff --git a/goon/icons/effects/320x320.dmi b/goon/icons/effects/320x320.dmi new file mode 100644 index 000000000000..289584a301f9 Binary files /dev/null and b/goon/icons/effects/320x320.dmi differ diff --git a/goon/icons/effects/particles.dmi b/goon/icons/effects/particles.dmi new file mode 100644 index 000000000000..285cfaf7fcad Binary files /dev/null and b/goon/icons/effects/particles.dmi differ diff --git a/goon/icons/mob/slasher.dmi b/goon/icons/mob/slasher.dmi new file mode 100644 index 000000000000..e0450ebc7ae9 Binary files /dev/null and b/goon/icons/mob/slasher.dmi differ diff --git a/goon/icons/obj/artifacts/artifactEffects.dmi b/goon/icons/obj/artifacts/artifactEffects.dmi new file mode 100644 index 000000000000..d91c9f56a883 Binary files /dev/null and b/goon/icons/obj/artifacts/artifactEffects.dmi differ diff --git a/goon/icons/obj/artifacts/artifactHearts.dmi b/goon/icons/obj/artifacts/artifactHearts.dmi new file mode 100644 index 000000000000..6471682b125b Binary files /dev/null and b/goon/icons/obj/artifacts/artifactHearts.dmi differ diff --git a/goon/icons/obj/artifacts/artifactLimbs.dmi b/goon/icons/obj/artifacts/artifactLimbs.dmi new file mode 100644 index 000000000000..5e4f5bfdfa8d Binary files /dev/null and b/goon/icons/obj/artifacts/artifactLimbs.dmi differ diff --git a/goon/icons/obj/artifacts/artifacts.dmi b/goon/icons/obj/artifacts/artifacts.dmi new file mode 100644 index 000000000000..919fccd90fac Binary files /dev/null and b/goon/icons/obj/artifacts/artifacts.dmi differ diff --git a/goon/icons/obj/artifacts/artifactsitem.dmi b/goon/icons/obj/artifacts/artifactsitem.dmi new file mode 100644 index 000000000000..6e3356cba3bd Binary files /dev/null and b/goon/icons/obj/artifacts/artifactsitem.dmi differ diff --git a/goon/icons/obj/artifacts/artifactsitemS.dmi b/goon/icons/obj/artifacts/artifactsitemS.dmi new file mode 100644 index 000000000000..b03d83766ba1 Binary files /dev/null and b/goon/icons/obj/artifacts/artifactsitemS.dmi differ diff --git a/goon/icons/obj/artifacts/keys.dmi b/goon/icons/obj/artifacts/keys.dmi new file mode 100644 index 000000000000..9d56b4d8804f Binary files /dev/null and b/goon/icons/obj/artifacts/keys.dmi differ diff --git a/goon/icons/obj/artifacts/puzzles.dmi b/goon/icons/obj/artifacts/puzzles.dmi new file mode 100644 index 000000000000..639a230cc83b Binary files /dev/null and b/goon/icons/obj/artifacts/puzzles.dmi differ diff --git a/goon/icons/obj/effects.dmi b/goon/icons/obj/effects.dmi index c3221abfc5f4..ff94351efd39 100644 Binary files a/goon/icons/obj/effects.dmi and b/goon/icons/obj/effects.dmi differ diff --git a/goon/icons/obj/food.dmi b/goon/icons/obj/food.dmi new file mode 100644 index 000000000000..c8ca42d14f49 Binary files /dev/null and b/goon/icons/obj/food.dmi differ diff --git a/goon/icons/obj/items/weapons.dmi b/goon/icons/obj/items/weapons.dmi new file mode 100644 index 000000000000..b552edfe33b1 Binary files /dev/null and b/goon/icons/obj/items/weapons.dmi differ diff --git a/goon/icons/obj/large_storage.dmi b/goon/icons/obj/large_storage.dmi new file mode 100644 index 000000000000..bb90d68312aa Binary files /dev/null and b/goon/icons/obj/large_storage.dmi differ diff --git a/goon/icons/obj/networked.dmi b/goon/icons/obj/networked.dmi new file mode 100644 index 000000000000..8b11a7bb2e79 Binary files /dev/null and b/goon/icons/obj/networked.dmi differ diff --git a/goon/sounds/impact_sounds/Flesh_Break_1.ogg b/goon/sounds/impact_sounds/Flesh_Break_1.ogg new file mode 100644 index 000000000000..95f17d8f50ee Binary files /dev/null and b/goon/sounds/impact_sounds/Flesh_Break_1.ogg differ diff --git a/goon/sounds/impact_sounds/Flesh_Break_2.ogg b/goon/sounds/impact_sounds/Flesh_Break_2.ogg new file mode 100644 index 000000000000..ffc9608cde04 Binary files /dev/null and b/goon/sounds/impact_sounds/Flesh_Break_2.ogg differ diff --git a/goon/sounds/impact_sounds/Flesh_Crush_1.ogg b/goon/sounds/impact_sounds/Flesh_Crush_1.ogg new file mode 100644 index 000000000000..928386515468 Binary files /dev/null and b/goon/sounds/impact_sounds/Flesh_Crush_1.ogg differ diff --git a/goon/sounds/impact_sounds/Flesh_Cut_1.ogg b/goon/sounds/impact_sounds/Flesh_Cut_1.ogg new file mode 100644 index 000000000000..cf5665537697 Binary files /dev/null and b/goon/sounds/impact_sounds/Flesh_Cut_1.ogg differ diff --git a/goon/sounds/impact_sounds/Flesh_Stab_1.ogg b/goon/sounds/impact_sounds/Flesh_Stab_1.ogg new file mode 100644 index 000000000000..5e506eb9563a Binary files /dev/null and b/goon/sounds/impact_sounds/Flesh_Stab_1.ogg differ diff --git a/goon/sounds/impact_sounds/Flesh_Stab_2.ogg b/goon/sounds/impact_sounds/Flesh_Stab_2.ogg new file mode 100644 index 000000000000..fa1c2f41ab37 Binary files /dev/null and b/goon/sounds/impact_sounds/Flesh_Stab_2.ogg differ diff --git a/goon/sounds/impact_sounds/Flesh_Stab_3.ogg b/goon/sounds/impact_sounds/Flesh_Stab_3.ogg new file mode 100644 index 000000000000..22931a024744 Binary files /dev/null and b/goon/sounds/impact_sounds/Flesh_Stab_3.ogg differ diff --git a/goon/sounds/impact_sounds/Flesh_Tear_1.ogg b/goon/sounds/impact_sounds/Flesh_Tear_1.ogg new file mode 100644 index 000000000000..09e03ab822ab Binary files /dev/null and b/goon/sounds/impact_sounds/Flesh_Tear_1.ogg differ diff --git a/goon/sounds/impact_sounds/Flesh_Tear_2.ogg b/goon/sounds/impact_sounds/Flesh_Tear_2.ogg new file mode 100644 index 000000000000..e546317794be Binary files /dev/null and b/goon/sounds/impact_sounds/Flesh_Tear_2.ogg differ diff --git a/goon/sounds/impact_sounds/Flesh_Tear_3.ogg b/goon/sounds/impact_sounds/Flesh_Tear_3.ogg new file mode 100644 index 000000000000..5e6e5100d4dc Binary files /dev/null and b/goon/sounds/impact_sounds/Flesh_Tear_3.ogg differ diff --git a/goon/sounds/machines/ArtifactAnc1.ogg b/goon/sounds/machines/ArtifactAnc1.ogg new file mode 100644 index 000000000000..7b78444402d9 Binary files /dev/null and b/goon/sounds/machines/ArtifactAnc1.ogg differ diff --git a/goon/sounds/machines/ArtifactBee1.ogg b/goon/sounds/machines/ArtifactBee1.ogg new file mode 100644 index 000000000000..857f23df8591 Binary files /dev/null and b/goon/sounds/machines/ArtifactBee1.ogg differ diff --git a/goon/sounds/machines/ArtifactBee2.ogg b/goon/sounds/machines/ArtifactBee2.ogg new file mode 100644 index 000000000000..aa9b21486327 Binary files /dev/null and b/goon/sounds/machines/ArtifactBee2.ogg differ diff --git a/goon/sounds/machines/ArtifactBee3.ogg b/goon/sounds/machines/ArtifactBee3.ogg new file mode 100644 index 000000000000..2347701a513d Binary files /dev/null and b/goon/sounds/machines/ArtifactBee3.ogg differ diff --git a/goon/sounds/machines/ArtifactEld1.ogg b/goon/sounds/machines/ArtifactEld1.ogg new file mode 100644 index 000000000000..90180faf72ef Binary files /dev/null and b/goon/sounds/machines/ArtifactEld1.ogg differ diff --git a/goon/sounds/machines/ArtifactEld2.ogg b/goon/sounds/machines/ArtifactEld2.ogg new file mode 100644 index 000000000000..67e8d5bbacd5 Binary files /dev/null and b/goon/sounds/machines/ArtifactEld2.ogg differ diff --git a/goon/sounds/machines/ArtifactFea1.ogg b/goon/sounds/machines/ArtifactFea1.ogg new file mode 100644 index 000000000000..1d66017102a5 Binary files /dev/null and b/goon/sounds/machines/ArtifactFea1.ogg differ diff --git a/goon/sounds/machines/ArtifactFea2.ogg b/goon/sounds/machines/ArtifactFea2.ogg new file mode 100644 index 000000000000..78214a7a59db Binary files /dev/null and b/goon/sounds/machines/ArtifactFea2.ogg differ diff --git a/goon/sounds/machines/ArtifactFea3.ogg b/goon/sounds/machines/ArtifactFea3.ogg new file mode 100644 index 000000000000..fd27eb5fc839 Binary files /dev/null and b/goon/sounds/machines/ArtifactFea3.ogg differ diff --git a/goon/sounds/machines/ArtifactLat1.ogg b/goon/sounds/machines/ArtifactLat1.ogg new file mode 100644 index 000000000000..442d35527526 Binary files /dev/null and b/goon/sounds/machines/ArtifactLat1.ogg differ diff --git a/goon/sounds/machines/ArtifactLat2.ogg b/goon/sounds/machines/ArtifactLat2.ogg new file mode 100644 index 000000000000..cde660697842 Binary files /dev/null and b/goon/sounds/machines/ArtifactLat2.ogg differ diff --git a/goon/sounds/machines/ArtifactLat3.ogg b/goon/sounds/machines/ArtifactLat3.ogg new file mode 100644 index 000000000000..28939fe367ec Binary files /dev/null and b/goon/sounds/machines/ArtifactLat3.ogg differ diff --git a/goon/sounds/machines/ArtifactMar1.ogg b/goon/sounds/machines/ArtifactMar1.ogg new file mode 100644 index 000000000000..1c813f1df305 Binary files /dev/null and b/goon/sounds/machines/ArtifactMar1.ogg differ diff --git a/goon/sounds/machines/ArtifactMar2.ogg b/goon/sounds/machines/ArtifactMar2.ogg new file mode 100644 index 000000000000..52bc3b3d0a38 Binary files /dev/null and b/goon/sounds/machines/ArtifactMar2.ogg differ diff --git a/goon/sounds/machines/ArtifactPre1.ogg b/goon/sounds/machines/ArtifactPre1.ogg new file mode 100644 index 000000000000..040351d0f98d Binary files /dev/null and b/goon/sounds/machines/ArtifactPre1.ogg differ diff --git a/goon/sounds/machines/ArtifactVoi1.ogg b/goon/sounds/machines/ArtifactVoi1.ogg new file mode 100644 index 000000000000..15298c345ada Binary files /dev/null and b/goon/sounds/machines/ArtifactVoi1.ogg differ diff --git a/goon/sounds/machines/ArtifactVoi2.ogg b/goon/sounds/machines/ArtifactVoi2.ogg new file mode 100644 index 000000000000..0d3368438eec Binary files /dev/null and b/goon/sounds/machines/ArtifactVoi2.ogg differ diff --git a/goon/sounds/machines/ArtifactWiz1.ogg b/goon/sounds/machines/ArtifactWiz1.ogg new file mode 100644 index 000000000000..7f48909b294f Binary files /dev/null and b/goon/sounds/machines/ArtifactWiz1.ogg differ diff --git a/goon/sounds/misc/openlootcrate.ogg b/goon/sounds/misc/openlootcrate.ogg new file mode 100644 index 000000000000..7d197eb3c696 Binary files /dev/null and b/goon/sounds/misc/openlootcrate.ogg differ diff --git a/goon/sounds/misc/openlootcrate2.ogg b/goon/sounds/misc/openlootcrate2.ogg new file mode 100644 index 000000000000..fb190b610358 Binary files /dev/null and b/goon/sounds/misc/openlootcrate2.ogg differ diff --git a/html/browser/common.css b/html/browser/common.css index eb6fed9a9e0c..6a37b98039e5 100644 --- a/html/browser/common.css +++ b/html/browser/common.css @@ -31,6 +31,10 @@ a:hover background: #ffffff; } +a.inlineblock { + display: inline-block; +} + a.white, a.white:link, a.white:visited, a.white:active { color: #40628a; @@ -409,3 +413,7 @@ ul.sparse { display: inline-block; vertical-align: middle; } + +.highlighter:hover { + background-color: #f0c400 !important; +} diff --git a/html/changelogs/AutoChangeLog-pr-363.yml b/html/changelogs/AutoChangeLog-pr-363.yml deleted file mode 100644 index e6f11031bd71..000000000000 --- a/html/changelogs/AutoChangeLog-pr-363.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "KoboldCommando" -delete-after: True -changes: - - bugfix: "dwarf beards and eyes should work properly now" - - bugfix: "giants use the new height system and look a bit less distorted" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-418.yml b/html/changelogs/AutoChangeLog-pr-418.yml deleted file mode 100644 index 7e13dee9932c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-418.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DrDiasyl aka DrTuxedo" -delete-after: True -changes: - - balance: "Holsters can now be clipped to any suit, and house Captain antique gun and HoS gun. You now can buy holsters from the SecTech premium section." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-426.yml b/html/changelogs/AutoChangeLog-pr-426.yml deleted file mode 100644 index 9a0e1f0e0119..000000000000 --- a/html/changelogs/AutoChangeLog-pr-426.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "lmenvs" -delete-after: True -changes: - - bugfix: "various oshan fixes" - - rscadd: "new conveyor/auto/inside_corners for the missing directional sprites." - - rscadd: "new wrestling railing." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-428.yml b/html/changelogs/AutoChangeLog-pr-428.yml deleted file mode 100644 index 38c75a4d5b6c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-428.yml +++ /dev/null @@ -1,10 +0,0 @@ -author: "wraith-54321" -delete-after: True -changes: - - bugfix: "eminence linked abscond and purge reagents can now actually be used again" - - bugfix: "vitality matrix servant revival" - - balance: "default max servants is now 10 again" - - balance: "replica fabricators now build slower on reebe until the cult has stabilized their first anchoring crystal" - - balance: "clockwork bows deal double damage to non clockwork machines and structures" - - balance: "kindle will now only have less effect on reebe if the ark is active" - - balance: "the crew now has 30 extra seconds to prepare before the portals open" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-430.yml b/html/changelogs/AutoChangeLog-pr-430.yml deleted file mode 100644 index 9aac974ecbb4..000000000000 --- a/html/changelogs/AutoChangeLog-pr-430.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "KoboldCommando" -delete-after: True -changes: - - sound: "tweaked the new surgery sound" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-432.yml b/html/changelogs/AutoChangeLog-pr-432.yml deleted file mode 100644 index 992e18ae3ff6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-432.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Glyphee" -delete-after: True -changes: - - rscadd: "placeholder screams" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-435.yml b/html/changelogs/AutoChangeLog-pr-435.yml deleted file mode 100644 index 5818f06b0046..000000000000 --- a/html/changelogs/AutoChangeLog-pr-435.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Salted-Zen" -delete-after: True -changes: - - rscadd: "Added medical eyepatch and mask to monkey store" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-437.yml b/html/changelogs/AutoChangeLog-pr-437.yml deleted file mode 100644 index 9f1eb2f46904..000000000000 --- a/html/changelogs/AutoChangeLog-pr-437.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Dexee" -delete-after: True -changes: - - qol: "Evidence lockers on Tramstation now numbered correctly" - - qol: "Two evidence lockers swapped on Tramstation for their secure counterparts to match other stations." - - qol: "Scrubber and Vent pipes by arrivals on lower Z now properly connect on Tramstation" - - qol: "Added a missing multi-Z cable hub to the bridge on Tramstation. The vault has power again!" - - rscdel: "Removed an errant directional plasmaglass window by the SM cooling loop on Deltastation." \ No newline at end of file diff --git a/html/changelogs/archive/2018-12.yml b/html/changelogs/archive/2018-12.yml index 9f2eeb1a5f38..097b14839086 100644 --- a/html/changelogs/archive/2018-12.yml +++ b/html/changelogs/archive/2018-12.yml @@ -292,7 +292,7 @@ YoYoBatty: - rscadd: Blurry eyes now actually blur instead of an overlay. anconfuzedrock: - - tweak: slapping now doesn't require a specific intent or limb to be targetted. + - tweak: slapping now doesn't require a specific intent or limb to be targeted. coiax: - rscadd: Robotics can print cybernetic hearts, lungs and livers at their exofabricators (along with their upgraded versions). diff --git a/html/changelogs/archive/2021-02.yml b/html/changelogs/archive/2021-02.yml index 596ac007c1b5..8be6bee8841e 100644 --- a/html/changelogs/archive/2021-02.yml +++ b/html/changelogs/archive/2021-02.yml @@ -695,7 +695,7 @@ multiple targets. - balance: 'The immovable rod deals a LOT more damage to non-mobs that it passes through. feature: The immovable rod can now traverse z-level to chase its targets - down when used as both a targetted smite and as an option from the admin event + down when used as both a targeted smite and as an option from the admin event menu. feature: The immovable rod will subtly grow as it consumes the souls of sentients it hits.' - bugfix: The immovable rod no longer stalls on Icebox and will now spawn on the diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml index c7e3afbf3f20..8216d98d0910 100644 --- a/html/changelogs/archive/2023-10.yml +++ b/html/changelogs/archive/2023-10.yml @@ -26,3 +26,259 @@ NicoDeLuna: - rscadd: 'New Hat: Small But Knowing Clown hat' - rscadd: 'New suit: Small But Knowing Clown suit' +2023-10-10: + Dexee: + - qol: Evidence lockers on Tramstation now numbered correctly + - qol: Two evidence lockers swapped on Tramstation for their secure counterparts + to match other stations. + - qol: Scrubber and Vent pipes by arrivals on lower Z now properly connect on Tramstation + - qol: Added a missing multi-Z cable hub to the bridge on Tramstation. The vault + has power again! + - rscdel: Removed an errant directional plasmaglass window by the SM cooling loop + on Deltastation. + DrDiasyl aka DrTuxedo: + - balance: Holsters can now be clipped to any suit, and house Captain antique gun + and HoS gun. You now can buy holsters from the SecTech premium section. + Glyphee: + - rscadd: placeholder screams + KoboldCommando: + - bugfix: dwarf beards and eyes should work properly now + - bugfix: giants use the new height system and look a bit less distorted + - sound: tweaked the new surgery sound + Salted-Zen: + - rscadd: Added medical eyepatch and mask to monkey store + lmenvs: + - bugfix: various oshan fixes + - rscadd: new conveyor/auto/inside_corners for the missing directional sprites. + - rscadd: new wrestling railing. + wraith-54321: + - bugfix: eminence linked abscond and purge reagents can now actually be used again + - bugfix: vitality matrix servant revival + - balance: default max servants is now 10 again + - balance: replica fabricators now build slower on reebe until the cult has stabilized + their first anchoring crystal + - balance: clockwork bows deal double damage to non clockwork machines and structures + - balance: kindle will now only have less effect on reebe if the ark is active + - balance: the crew now has 30 extra seconds to prepare before the portals open +2023-10-12: + Dexee: + - rscadd: AdminLand, the land of Admin Offices + - rscadd: Dressing Room, version 1 (various vendors, selection of lockers, subject + to change based on feedback, now with magic mirror!) + - qol: CentCom Auxiliary Announcement closet moved to AdminLand (Anti-Tide), also + now has a light. + - qol: old CentCom Administrative Office retained, moved to sit with AdminLand as + The Council Chambers + - qol: Expanded the bar/kitchen by Thunderdome, complete with extra table space, + vendors and trash bins as appropriate + - rscdel: removed all CE belts from the map + - rscdel: removed the CE room by arrivals + - qol: moved Poly Prime. Can't let the bird die + - qol: fixed the improper cloning bay arrangement in CC Medical + - rscdel: removed the CC Medical Mechbay and Odysseus (the damn thing had nothing + on it anyway) + - qol: increased the strength of various doors and windows to help provide a passive + enforcement mechanism to CC Ghost Interns of where they are allowed to be. + - qol: moved minigame start markers for Mafia and Basketball to open up space next + to CentCom (does not require code changes, tested locally) + - qol: moved CC Cargo to a tenative better position, mostly to allow for room for + AdminLand, but also provides Anti-Tide. + - qol: gave a big window to Peppino's so viewers can enjoy our nice space backgrounds + - qol: Tiny Fans added under the arrivals blast doors by the shuttle to help mitigate + depressurization events during EORG... not that it'll make a huge difference, + but worth the change. + - qol: toned down how many cooking pots and ladles there are at the CC Kitchen. + - qol: kicked one microwave out of the way to add a dedicated rack with chef clothing + items at CC Kitchen. + - rscdel: removed barkeep powergaming shotgun at CC Bar. + - rscdel: removed Detroit. +2023-10-14: + Glyphee: + - rscadd: Glerm + - rscadd: Cool Glerm + - rscadd: Glerm Pet Beacon + - rscadd: Cool Glerm Pet Beacon + - rscadd: Ordinary Flash + - rscadd: Ordinary Flash Pet Beacon +2023-10-15: + KoboldCommando: + - rscadd: 7 new latejoin spooktober jobs! + wraith-54321: + - bugfix: clockwork armaments now actually gives weapons again +2023-10-16: + TTNT789: + - balance: halves heralds armor pierce +2023-10-17: + NicoDeLuna: + - rscadd: 'New roundstart hair sprite: Monkey King' + Singul0, Melbert, Motho, jlsnow301, Rhials, Gboster: + - rscadd: Motho - Bitrunners can now have alternative job titles. FTU urges that + these titles are purely cosmetic and not representative of bitrunning ability. + - rscadd: Rhials - Two new psyker-oriented virtual domains -- Crate Chaos and Infected + Domain. + - rscadd: Rhials - Map helper for cyber-police corpse spawn. + - rscadd: Rhials - Map helper for swapping the encrypted crate in an area with a + random crate from that same area. + - rscadd: jlsnow301 - Quantum servers now look for a new machine called a byteforge + to spawn loot on- no longer on an invisible landmark. This should make the rooms + rebuildable after disasters. + - rscadd: jlsnow301 - Most bitrunning machinery is now researchable and buildable + via circuits in the engineering protolathe. + - bugfix: jlsnow301 - Added extra checks to bitrunning domain cleanup so avatars + are deleted properly. + - bugfix: Singul0 - Fixes missing baseturfs and clowns in mining planet VDOM. + - bugfix: Melbert - Virtual Drink Glasses now look correct. + - bugfix: Gboster - Makes the clown mining planet virtual plane actually able to + be solved solo. + lmenvs: + - rscadd: Adds loafing mechanic +2023-10-21: + CL0WNE: + - rscadd: A new fart line "_____ unleashes their animal spirit!" + - rscadd: Flashlights to kinetic crusher variants (machete,spear,hammer,etc.) + KittyNoodle: + - rscdel: Lots of weirdly placed powerful gear is gone now. + - qol: singularity engine cameras are now emp-proof + - bugfix: tramstation ai solars have been remodeled to function. + - bugfix: all bars now have the proper holosign emitters + KoboldCommando: + - rscadd: The botany infuser and splicer are merged into one machine +2023-10-23: + DexeeXI: + - rscadd: Readded missing water tank for Botany on Metastation + - rscadd: Readded a missing helper for the disposals system on Metastation + - rscadd: plantgenes machine in the seed vaults! + - rscdel: ALL SM gas filters for gas synthesis are removed, but the space is still + there if folk want to setup such filters for their operations. + - qol: moved the plantgenes machine and all the botany lexicons on Tram to a different + table so its not stacked. + - rscdel: reverted the "clown asteroid" on Tramstation down to 99% stock. It should + still play clown.wmv when over there, because you still are a clown if you wanna + use the place. + - rscadd: dinnerware, nanomed vendors added to Centcom + - rscadd: readded the missing tcomm server so syndie comms work again. it was on + centcom, its now back on centcom. + - qol: fixed some of the busted disposals. + - qol: zones for rooms in Oshan Medical are redone. Medbay Central is now a "common + sense" location so cargo crates can be opened properly. +2023-10-24: + Gboster-0: + - rscadd: Added a lot more SMES + - bugfix: Singularity to PTL connection on kilo was always broken, now its not so + much broken + - rscadd: Split the technology tab into gear and abilities tabs on the bitrunner + console + - qol: The bitrunning disks were split into their individual abilities, no more + wasting points on virtual toilets + - image: All the abilities and combat gear in bitrunner's stolen now has unique + sprites + KittyNoodle: + - bugfix: Syndicate laser muskets can now be worn on armor again + - rscadd: Non-lethal and less than lethal options for autorifles have been made + available. + - balance: Autorifles have been moved to imports and made more expensive. + - balance: Higher technologies are now needed to access autorifle ammo. + - refactor: Autorifle code has been modularized + OtieBoy: + - bugfix: fixed the Tramstation incinerator room atmospherics so that air supply + and scrubbing pipenets are connected properly from roundstart + SeeBeeSee: + - rscadd: Added new quirk that applies a permanent Extra-Sensory Paranoia - no lobotomies + for this one. + - rscadd: Added a new version of ESP that summons 10 stalkers by default, and can + be called by an admin for more. + lmenvs: + - rscadd: Adds donator items for Senri, Mjolnir, Random and Spinnermaster! Thank + you guys! +2023-10-25: + Dexee: + - qol: 75% audit of doors, areas done. A TON of door names will have changed to + make better sense. + - qol: NAVIGATE VERBS! THEY WORK NOW! It covers the bog standard stuff but people + will be able to actually use the damn thing. Still working on a solution for + the lesser known things like certain rooms in maints or things like that. + - qol: MEDBAY CENTRAL is now in the most common sense spot and not some bumfuck + hallway nobody cares about. + - qol: Psychologist now legally has an office. + - qol: The Genetics Lab doors should all now be accessible to both Geneticists and + Med Staff. + - qol: Botany now has weedkillers. Though this may be moot because it should be + blacklisted by this point, but you'll never know. + - qol: Added some lights here and there. Many to count. + - qol: Moved a ton of the flood mitigation drains to get them off things like vents, + scrubbers and lights in the central hallway. + - qol: Adjusted a TON of doors to not only reflect what departments they actually + are, but also their permissions where needed. + - rscadd: a single stethoscope is now in the operating theatre. What kind of doctors + are you if you don't have your old timey thing that proves you're a doctor! + - qol: Moved the ATMOS main APC because YOU CANT PUT THAT IN GLASS (it also causes + it to render under the glass so its difficult for those that dont know where + to look in order to fix it) + - qol: Redid wiring for the ATMOS Turbine Generator. + - qol: Redid the PIPING for the ATMOS Turbine Generator. You no longer have a broken + pipe in a window that prevents you from even starting it. There, you now have + an alternate power source. + - qol: 'Added a plumbing disposal unit connected to the drain system so that the + system can, hopefully at this point after multiple test attempts, function properly. + + Delta:' + - qol: 'Moved 2 tiles of pipes and wires to connect to maints by engineering due + to the SMES additions. + + Tram:' + - rscadd: 'a single piece of missing layer 1 wire that was preventing the AI sat + solars from charging correctly. + + Icebox Arcade Bar:' + - qol: moved APC, fixed wires. + dwasint: + - rscadd: votable story tellers +2023-10-26: + Dexee: + - qol: even more doors audited and names fixed. + - rscadd: Custodial Closet/Janitor now on NAVIGATE VERB + - qol: 'moved the prisoner spawners to the brig bridge next to the hole so they + can throw themselves in. (note: if an AI main is reading this, no, you are not + allowed to release the prisoners under Law 1 unless the HOS/Captain gives you + specific position. This is to help the prisoners that start on Oshan don''t + just fucking die)' + - qol: 'There are now patient rooms. Yay. + + Tram:' + - rscadd: a single missing disposal pipe in front of det's office so now trash doesn't + come flying out of the floor. + DexeeXI: + - qol: fixed some bad door perms (one v all) + - qol: fixed tiles in science being marked as AIRLESS tiles instead of... well, + not. + - qol: some lights replaced in maints with maints varients. offsets should be getting + adjusted so they look less like shit. + MomoBerri: + - bugfix: sprite ffix + scriptis: + - rscadd: don't blink. don't blink not even for a second +2023-10-27: + Dexee: + - rscadd: New navmakers for some lesser known places, as well as most station solar + platforms + - qol: 'Moved/replaced a ton of existing markers to better common sense spots. + + Tram:' + - qol: 'Aseembly lab door renamed to Assembly Lab. + + Ice Box Coggers Bar:' + - rscadd: added the missing Booze-O-Mat. (thanks Skell Bones II) +2023-10-28: + DexeeXI: + - rscadd: Centcom map now has nav support + - rscadd: Icebox now has cryo signs in spots to point towards the room, because + its on lower Z level. + - bugfix: Fixed railings on Delta, Meta, Icebox. + - rscdel: Lots of railings on Northstar + - rscadd: Icebox now has signs next to the stairs to the morgue to help indicate + where the Morgue is (z level problems and navigate) + - qol: updated interview link for da rulez. + Salted-Zen: + - balance: Machete now has 25 block instead of 50 + dwasint: + - bugfix: malf ai should roll again diff --git a/html/changelogs/archive/2023-11.yml b/html/changelogs/archive/2023-11.yml new file mode 100644 index 000000000000..b5425ff42be1 --- /dev/null +++ b/html/changelogs/archive/2023-11.yml @@ -0,0 +1,222 @@ +2023-11-06: + DexeeXI: + - rscadd: Dagoth Ur wishes you all to behave yourselves and pray well, lest you + invoke his anger. + Gboster-0: + - rscdel: Deleted wendigo's impossible attack + Salted-Zen: + - bugfix: Un-fries your boiled spagetti + Senri: + - bugfix: Fixed patreon monkecoin boost to work properly + - balance: rebalanced Throwing Arm quirk + lmenvs: + - rscadd: New Space Marine helmet, thanks to Odie_boy! + - bugfix: Pets that died and had no sprite should now be fixed. Lazarus Injections + will work properly too. +2023-11-07: + DexeeXI: + - rscdel: Removed buffer bottles from Chemist job starting gear and the Chemist + lockers. + NicoDeLuna: + - rscadd: Added Edgerunner Hairstyle for Roundstart +2023-11-08: + Glyphee: + - rscadd: Florans + KoboldCommando: + - bugfix: cargo, zoomba and kerfus borgs should no longer go invisible when reset +2023-11-12: + Coding-Grape: + - rscadd: Maints bar + DexeeXI: + - rscadd: The Dinosaur Pajamas are now available on the Loadout Shop for 10000 Monke + on the SUITS tab. + - rscadd: The Headdress of Nemes is now available on the Loadout Shop for 2000 Monke + on the HEADS tab. + - rscadd: The Pharaoh's Hat is now available on the Loadout Shop for 2000 Monke + on the HEADS tab. + Gboster-0: + - qol: slashers now get told preciselly how long their soul sucking will last + - qol: you wont get spam messages whilst clicking walls/floors as slasher with the + soul suck ability on + - qol: slasher now shows up on the ghost orbit panel + - balance: you can no longer screech whilst incorporeal, instead your targets will + hear a distant screech + - bugfix: abilities once again properly check for all conditions + - bugfix: slasher's incorporeal ability is now a proper jaunt, due to this it no + longer allows you to destroy glass tables for free + - bugfix: due to the slashers new incorporeal ability you also cant now grab, examine + or shove them whilst they are incorporeal + - rscadd: Added the winter tramstation random bar, how n-ice! + - rscadd: Added a cult bar, legends say it has a rune that can summon booze + lolc4n: + - rscadd: Added a new tramstation bar. + wraith-54321: + - rscadd: Added a new random bar +2023-11-13: + Glyphee: + - rscadd: new bar + wraith-54321: + - rscadd: map template for contests +2023-11-14: + lmenvs: + - rscadd: TTNT's donator item set! +2023-11-15: + Glyphee: + - bugfix: changed atmos on the dirt tiles to `"o2=22;n2=82;TEMP=293.15"` + wraith-54321: + - bugfix: Admins can now actually force events + - bugfix: fixed some midrounds spawning without their antag datum +2023-11-18: + Glyphee: + - rscadd: Changed how my office looks :p + - bugfix: Fixed a typo in the medbay of CC ("all in one medial fabricator" -> "all + in one medical fabricator") + NicoDeLuna: + - rscadd: ' Added Ascots to Loadout and Clothesmate' + - rscadd: Add new Guardman's uniform, vest and helmet to the sectech vendor + Salted-Zen: + - balance: Herald triple shot no longer shotgun fans. Its just three projectiles. + kawoppi, gboster: + - rscadd: 'kawoppi: added animations to the *jump, *shiver, *sway, *tremble, *twitch + and *twitch_s emotes' + - rscadd: 'kawoppi: the *jump emote now plays a sound' + wraith-54321: + - balance: Reverts our change making miner medipens take only half a second to use + on station +2023-11-20: + Bidlink1: + - rscadd: Lanternfruit to Megaservitor (courtesy of MrMelbert) + - rscadd: Adds Sulfur and Liquid Electricity production as a gene in Lantern fruit + KittyNoodle: + - rscadd: Nuke ops have been authorized for a new experimental combat implant. + - qol: Stacking hardlight spears now stores it in only one spell. And it looks really + cool. + - qol: Hardlight spears no longer delete themselves after 10 seconds. + - balance: Hardlight spears now do much more damage. + - image: resprited the hardlight spear + - refactor: Hardlight spears use projectiles instead of throws now. + NicoDeLuna: + - bugfix: adjusting sprites of the ascot +2023-11-21: + NicoDeLuna: + - rscadd: Added World Champion's Gi and Cape + lmenvs: + - rscadd: Rickdude's donator rewards +2023-11-23: + wraith-54321: + - rscadd: Added teleporters to centcom + - rscadd: added a firing range for ghosts on centcom +2023-11-25: + KittyNoodle: + - rscadd: The Observer, a more roundstart focused storyteller that prefers to watch + idly + - rscadd: The Nobleman, a less destructive variant of warrior that lets pacifists + enjoy the game too. + - qol: No more lowpop kudzu spam + - balance: Jester and warrior are now highpop/midpop only. + - balance: Changed a lot of storyteller tags to make more sense + - code_imp: Modularizes a lot of storyteller code + KoboldCommando: + - rscadd: You can now sharpen mops! Check the crafting menu +2023-11-26: + Gboster-0: + - bugfix: The fax machine on tram is once again usable without opening QM's locker + lmenvs: + - rscadd: Clicking the Twitch icon in the menu will now allow you to link your Twitch + account to your ckey. Twitch subs who link their account in this way have access + to donator items. + moocowswag: + - qol: Apc covers can now be repaired with a welder and replaced with an apc frame. +2023-11-27: + KoboldCommando: + - bugfix: Some lurid posters have been 1984'd + MomoBerri: + - qol: more radiation shutter directionals + lmenvs: + - rscadd: Twitch subs and Patrons at Assistant tier and above can enjoy a 25 monkecoin + bonus at round end. These bonuses do stack if you are both subbed and a patron, + AND they both are affected by monkecoin multipliers. + - rscadd: Kon Chieko's Donator rewards! Thank you!! +2023-11-28: + DexeeXI: + - rscadd: missing floor near investigations. no more weird stuff happening by sec. + - rscadd: missing ATMOS stuff for departures. now we have scrubbers and vents! holy + shit! + - rscdel: removed acidic/basic buffer from chem storage + - rscdel: 'removed a redundant navigation marker + + Delta Station:' + - qol: 'fixed the firelocks by Engineering + + Icebox' + - qol: Adjusted the Secure Art Exhibit so the large paintings don't spawn in a very + weird manner, breaking the 4th wall. + - rscdel: 'removed acidic/basic buffer from chem storage + + Metastation' + - rscdel: 'removed acidic/basic buffer from chem storage + + Oshan' + - qol: Stationwide, ATMOS should now be implemented in its entirety, or as close + as one can get without extensive testing using dozens of live subjects. + - qol: ARTSCI lab rearranged for ease of use. + - rscadd: EXP LAB area where ARTSCI is done. Has its own APC and Air Alarm if anything + were to wrong + - rscadd: Missing wiring going up to various APCs added in. Areas affected by this + include the Barkeep's Backroom, Fitness Rooms and the Med/Sci Security Post. + - rscdel: removed a NanoChem Plus machine from behind a PHARMACY sign + - rscadd: Organ Smartfridge is now available between the OR and Central Medbay + - rscadd: Chem Smartfridge is now available in Medbay Central. + - qol: Adjusted a large number of objects in Medbay Central. + - rscdel: Removed one of the showers and the Scanner Machines in Medbay Central + to reduce unnecessary clutter and traffic. + - qol: Adjusted the front door of Medbay Central to make it easier to maintain isolation + of the primary treatment area and public areas. + - qol: Pharmacy had some machines moved around to be in better reach of where the + chemists will usually be + - qol: 'Bridge broken up into two distinct areas: the Bridge and Conference Room. + APCs and Air Alarms split as such as well' + - rscdel: Removed OP gamer gear from more spots on the map + - rscdel: Paired down the Warden's office to comply with Space Law. + - qol: Artsci has taken over the "Science Storage" room. + - rscdel: Because of the aformentioned takeover by Artsci, the Ordinance lab is + effectively removed. A future actual major edit (substantial structure/flow + change) will eventually re-add the Ordinance lab with all of its bells and whistles. + - rscadd: Firelocks and Fire Alarms to compartmentalize some parts of the main station + loop in the event of the inevitable plasma fire. + - rscadd: Signs! You asked, I got some up for some extra visual identification. + - qol: Adjusted some of the permissions on some doors across the station to better + align with who should be there and who should not be. + - qol: Changed the disposal tube transit between main and aux into a Bluespace Pod + system instead. Fewer instant broken bones! + - bugfix: Medbay shutters should work. Someone forgot to code it! + KoboldCommando: + - bugfix: cyborgs should no longer go invisible upon changing model + - bugfix: the expand module for cyborgs should once again work properly +2023-11-30: + Ghommie, Jacquerel, Melbert, Rhials, Distributivgesetz, Hypernoblium, Gboster: + - bugfix: Hypernoblium - Fixes a selection window in the game rock-paper-scissors + with death. + - rscadd: Distributivgesetz - Add an achievement for saving a cascading engine from + the final countdown. + - code_imp: Distributivgesetz - Moved some job-related achievements from the misc + category to the jobs category. + - rscadd: Rhials - The roundend report will now read out any achievements ("cheevos" + as you may know them) earned by players over the course of the round. + - balance: Melbert - The "Long Shift" achievement is now feasibly obtainable, and + admins can no longer trigger it unknowingly + - rscadd: Jacquerel - You can now earn an achievement for completing the Grand Ritual. + - bugfix: Jacquerel - Summon Magic and Summon Guns work again + - rscadd: Ghommie - Added a score award that counts how many achievements you've + unlocked so far. + - rscadd: Ghommie - Added an Indebted negative quirk to the game, which gives the + holder's bank account a debt averaging at 15000 credits (with a variation of + 1250 cr) and forces 75% of all earnings towards solving it. A little prize awaits + those who actually extinguish it. + - qol: Ghommie - The Achievements UI now shows how many people have unlocked a given + achievement. + - bugfix: Ghommie - The "Skills" Category for achievements should no longer be hidden. + - bugfix: Ghommie - The "Unlocked Achievements" score will now be properly saved + at the end of the round the first time it's loaded. + - sound: Ghommie - Unlocking an achievement now plays a sound by default. You can + change it in the Sound category of the game preferences. diff --git a/html/changelogs/archive/2023-12.yml b/html/changelogs/archive/2023-12.yml new file mode 100644 index 000000000000..1a7fa2f7a56f --- /dev/null +++ b/html/changelogs/archive/2023-12.yml @@ -0,0 +1,7 @@ +2023-12-04: + san7890: + - bugfix: 'The Holy Hand Grenade''s effect on revealing a revenant had its duration + accidentally nerfed, it is now back to 10 seconds. fix: Revenant midrounds should + now properly run.' + - bugfix: Revenant harvesting should now let you actually pass the final do_after + so you can harvest that sweet essence. diff --git a/icons/effects/ore_visuals.dmi b/icons/effects/ore_visuals.dmi index 5189711bc256..4bf77e77bff5 100644 Binary files a/icons/effects/ore_visuals.dmi and b/icons/effects/ore_visuals.dmi differ diff --git a/icons/hud/screen_full.dmi b/icons/hud/screen_full.dmi index 54931085b74b..f1571e88e839 100644 Binary files a/icons/hud/screen_full.dmi and b/icons/hud/screen_full.dmi differ diff --git a/icons/mob/actions/actions_AI.dmi b/icons/mob/actions/actions_AI.dmi index 9f900bb9b4d9..ea940fc92af9 100644 Binary files a/icons/mob/actions/actions_AI.dmi and b/icons/mob/actions/actions_AI.dmi differ diff --git a/icons/mob/actions/actions_trader.dmi b/icons/mob/actions/actions_trader.dmi new file mode 100644 index 000000000000..59330b4aac83 Binary files /dev/null and b/icons/mob/actions/actions_trader.dmi differ diff --git a/icons/mob/clothing/accessories.dmi b/icons/mob/clothing/accessories.dmi index 6e1f7c26fd5b..3a3561446afa 100644 Binary files a/icons/mob/clothing/accessories.dmi and b/icons/mob/clothing/accessories.dmi differ diff --git a/icons/mob/clothing/head/plasmaman_head.dmi b/icons/mob/clothing/head/plasmaman_head.dmi index 3a737ca3d03d..42a209676ccb 100644 Binary files a/icons/mob/clothing/head/plasmaman_head.dmi and b/icons/mob/clothing/head/plasmaman_head.dmi differ diff --git a/icons/mob/clothing/suits/utility.dmi b/icons/mob/clothing/suits/utility.dmi index 539eb8594d85..64c17c99a177 100644 Binary files a/icons/mob/clothing/suits/utility.dmi and b/icons/mob/clothing/suits/utility.dmi differ diff --git a/icons/mob/clothing/under/plasmaman.dmi b/icons/mob/clothing/under/plasmaman.dmi index 57643d4f7f58..3738989c8cb4 100644 Binary files a/icons/mob/clothing/under/plasmaman.dmi and b/icons/mob/clothing/under/plasmaman.dmi differ diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi index 7d753efe421b..4284c4b92f99 100644 Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi index 4fdf61b03eb9..fe336a4d5964 100644 Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ diff --git a/icons/mob/simple/jungle/mook.dmi b/icons/mob/simple/jungle/mook.dmi index c9265b22a0ad..fbc38d29d99d 100644 Binary files a/icons/mob/simple/jungle/mook.dmi and b/icons/mob/simple/jungle/mook.dmi differ diff --git a/icons/mob/simple/jungle/seedling.dmi b/icons/mob/simple/jungle/seedling.dmi index 01e91c6c292c..c4a76ebb2d1c 100644 Binary files a/icons/mob/simple/jungle/seedling.dmi and b/icons/mob/simple/jungle/seedling.dmi differ diff --git a/icons/mob/simple/lavaland/lavaland_monsters.dmi b/icons/mob/simple/lavaland/lavaland_monsters.dmi index 1d546bd17d45..62f6f6a3fa1a 100644 Binary files a/icons/mob/simple/lavaland/lavaland_monsters.dmi and b/icons/mob/simple/lavaland/lavaland_monsters.dmi differ diff --git a/icons/mob/simple/traders.dmi b/icons/mob/simple/traders.dmi deleted file mode 100644 index 2f2b828bed91..000000000000 Binary files a/icons/mob/simple/traders.dmi and /dev/null differ diff --git a/icons/mob/spacevines.dmi b/icons/mob/spacevines.dmi new file mode 100644 index 000000000000..5839307bcfcd Binary files /dev/null and b/icons/mob/spacevines.dmi differ diff --git a/icons/mob/species/human/human_face.dmi b/icons/mob/species/human/human_face.dmi index ab6c4ad22f2f..02960bb8859f 100644 Binary files a/icons/mob/species/human/human_face.dmi and b/icons/mob/species/human/human_face.dmi differ diff --git a/icons/mob/species/lizard/bodyparts.dmi b/icons/mob/species/lizard/bodyparts.dmi index f81da7e6f6ad..9d3c3b6c5943 100644 Binary files a/icons/mob/species/lizard/bodyparts.dmi and b/icons/mob/species/lizard/bodyparts.dmi differ diff --git a/icons/mob/species/lizard/lizard_misc.dmi b/icons/mob/species/lizard/lizard_misc.dmi index ab228f29076f..cb4a0435b592 100644 Binary files a/icons/mob/species/lizard/lizard_misc.dmi and b/icons/mob/species/lizard/lizard_misc.dmi differ diff --git a/icons/mob/telegraphing/telegraph.dmi b/icons/mob/telegraphing/telegraph.dmi index d5e03419cd89..de525ead4ee9 100644 Binary files a/icons/mob/telegraphing/telegraph.dmi and b/icons/mob/telegraphing/telegraph.dmi differ diff --git a/icons/obj/anomaly.dmi b/icons/obj/anomaly.dmi new file mode 100644 index 000000000000..ad712e290fb7 Binary files /dev/null and b/icons/obj/anomaly.dmi differ diff --git a/icons/obj/artifacts.dmi b/icons/obj/artifacts.dmi new file mode 100644 index 000000000000..c365a4669c65 Binary files /dev/null and b/icons/obj/artifacts.dmi differ diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi index 8e98e22bf666..23dd1b0780dd 100644 Binary files a/icons/obj/clothing/accessories.dmi and b/icons/obj/clothing/accessories.dmi differ diff --git a/icons/obj/clothing/head/plasmaman_hats.dmi b/icons/obj/clothing/head/plasmaman_hats.dmi index 8c938d9e0b42..3ddd2da39cf4 100644 Binary files a/icons/obj/clothing/head/plasmaman_hats.dmi and b/icons/obj/clothing/head/plasmaman_hats.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi index 037e7fe69634..f1d19c29da11 100644 Binary files a/icons/obj/clothing/modsuit/mod_modules.dmi and b/icons/obj/clothing/modsuit/mod_modules.dmi differ diff --git a/icons/obj/clothing/suits/utility.dmi b/icons/obj/clothing/suits/utility.dmi index 7c8ce468350e..112e62e71ece 100644 Binary files a/icons/obj/clothing/suits/utility.dmi and b/icons/obj/clothing/suits/utility.dmi differ diff --git a/icons/obj/clothing/under/plasmaman.dmi b/icons/obj/clothing/under/plasmaman.dmi index dd4941792df4..85c3999ddf59 100644 Binary files a/icons/obj/clothing/under/plasmaman.dmi and b/icons/obj/clothing/under/plasmaman.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 6b19eafc327f..680fcd279384 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/doors/shutters_radiation.dmi b/icons/obj/doors/shutters_radiation.dmi index 657b613b0ccd..ec9d72874ab3 100644 Binary files a/icons/obj/doors/shutters_radiation.dmi and b/icons/obj/doors/shutters_radiation.dmi differ diff --git a/icons/obj/hydroponics/growing_fruits.dmi b/icons/obj/hydroponics/growing_fruits.dmi index 7e535cdaf9b3..73c22bc11c1d 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 517edbba0677..d41a8f22def3 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 d6e70af1a428..21430781ace2 100644 Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ diff --git a/icons/obj/machines/artifact_machines.dmi b/icons/obj/machines/artifact_machines.dmi new file mode 100644 index 000000000000..004e7539d4e5 Binary files /dev/null and b/icons/obj/machines/artifact_machines.dmi differ diff --git a/icons/obj/machines/atmospherics/heatingpad.dmi b/icons/obj/machines/atmospherics/heatingpad.dmi new file mode 100644 index 000000000000..c86e5bf84de0 Binary files /dev/null and b/icons/obj/machines/atmospherics/heatingpad.dmi differ diff --git a/icons/obj/machines/bitrunning.dmi b/icons/obj/machines/bitrunning.dmi index a910a16b35cf..b3f8ad63a6c9 100644 Binary files a/icons/obj/machines/bitrunning.dmi and b/icons/obj/machines/bitrunning.dmi differ diff --git a/icons/obj/medical/organs/mining_organs.dmi b/icons/obj/medical/organs/mining_organs.dmi index f3fc298284ba..172f94001ffa 100644 Binary files a/icons/obj/medical/organs/mining_organs.dmi and b/icons/obj/medical/organs/mining_organs.dmi differ diff --git a/icons/obj/mining_zones/artefacts.dmi b/icons/obj/mining_zones/artefacts.dmi new file mode 100644 index 000000000000..d4c603834d21 Binary files /dev/null and b/icons/obj/mining_zones/artefacts.dmi differ diff --git a/icons/obj/poster.dmi b/icons/obj/poster.dmi index d0176a1ac756..f46b95a85934 100644 Binary files a/icons/obj/poster.dmi and b/icons/obj/poster.dmi differ diff --git a/icons/obj/service/bureaucracy.dmi b/icons/obj/service/bureaucracy.dmi new file mode 100644 index 000000000000..fe762671e370 Binary files /dev/null and b/icons/obj/service/bureaucracy.dmi differ diff --git a/icons/obj/service/hydroponics/growing_fruits.dmi b/icons/obj/service/hydroponics/growing_fruits.dmi new file mode 100644 index 000000000000..c0f547322c7c Binary files /dev/null and b/icons/obj/service/hydroponics/growing_fruits.dmi differ diff --git a/icons/obj/service/hydroponics/seeds.dmi b/icons/obj/service/hydroponics/seeds.dmi new file mode 100644 index 000000000000..ffef219193a7 Binary files /dev/null and b/icons/obj/service/hydroponics/seeds.dmi differ diff --git a/icons/obj/service/kitchen.dmi b/icons/obj/service/kitchen.dmi new file mode 100644 index 000000000000..aeafe2591e9b Binary files /dev/null and b/icons/obj/service/kitchen.dmi differ diff --git a/icons/obj/signs.dmi b/icons/obj/signs.dmi index 518624aab840..2421fbb208d3 100644 Binary files a/icons/obj/signs.dmi and b/icons/obj/signs.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index a931c282f4dc..4b19402cfd59 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/trader_signs.dmi b/icons/obj/trader_signs.dmi new file mode 100644 index 000000000000..a6789e0bb4c5 Binary files /dev/null and b/icons/obj/trader_signs.dmi differ diff --git a/icons/obj/weapons/guns/energy.dmi b/icons/obj/weapons/guns/energy.dmi index bdd5290eb0ae..2cdbc55ea122 100644 Binary files a/icons/obj/weapons/guns/energy.dmi and b/icons/obj/weapons/guns/energy.dmi differ diff --git a/icons/testing/turf_analysis.dmi b/icons/testing/turf_analysis.dmi index e3aac1ebd05b..864e6c14643d 100644 Binary files a/icons/testing/turf_analysis.dmi and b/icons/testing/turf_analysis.dmi differ diff --git a/icons/ui_icons/achievements/achievements.dmi b/icons/ui_icons/achievements/achievements.dmi index 017eef050107..ea6c4b79e07c 100644 Binary files a/icons/ui_icons/achievements/achievements.dmi and b/icons/ui_icons/achievements/achievements.dmi differ diff --git a/icons/ui_icons/emoji/emoji.dmi b/icons/ui_icons/emoji/emoji.dmi index c4a4d3136f2b..b1fdf08427f5 100644 Binary files a/icons/ui_icons/emoji/emoji.dmi and b/icons/ui_icons/emoji/emoji.dmi differ diff --git a/interface/skin.dmf b/interface/skin.dmf index c6f2a29ad244..8ab3258f9a6b 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -201,15 +201,6 @@ window "infowindow" saved-params = "is-checked" text = "Report Issue" command = "report-issue" - elem "mediapanel" - type = BROWSER - pos = 392,25 - size = 1x1 - anchor1 = -1,-1 - anchor2 = -1,-1 - background-color = none - is-visible = false - saved-params = "" window "outputwindow" elem "outputwindow" @@ -344,6 +335,15 @@ window "statwindow" anchor2 = 100,100 is-visible = false saved-params = "" + elem "mediapanel" + type = BROWSER + pos = 392,25 + size = 1x1 + anchor1 = -1,-1 + anchor2 = -1,-1 + background-color = none + is-visible = false + saved-params = "" window "tgui_say" elem "tgui_say" diff --git a/monkestation/_maps/RandomBars/Icebox/BarSM.dmm b/monkestation/_maps/RandomBars/Icebox/BarSM.dmm index 8fd9770d46b5..c911052fec39 100644 --- a/monkestation/_maps/RandomBars/Icebox/BarSM.dmm +++ b/monkestation/_maps/RandomBars/Icebox/BarSM.dmm @@ -24,17 +24,6 @@ }, /turf/open/floor/pod/dark, /area/station/commons/lounge) -"aZ" = ( -/obj/structure/bed/dogbed{ - name = "pet bed"; - desc = "A comfy-looking pet bed. You can even strap your pet in, in case the gravity turns off." - }, -/mob/living/simple_animal/pet/cat/kitten{ - gender = "female"; - name = "Blu" - }, -/turf/open/floor/carpet/neon/simple/yellow/nodots, -/area/station/service/bar/backroom) "bo" = ( /obj/structure/cable, /obj/machinery/door/airlock/engineering/glass/critical{ @@ -591,8 +580,6 @@ /obj/item/reagent_containers/cup/beaker/large, /obj/item/vending_refill/cigarette, /obj/structure/table/reinforced, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/beanbag, /turf/open/floor/carpet/neon/simple/yellow/nodots, /area/station/service/bar/backroom) "uo" = ( @@ -905,18 +892,6 @@ "Ec" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/machinery/autolathe, -/obj/item/stack/sheet/iron/ten, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, /turf/open/floor/pod/light, /area/station/service/bar) "Eu" = ( @@ -1212,11 +1187,9 @@ pixel_x = 4; pixel_y = -4 }, -/obj/item/clothing/gloves/color/yellow, /obj/item/stack/cable_coil, -/obj/item/mod/control/pre_equipped/engineering{ - name = "Barkeeper MODsuit" - }, +/obj/item/clothing/gloves/color/fyellow, +/obj/item/mod/control/pre_equipped/empty, /turf/open/floor/carpet/neon/simple/yellow/nodots, /area/station/service/bar/backroom) "KG" = ( @@ -1233,6 +1206,7 @@ pixel_y = 6 }, /obj/item/reagent_containers/cup/rag, +/obj/item/holosign_creator/robot_seat/bar, /turf/open/floor/pod/light, /area/station/service/bar) "KL" = ( @@ -1873,7 +1847,7 @@ EK "} (17,1,1) = {" Kf -aZ +Ix Ix qu wG diff --git a/monkestation/_maps/RandomBars/Icebox/Drunkopsbar.dmm b/monkestation/_maps/RandomBars/Icebox/Drunkopsbar.dmm index e6c50a1fda6c..4d5d85804d58 100644 --- a/monkestation/_maps/RandomBars/Icebox/Drunkopsbar.dmm +++ b/monkestation/_maps/RandomBars/Icebox/Drunkopsbar.dmm @@ -592,7 +592,6 @@ /turf/open/floor/iron/dark, /area/station/service/bar) "Gc" = ( -/obj/structure/closet/gimmick/tacticool, /obj/structure/cable, /obj/item/clothing/under/syndicate/tacticool, /obj/item/clothing/under/syndicate/tacticool/skirt, @@ -600,6 +599,9 @@ /obj/item/toy/sword, /obj/structure/extinguisher_cabinet/directional/north, /obj/item/clothing/head/collectable/swat, +/obj/structure/closet{ + icon_state = "syndicate" + }, /turf/open/floor/mineral/plastitanium, /area/station/service/bar) "Gv" = ( @@ -726,12 +728,14 @@ /obj/effect/turf_decal/siding/thinplating_new/dark, /obj/effect/turf_decal/stripes/red/line, /obj/structure/railing, -/obj/structure/closet/gimmick/tacticool, /obj/item/clothing/under/syndicate/tacticool, /obj/item/clothing/under/syndicate/tacticool/skirt, /obj/item/toy/gun, /obj/item/toy/sword, /obj/item/clothing/mask/gas, +/obj/structure/closet{ + icon_state = "syndicate" + }, /turf/open/floor/mineral/plastitanium, /area/station/service/bar) "Pk" = ( @@ -785,6 +789,7 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark, /area/station/service/bar/backroom) "Qe" = ( @@ -849,7 +854,9 @@ /obj/item/toy/mecha/mauler, /obj/item/toy/sword, /obj/item/clothing/mask/gas, -/obj/structure/closet, +/obj/structure/closet{ + icon_state = "syndicate" + }, /turf/open/floor/mineral/plastitanium, /area/station/service/bar) "RX" = ( @@ -924,7 +931,9 @@ /obj/item/clothing/under/syndicate/tacticool/skirt, /obj/item/toy/gun, /obj/item/toy/sword, -/obj/structure/closet, +/obj/structure/closet{ + icon_state = "syndicate" + }, /turf/open/floor/mineral/plastitanium, /area/station/service/bar) "TO" = ( diff --git a/monkestation/_maps/RandomBars/Icebox/MaidCafe.dmm b/monkestation/_maps/RandomBars/Icebox/MaidCafe.dmm index f5856550ceb3..a2a741c45fec 100644 --- a/monkestation/_maps/RandomBars/Icebox/MaidCafe.dmm +++ b/monkestation/_maps/RandomBars/Icebox/MaidCafe.dmm @@ -38,7 +38,7 @@ /obj/structure/flora/bush/ferny/style_random, /obj/structure/flora/bush/flowers_pp/style_random, /obj/structure/flora/bush/pale/style_random, -/obj/structure/window/reinforced/fulltile, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/grass, /area/station/commons/lounge) "gO" = ( @@ -207,17 +207,14 @@ /area/station/service/bar/backroom) "tc" = ( /obj/machinery/duct, -/mob/living/basic/carp/pet/cayenne{ - desc = "It's Paprika! One of the Spider Clan's lovable Space Carp!"; - faction = list("neutral"); - name = "Paprika"; - real_name = "Paprika" - }, -/obj/structure/bed/dogbed/cayenne{ - name = "Paprika's bed" - }, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, +/mob/living/basic/carp/pet{ + name = "Paprika" + }, +/obj/structure/bed/dogbed{ + name = "fish bed" + }, /turf/open/floor/carpet/black, /area/station/service/bar) "tg" = ( @@ -284,7 +281,7 @@ /obj/structure/flora/bush/ferny/style_random, /obj/structure/flora/bush/flowers_pp/style_random, /obj/structure/flora/bush/pale/style_random, -/obj/structure/window/reinforced/fulltile, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/grass, /area/station/service/bar) "Ak" = ( @@ -568,9 +565,8 @@ /obj/item/reagent_containers/cup/beaker/large, /obj/item/reagent_containers/cup/beaker/large, /obj/item/vending_refill/cigarette, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/beanbag, -/obj/structure/table/wood, +/obj/item/holosign_creator/robot_seat/bar, +/obj/structure/closet/secure_closet/bar, /turf/open/floor/wood/tile, /area/station/service/bar/backroom) "Ou" = ( @@ -690,13 +686,6 @@ /area/station/service/bar) "TT" = ( /obj/structure/rack, -/obj/item/melee/energy/sword/holographic/red, -/obj/item/melee/energy/sword/holographic/red, -/obj/item/melee/energy/sword/holographic/green, -/obj/item/melee/energy/sword/holographic/green, -/obj/item/melee/energy/sword/holographic, -/obj/item/melee/energy/sword/holographic, -/obj/item/melee/energy/sword/bananium, /obj/item/toy/katana{ desc = "As seen in your favourite Japanese cartoon."; name = "anime katana" @@ -710,6 +699,9 @@ name = "anime katana" }, /obj/machinery/light/directional/west, +/obj/item/toy/sword, +/obj/item/toy/sword, +/obj/item/toy/sword, /turf/open/floor/wood/large, /area/station/commons/lounge) "TY" = ( @@ -729,10 +721,10 @@ /obj/structure/flora/bush/ferny/style_random, /obj/structure/flora/bush/flowers_pp/style_random, /obj/structure/flora/bush/pale/style_random, -/obj/structure/window/reinforced/fulltile, /obj/effect/turf_decal/siding/wood{ dir = 8 }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/grass, /area/station/service/bar) "UN" = ( diff --git a/monkestation/_maps/RandomBars/Icebox/clockwork_icebox.dmm b/monkestation/_maps/RandomBars/Icebox/clockwork_icebox.dmm index b780521dc727..7c23ea377a2a 100644 --- a/monkestation/_maps/RandomBars/Icebox/clockwork_icebox.dmm +++ b/monkestation/_maps/RandomBars/Icebox/clockwork_icebox.dmm @@ -163,6 +163,7 @@ }, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/camera/autoname/directional/north, /turf/open/floor/bronze/filled, /area/station/service/bar/backroom) "hS" = ( @@ -576,6 +577,10 @@ }, /turf/open/floor/bronze/filled, /area/station/service/bar) +"Fm" = ( +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/carpet/lone, +/area/station/service/theater) "FS" = ( /obj/machinery/restaurant_portal/bar, /turf/open/floor/bronze/filled, @@ -643,6 +648,10 @@ "IC" = ( /turf/closed/wall/mineral/bronze, /area/station/commons/lounge) +"IQ" = ( +/obj/machinery/vending/boozeomat, +/turf/open/floor/bronze/filled, +/area/station/service/bar) "IT" = ( /obj/effect/landmark/event_spawn, /obj/structure/disposalpipe/segment{ @@ -654,6 +663,10 @@ /obj/structure/closet/secure_closet/bar, /turf/open/floor/bronze/filled, /area/station/service/bar/backroom) +"Ky" = ( +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/bronze, +/area/station/commons/lounge) "KP" = ( /obj/effect/landmark/start/assistant, /turf/open/floor/bronze, @@ -966,7 +979,7 @@ EK "} (5,1,1) = {" nZ -YM +Fm SW OY Pz @@ -1016,7 +1029,7 @@ oC oC oC ux -ZP +Ky nl EK "} @@ -1101,7 +1114,7 @@ dJ uw Ag PC -zS +IQ EK "} (15,1,1) = {" diff --git a/monkestation/_maps/RandomBars/Icebox/cultbar_icebox.dmm b/monkestation/_maps/RandomBars/Icebox/cultbar_icebox.dmm index b2207d8af14d..9ee441ee8e9f 100644 --- a/monkestation/_maps/RandomBars/Icebox/cultbar_icebox.dmm +++ b/monkestation/_maps/RandomBars/Icebox/cultbar_icebox.dmm @@ -635,10 +635,6 @@ /obj/item/toy/toy_dagger, /turf/open/floor/cult, /area/station/commons/lounge) -"Ha" = ( -/obj/structure/constructshell, -/turf/open/floor/cult, -/area/station/service/bar/backroom) "HO" = ( /obj/structure/table/wood/fancy/red, /obj/item/food/pie/cream{ @@ -1297,7 +1293,7 @@ EK HZ QV rf -Ha +rf TV xc zG diff --git a/monkestation/_maps/RandomBars/Icebox/disco_icebox.dmm b/monkestation/_maps/RandomBars/Icebox/disco_icebox.dmm index b93b69374641..77cd09b67802 100644 --- a/monkestation/_maps/RandomBars/Icebox/disco_icebox.dmm +++ b/monkestation/_maps/RandomBars/Icebox/disco_icebox.dmm @@ -99,6 +99,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, +/obj/machinery/camera/autoname/directional/east, /turf/open/floor/eighties/red, /area/station/commons/lounge) "jI" = ( @@ -277,6 +278,7 @@ "BO" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, +/obj/machinery/camera/autoname/directional/north, /turf/open/floor/eighties, /area/station/commons/lounge) "BS" = ( diff --git a/monkestation/_maps/RandomBars/Icebox/icebox_bar_arcade.dmm b/monkestation/_maps/RandomBars/Icebox/icebox_bar_arcade.dmm index 4522dcde5860..213c0dd1a3e1 100644 --- a/monkestation/_maps/RandomBars/Icebox/icebox_bar_arcade.dmm +++ b/monkestation/_maps/RandomBars/Icebox/icebox_bar_arcade.dmm @@ -91,6 +91,7 @@ /turf/open/floor/wood/large, /area/station/commons/lounge) "ec" = ( +/obj/structure/cable, /turf/open/floor/carpet/neon/simple/orange, /area/station/service/bar) "eG" = ( @@ -100,6 +101,7 @@ name = "Bar Backroom" }, /obj/effect/mapping_helpers/airlock/access/all/service/bar, +/obj/structure/cable, /turf/open/floor/eighties/red, /area/station/service/bar/backroom) "eS" = ( @@ -149,6 +151,7 @@ /area/station/service/bar) "hH" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/cable, /turf/open/floor/carpet/neon/simple/orange, /area/station/service/bar) "ip" = ( @@ -171,6 +174,7 @@ /area/station/commons/lounge) "jn" = ( /obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, /turf/open/floor/eighties/red, /area/station/service/bar/backroom) "jp" = ( @@ -205,6 +209,7 @@ /obj/effect/turf_decal/siding/purple{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/eighties, /area/station/service/theater) "kp" = ( @@ -276,6 +281,7 @@ dir = 4 }, /obj/machinery/duct, +/obj/structure/cable, /turf/open/floor/carpet/neon/simple/yellow, /area/station/commons/lounge) "pH" = ( @@ -348,6 +354,7 @@ }, /obj/effect/mapping_helpers/airlock/access/all/service/bar, /obj/machinery/duct, +/obj/structure/cable, /turf/open/floor/eighties/red, /area/station/service/bar/backroom) "ut" = ( @@ -372,6 +379,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/eighties/red, /area/station/commons/lounge) "vl" = ( @@ -447,10 +455,12 @@ "xW" = ( /obj/effect/landmark/event_spawn, /obj/machinery/duct, +/obj/structure/cable, /turf/open/floor/carpet/neon/simple/orange, /area/station/service/bar) "xX" = ( /obj/structure/sink/kitchen/directional/east, +/obj/structure/cable, /turf/open/floor/eighties/red, /area/station/service/bar/backroom) "ys" = ( @@ -612,6 +622,7 @@ name = "bar mixing area"; req_access = list("bar") }, +/obj/structure/cable, /turf/open/floor/carpet/neon/simple/yellow, /area/station/service/bar) "FR" = ( @@ -629,6 +640,7 @@ /area/station/commons/lounge) "FS" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable, /turf/open/floor/eighties/red, /area/station/service/bar/backroom) "FW" = ( @@ -722,6 +734,7 @@ /area/station/service/bar/backroom) "Jv" = ( /obj/machinery/duct, +/obj/structure/cable, /turf/open/floor/carpet/neon/simple/orange, /area/station/service/bar) "Kc" = ( @@ -866,7 +879,7 @@ /turf/open/floor/carpet/neon/simple/purple, /area/station/commons/lounge) "OO" = ( -/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, /turf/open/floor/carpet/neon/simple/yellow, /area/station/service/bar) "OW" = ( @@ -896,6 +909,10 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/carpet/neon/simple/red, /area/station/commons/lounge) +"PL" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/turf/template_noop, +/area/template_noop) "PN" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -1119,7 +1136,7 @@ dn XN "} (4,1,1) = {" -Ow +PL Ow Ow eS diff --git a/monkestation/_maps/RandomBars/Icebox/junglebar.dmm b/monkestation/_maps/RandomBars/Icebox/junglebar.dmm index ec495ac3e99d..bf3174b6ca2d 100644 --- a/monkestation/_maps/RandomBars/Icebox/junglebar.dmm +++ b/monkestation/_maps/RandomBars/Icebox/junglebar.dmm @@ -6,6 +6,15 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/wood, /area/station/commons/lounge) +"az" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/power/floodlight, +/obj/item/wrench, +/turf/open/floor/wood, +/area/station/commons/lounge) "bp" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, @@ -94,6 +103,7 @@ /area/station/commons/lounge) "hi" = ( /obj/machinery/firealarm/directional/east, +/obj/structure/chair/sofa/left/brown, /turf/open/misc/grass/jungle, /area/station/commons/lounge) "ho" = ( @@ -288,6 +298,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/dim/directional/north, +/obj/machinery/camera/autoname/directional/north, /turf/open/floor/wood, /area/station/commons/lounge) "Es" = ( @@ -301,6 +312,7 @@ /area/template_noop) "Fz" = ( /obj/machinery/firealarm/directional/north, +/obj/machinery/camera/autoname/directional/north, /turf/open/floor/wood, /area/station/service/bar) "FY" = ( @@ -355,9 +367,6 @@ /area/station/commons/lounge) "Km" = ( /obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, /obj/machinery/restaurant_portal/bar, /turf/open/floor/wood, /area/station/commons/lounge) @@ -415,7 +424,9 @@ /area/station/service/bar) "QV" = ( /obj/item/radio/intercom/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, /turf/open/floor/wood, /area/station/commons/lounge) "Rp" = ( @@ -432,6 +443,12 @@ /obj/machinery/light/dim/directional/north, /turf/open/floor/wood, /area/station/commons/lounge) +"Tg" = ( +/obj/machinery/holopad, +/turf/open/misc/dirt/jungle/wasteland{ + slowdown = 0 + }, +/area/station/commons/lounge) "TK" = ( /obj/machinery/status_display/evac/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -441,6 +458,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/station/commons/lounge) +"Vc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/wood, +/area/station/commons/lounge) "Vd" = ( /obj/machinery/atm, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -481,6 +506,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/west, /obj/structure/cable, +/obj/machinery/camera/autoname/directional/west, /turf/open/floor/wood, /area/station/service/bar/backroom) @@ -491,7 +517,7 @@ EK tV xY OC -Ke +Vc TK YA pl @@ -530,7 +556,7 @@ de EK EK EK -ac +xY Xr Xr dB @@ -543,7 +569,7 @@ EK (5,1,1) = {" ac xY -VL +az VL Mt Df @@ -602,7 +628,7 @@ tx GX Mt qR -qR +Tg qR Xr Xr diff --git a/monkestation/_maps/RandomBars/Tram/tram_bar_beachside.dmm b/monkestation/_maps/RandomBars/Tram/tram_bar_beachside.dmm new file mode 100644 index 000000000000..a94346f91a0d --- /dev/null +++ b/monkestation/_maps/RandomBars/Tram/tram_bar_beachside.dmm @@ -0,0 +1,2588 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ag" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe, +/turf/open/floor/wood, +/area/station/service/kitchen) +"am" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/holosign_creator/robot_seat/restaurant, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"aO" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"bk" = ( +/obj/structure/closet/crate{ + name = "aquarium supplies" + }, +/obj/item/storage/box/aquarium_props, +/turf/open/floor/wood, +/area/station/service/kitchen) +"bq" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks, +/turf/open/floor/wood, +/area/station/service/bar) +"br" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"bF" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"bR" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/service/bar) +"bX" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/camera/directional/south, +/obj/machinery/newscaster/directional/south, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"cb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"cZ" = ( +/obj/machinery/requests_console/directional/north{ + name = "Kitchen Requests Console" + }, +/obj/machinery/deepfryer, +/turf/open/floor/wood, +/area/station/service/kitchen) +"dd" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/airalarm/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/theater) +"di" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood, +/area/station/service/kitchen) +"du" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"dG" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/bar) +"dP" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/water/beach/biodome/sinking, +/area/station/commons/lounge) +"ee" = ( +/obj/effect/landmark/start/hangover, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"ef" = ( +/obj/effect/turf_decal/sand, +/obj/structure/mineral_door/sandstone, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"ek" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/plate, +/obj/item/food/fishmeat, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"ey" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/sand, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"fi" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/plate, +/obj/item/food/fishmeat, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"fr" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/item/reagent_containers/condiment/rice, +/obj/item/reagent_containers/condiment/rice, +/turf/open/floor/wood, +/area/station/service/kitchen) +"fs" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/turf/open/floor/wood, +/area/station/service/bar) +"fw" = ( +/obj/structure/railing, +/turf/open/misc/beach/coastline_b{ + dir = 6 + }, +/area/station/commons/lounge) +"fy" = ( +/obj/effect/spawner/random/vending/snackvend, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"ga" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/entertainment/gambling, +/turf/open/floor/wood, +/area/station/service/bar) +"hh" = ( +/turf/open/misc/beach/coastline_b{ + dir = 1 + }, +/area/station/commons/lounge) +"hi" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/sand, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"hn" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/sand, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"hD" = ( +/turf/closed/wall/mineral/sandstone, +/area/station/service/theater) +"hG" = ( +/obj/structure/flora/rock/style_random{ + desc = "A volcanic rock."; + name = "coastal rock" + }, +/obj/structure/flora/bush/stalky/style_random{ + desc = "It can't be smoked."; + name = "sea weed" + }, +/turf/open/water/beach/biodome/sinking, +/area/station/commons/lounge) +"hO" = ( +/obj/machinery/fishing_portal_generator, +/turf/open/floor/wood, +/area/station/service/kitchen) +"hZ" = ( +/obj/machinery/door/airlock/sandstone{ + id_tag = "toilet1"; + name = "Restroom Stall" + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron/white, +/area/station/commons/lounge) +"ia" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/bar) +"iK" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"iS" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 2 + }, +/obj/effect/mapping_helpers/mail_sorting/service/theater, +/obj/effect/turf_decal/sand, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"iX" = ( +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/wood, +/area/station/service/kitchen) +"iY" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/entertainment/cigar, +/turf/open/floor/wood, +/area/station/service/bar) +"jg" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/sand, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"jm" = ( +/turf/open/water/beach/biodome/sinking, +/area/station/commons/lounge) +"js" = ( +/mob/living/basic/parrot, +/obj/structure/fluff/beach_umbrella/security, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"jv" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"jy" = ( +/obj/structure/chair/comfy/carp{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/service/bar) +"jA" = ( +/obj/effect/turf_decal/sand, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/service/theater) +"jR" = ( +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/wood, +/area/station/service/kitchen) +"jY" = ( +/turf/open/misc/beach/coastline_t{ + dir = 5 + }, +/area/station/commons/lounge) +"kB" = ( +/turf/open/misc/beach/coastline_b{ + dir = 10 + }, +/area/station/commons/lounge) +"lb" = ( +/turf/open/openspace, +/area/station/service/kitchen) +"lm" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/food_or_drink/three_course_meal, +/turf/open/floor/wood, +/area/station/service/kitchen) +"lq" = ( +/obj/structure/aquarium, +/turf/open/floor/wood, +/area/station/service/kitchen) +"ls" = ( +/obj/machinery/chem_master/condimaster{ + desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; + name = "HoochMaster Deluxe" + }, +/turf/open/floor/wood, +/area/station/service/bar) +"lt" = ( +/obj/structure/flora/bush/reed/style_random, +/turf/open/water/beach/biodome/sinking, +/area/station/commons/lounge) +"lE" = ( +/obj/structure/railing, +/turf/open/misc/beach/coastline_t/sandwater_inner{ + dir = 4 + }, +/area/station/commons/lounge) +"lL" = ( +/turf/template_noop, +/area/template_noop) +"lQ" = ( +/obj/machinery/stove, +/turf/open/floor/wood, +/area/station/service/kitchen) +"me" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/water/beach/biodome/sinking, +/area/station/commons/lounge) +"mp" = ( +/mob/living/basic/crab{ + name = "la creatura"; + desc = "ay dios mios..." + }, +/turf/open/misc/beach/coastline_t{ + dir = 4 + }, +/area/station/commons/lounge) +"my" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"mG" = ( +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen/east_offset, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/service/kitchen) +"mH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"mO" = ( +/obj/effect/landmark/start/assistant, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"mS" = ( +/obj/effect/overlay/palmtree_r{ + desc = "How did you get here?"; + icon_state = "palm2"; + name = "\proper island palm tree" + }, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"mV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/reinforced/titaniumglass, +/turf/open/floor/wood, +/area/station/service/bar) +"nx" = ( +/obj/effect/area_lighting_helper/max_alpha, +/turf/open/floor/wood, +/area/station/service/bar) +"nB" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/chef_recipes, +/obj/item/reagent_containers/condiment/enzyme, +/turf/open/floor/wood, +/area/station/service/kitchen) +"nN" = ( +/obj/structure/ladder, +/obj/machinery/door/window/left/directional/north{ + name = "Bar backroom Access"; + req_one_access = list("bar") + }, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron, +/area/station/commons/lounge) +"nU" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/paper/fluff/beachside_bar, +/turf/open/floor/wood, +/area/station/service/bar) +"oc" = ( +/mob/living/basic/crab, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"ot" = ( +/turf/open/misc/beach/coastline_t/sandwater_inner{ + dir = 1 + }, +/area/station/commons/lounge) +"oy" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/service/kitchen) +"oE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/area_lighting_helper/max_alpha, +/turf/open/floor/wood, +/area/station/service/kitchen) +"oL" = ( +/turf/open/misc/beach/coastline_b, +/area/station/commons/lounge) +"oN" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/sand, +/obj/item/radio/intercom/directional/south{ + name = "Common Channel" + }, +/obj/machinery/camera/directional/south, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"oV" = ( +/obj/structure/fluff/beach_umbrella, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"oW" = ( +/obj/machinery/restaurant_portal/bar, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"pa" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/effect/turf_decal/sand, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"pi" = ( +/turf/open/misc/beach/coastline_b{ + dir = 5 + }, +/area/station/commons/lounge) +"pj" = ( +/turf/open/misc/beach/coastline_t{ + dir = 8 + }, +/area/station/commons/lounge) +"pm" = ( +/obj/structure/chair/comfy/carp{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood, +/area/station/service/bar) +"pL" = ( +/obj/effect/turf_decal/sand, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"pN" = ( +/obj/effect/turf_decal/sand, +/obj/structure/closet/crate, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/glasses/eyepatch, +/turf/open/floor/iron, +/area/station/commons/lounge) +"pR" = ( +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"pW" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/entertainment/plushie, +/turf/open/floor/wood, +/area/station/service/bar) +"qc" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/wood, +/area/station/service/bar) +"qg" = ( +/obj/structure/chair/comfy/carp{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/landmark/start/hangover, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/kitchen) +"ql" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/kitchen) +"qq" = ( +/obj/effect/turf_decal/sand, +/obj/structure/closet/athletic_mixed, +/turf/open/floor/iron, +/area/station/commons/lounge) +"qT" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/reagent_containers/cup/glass/bottle/beer, +/turf/open/floor/wood, +/area/station/service/bar) +"rn" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/misc/beach/coastline_b{ + dir = 5 + }, +/area/station/commons/lounge) +"rw" = ( +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/sand, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"rT" = ( +/obj/item/toy/seashell, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"sa" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/machinery/door/window/left/directional/west{ + name = "Kitchen"; + req_one_access = list("kitchen") + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"sb" = ( +/obj/structure/closet/secure_closet/freezer/cream_pie, +/obj/effect/turf_decal/sand, +/obj/machinery/camera/directional/north{ + c_tag = "Civilian - Theatre Backstage" + }, +/turf/open/floor/iron, +/area/station/service/theater) +"sd" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/navigate_destination/kitchen, +/turf/open/floor/wood, +/area/station/service/kitchen) +"sI" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/elevator_control_panel/directional/north{ + desc = "A small control panel used to move the kitchen dumbwaiter up and down."; + linked_elevator_id = "dumbwaiter_lift"; + name = "Dumbwaiter Control Panel"; + preset_destination_names = list("2"="Hydroponics","3"="Kitchen") + }, +/turf/open/floor/wood/large, +/area/station/service/kitchen) +"sL" = ( +/mob/living/basic/crab, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"sM" = ( +/obj/effect/landmark/start/hangover, +/turf/open/misc/beach/coastline_b, +/area/station/commons/lounge) +"tk" = ( +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"tD" = ( +/obj/machinery/camera/directional/south, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"tF" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/bananalamp{ + pixel_y = 3 + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron, +/area/station/service/theater) +"uz" = ( +/obj/effect/landmark/start/clown, +/obj/structure/chair/wood{ + dir = 4 + }, +/obj/effect/turf_decal/sand, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/service/theater) +"uA" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"uN" = ( +/obj/machinery/camera/directional/east, +/turf/open/floor/wood, +/area/station/service/kitchen) +"vb" = ( +/obj/item/toy/seashell, +/obj/effect/turf_decal/sand, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"vc" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/reagent_containers/cup/glass/bottle/beer, +/turf/open/floor/wood, +/area/station/service/bar) +"vR" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/mob/living/basic/crab/evil/kreb, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron/white, +/area/station/commons/lounge) +"vY" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"wm" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Civilian - Theatre Backstage" + }, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"wn" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/obj/item/food/moonfish_caviar, +/turf/open/floor/wood, +/area/station/service/kitchen) +"wq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"ww" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"wA" = ( +/obj/machinery/oven, +/turf/open/floor/wood, +/area/station/service/kitchen) +"wC" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"wI" = ( +/turf/open/misc/beach/coastline_b{ + dir = 4 + }, +/area/station/commons/lounge) +"wR" = ( +/obj/structure/flora/bush/reed/style_random, +/turf/open/misc/beach/coastline_b, +/area/station/commons/lounge) +"xw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"xE" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"xG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/reagent_containers/cup/glass/bottle/beer, +/turf/open/floor/wood, +/area/station/service/bar) +"xH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/access/all/service/theatre/east_offset, +/obj/effect/turf_decal/sand, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/service/theater) +"xI" = ( +/turf/open/misc/beach/coastline_t/sandwater_inner{ + dir = 4 + }, +/area/station/commons/lounge) +"xU" = ( +/turf/open/misc/beach/coastline_t{ + dir = 9 + }, +/area/station/commons/lounge) +"yg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/bar) +"zb" = ( +/obj/machinery/grill, +/turf/open/floor/wood, +/area/station/service/kitchen) +"zh" = ( +/turf/open/misc/beach/coastline_b{ + dir = 6 + }, +/area/station/commons/lounge) +"zo" = ( +/obj/machinery/door/window/left/directional/south{ + req_one_access = list("kitchen"); + name = "Kitchen" + }, +/obj/effect/turf_decal/siding/wood, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"zt" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/sand, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"zC" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/sand, +/obj/structure/mineral_door/sandstone, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"zQ" = ( +/turf/open/misc/beach/coastline_t, +/area/station/commons/lounge) +"Ad" = ( +/obj/machinery/button/door/directional/east{ + id = "toilet1"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/sink/directional/south, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron/white, +/area/station/commons/lounge) +"Af" = ( +/obj/structure/closet/crate{ + name = "fishing supplies" + }, +/obj/item/storage/toolbox/fishing, +/turf/open/floor/wood, +/area/station/service/kitchen) +"AA" = ( +/obj/effect/turf_decal/sand, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"AC" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Bar"; + req_one_access = list("bar") + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/bar) +"AR" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/item/food/fish_poke, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"AS" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"AZ" = ( +/mob/living/basic/crab, +/turf/open/water/beach/biodome/sinking, +/area/station/commons/lounge) +"Bb" = ( +/obj/structure/mirror/directional/west, +/obj/structure/sink/directional/east, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron/white, +/area/station/commons/lounge) +"Bt" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/sand, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"BN" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/entertainment/gambling, +/turf/open/floor/wood, +/area/station/service/bar) +"BO" = ( +/obj/effect/landmark/start/hangover, +/turf/open/misc/beach/coastline_t{ + dir = 1 + }, +/area/station/commons/lounge) +"BW" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/obj/item/reagent_containers/condiment/rice, +/obj/item/reagent_containers/condiment/rice, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/kitchen) +"Ci" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/kitchen) +"Cw" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron/white, +/area/station/commons/lounge) +"CD" = ( +/obj/effect/turf_decal/sand, +/obj/structure/closet/crate{ + name = "fishing supplies" + }, +/obj/effect/spawner/random/fishing_rods, +/obj/effect/spawner/random/fishing_rods, +/obj/effect/spawner/random/fishing_rods, +/obj/item/storage/box/fishing_lines, +/obj/item/storage/box/fishing_hooks, +/obj/item/fishing_hook/jaws, +/obj/item/fishing_hook/stabilized, +/obj/item/storage/toolbox/fishing, +/obj/item/bait_can/worm/premium, +/obj/item/bait_can/worm, +/turf/open/floor/iron, +/area/station/commons/lounge) +"CQ" = ( +/obj/effect/turf_decal/sand, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"CT" = ( +/obj/structure/table/wood, +/obj/item/lipstick/random, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron, +/area/station/service/theater) +"Df" = ( +/obj/machinery/griddle, +/turf/open/floor/wood, +/area/station/service/kitchen) +"DL" = ( +/obj/machinery/vending/cigarette, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"DP" = ( +/obj/item/toy/seashell, +/turf/open/misc/beach/coastline_t{ + dir = 1 + }, +/area/station/commons/lounge) +"DT" = ( +/obj/effect/turf_decal/sand, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/area_lighting_helper/max_alpha, +/turf/open/floor/iron, +/area/station/service/theater) +"Eg" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"Ei" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"Em" = ( +/obj/structure/fluff/beach_umbrella/engine, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"Eu" = ( +/obj/machinery/door/airlock/sandstone, +/obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/effect/turf_decal/sand, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/service/theater) +"Ex" = ( +/obj/structure/fluff/beach_umbrella/science, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"EN" = ( +/turf/open/misc/beach/coastline_t{ + dir = 4 + }, +/area/station/commons/lounge) +"EQ" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/soup_pot, +/obj/item/kitchen/spoon/soup_ladle, +/turf/open/floor/wood, +/area/station/service/kitchen) +"Fc" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"Fj" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/item/clothing/glasses/sunglasses/big, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"Fn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/service/bar/west_offset, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/bar) +"Ge" = ( +/obj/effect/turf_decal/sand, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"Gg" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"Gu" = ( +/obj/effect/overlay/coconut{ + pixel_x = -5; + pixel_y = 4 + }, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"Gz" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/entertainment/money, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/wood, +/area/station/service/bar) +"GB" = ( +/obj/effect/landmark/start/bartender, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/bar) +"GF" = ( +/obj/machinery/airalarm/directional/south, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"GK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/entertainment/lighter, +/turf/open/floor/wood, +/area/station/service/bar) +"GU" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/sand, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/service/theater) +"Hk" = ( +/obj/structure/fluff/beach_umbrella/cap, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"Hz" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron, +/area/station/service/theater) +"HB" = ( +/obj/structure/railing, +/turf/open/water/beach/biodome/sinking, +/area/station/commons/lounge) +"HN" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood/large, +/area/station/service/kitchen) +"HU" = ( +/obj/structure/table/reinforced, +/obj/machinery/reagentgrinder{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_x = 6; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"HW" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/entertainment/money, +/turf/open/floor/wood, +/area/station/service/bar) +"Iq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/station/service/kitchen) +"Iy" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/entertainment/deck, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/service/bar) +"IS" = ( +/obj/effect/landmark/navigate_destination/bar, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/bar) +"IY" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/effect/turf_decal/sand, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/mineral_door/sandstone, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"Js" = ( +/obj/structure/table/wood, +/obj/item/toy/crayon/spraycan/lubecan, +/obj/effect/turf_decal/sand, +/obj/structure/mirror/directional/north, +/turf/open/floor/iron, +/area/station/service/theater) +"JF" = ( +/turf/open/floor/wood, +/area/station/service/kitchen) +"JT" = ( +/obj/structure/sink/kitchen/directional/south, +/turf/open/floor/wood, +/area/station/service/kitchen) +"Ku" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/service/bar) +"KJ" = ( +/turf/open/misc/beach/coastline_t{ + dir = 1 + }, +/area/station/commons/lounge) +"KP" = ( +/turf/open/water/beach/biodome/sinking/deep, +/area/station/commons/lounge) +"La" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Le" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/cigarettes/cigars/cohiba, +/obj/effect/spawner/random/entertainment/lighter, +/turf/open/floor/wood, +/area/station/service/bar) +"LD" = ( +/turf/open/misc/beach/coastline_b{ + dir = 8 + }, +/area/station/commons/lounge) +"LE" = ( +/obj/machinery/restaurant_portal/restaurant, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"LJ" = ( +/obj/machinery/vending/boozeomat, +/turf/open/floor/wood, +/area/station/service/bar) +"LK" = ( +/turf/closed/wall/mineral/sandstone, +/area/station/commons/lounge) +"LT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"Mz" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/floor/wood, +/area/station/service/bar) +"ME" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"MX" = ( +/turf/open/floor/wood, +/area/station/service/bar) +"Na" = ( +/turf/open/misc/beach/coastline_t{ + dir = 6 + }, +/area/station/commons/lounge) +"Nm" = ( +/obj/item/melee/skateboard/hoverboard, +/mob/living/carbon/human/species/monkey/punpun, +/turf/open/water/beach/biodome/sinking, +/area/station/commons/lounge) +"Nt" = ( +/obj/structure/ladder, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/siding/wood/end, +/turf/open/floor/wood/large, +/area/station/service/kitchen) +"Nz" = ( +/obj/structure/closet/crate/freezer, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/fishmeat/carp, +/obj/item/food/fishmeat/carp, +/obj/item/food/fishmeat/carp, +/obj/item/food/fishmeat/carp, +/obj/item/food/fishmeat/carp, +/obj/item/food/fishmeat/carp, +/turf/open/floor/wood, +/area/station/service/kitchen) +"NG" = ( +/obj/effect/area_lighting_helper/max_alpha, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"NK" = ( +/obj/effect/overlay/coconut{ + pixel_x = -7; + pixel_y = 7 + }, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"NL" = ( +/obj/structure/closet/secure_closet/freezer/cream_pie, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron, +/area/station/service/theater) +"NZ" = ( +/obj/effect/landmark/start/cook, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/kitchen) +"Ob" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"Oi" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/sand, +/obj/effect/spawner/random/entertainment/musical_instrument{ + spawn_loot_count = 2; + spawn_loot_double = 0; + spawn_random_offset = 1 + }, +/obj/effect/spawner/random/entertainment/musical_instrument{ + spawn_loot_count = 2; + spawn_loot_double = 0; + spawn_random_offset = 1 + }, +/obj/effect/spawner/random/entertainment/musical_instrument{ + spawn_loot_count = 2; + spawn_loot_double = 0; + spawn_random_offset = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Oo" = ( +/obj/structure/disposalpipe/segment, +/obj/item/radio/intercom/directional/east{ + freerange = 1; + listening = 0; + name = "Common Channel" + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"Or" = ( +/obj/effect/landmark/start/cook, +/turf/open/floor/wood, +/area/station/service/kitchen) +"OL" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Dumbwaiter Pier Safety Door" + }, +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood/large, +/area/station/service/kitchen) +"OO" = ( +/obj/item/toy/seashell, +/turf/open/misc/beach/coastline_t{ + dir = 8 + }, +/area/station/commons/lounge) +"OU" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/misc/beach/coastline_t/sandwater_inner{ + dir = 8 + }, +/area/station/commons/lounge) +"Ps" = ( +/obj/machinery/vending/dinnerware, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/wood, +/area/station/service/kitchen) +"Pt" = ( +/obj/structure/railing, +/turf/open/misc/beach/coastline_t{ + dir = 9 + }, +/area/station/commons/lounge) +"Px" = ( +/turf/open/misc/beach/coastline_t{ + dir = 10 + }, +/area/station/commons/lounge) +"PF" = ( +/obj/structure/dresser, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron, +/area/station/service/theater) +"PH" = ( +/obj/machinery/door/airlock/sandstone{ + name = "Supply Shed" + }, +/obj/effect/turf_decal/sand, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"PR" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/chair/comfy/carp{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"Qd" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/barman_recipes, +/turf/open/floor/wood, +/area/station/service/bar) +"Qm" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/item/clothing/glasses/sunglasses, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"Qz" = ( +/obj/effect/overlay/coconut, +/obj/item/food/baguette, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"QE" = ( +/obj/machinery/vending/autodrobe, +/obj/effect/turf_decal/sand, +/turf/open/floor/iron, +/area/station/service/theater) +"QK" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"QW" = ( +/obj/item/toy/beach_ball, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"Rv" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/sand, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"RH" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"RK" = ( +/obj/effect/landmark/start/assistant, +/turf/open/misc/beach/coastline_t{ + dir = 1 + }, +/area/station/commons/lounge) +"RL" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/service/kitchen) +"RY" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"Sx" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/food_or_drink/salad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/knife/kitchen, +/turf/open/floor/wood, +/area/station/service/kitchen) +"Tk" = ( +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/entertainment/toy_figure, +/turf/open/floor/wood, +/area/station/service/bar) +"To" = ( +/obj/structure/table/reinforced, +/obj/machinery/button/door/directional/south{ + id = "playerscantreadthis"; + name = "Kitchen Shutters Control"; + pixel_y = null + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"TC" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/overlay/palmtree_r{ + desc = "How did you get here?"; + icon_state = "palm2"; + name = "\proper island palm tree" + }, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"TG" = ( +/obj/machinery/door/window/left/directional/south{ + req_one_access = list("kitchen"); + name = "Kitchen Coldroom Access" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/service/kitchen) +"Ua" = ( +/obj/structure/chair/comfy/carp{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood, +/area/station/service/bar) +"Um" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"Ux" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"UY" = ( +/obj/structure/closet/crate/wooden/toy, +/obj/effect/turf_decal/sand, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/service/theater) +"UZ" = ( +/obj/effect/spawner/random/vending/colavend, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"Va" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/entertainment/drugs, +/turf/open/floor/wood, +/area/station/service/bar) +"Vb" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"Vg" = ( +/obj/structure/chair/comfy/carp{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/turf/open/floor/wood, +/area/station/service/bar) +"Vm" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/sand, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"Vt" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/misc/beach/coastline_t{ + dir = 8 + }, +/area/station/commons/lounge) +"VC" = ( +/obj/item/radio/intercom/directional/west{ + freerange = 1; + listening = 0; + name = "Common Channel"; + pixel_y = -8 + }, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"VI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/entertainment/cigarette_pack, +/turf/open/floor/wood, +/area/station/service/bar) +"VS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/fakesand, +/area/station/commons/lounge) +"Wq" = ( +/obj/machinery/atm, +/obj/effect/turf_decal/sand, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"WJ" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"WZ" = ( +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/kitchen) +"Xc" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/water/beach/biodome/sinking, +/area/station/commons/lounge) +"XT" = ( +/obj/structure/table/reinforced, +/obj/item/knife/kitchen, +/obj/item/kitchen/rollingpin, +/turf/open/floor/wood, +/area/station/service/kitchen) +"XX" = ( +/obj/structure/table/wood, +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_x = -5; + pixel_y = 8 + }, +/turf/open/floor/wood, +/area/station/service/bar) +"Yb" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/effect/spawner/random/entertainment/gambling, +/turf/open/floor/wood, +/area/station/service/bar) +"Yn" = ( +/obj/machinery/processor, +/turf/open/floor/wood, +/area/station/service/kitchen) +"YA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/table/reinforced/titaniumglass, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/turf/open/floor/wood, +/area/station/service/kitchen) +"YC" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/east_offset, +/turf/open/misc/beach/coastline_t, +/area/station/commons/lounge) +"YE" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer, +/turf/open/floor/wood, +/area/station/service/bar) +"Zc" = ( +/obj/effect/landmark/start/mime, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/station/commons/lounge) +"ZG" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/water/beach/biodome/sinking, +/area/station/commons/lounge) +"ZH" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/misc/beach/coastline_t{ + dir = 10 + }, +/area/station/commons/lounge) +"ZN" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4 + }, +/obj/effect/mapping_helpers/mail_sorting/service/kitchen, +/turf/open/floor/fakesand, +/area/station/commons/lounge) + +(1,1,1) = {" +KP +LD +LD +LD +jm +jm +hh +KJ +Gz +yg +Fn +ia +vc +Vg +pR +pR +pR +LK +LK +LK +LK +lL +lL +lL +lL +"} +(2,1,1) = {" +hh +xU +OO +Px +oL +jm +hh +KJ +mV +MX +Le +dG +Tk +bR +pR +pR +pR +LK +vR +Bb +LK +lL +lL +lL +lL +"} +(3,1,1) = {" +hh +KJ +mS +zQ +oL +jm +hh +BO +VI +MX +XX +dG +ga +Ua +pR +pR +tD +LK +Ad +Cw +LK +lL +lL +lL +lL +"} +(4,1,1) = {" +hh +KJ +Qz +zQ +oL +jm +hh +KJ +Yb +MX +LJ +dG +Mz +bR +pR +pR +pR +LK +LK +hZ +LK +lL +lL +lL +lL +"} +(5,1,1) = {" +hh +KJ +js +zQ +oL +jm +hh +KJ +Va +nx +Qd +IS +ga +jy +pR +pR +pR +VC +pR +CQ +LK +lL +lL +lL +lL +"} +(6,1,1) = {" +hh +KJ +Zc +zQ +oL +jm +hh +RK +mV +MX +ls +dG +Iy +Ku +pR +sL +pR +pR +pR +CQ +LK +lL +lL +lL +lL +"} +(7,1,1) = {" +hh +jY +mp +Na +oL +jm +hh +BO +GK +MX +bq +dG +HW +jy +CQ +CQ +CQ +CQ +CQ +CQ +LK +lL +lL +lL +lL +"} +(8,1,1) = {" +jm +wI +wI +wI +jm +Nm +hh +KJ +xG +MX +YE +dG +pW +bR +pR +pR +pR +CQ +pR +pR +LK +LK +lL +lL +lL +"} +(9,1,1) = {" +jm +jm +jm +jm +jm +jm +hh +KJ +Va +qc +GB +dG +nU +pm +pR +pR +pR +CQ +pR +mS +GF +LK +lL +lL +lL +"} +(10,1,1) = {" +jm +jm +jm +jm +hG +jm +hh +DP +qT +iY +BN +AC +fs +oW +pR +pR +pR +CQ +pR +pR +pR +LK +LK +LK +LK +"} +(11,1,1) = {" +jm +jm +jm +jm +jm +jm +hh +KJ +oV +br +ee +Um +pR +pR +pR +pR +pR +CQ +pR +pR +pR +pR +pR +pR +LK +"} +(12,1,1) = {" +hG +jm +jm +jm +jm +jm +hh +jY +EN +ot +pR +Um +pR +pR +pR +pR +pL +zt +zt +Ei +CQ +CQ +vb +CQ +ef +"} +(13,1,1) = {" +jm +jm +jm +jm +jm +jm +jm +wI +kB +KJ +Qm +Um +pR +LK +LK +LK +LK +LK +pR +tk +du +du +du +zt +zC +"} +(14,1,1) = {" +jm +jm +dP +dP +dP +dP +dP +jm +hh +KJ +Hk +TC +pR +LK +qq +rw +CD +LK +pR +wq +Ux +cb +pR +CQ +ef +"} +(15,1,1) = {" +jm +HB +lb +OL +Iq +TG +Nt +me +hh +BO +pR +Um +AS +PH +La +La +nN +LK +NG +LT +Ux +mS +pR +oN +LK +"} +(16,1,1) = {" +jm +HB +sI +HN +ZG +Xc +Xc +jm +hh +KJ +WJ +Um +iK +LK +pN +Bt +Oi +LK +pR +LT +Ux +NK +pR +CQ +ef +"} +(17,1,1) = {" +jm +HB +RL +ZG +jm +jm +jm +jm +hh +KJ +Em +QW +bX +LK +LK +LK +LK +LK +Wq +LT +my +uA +bF +Vm +IY +"} +(18,1,1) = {" +jm +HB +RL +me +jm +jm +jm +jm +hh +KJ +ME +Ge +CQ +fy +fy +DL +UZ +UZ +CQ +mH +AA +CQ +CQ +CQ +ef +"} +(19,1,1) = {" +jm +fw +RL +rn +jm +AZ +jm +jm +hh +KJ +Fj +Ge +oc +Rv +Rv +ey +Vm +hn +hn +Gg +Eg +wC +pR +pR +LK +"} +(20,1,1) = {" +zh +Pt +RL +ZH +pi +LD +LD +LD +zh +KJ +Ex +Ge +cb +pR +pR +LT +Ge +pR +pR +pR +LT +LK +lL +lL +lL +"} +(21,1,1) = {" +pj +lE +RL +OU +Vt +pj +Vt +pj +pj +xI +pR +hi +du +du +du +ZN +Ge +pR +pR +pR +LT +LK +lL +lL +lL +"} +(22,1,1) = {" +xw +ek +sa +Vb +xw +YA +xw +ek +xw +am +LE +jg +pR +Gu +pR +LT +Ge +rT +pR +pR +LT +LK +lL +lL +lL +"} +(23,1,1) = {" +JT +WZ +WZ +WZ +WZ +WZ +WZ +WZ +ql +QK +qg +jg +pR +mS +pR +LT +Ge +pR +pR +pR +LT +LK +lL +lL +lL +"} +(24,1,1) = {" +JT +WZ +Af +vY +Nz +XT +Df +lm +Ci +AR +oy +VS +pR +pR +pR +xE +iS +du +du +du +aO +LK +lL +lL +lL +"} +(25,1,1) = {" +cZ +WZ +JF +lq +JF +RH +JF +zb +Ci +jv +PR +VS +pR +pR +pR +pR +pa +pR +sL +pR +pR +zQ +oL +jm +jm +"} +(26,1,1) = {" +BW +WZ +hO +HU +Or +oE +NZ +Sx +Ci +RY +oy +VS +ee +hD +hD +hD +Eu +hD +hD +wm +pR +zQ +oL +jm +lt +"} +(27,1,1) = {" +fr +JF +JF +wn +JF +ww +JF +zb +JF +fi +PR +VS +pR +hD +NL +dd +GU +Hz +hD +pR +mO +zQ +sM +jm +jm +"} +(28,1,1) = {" +jR +JF +bk +Yn +JF +nB +Df +To +JF +Ob +di +VS +pR +hD +sb +DT +jA +UY +hD +pR +Fc +zQ +oL +jm +jm +"} +(29,1,1) = {" +EQ +JF +JF +JF +JF +JF +JF +JF +JF +RY +PR +VS +pR +hD +PF +jA +uz +QE +hD +pR +ee +zQ +wR +jm +jm +"} +(30,1,1) = {" +lQ +uN +wA +wA +ag +Ps +iX +Oo +mG +zo +sd +aO +pR +hD +Js +xH +tF +CT +hD +pR +pR +YC +oL +jm +jm +"} diff --git a/monkestation/_maps/RandomBars/Tram/tram_bar_biodome.dmm b/monkestation/_maps/RandomBars/Tram/tram_bar_biodome.dmm new file mode 100644 index 000000000000..bb15b80a1539 --- /dev/null +++ b/monkestation/_maps/RandomBars/Tram/tram_bar_biodome.dmm @@ -0,0 +1,3036 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood, +/area/station/commons/lounge) +"ad" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"ap" = ( +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"aC" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Service - Bar Lounge South West" + }, +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"aL" = ( +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"aW" = ( +/obj/structure/table/wood, +/obj/item/storage/bag/tray, +/obj/item/kitchen/rollingpin, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"bh" = ( +/obj/structure/chair/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/service/theater) +"bk" = ( +/obj/effect/turf_decal/trimline/dark_blue/line, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"bv" = ( +/obj/structure/chair/wood, +/obj/effect/landmark/start/mime, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/pod/light, +/area/station/service/theater) +"by" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/kitchen/fork{ + pixel_x = -10; + pixel_y = 7 + }, +/obj/item/kitchen/spoon{ + pixel_x = -2; + pixel_y = 7 + }, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"bP" = ( +/obj/structure/table/wood, +/obj/item/instrument/violin, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"bX" = ( +/obj/structure/chair/sofa/corp/left, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"ca" = ( +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"cc" = ( +/obj/machinery/deepfryer, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"cl" = ( +/obj/structure/flora/tree/dead/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"cn" = ( +/obj/structure/table/wood, +/obj/structure/mirror/directional/south, +/obj/item/food/baguette, +/turf/open/floor/pod/light, +/area/station/service/theater) +"cr" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 4 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"cu" = ( +/turf/closed/wall/mineral/wood, +/area/station/maintenance/department/security) +"cA" = ( +/obj/structure/table/wood, +/obj/machinery/processor{ + pixel_y = 12 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"cT" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/pod/light, +/area/station/service/theater) +"dl" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/effect/turf_decal/bot_white, +/obj/machinery/airalarm/directional/north, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"dA" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"dB" = ( +/obj/structure/rack, +/obj/item/book/manual/chef_recipes, +/obj/item/holosign_creator/robot_seat/restaurant, +/obj/item/reagent_containers/condiment/enzyme, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"dC" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood, +/area/station/commons/lounge) +"dS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Skill Games" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"ed" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"ei" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"eu" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Service - Kitchen West" + }, +/obj/machinery/grill, +/obj/structure/sign/poster/official/work_for_a_future{ + pixel_x = -31; + pixel_y = 4 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"ev" = ( +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"eT" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"eU" = ( +/obj/machinery/vending/boozeomat, +/obj/effect/landmark/navigate_destination/bar, +/obj/structure/displaycase/freezeray{ + pixel_y = 20 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"eY" = ( +/obj/item/radio/intercom/directional/west, +/obj/structure/table/wood, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"fG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"fW" = ( +/obj/effect/turf_decal/trimline/dark_green/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"fZ" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"go" = ( +/obj/structure/table/wood/fancy/orange, +/obj/item/clothing/neck/scarf/christmas, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"gH" = ( +/obj/machinery/grill, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"gK" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"hd" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"he" = ( +/obj/effect/landmark/start/bartender, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"hj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"hm" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"hr" = ( +/obj/structure/flora/rock/pile/icy/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"hA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"hC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"hI" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"if" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"iq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"iu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"iY" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"ji" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"js" = ( +/obj/machinery/duct, +/obj/machinery/door/window/left/directional/north{ + name = "Dumbwaiter Safety Door" + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"jA" = ( +/obj/effect/turf_decal/siding/thinplating, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"jG" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/pod/light, +/area/station/service/theater) +"jO" = ( +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"jW" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/service/theater) +"kb" = ( +/obj/structure/table/wood, +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/clothing/head/costume/ushanka/frosty{ + pixel_y = 16; + pixel_x = 8 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"kn" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"kz" = ( +/obj/structure/flora/tree/pine/style_random, +/obj/machinery/hydroponics/soil, +/turf/open/floor/pod/light, +/area/station/service/theater) +"kA" = ( +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"kI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"lb" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"lg" = ( +/obj/structure/table/wood/fancy/orange, +/obj/item/clothing/neck/scarf/black, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"ls" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 4 + }, +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"lz" = ( +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"lH" = ( +/obj/structure/table/wood/fancy/orange, +/obj/machinery/light/dim/directional/south, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/effect/spawner/random/entertainment/lighter, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"lU" = ( +/turf/closed/mineral/random/stationside/asteroid/porus, +/area/station/asteroid) +"mp" = ( +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"mC" = ( +/turf/closed/wall/r_wall, +/area/station/service/theater) +"mE" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"mP" = ( +/obj/machinery/newscaster/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"mQ" = ( +/obj/machinery/vending/autodrobe, +/turf/open/floor/pod/light, +/area/station/service/theater) +"mV" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/flora/tree/pine/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"mW" = ( +/obj/effect/turf_decal/siding/thinplating/corner, +/obj/machinery/button/door/directional/south{ + id = "playerscantreadthis"; + name = "Kitchen Shutters Control" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"nk" = ( +/obj/machinery/light/dim/directional/north, +/obj/effect/turf_decal/trimline/dark_green/corner{ + dir = 8 + }, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"nm" = ( +/turf/open/floor/wood, +/area/station/commons/lounge) +"nu" = ( +/obj/structure/table/wood, +/obj/item/storage/bag/tray, +/obj/item/knife/kitchen, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"nx" = ( +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"nL" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "The Cantina" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"nS" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"nY" = ( +/obj/machinery/holopad, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"nZ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "The Cantina" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"of" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/pod/light, +/area/station/service/theater) +"oj" = ( +/obj/structure/table/wood, +/obj/machinery/light/warm/directional/east, +/obj/effect/spawner/random/entertainment/musical_instrument, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"on" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/service/theater) +"oq" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/musician/piano, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"ow" = ( +/obj/machinery/stove, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"ox" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/cake_ingredients, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"oA" = ( +/obj/machinery/restaurant_portal/bar, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"oI" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/bananalamp{ + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/service/theater) +"oL" = ( +/obj/structure/chair/wood, +/obj/effect/landmark/start/clown, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/service/theater) +"oO" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/machinery/duct, +/obj/effect/landmark/start/assistant, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"oT" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/trimline/dark_blue/corner, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 8 + }, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"oW" = ( +/obj/structure/table/wood, +/obj/machinery/microwave, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"oY" = ( +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, +/obj/structure/rack, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"pa" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"pd" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 10 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"pe" = ( +/obj/structure/table/wood, +/obj/item/clothing/glasses/monocle, +/obj/item/food/pie/cream, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"pu" = ( +/obj/structure/chair, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"pH" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"pJ" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 8 + }, +/obj/machinery/light/dim/directional/east{ + pixel_y = 11 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"pL" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Civilian - Theatre Backstage" + }, +/turf/open/floor/pod/light, +/area/station/service/theater) +"qm" = ( +/obj/machinery/holopad, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"qs" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"qu" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/soup_pot, +/obj/item/kitchen/spoon/soup_ladle, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"qC" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"qE" = ( +/obj/structure/table/wood, +/obj/item/staff/broom, +/obj/item/clothing/head/costume/sombrero/green, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"qF" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"qQ" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Theatre Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/misc/snow/actually_safe, +/area/station/maintenance/department/cargo) +"qR" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"rs" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/effect/landmark/start/hangover, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"ru" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"rL" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + location = "Kitchen"; + name = "navigation beacon (Kitchen Delivery)" + }, +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/window/right/directional/west{ + name = "Kitchen Delivery Chute"; + req_access = "kitchen" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/cargo) +"sd" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"se" = ( +/obj/structure/table/wood/fancy/orange, +/obj/machinery/light/dim/directional/north, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"sf" = ( +/obj/structure/table/wood/fancy/orange, +/obj/machinery/light/dim/directional/south, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"sk" = ( +/turf/closed/wall/mineral/wood, +/area/station/service/kitchen) +"sm" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"sx" = ( +/obj/structure/table/wood/fancy/orange, +/obj/structure/window/reinforced/tinted/frosted, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"sK" = ( +/obj/structure/table/wood, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"sR" = ( +/obj/structure/table/wood, +/obj/structure/mirror/directional/south, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/service/theater) +"tc" = ( +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"td" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"tH" = ( +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"tK" = ( +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 2 + }, +/obj/effect/mapping_helpers/mail_sorting/service/theater, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"uj" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"up" = ( +/obj/effect/decal/cleanable/food/flour, +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"us" = ( +/obj/structure/closet/crate/wooden/toy, +/obj/machinery/light/directional/north, +/turf/open/floor/pod/light, +/area/station/service/theater) +"uV" = ( +/obj/effect/spawner/structure/window, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"vf" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"vr" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"vP" = ( +/obj/structure/sign/clock/directional/north, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"wb" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"wu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atm, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"wx" = ( +/turf/closed/wall/r_wall, +/area/station/commons/lounge) +"wK" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"wM" = ( +/obj/machinery/light/warm/directional/south, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"wO" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/turf_decal/trimline/dark_green/line{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"xa" = ( +/obj/structure/table/wood/fancy/orange, +/obj/item/reagent_containers/cup/glass/mug/coco{ + pixel_x = 5 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"xs" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"xu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"ye" = ( +/obj/structure/rack, +/obj/item/clothing/suit/hooded/wintercoat/science, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/gloves/fingerless, +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/item/clothing/mask/balaclava, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"yh" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/commons/lounge) +"yp" = ( +/turf/closed/wall/r_wall, +/area/station/maintenance/department/security) +"yE" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"yL" = ( +/obj/structure/table/wood, +/obj/machinery/chem_master/condimaster{ + desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; + name = "HoochMaster Deluxe" + }, +/obj/machinery/light/dim/directional/west{ + pixel_y = 11 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"yM" = ( +/obj/structure/table/wood, +/obj/machinery/requests_console/directional/west{ + assistance_requestable = 1; + department = "Kitchen"; + name = "Kitchen Requests Console"; + supplies_requestable = 1 + }, +/obj/machinery/reagentgrinder{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_x = 6; + pixel_y = 5 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"yQ" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"yV" = ( +/obj/structure/flora/tree/pine/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"yY" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Service - Bar Lounge South East" + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/barsign/directional/south, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"zq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/commons/lounge) +"zK" = ( +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/food/egg_smudge, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"zM" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"zN" = ( +/obj/effect/landmark/start/cook, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"zP" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"zV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"Ap" = ( +/obj/structure/closet/secure_closet/freezer/cream_pie, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/service/theater) +"As" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"AE" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4 + }, +/obj/effect/mapping_helpers/mail_sorting/service/kitchen, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"AF" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"Bi" = ( +/obj/structure/table/wood/fancy/orange, +/obj/machinery/light/dim/directional/north, +/obj/item/reagent_containers/cup/glass/mug/coco{ + pixel_x = -4 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"Bj" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Service - Bar Lounge North West" + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/structure/flora/tree/pine/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"Bk" = ( +/obj/machinery/duct, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"Bq" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/landmark/navigate_destination/kitchen, +/obj/structure/table/wood, +/obj/item/food/pie/frostypie, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"Bs" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/commons/lounge) +"BD" = ( +/obj/structure/table/wood/fancy/orange, +/obj/item/clothing/neck/scarf/darkblue, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"BE" = ( +/obj/structure/table/wood, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"BK" = ( +/obj/structure/ladder, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"BN" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"Cf" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood, +/area/station/commons/lounge) +"Co" = ( +/obj/machinery/duct, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 1 + }, +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"Cp" = ( +/obj/structure/sink/kitchen/directional/south, +/obj/item/radio/intercom/directional/west, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"CC" = ( +/obj/machinery/light/directional/south, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"CF" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/turf_decal/trimline/dark_green/line, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"CG" = ( +/turf/closed/wall/mineral/wood, +/area/station/maintenance/department/cargo) +"CJ" = ( +/obj/machinery/duct, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"CL" = ( +/obj/structure/table/wood/fancy/orange, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"CR" = ( +/obj/structure/table/wood/fancy/orange, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"Dd" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"Dj" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Kitchen" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"Dy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"DA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "The Cantina" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"DS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"EB" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/commons/lounge) +"ED" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 1 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"EG" = ( +/obj/effect/turf_decal/trimline/dark_green/line{ + dir = 8 + }, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"EP" = ( +/obj/structure/table/wood/fancy/orange, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"ET" = ( +/obj/structure/flora/grass/both/style_random, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/commons/lounge) +"EV" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Fb" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"Fc" = ( +/obj/machinery/deepfryer, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Service - Kitchen East" + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"Fi" = ( +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 + }, +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"Fz" = ( +/obj/structure/chair/stool/directional/west, +/obj/structure/cable, +/obj/effect/landmark/start/hangover, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"FI" = ( +/turf/closed/wall/mineral/wood, +/area/station/service/theater) +"FM" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"FW" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"FY" = ( +/obj/structure/chair/sofa/corp{ + dir = 4 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"Gl" = ( +/obj/machinery/light/directional/south, +/obj/machinery/light_switch/directional/south{ + pixel_x = -8 + }, +/obj/machinery/firealarm/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"Gs" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 4 + }, +/obj/machinery/restaurant_portal/restaurant, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"Gv" = ( +/obj/structure/table/wood/fancy/orange, +/obj/machinery/light/dim/directional/east, +/obj/item/clothing/neck/scarf/green, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"Gy" = ( +/obj/structure/table/wood/fancy/orange, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"GB" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"GN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"GP" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"GS" = ( +/obj/machinery/door/airlock{ + name = "Theatre Backstage" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/pod/light, +/area/station/service/theater) +"Hj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/pod/light, +/area/station/service/theater) +"Ht" = ( +/obj/structure/cable, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"IA" = ( +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"Jb" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"Jg" = ( +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"Jl" = ( +/obj/structure/table/wood/fancy/orange, +/obj/machinery/light/dim/directional/west, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"JB" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"JH" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/musical_instrument{ + spawn_loot_count = 2; + spawn_loot_double = 0; + spawn_random_offset = 1 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"JI" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 4 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"JN" = ( +/obj/machinery/vending/dinnerware, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"JT" = ( +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"JW" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks{ + dir = 8 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"Kl" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"KN" = ( +/obj/structure/table/wood/poker, +/obj/effect/landmark/start/hangover, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"KT" = ( +/obj/structure/table/wood/fancy/orange, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/effect/landmark/start/hangover, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"KW" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Civilian - Theatre Stage" + }, +/obj/item/radio/intercom/directional/east, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"Lh" = ( +/obj/structure/dresser, +/turf/open/floor/pod/light, +/area/station/service/theater) +"Lj" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"Lk" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"Ln" = ( +/obj/structure/table/wood, +/obj/structure/closet/mini_fridge{ + name = "mini-fridge"; + anchored = 1 + }, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/cup/soda_cans/cola, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"Lw" = ( +/obj/structure/table/wood, +/obj/structure/mirror/directional/south, +/obj/item/lipstick/random{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/service/theater) +"LD" = ( +/obj/structure/table/wood/poker, +/obj/item/storage/dice, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"LQ" = ( +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"Mh" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/commons/lounge) +"Mr" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/corner, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"ME" = ( +/obj/machinery/elevator_control_panel/directional/north{ + desc = "A small control panel used to move the kitchen dumbwaiter up and down."; + linked_elevator_id = "dumbwaiter_lift"; + name = "Dumbwaiter Control Panel"; + preset_destination_names = list("2"="Hydroponics","3"="Kitchen") + }, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"MH" = ( +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"MJ" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"MO" = ( +/turf/closed/wall/mineral/wood, +/area/station/commons/lounge) +"MS" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"MX" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"Na" = ( +/obj/structure/table/wood/fancy/orange, +/obj/machinery/light/dim/directional/west, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/obj/structure/window/reinforced/tinted/frosted{ + dir = 1 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"NP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/chem_pile, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"Oc" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"Ol" = ( +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"Ov" = ( +/obj/structure/ladder, +/obj/effect/landmark/event_spawn, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"Ow" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"Oz" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"OT" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"OZ" = ( +/obj/structure/table/wood, +/obj/item/lipstick/random{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/pod/light, +/area/station/service/theater) +"Pc" = ( +/turf/closed/wall/r_wall, +/area/station/service/kitchen) +"Pp" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "The Cantina" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"PJ" = ( +/obj/structure/table/wood/fancy/orange, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/item/plate{ + pixel_y = -3 + }, +/obj/item/reagent_containers/cup/glass/mug/coco{ + pixel_x = -4 + }, +/obj/item/reagent_containers/cup/glass/mug/coco{ + pixel_x = 5 + }, +/obj/item/reagent_containers/cup/glass/mug/coco{ + pixel_y = 6 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"PW" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/bar, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"Qm" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"Qu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/pod/light, +/area/station/service/theater) +"QC" = ( +/turf/template_noop, +/area/template_noop) +"QE" = ( +/obj/machinery/light/warm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"QF" = ( +/obj/structure/table/wood/fancy/orange, +/obj/machinery/light/dim/directional/east, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"QJ" = ( +/obj/structure/table/wood/fancy/orange, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"QX" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"Rl" = ( +/obj/machinery/oven, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"RJ" = ( +/obj/structure/table/wood/poker, +/obj/effect/spawner/random/entertainment/deck, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"RN" = ( +/obj/structure/sink/kitchen/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"RO" = ( +/obj/machinery/griddle, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"Sa" = ( +/obj/structure/rack, +/obj/item/clothing/suit/hooded/wintercoat/science, +/obj/item/clothing/shoes/winterboots, +/obj/item/clothing/gloves/fingerless, +/obj/item/clothing/mask/balaclava, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"Sg" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"So" = ( +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"St" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"SI" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/commons/lounge) +"SO" = ( +/obj/machinery/light/directional/north, +/obj/structure/closet/secure_closet/freezer/kitchen, +/obj/effect/turf_decal/bot_white, +/obj/item/reagent_containers/condiment/rice, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"SU" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"SV" = ( +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"Tv" = ( +/obj/structure/flora/bush/snow/style_random, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"TE" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/pod/light, +/area/station/service/theater) +"TV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"Ud" = ( +/turf/open/misc/asteroid, +/area/station/asteroid) +"Ul" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 1 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"UF" = ( +/turf/closed/wall/r_wall, +/area/station/maintenance/department/cargo) +"UV" = ( +/obj/structure/cable, +/mob/living/carbon/human/species/monkey/punpun, +/obj/machinery/holopad, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"UX" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"Va" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"Vd" = ( +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"Vq" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/atm, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"Vs" = ( +/obj/structure/table/wood, +/obj/machinery/light/warm/directional/east, +/obj/item/clothing/glasses/eyepatch, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"VL" = ( +/obj/machinery/light/dim/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Civilian - Skill Games" + }, +/obj/effect/turf_decal/trimline/dark_green/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/corner, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"VU" = ( +/turf/closed/wall/r_wall, +/area/station/service/bar) +"VY" = ( +/obj/machinery/duct, +/obj/effect/decal/cleanable/food/flour, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"VZ" = ( +/obj/structure/flora/grass/both/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"Wj" = ( +/obj/structure/table/wood, +/obj/machinery/microwave, +/obj/machinery/light/directional/north, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"Wn" = ( +/obj/structure/table/wood/fancy/orange, +/obj/item/clothing/neck/scarf/cyan, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"Wq" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/misc/snow/actually_safe, +/area/station/service/bar) +"Wz" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Skill Games" + }, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"WA" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 8 + }, +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"WP" = ( +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Bar Maintenance Hatch" + }, +/obj/machinery/duct, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/security) +"WW" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + location = "Theatre"; + name = "navigation beacon (Theatre Delivery)" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/window/right/directional/south{ + name = "Theatre Delivery Chute"; + req_access = "theatre" + }, +/obj/effect/turf_decal/loading_area, +/turf/open/floor/plating, +/area/station/maintenance/department/cargo) +"WX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/machinery/door/window/right/directional/north{ + name = "Bar Delivery Chute" + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + location = "Bar"; + name = "navigation beacon (Bar Delivery)" + }, +/turf/open/misc/snow/actually_safe, +/area/station/maintenance/department/cargo) +"Xa" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"Xq" = ( +/obj/machinery/holopad{ + pixel_y = 16 + }, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"Xu" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"Xv" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"Xy" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"XA" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/misc/snow/actually_safe, +/area/station/service/kitchen) +"XG" = ( +/obj/structure/cable, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"XI" = ( +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"XN" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Service - Bar Lounge North East" + }, +/obj/machinery/airalarm/directional/east, +/obj/structure/flora/tree/dead/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"XR" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/flora/bush/snow/style_random, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"XS" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"Ys" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"YM" = ( +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"YQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/misc/snow/actually_safe, +/area/station/service/theater) +"YX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/pod/light, +/area/station/commons/lounge) +"YZ" = ( +/obj/structure/flora/grass/both/style_random, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/snow/actually_safe, +/area/station/commons/lounge) +"ZD" = ( +/turf/open/floor/pod/light, +/area/station/service/theater) + +(1,1,1) = {" +lU +lU +lU +lU +Ud +Ud +Ud +Ud +Ud +Ud +Ud +Ud +Ud +Ud +yp +cu +cu +MO +MO +wx +QC +QC +QC +QC +QC +"} +(2,1,1) = {" +lU +lU +lU +lU +lU +lU +lU +lU +lU +lU +lU +Ud +Ud +Ud +cu +CF +LD +RJ +wO +MO +QC +QC +QC +QC +QC +"} +(3,1,1) = {" +lU +lU +lU +lU +lU +lU +lU +lU +lU +lU +lU +Ud +Ud +Ud +cu +CF +RJ +KN +wO +MO +QC +QC +QC +QC +QC +"} +(4,1,1) = {" +lU +lU +lU +lU +lU +lU +lU +lU +lU +lU +lU +Ud +Ud +yp +yp +nk +fW +EG +VL +wx +wx +QC +QC +QC +QC +"} +(5,1,1) = {" +lU +lU +lU +lU +lU +lU +lU +lU +Ud +Ud +Ud +Ud +Ud +cu +eT +JI +mE +Xq +oT +eT +MO +QC +QC +QC +QC +"} +(6,1,1) = {" +lU +lU +lU +lU +lU +lU +lU +lU +Ud +Ud +Ud +Ud +Ud +cu +Vq +mp +iq +Vd +bk +wK +MO +QC +QC +QC +QC +"} +(7,1,1) = {" +lU +lU +lU +lU +lU +lU +lU +lU +Ud +Ud +Ud +Ud +Ud +cu +eT +GP +iu +YX +Mr +eT +MO +QC +QC +QC +QC +"} +(8,1,1) = {" +lU +lU +lU +lU +lU +lU +lU +lU +lU +lU +lU +yp +WP +yp +wx +EV +dS +Wz +EV +wx +wx +wx +QC +QC +QC +"} +(9,1,1) = {" +lU +lU +Pc +sk +sk +sk +sk +sk +sk +Pc +MO +wx +FM +pu +by +zP +zq +ET +cl +rs +yQ +MO +QC +QC +QC +"} +(10,1,1) = {" +lU +Pc +Pc +Cp +yM +eu +gH +dB +CC +sk +Bj +eY +Jb +fG +sd +uj +nm +Ys +sd +xs +aC +wx +MO +MO +wx +"} +(11,1,1) = {" +lU +sk +hm +Bk +GN +GN +GN +GN +mW +Pc +Gs +xu +ad +ap +yh +qF +qF +SI +SI +ed +JT +tc +hr +Sa +EV +"} +(12,1,1) = {" +lU +sk +SO +VY +RO +ox +BE +aW +jA +CR +gK +sd +XI +GB +QF +lg +go +Wn +BD +Gv +MS +JT +MH +Sa +EV +"} +(13,1,1) = {" +Pc +Pc +dl +VY +up +aL +zN +VZ +jA +Gy +Cf +dC +FW +lH +VU +iY +iY +LQ +tH +VU +Bi +UX +pa +pa +Pp +"} +(14,1,1) = {" +sk +mV +Fb +CJ +aL +ow +aL +Ln +jA +PJ +fZ +Mh +oO +QJ +Kl +Dy +JW +pJ +Ht +yE +QJ +MJ +dC +QX +nL +"} +(15,1,1) = {" +sk +vP +aL +js +nY +Bq +BK +BE +jA +Gy +fZ +Mh +Xu +QJ +ca +he +Ov +eU +UV +ca +QJ +vf +EB +oA +uV +"} +(16,1,1) = {" +sk +lb +JN +Co +aL +Rl +XA +qu +jA +KT +aa +qs +Xu +QJ +tH +hj +kb +yL +Oz +zM +QJ +OT +DS +JB +nZ +"} +(17,1,1) = {" +Pc +Pc +ME +lz +aL +ev +zN +ev +jA +CL +Bs +wb +AE +sf +VU +Wq +NP +hj +BN +VU +se +Qm +SU +Xv +DA +"} +(18,1,1) = {" +lU +sk +Wj +zK +RO +nu +BE +BE +jA +EP +vr +tc +Fi +pd +Jl +xa +QJ +sx +PW +Na +kn +IA +qR +Sa +EV +"} +(19,1,1) = {" +lU +sk +oW +jO +So +So +So +kA +WA +Dj +As +XR +Sg +YM +hI +Ol +SV +SV +nS +Xa +tK +MX +pH +ye +EV +"} +(20,1,1) = {" +lU +Pc +Pc +RN +cA +Fc +cc +oY +Gl +Pc +XN +hr +if +tc +tc +tc +tc +tc +tc +tc +yY +wx +MO +MO +wx +"} +(21,1,1) = {" +Ud +Ud +UF +rL +UF +CG +CG +UF +sk +Pc +FI +mC +mP +Lk +Tv +AF +hC +YZ +Tv +kI +Va +MO +QC +QC +QC +"} +(22,1,1) = {" +Ud +Ud +Ud +Ud +Ud +Ud +Ud +CG +Ap +oL +Lw +FI +wu +ls +FY +Ul +nx +cr +FY +Ul +sm +MO +QC +QC +QC +"} +(23,1,1) = {" +Ud +Ud +Ud +Ud +Ud +Ud +Ud +CG +Ap +jW +oI +FI +QE +bX +sK +ED +qm +bX +sK +ED +wM +MO +QC +QC +QC +"} +(24,1,1) = {" +lU +lU +lU +lU +lU +Ud +Ud +CG +on +bh +sR +FI +YQ +zV +hd +hd +hd +dA +hd +TV +sm +MO +QC +QC +QC +"} +(25,1,1) = {" +lU +lU +lU +lU +lU +Ud +Ud +CG +pL +of +OZ +FI +Xy +ru +qC +qC +oq +qC +qC +qC +Ow +UF +lU +lU +lU +"} +(26,1,1) = {" +lU +lU +lU +lU +lU +Ud +Ud +UF +us +bv +cn +mC +YQ +Dd +Jg +nx +Fz +XG +XG +Lj +td +WX +lU +lU +lU +"} +(27,1,1) = {" +lU +lU +lU +lU +lU +Ud +Ud +WW +ZD +Qu +jG +GS +Oc +Oc +ei +Oc +XS +ji +ji +ji +St +UF +lU +lU +lU +"} +(28,1,1) = {" +lU +lU +lU +lU +lU +Ud +Ud +UF +mQ +Hj +TE +mC +pe +sK +nx +YQ +XG +nx +nx +sK +qE +CG +lU +lU +lU +"} +(29,1,1) = {" +lU +lU +lU +lU +lU +Ud +Ud +CG +kz +Lh +cT +FI +yV +bP +Vs +hA +XG +KW +oj +JH +UF +UF +lU +lU +lU +"} +(30,1,1) = {" +lU +lU +lU +lU +lU +Ud +Ud +UF +CG +CG +CG +UF +CG +CG +UF +qQ +UF +CG +CG +CG +UF +lU +lU +lU +lU +"} diff --git a/monkestation/_maps/RandomBars/Tram/tram_bar_cult.dmm b/monkestation/_maps/RandomBars/Tram/tram_bar_cult.dmm new file mode 100644 index 000000000000..70699fac905d --- /dev/null +++ b/monkestation/_maps/RandomBars/Tram/tram_bar_cult.dmm @@ -0,0 +1,3022 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ad" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/cult/glass/friendly{ + name = "Church Door" + }, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/service/theater) +"ap" = ( +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/structure/disposalpipe/segment, +/turf/open/floor/cult, +/area/station/commons/lounge) +"au" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/table/wood/fancy/red, +/obj/item/lipstick/random{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/lipstick/random{ + pixel_x = 2; + pixel_y = 2 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"aC" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Service - Bar Lounge South West" + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"aL" = ( +/mob/living/carbon/human/species/monkey/punpun, +/turf/open/floor/cult, +/area/station/service/kitchen) +"br" = ( +/obj/machinery/door/airlock/cult/glass/friendly{ + name = "Church Door" + }, +/turf/open/floor/cult, +/area/station/service/theater) +"bv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/cult, +/area/station/commons/lounge) +"by" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/turf/closed/wall/mineral/cult/artificer, +/area/station/service/theater) +"cc" = ( +/obj/machinery/deepfryer, +/turf/open/floor/cult, +/area/station/service/kitchen) +"cg" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/turf/open/floor/cult, +/area/station/commons/lounge) +"cj" = ( +/obj/structure/chair/pew/left{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/cult, +/area/station/service/theater) +"cl" = ( +/obj/structure/chair, +/turf/open/floor/cult, +/area/station/commons/lounge) +"cm" = ( +/obj/machinery/disposal/bin{ + pixel_x = 14 + }, +/turf/open/floor/cult, +/area/station/service/theater) +"cr" = ( +/obj/structure/table/wood/fancy/red, +/turf/open/floor/cult, +/area/station/commons/lounge) +"cu" = ( +/turf/closed/wall/mineral/cult/artificer, +/area/station/service/theater) +"cA" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/processor{ + pixel_y = 12 + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"cB" = ( +/obj/machinery/light/warm/directional/south, +/turf/open/floor/cult, +/area/station/commons/lounge) +"cL" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/vending/autodrobe, +/obj/item/clothing/glasses/eyepatch{ + pixel_y = 12; + pixel_x = -5 + }, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/cult, +/area/station/commons/lounge) +"cT" = ( +/obj/machinery/camera/directional/east, +/turf/open/floor/cult, +/area/station/commons/lounge) +"dz" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/cult, +/area/station/commons/lounge) +"dA" = ( +/turf/open/floor/cult, +/area/station/service/theater) +"dB" = ( +/obj/structure/rack, +/obj/item/book/manual/chef_recipes, +/obj/item/holosign_creator/robot_seat/restaurant, +/obj/item/reagent_containers/condiment/enzyme, +/obj/machinery/button/door/directional/south{ + id = "playerscantreadthis"; + name = "Kitchen Shutters Control"; + pixel_x = -24; + pixel_y = 0 + }, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/cult, +/area/station/service/kitchen) +"dC" = ( +/obj/structure/table/wood/fancy/red, +/obj/item/kitchen/spoon{ + pixel_x = -2; + pixel_y = 7 + }, +/obj/item/kitchen/fork{ + pixel_x = -10; + pixel_y = 7 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"dD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/cult/friendly{ + name = "Church backstage" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/cult, +/area/station/commons/lounge) +"dF" = ( +/obj/structure/table/wood/fancy/red, +/obj/effect/spawner/random/entertainment/dice, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/turf/open/floor/cult, +/area/station/commons/lounge) +"dM" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"dP" = ( +/obj/structure/table/wood/fancy/red, +/obj/item/reagent_containers/cup/bowl{ + name = "donation bowl" + }, +/obj/item/stack/spacecash/c10{ + pixel_y = 4; + pixel_x = 6 + }, +/obj/item/stack/spacecash/c1{ + pixel_y = 2; + pixel_x = -3 + }, +/turf/open/floor/cult, +/area/station/service/theater) +"dW" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"ed" = ( +/obj/structure/table/wood/fancy/red, +/turf/open/floor/cult, +/area/station/service/bar) +"eu" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Service - Kitchen West" + }, +/obj/machinery/grill, +/turf/open/floor/cult, +/area/station/service/kitchen) +"ey" = ( +/obj/machinery/camera/directional/west, +/turf/open/floor/cult, +/area/station/service/theater) +"eG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/arrows{ + dir = 1; + pixel_y = -14; + pixel_x = 8 + }, +/obj/effect/turf_decal/arrows{ + pixel_y = 9; + dir = 8; + pixel_x = -1 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"eQ" = ( +/obj/structure/chair/pew/left{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/cult, +/area/station/service/theater) +"eT" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"eU" = ( +/obj/machinery/vending/boozeomat, +/obj/effect/landmark/navigate_destination/bar, +/turf/open/floor/cult, +/area/station/service/bar) +"eZ" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/airalarm/directional/south, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/cult, +/area/station/commons/lounge) +"fC" = ( +/obj/structure/kitchenspike, +/turf/open/floor/cult, +/area/station/service/theater) +"fG" = ( +/obj/structure/table/wood/fancy/red, +/obj/item/kitchen/spoon{ + pixel_x = 10; + pixel_y = 7 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"fU" = ( +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 8 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/cult, +/area/station/commons/lounge) +"fV" = ( +/obj/structure/table/wood/fancy/red, +/obj/item/food/pie/cream, +/turf/open/floor/cult, +/area/station/service/theater) +"fW" = ( +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 1 + }, +/obj/effect/turf_decal/arrows{ + pixel_x = 8; + dir = 1; + pixel_y = 1 + }, +/obj/effect/turf_decal/arrows{ + pixel_x = -8 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"fZ" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"gg" = ( +/obj/item/toy/plush/narplush, +/obj/machinery/light/broken/directional/west, +/turf/open/floor/cult, +/area/station/maintenance/department/cargo) +"gy" = ( +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 4 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"gG" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"gH" = ( +/obj/machinery/grill, +/turf/open/floor/cult, +/area/station/service/kitchen) +"gK" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/bubblegum, +/obj/effect/decal/cleanable/blood/gibs/limb, +/obj/structure/chair/stool/bar/directional/north, +/turf/open/floor/cult, +/area/station/commons/lounge) +"he" = ( +/obj/effect/landmark/start/bartender, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/cult, +/area/station/service/bar) +"hf" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 4 + }, +/turf/open/floor/cult, +/area/template_noop) +"hg" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe, +/obj/machinery/camera/directional/west, +/turf/open/floor/cult, +/area/station/service/kitchen) +"hh" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/cult, +/area/station/commons/lounge) +"hl" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/cult, +/area/station/service/kitchen) +"hI" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/stool/bar/directional/west, +/turf/open/floor/cult, +/area/station/commons/lounge) +"id" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/cult, +/area/station/commons/lounge) +"if" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/cult, +/area/station/commons/lounge) +"iq" = ( +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 1 + }, +/obj/effect/turf_decal/arrows{ + pixel_x = -8; + pixel_y = 15 + }, +/obj/effect/turf_decal/arrows{ + dir = 1; + pixel_y = -14; + pixel_x = 8 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"ir" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"iu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/cult, +/area/station/commons/lounge) +"iU" = ( +/obj/structure/cable, +/obj/machinery/camera/directional/west, +/turf/open/floor/cult, +/area/station/service/theater) +"iY" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/cult, +/area/station/service/bar) +"js" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Dumbwaiter Safety Door" + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/light/floor/has_bulb, +/obj/machinery/elevator_control_panel/directional/north{ + desc = "A small control panel used to move the kitchen dumbwaiter up and down."; + linked_elevator_id = "dumbwaiter_lift"; + name = "Dumbwaiter Control Panel"; + preset_destination_names = list("2"="Hydroponics","3"="Kitchen"); + pixel_x = 22; + pixel_y = 7 + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"jv" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/obj/structure/table/wood/fancy/red, +/turf/open/floor/cult, +/area/template_noop) +"jA" = ( +/obj/effect/turf_decal/siding/thinplating, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/service/kitchen) +"jF" = ( +/obj/structure/window/reinforced/fulltile, +/obj/structure/grille, +/obj/structure/window_sill, +/turf/open/floor/cult, +/area/station/service/theater) +"jH" = ( +/turf/closed/wall/mineral/cult/artificer, +/area/station/commons/lounge) +"jO" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"kb" = ( +/obj/structure/table/wood, +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_x = -5; + pixel_y = 8 + }, +/turf/open/floor/cult, +/area/station/service/bar) +"ke" = ( +/obj/machinery/light/warm/directional/east, +/turf/open/floor/cult, +/area/station/service/theater) +"ki" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/cult, +/area/station/service/theater) +"kA" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/cult, +/area/station/service/kitchen) +"lb" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/trimline/yellow/corner, +/turf/open/floor/cult, +/area/station/service/kitchen) +"lg" = ( +/obj/structure/table/wood/fancy/red, +/obj/item/clothing/neck/cross{ + name = "bloodied silver cross" + }, +/turf/open/floor/cult, +/area/station/service/theater) +"li" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/cult, +/area/station/commons/lounge) +"lo" = ( +/obj/effect/landmark/start/hangover, +/obj/structure/sacrificealtar, +/obj/item/knife/ritual{ + force = 5; + name = "dull ritual knife" + }, +/turf/open/floor/cult, +/area/station/service/theater) +"lz" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"lH" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/effect/spawner/random/entertainment/lighter, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/cult, +/area/station/service/bar) +"lL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"lP" = ( +/obj/machinery/duct, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/cult, +/area/station/service/theater) +"lT" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/cult, +/area/station/commons/lounge) +"lU" = ( +/turf/open/floor/cult, +/area/station/maintenance/department/cargo) +"md" = ( +/obj/structure/destructible/cult/pants_altar, +/turf/open/floor/cult, +/area/station/maintenance/department/cargo) +"mg" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/commons/lounge) +"mm" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/cult, +/area/station/service/theater) +"mp" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/cult, +/area/station/commons/lounge) +"mu" = ( +/obj/effect/turf_decal/trimline/dark_blue/line{ + dir = 4 + }, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/cult, +/area/station/commons/lounge) +"mP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"mW" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/thinplating, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/service/kitchen) +"nu" = ( +/obj/item/storage/bag/tray, +/obj/item/knife/kitchen, +/obj/structure/table/wood/fancy/red, +/turf/open/floor/cult, +/area/station/service/kitchen) +"nw" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/cult, +/area/station/commons/lounge) +"nx" = ( +/obj/structure/table/wood/fancy/red, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"ny" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/cult, +/area/station/service/theater) +"nY" = ( +/obj/machinery/holopad, +/turf/open/floor/cult, +/area/station/service/kitchen) +"oj" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/cult, +/area/station/commons/lounge) +"oq" = ( +/obj/structure/chair/wood/wings, +/obj/effect/landmark/start/hangover, +/turf/open/floor/cult, +/area/station/service/theater) +"os" = ( +/obj/structure/chair/pew/right{ + dir = 1 + }, +/obj/effect/landmark/start/cook, +/turf/open/floor/cult, +/area/station/service/theater) +"ox" = ( +/obj/effect/spawner/random/food_or_drink/cake_ingredients, +/obj/structure/table/wood/fancy/red, +/turf/open/floor/cult, +/area/station/service/kitchen) +"oA" = ( +/obj/machinery/restaurant_portal/bar, +/turf/open/floor/cult, +/area/station/commons/lounge) +"oN" = ( +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 8 + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"oP" = ( +/obj/machinery/light/warm/directional/north, +/turf/open/floor/cult, +/area/station/commons/lounge) +"oW" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/microwave, +/turf/open/floor/cult, +/area/station/service/kitchen) +"oY" = ( +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, +/obj/structure/rack, +/obj/machinery/airalarm/directional/east, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/cult, +/area/station/service/kitchen) +"pa" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/cult, +/area/station/commons/lounge) +"pH" = ( +/obj/structure/chair, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/cult, +/area/station/commons/lounge) +"pJ" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 8 + }, +/turf/open/floor/cult, +/area/station/service/bar) +"pO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/holopad{ + pixel_y = 16; + pixel_x = -16 + }, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 4 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"qf" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/dresser, +/obj/structure/closet/crate/wooden/toy{ + pixel_y = 18 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"qm" = ( +/obj/structure/table/wood/fancy/red, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"qr" = ( +/obj/structure/chair/wood/wings, +/turf/open/floor/cult, +/area/station/commons/lounge) +"qF" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/cult, +/area/station/commons/lounge) +"qI" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/rune/beer, +/turf/open/floor/cult, +/area/station/service/theater) +"qN" = ( +/obj/structure/table/wood/fancy/red, +/obj/item/reagent_containers/cup/glass/bottle/holywater{ + pixel_y = 7; + pixel_x = -1 + }, +/turf/open/floor/cult, +/area/station/service/theater) +"qR" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/cult, +/area/station/commons/lounge) +"rg" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"rj" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/turf_decal/trimline/dark_green/line, +/obj/machinery/camera/directional/west, +/turf/open/floor/cult, +/area/station/commons/lounge) +"sd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"se" = ( +/obj/structure/table/wood/fancy/red, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/cult, +/area/station/service/bar) +"sf" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/table/wood/fancy/red, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/cult, +/area/station/service/bar) +"sk" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"ta" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/north, +/turf/open/floor/cult, +/area/station/service/bar) +"tc" = ( +/obj/effect/landmark/start/cook, +/turf/open/floor/cult, +/area/station/service/kitchen) +"tk" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"tA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/commons/lounge) +"tK" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/cult, +/area/station/commons/lounge) +"tM" = ( +/turf/closed/wall/mineral/cult/artificer, +/area/station/maintenance/department/cargo) +"up" = ( +/turf/open/floor/cult, +/area/station/service/kitchen) +"uK" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"uL" = ( +/turf/open/floor/cult, +/area/template_noop) +"uO" = ( +/obj/effect/turf_decal/arrows{ + pixel_x = -8 + }, +/obj/effect/turf_decal/arrows{ + pixel_x = 8; + dir = 1 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"uV" = ( +/obj/structure/cable, +/obj/structure/chair/wood, +/turf/open/floor/cult, +/area/station/commons/lounge) +"vf" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"vr" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"vO" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/cult, +/area/station/service/kitchen) +"vP" = ( +/obj/structure/sign/clock/directional/north, +/obj/structure/window, +/obj/effect/turf_decal/trimline/yellow/warning, +/turf/open/floor/cult, +/area/station/service/kitchen) +"wu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table/wood/fancy/red, +/obj/item/kitchen/fork{ + pixel_x = -10; + pixel_y = 7 + }, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"wx" = ( +/obj/structure/sign/poster/contraband/blood_geometer{ + pixel_y = -32 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"wO" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/turf_decal/trimline/dark_green/line{ + dir = 1 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"xc" = ( +/obj/structure/chair/wood/wings, +/turf/open/floor/cult, +/area/station/service/theater) +"xe" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/obj/item/reagent_containers/condiment/rice, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/cult, +/area/station/service/kitchen) +"xf" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/template_noop) +"xq" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/cult, +/area/station/commons/lounge) +"xs" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/service/theater) +"xu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/cult, +/area/station/commons/lounge) +"ye" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"yh" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/cult, +/area/station/commons/lounge) +"yu" = ( +/turf/closed/wall/mineral/cult/artificer, +/area/station/service/kitchen) +"yE" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/cult, +/area/station/service/bar) +"yL" = ( +/obj/structure/table/wood, +/obj/machinery/chem_master/condimaster{ + desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; + name = "HoochMaster Deluxe" + }, +/turf/open/floor/cult, +/area/station/service/bar) +"yM" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/reagentgrinder{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_x = 6; + pixel_y = 5 + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"yY" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Service - Bar Lounge South East" + }, +/obj/machinery/barsign/directional/south, +/turf/open/floor/cult, +/area/station/commons/lounge) +"zh" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/table/wood/fancy/red, +/obj/item/flashlight/lamp/bananalamp{ + pixel_y = 12 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"zD" = ( +/obj/machinery/oven, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/sign/poster/contraband/blood_geometer{ + pixel_y = 32 + }, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/cult, +/area/station/commons/lounge) +"zK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/food/egg_smudge, +/obj/machinery/microwave, +/obj/structure/table/wood/fancy/red, +/turf/open/floor/cult, +/area/station/service/kitchen) +"zM" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/cult, +/area/station/service/bar) +"zP" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Ap" = ( +/obj/structure/table/wood/fancy/red, +/obj/item/kirbyplants/fullysynthetic{ + pixel_y = 23 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"As" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/commons/lounge) +"AE" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/commons/lounge) +"AI" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Bi" = ( +/obj/structure/table/wood/fancy/red, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/obj/machinery/light/warm/directional/north, +/turf/open/floor/cult, +/area/station/service/bar) +"Bj" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/machinery/restaurant_portal/restaurant, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/machinery/camera/directional/west, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Bk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Bm" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/cult, +/area/station/service/theater) +"Bq" = ( +/obj/effect/landmark/navigate_destination/kitchen, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Bs" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Bx" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/turf_decal/trimline/dark_green/line{ + dir = 1 + }, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/cult, +/area/station/commons/lounge) +"BE" = ( +/obj/structure/table/wood/fancy/red, +/turf/open/floor/cult, +/area/station/service/kitchen) +"BK" = ( +/obj/structure/ladder, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/cult, +/area/station/service/kitchen) +"BN" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/cult, +/area/station/service/bar) +"BY" = ( +/obj/structure/chair/pew/left{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/landmark/start/bartender, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/service/theater) +"Cf" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Ch" = ( +/obj/machinery/elevator_control_panel/directional/north{ + desc = "A small control panel used to move the kitchen dumbwaiter up and down."; + linked_elevator_id = "dumbwaiter_lift"; + name = "Dumbwaiter Control Panel"; + preset_destination_names = list("2"="Hydroponics","3"="Kitchen") + }, +/obj/machinery/stove, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Co" = ( +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 1 + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Cp" = ( +/obj/structure/sink/kitchen/directional/east, +/turf/open/floor/cult, +/area/station/service/kitchen) +"CC" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/turf_decal/siding/thinplating, +/turf/open/floor/cult, +/area/station/service/kitchen) +"CF" = ( +/obj/machinery/newscaster/directional/north, +/turf/open/floor/cult, +/area/station/commons/lounge) +"CG" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/cult, +/area/station/commons/lounge) +"CJ" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/corner{ + dir = 4 + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"CL" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"CM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"CR" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Dj" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/cult/glass/friendly, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Dq" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Dy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/cult, +/area/station/service/bar) +"DA" = ( +/obj/structure/window/reinforced/fulltile, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Ek" = ( +/obj/effect/landmark/start/clown, +/turf/open/floor/cult, +/area/station/service/theater) +"Es" = ( +/obj/machinery/requests_console/directional/east, +/obj/effect/decal/cleanable/blood/gibs/core{ + pixel_y = 21; + pixel_x = -4 + }, +/obj/effect/decal/cleanable/blood/tracks{ + pixel_y = 18 + }, +/obj/effect/decal/cleanable/blood/tracks{ + pixel_y = 18; + pixel_x = 2 + }, +/obj/effect/decal/cleanable/blood/gibs/limb{ + pixel_x = -16; + pixel_y = 10 + }, +/obj/effect/decal/cleanable/blood/gibs/limb{ + pixel_x = 4; + pixel_y = 12; + dir = 4 + }, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Et" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/chair/wood/wings, +/turf/open/floor/cult, +/area/station/service/theater) +"EG" = ( +/obj/effect/turf_decal/trimline/dark_green/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/arrows{ + dir = 4; + pixel_y = -8 + }, +/obj/effect/turf_decal/arrows{ + pixel_x = 8; + dir = 1; + pixel_y = 1 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"EV" = ( +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Fb" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, +/obj/structure/window{ + dir = 4 + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Fc" = ( +/obj/machinery/deepfryer, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Service - Kitchen East" + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Fh" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/landmark/event_spawn, +/obj/machinery/holopad, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Fi" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Fy" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Fz" = ( +/obj/structure/cable, +/turf/open/floor/cult, +/area/station/service/theater) +"FA" = ( +/obj/machinery/atm{ + pixel_y = -30 + }, +/obj/effect/turf_decal/arrows{ + pixel_x = -8 + }, +/obj/effect/turf_decal/arrows{ + pixel_x = 8; + dir = 1 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"FH" = ( +/obj/structure/chair/pew/left{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/service/theater) +"FW" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/commons/lounge) +"FY" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Gl" = ( +/obj/machinery/light_switch/directional/south{ + pixel_x = -8 + }, +/obj/machinery/firealarm/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/item/kirbyplants/random, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Gs" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 1 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Gv" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/cult, +/area/station/service/bar) +"GB" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 6 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"GM" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/cult, +/area/station/commons/lounge) +"GN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Ht" = ( +/obj/structure/cable, +/turf/open/floor/cult, +/area/station/service/bar) +"Hv" = ( +/obj/structure/cable, +/turf/open/floor/cult, +/area/station/commons/lounge) +"HB" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Ih" = ( +/obj/machinery/stove, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/item/food/baguette{ + pixel_y = 14 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Ij" = ( +/obj/effect/turf_decal/caution/stand_clear/white{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/elevator/left/directional/west{ + elevator_mode = 1; + elevator_linked_id = "tram_upper_center_lift" + }, +/turf/open/floor/iron, +/area/template_noop) +"IA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/cult, +/area/station/commons/lounge) +"IY" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/item/instrument/violin{ + pixel_y = 32 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Civilian - Theatre Backstage" + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Jg" = ( +/obj/effect/landmark/start/hangover, +/turf/open/floor/cult, +/area/station/service/theater) +"Jm" = ( +/obj/structure/sign/poster/official/do_not_question{ + pixel_x = 32 + }, +/turf/open/floor/cult, +/area/station/service/theater) +"JH" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/cult, +/area/station/service/bar) +"JI" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 4 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"JN" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 + }, +/obj/structure/window{ + dir = 8 + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"JR" = ( +/turf/open/floor/iron, +/area/template_noop) +"JT" = ( +/obj/effect/turf_decal/siding/thinplating/dark/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"JW" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks{ + dir = 8 + }, +/turf/open/floor/cult, +/area/station/service/bar) +"Kl" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/decal/cleanable/dirt, +/mob/living/basic/pet/dog/corgi/narsie, +/obj/structure/bed/dogbed, +/turf/open/floor/cult, +/area/station/service/bar) +"KN" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/turf_decal/trimline/dark_green/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/cult, +/area/station/commons/lounge) +"KT" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"KU" = ( +/obj/structure/chair/pew/right{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/service/theater) +"KW" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Civilian - Theatre Stage" + }, +/obj/item/radio/intercom/directional/east, +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Lh" = ( +/obj/machinery/light/warm/directional/east, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Lj" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Lq" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/cult, +/area/template_noop) +"Lu" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"LQ" = ( +/turf/open/floor/cult, +/area/station/service/bar) +"Md" = ( +/obj/structure/sign/poster/contraband/blood_geometer{ + pixel_y = -32 + }, +/turf/closed/wall/mineral/cult/artificer, +/area/station/maintenance/department/cargo) +"ME" = ( +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"MH" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 8 + }, +/turf/open/floor/cult, +/area/template_noop) +"MO" = ( +/obj/structure/window/reinforced/fulltile, +/obj/effect/decal/cleanable/blood/splatter/over_window, +/turf/open/floor/cult, +/area/station/commons/lounge) +"MS" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"MX" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Na" = ( +/obj/machinery/door/airlock/cult/glass/friendly{ + name = "Bartender Access" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/bar, +/turf/open/floor/cult, +/area/station/service/bar) +"NH" = ( +/obj/effect/decal/cleanable/blood/splatter/over_window, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/cult, +/area/station/commons/lounge) +"NP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/chem_pile, +/turf/open/floor/cult, +/area/station/service/bar) +"Ol" = ( +/obj/effect/turf_decal/trimline/dark_green/corner{ + dir = 1 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Om" = ( +/obj/structure/chair/pew/right{ + dir = 1 + }, +/turf/open/floor/cult, +/area/station/service/theater) +"Ov" = ( +/obj/structure/ladder, +/obj/effect/landmark/event_spawn, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/cult, +/area/station/service/bar) +"Oz" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/cult, +/area/station/service/bar) +"OA" = ( +/obj/effect/turf_decal/siding/thinplating, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/cult, +/area/station/service/kitchen) +"OB" = ( +/obj/machinery/door/airlock/cult/glass/friendly{ + name = "Gambling Den" + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"OY" = ( +/obj/structure/window/reinforced/fulltile, +/obj/structure/grille, +/obj/structure/window_sill, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Pc" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Pp" = ( +/obj/structure/window/reinforced/fulltile, +/obj/structure/disposalpipe/segment, +/turf/open/floor/cult, +/area/station/commons/lounge) +"PH" = ( +/obj/structure/musician/piano, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/cult, +/area/station/service/theater) +"PJ" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/item/plate, +/turf/open/floor/cult, +/area/station/service/kitchen) +"PW" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table/wood/fancy/red, +/turf/open/floor/cult, +/area/station/service/bar) +"Qi" = ( +/obj/structure/chair/wood, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Qm" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Qu" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"QC" = ( +/turf/template_noop, +/area/template_noop) +"QE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table/wood/fancy/red, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"QF" = ( +/obj/structure/table/wood/fancy/red, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/obj/machinery/light/warm/directional/east, +/turf/open/floor/cult, +/area/station/service/bar) +"QP" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/turf_decal/trimline/dark_blue/corner{ + dir = 1 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"QW" = ( +/obj/effect/landmark/start/mime, +/obj/structure/chair/wood/wings{ + dir = 8 + }, +/turf/open/floor/cult, +/area/station/service/theater) +"Rl" = ( +/obj/machinery/oven, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Rp" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/table/wood/fancy/red, +/obj/effect/spawner/random/entertainment/musical_instrument{ + spawn_loot_count = 2; + spawn_loot_double = 0; + spawn_random_offset = 1; + pixel_x = -5; + pixel_y = 5 + }, +/obj/effect/spawner/random/entertainment/musical_instrument{ + spawn_loot_count = 2; + spawn_loot_double = 0; + spawn_random_offset = 1; + pixel_y = -5; + pixel_x = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"RJ" = ( +/obj/structure/table/wood/fancy/red, +/obj/effect/spawner/random/entertainment/deck, +/turf/open/floor/cult, +/area/station/commons/lounge) +"RN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light_switch/directional/east, +/obj/structure/closet/mini_fridge{ + name = "mini-fridge"; + anchored = 1 + }, +/obj/item/reagent_containers/cup/soda_cans/cola, +/obj/item/reagent_containers/condiment/milk, +/turf/open/floor/cult, +/area/station/service/kitchen) +"RO" = ( +/obj/structure/table/wood/fancy/red, +/obj/item/storage/bag/tray, +/obj/item/food/piedough, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Sa" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Sg" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/commons/lounge) +"SG" = ( +/obj/structure/window/reinforced/fulltile, +/obj/effect/decal/cleanable/blood/splatter/over_window, +/obj/structure/grille, +/obj/structure/window_sill, +/turf/open/floor/cult, +/area/station/service/kitchen) +"SI" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"SJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/service/theater) +"TS" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/table/wood/fancy/red, +/obj/item/clothing/glasses/monocle, +/turf/open/floor/cult, +/area/station/commons/lounge) +"TV" = ( +/turf/closed/wall/mineral/cult, +/area/station/service/bar) +"Ub" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Ud" = ( +/obj/machinery/atm{ + pixel_x = -30; + pixel_y = 0 + }, +/turf/open/floor/cult, +/area/station/service/theater) +"Uf" = ( +/obj/structure/table/wood/fancy/red, +/obj/item/toy/toy_dagger{ + pixel_x = -16; + pixel_y = 16 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"UG" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/mirror/directional/west, +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"UV" = ( +/obj/structure/cable, +/obj/machinery/holopad, +/obj/effect/landmark/start/bartender, +/turf/open/floor/cult, +/area/station/service/bar) +"UX" = ( +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Vd" = ( +/turf/open/floor/cult, +/area/station/commons/lounge) +"Vi" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/cult, +/area/station/commons/lounge) +"VA" = ( +/obj/structure/window/reinforced/fulltile, +/obj/effect/decal/cleanable/blood/splatter/over_window, +/obj/structure/grille, +/obj/structure/window_sill, +/turf/open/floor/cult, +/area/station/service/theater) +"VB" = ( +/obj/machinery/stove, +/obj/item/reagent_containers/cup/soup_pot{ + pixel_y = 15; + pixel_x = -6 + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"VL" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Civilian - Skill Games" + }, +/obj/effect/turf_decal/trimline/dark_green/line{ + dir = 8 + }, +/obj/structure/chair/stool/directional/west, +/turf/open/floor/cult, +/area/station/commons/lounge) +"VU" = ( +/obj/machinery/disposal/bin{ + pixel_y = -8; + name = "wall-mounted disposal unit" + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/closed/wall/mineral/cult, +/area/station/service/bar) +"VY" = ( +/obj/effect/decal/cleanable/blood, +/obj/structure/table/wood/fancy/red, +/obj/item/kitchen/rollingpin{ + pixel_y = 5; + pixel_x = 5 + }, +/obj/item/kitchen/spoon/soup_ladle{ + pixel_x = -9 + }, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Wc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Wq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/cult, +/area/station/service/bar) +"Wz" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/cult/glass/friendly{ + name = "Gambling Den" + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"WA" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 8 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/service/kitchen) +"WP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/service/theater) +"Xa" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 2 + }, +/obj/effect/mapping_helpers/mail_sorting/service/theater, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Xp" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/cult, +/area/station/service/kitchen) +"Xq" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/arrows{ + pixel_x = 8; + pixel_y = 15 + }, +/obj/effect/turf_decal/arrows{ + pixel_x = -8 + }, +/obj/effect/turf_decal/arrows{ + dir = 8; + pixel_y = 9 + }, +/obj/effect/turf_decal/arrows{ + dir = 4; + pixel_y = -8 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Xu" = ( +/obj/effect/turf_decal/siding/thinplating/dark, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/mail_sorting/service/kitchen, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4 + }, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Xv" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/cult, +/area/station/commons/lounge) +"XA" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/cult, +/area/station/service/kitchen) +"XG" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 5 + }, +/obj/structure/chair/wood/wings{ + dir = 8 + }, +/turf/open/floor/cult, +/area/template_noop) +"XI" = ( +/obj/effect/turf_decal/siding/thinplating/dark/corner, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/commons/lounge) +"XN" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Service - Bar Lounge North East" + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"XR" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/commons/lounge) +"XS" = ( +/obj/structure/table/wood/fancy/red, +/obj/item/kitchen/fork{ + pixel_x = -10; + pixel_y = 7 + }, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"XT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Yh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/cult/glass/friendly{ + name = "Gambling Den" + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Yk" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/closet/secure_closet/freezer/cream_pie, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Ys" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"YI" = ( +/obj/structure/chair/pew/right{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/cult, +/area/station/service/theater) +"YQ" = ( +/obj/structure/table/wood/fancy/red, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/turf/open/floor/cult, +/area/station/commons/lounge) +"YR" = ( +/obj/effect/turf_decal/trimline/dark_green/line{ + dir = 8 + }, +/obj/structure/chair/stool/directional/west, +/turf/open/floor/cult, +/area/station/commons/lounge) +"YX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/cult, +/area/station/commons/lounge) +"Zm" = ( +/obj/structure/chair/pew/right{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/landmark/start/assistant, +/obj/machinery/duct, +/turf/open/floor/cult, +/area/station/service/theater) +"Zn" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/table/wood/fancy/red, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/cult, +/area/station/commons/lounge) +"ZD" = ( +/obj/structure/table/wood/fancy/red, +/obj/item/kirbyplants/fullysynthetic{ + pixel_y = 23 + }, +/obj/item/storage/fancy/heart_box, +/turf/open/floor/cult, +/area/station/commons/lounge) +"ZO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/duct, +/obj/machinery/light/warm/directional/west, +/turf/open/floor/cult, +/area/station/service/theater) + +(1,1,1) = {" +cu +cu +cu +cu +cu +cu +cu +cu +cu +cu +lP +cu +cu +cu +cu +jH +jH +jH +jH +jH +jH +jH +QC +QC +QC +"} +(2,1,1) = {" +jF +PH +Bm +ey +fC +fC +fC +ny +iU +Fz +xs +SJ +ZO +Ud +cu +CF +Vd +rj +dF +RJ +wO +jH +jH +jH +jH +"} +(3,1,1) = {" +VA +QW +dA +mm +dA +dA +dA +mm +eQ +dA +cj +dA +BY +dA +cu +mu +pO +KN +RJ +Uf +Bx +jH +QC +QC +QC +"} +(4,1,1) = {" +jF +dA +dA +dA +Jg +Jg +Jg +dA +Om +dA +Om +dA +KU +dA +cu +eT +fW +EG +VL +YR +Ol +jH +QC +QC +QC +"} +(5,1,1) = {" +jF +dA +Ek +lo +Jg +qI +Jg +ki +dA +dA +dA +dA +SJ +dA +cu +gy +JI +Xq +uO +uO +FA +jH +QC +QC +QC +"} +(6,1,1) = {" +jF +dA +dA +dA +Jg +Jg +Jg +dA +cj +dA +eQ +dA +FH +dA +cu +mp +iq +eG +Vd +Vd +cB +jH +xf +Ij +xf +"} +(7,1,1) = {" +VA +xc +fV +Et +lg +dA +dA +mm +os +dA +YI +dA +Zm +dA +cu +fU +QP +if +YX +lL +qr +jH +Lq +uL +MH +"} +(8,1,1) = {" +jF +oq +qN +xc +dP +Jm +dA +dA +dA +dA +ke +dA +WP +cm +cu +jH +EV +Yh +OB +MO +jH +jH +jv +uL +JR +"} +(9,1,1) = {" +cu +cu +cu +cu +cu +cu +cu +cu +cu +cu +cu +br +ad +cu +by +zP +Vd +iu +Vd +Vd +Vd +EV +XG +hf +hf +"} +(10,1,1) = {" +OY +hg +vO +Cp +yM +eu +gH +dB +CC +sk +Bj +Vd +tA +iu +li +iu +iu +iu +Vd +Vd +aC +NH +EV +EV +jH +"} +(11,1,1) = {" +OY +hl +up +Bk +GN +GN +GN +GN +mW +uK +Gs +xu +mg +ap +yh +qF +qF +qF +qF +yh +JT +Vd +cl +dC +EV +"} +(12,1,1) = {" +SG +up +up +VY +RO +ox +up +up +jA +CR +gK +Vd +XI +GB +QF +ed +ed +ed +ed +Gv +MS +JT +Vd +Sa +NH +"} +(13,1,1) = {" +OY +xe +up +up +up +up +tc +up +jA +KT +Cf +Vd +FW +lH +TV +ta +iY +LQ +LQ +TV +Bi +UX +pa +pa +Pp +"} +(14,1,1) = {" +OY +lb +Fb +CJ +up +up +up +up +jA +PJ +Cf +Vd +FW +ed +Kl +Dy +JW +pJ +Ht +yE +ed +vf +Vd +Vd +Wz +"} +(15,1,1) = {" +OY +vP +aL +js +nY +Bq +BK +Xp +jA +CR +Cf +Vd +FW +Na +LQ +he +Ov +eU +UV +LQ +ed +vf +Vd +oA +EV +"} +(16,1,1) = {" +OY +oN +JN +Co +up +up +XA +up +jA +CR +fZ +pa +Xu +ed +LQ +Wq +kb +yL +Oz +zM +ed +vf +Vd +Vd +Wz +"} +(17,1,1) = {" +SG +Ch +ME +lz +up +up +tc +up +jA +CL +Bs +Vd +AE +sf +VU +Wq +NP +Wq +BN +TV +se +Qm +XT +Xv +DA +"} +(18,1,1) = {" +OY +VB +up +zK +oW +nu +up +Wc +OA +KT +vr +Vd +Fi +Vd +JH +ed +ed +ed +PW +JH +Vd +IA +qR +SI +EV +"} +(19,1,1) = {" +SG +Rl +up +jO +kA +kA +kA +kA +WA +Dj +As +XR +Sg +hh +hh +hI +hI +hI +hI +Xa +tK +MX +pH +ye +EV +"} +(20,1,1) = {" +OY +Rl +Es +RN +cA +Fc +cc +oY +Gl +BE +XN +Vd +if +Vd +Vd +Hv +Vd +Vd +Vd +Ys +yY +jH +jH +jH +jH +"} +(21,1,1) = {" +yu +yu +yu +yu +yu +yu +yu +yu +yu +yu +oP +Vd +mP +ir +Vd +Hv +ir +ir +Vd +Ys +Vd +jH +QC +QC +QC +"} +(22,1,1) = {" +jH +UG +cg +Lu +Lu +cg +jH +ir +ir +Vd +Vd +Qi +wu +cr +FY +uV +nx +cr +FY +Ys +wx +jH +QC +QC +QC +"} +(23,1,1) = {" +jH +cL +cg +au +Rp +eZ +jH +cr +Ap +Vd +Vd +Qi +QE +qm +FY +uV +qm +cr +FY +Ys +cB +jH +QC +QC +QC +"} +(24,1,1) = {" +jH +TS +cg +zh +Zn +cg +jH +CG +tk +Vd +Vd +Vd +CM +tk +Vd +Hv +tk +tk +Vd +Ys +Md +tM +tM +tM +tM +"} +(25,1,1) = {" +jH +IY +cg +gG +xq +cg +jH +Vd +Vd +Vd +Vd +Vi +if +GM +YX +AI +Ub +lL +Vd +Ys +tM +lU +gg +lU +tM +"} +(26,1,1) = {" +jH +Yk +Dq +Dq +dW +Fy +dD +bv +bv +bv +dz +dz +sd +Pc +pa +nw +Pc +Pc +pa +Lj +tM +lU +md +lU +tM +"} +(27,1,1) = {" +jH +Yk +Dq +Fh +HB +cg +jH +ir +ir +Qu +Vd +Qi +nx +fG +FY +uV +XS +fG +FY +Vd +tM +lU +lU +lU +tM +"} +(28,1,1) = {" +jH +zD +dM +cg +HB +lT +jH +cr +ZD +Vd +Vd +Qi +cr +qm +FY +uV +YQ +cr +FY +Vd +tM +lU +lU +lU +tM +"} +(29,1,1) = {" +jH +Ih +id +qf +rg +cg +jH +tk +tk +Lh +cT +Vd +tk +tk +Vd +Hv +tk +KW +oj +Vd +tM +lU +lU +lU +tM +"} +(30,1,1) = {" +jH +jH +jH +jH +jH +jH +jH +jH +jH +jH +jH +jH +jH +jH +Vd +Hv +Vd +jH +jH +jH +tM +lU +tM +tM +tM +"} diff --git a/monkestation/_maps/RandomBars/Tram/tram_bar_maints_grape.dmm b/monkestation/_maps/RandomBars/Tram/tram_bar_maints_grape.dmm new file mode 100644 index 000000000000..431a0d288985 --- /dev/null +++ b/monkestation/_maps/RandomBars/Tram/tram_bar_maints_grape.dmm @@ -0,0 +1,3193 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ad" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"ap" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/commons/lounge) +"aC" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Service - Bar Lounge South West" + }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/commons/lounge) +"aL" = ( +/turf/open/openspace, +/area/station/service/kitchen) +"aS" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/service/theater) +"aW" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/rag{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/effect/spawner/random/food_or_drink/cake_ingredients, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"bh" = ( +/obj/structure/chair/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/service/theater) +"bk" = ( +/obj/structure/chair/stool/bar, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/commons/lounge) +"bv" = ( +/obj/structure/chair/wood, +/obj/effect/landmark/start/mime, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/service/theater) +"by" = ( +/obj/structure/table, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/spawner/random/trash/food_packaging{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/effect/spawner/random/trash/cigbutt{ + pixel_y = 8; + pixel_x = 7 + }, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"bO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"bP" = ( +/obj/machinery/power/port_gen/pacman/pre_loaded, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/service/theater) +"bX" = ( +/obj/effect/spawner/random/trash/moisture_trap, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/commons/lounge) +"cc" = ( +/obj/machinery/deepfryer, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"ch" = ( +/obj/machinery/light/cold/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/commons/lounge) +"cl" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/ash, +/turf/open/floor/iron, +/area/station/commons/lounge) +"cn" = ( +/obj/structure/table/wood, +/obj/structure/mirror/directional/south, +/obj/item/food/baguette, +/obj/item/lipstick/random{ + pixel_x = 2; + pixel_y = 2 + }, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/service/theater) +"cr" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/service/theater) +"cu" = ( +/turf/closed/wall, +/area/station/maintenance/department/security) +"cA" = ( +/obj/machinery/processor, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"cS" = ( +/obj/effect/spawner/random/structure/crate_loot, +/turf/open/floor/plating, +/area/station/commons/lounge) +"cT" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/station/service/theater) +"dc" = ( +/obj/effect/spawner/random/trash/caution_sign, +/turf/open/floor/plating, +/area/station/commons/lounge) +"dl" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/effect/turf_decal/bot_white, +/obj/machinery/airalarm/directional/north, +/obj/effect/decal/cleanable/food/flour, +/obj/item/reagent_containers/condiment/milk, +/obj/item/reagent_containers/condiment/soymilk, +/obj/item/storage/fancy/egg_box, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"dA" = ( +/turf/open/floor/wood, +/area/station/service/theater) +"dB" = ( +/obj/structure/rack, +/obj/item/book/manual/chef_recipes, +/obj/item/holosign_creator/robot_seat/restaurant, +/obj/item/reagent_containers/condiment/enzyme, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"dC" = ( +/obj/effect/spawner/random/trash/moisture_trap, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/commons/lounge) +"dD" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/service/kitchen) +"dI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/service/kitchen) +"dS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Skill Games" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"dV" = ( +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/station/service/bar) +"ed" = ( +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"ei" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/service/theater) +"eu" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Service - Kitchen West" + }, +/obj/machinery/grill, +/obj/structure/sign/poster/contraband/shamblers_juice{ + pixel_y = 4; + pixel_x = -31 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"ev" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/service/kitchen) +"eF" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/commons/lounge) +"eT" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"eU" = ( +/obj/machinery/vending/boozeomat, +/obj/effect/landmark/navigate_destination/bar, +/turf/closed/wall, +/area/station/service/bar) +"eY" = ( +/obj/effect/decal/cleanable/robot_debris/limb, +/obj/item/reagent_containers/cup/bucket{ + pixel_y = -2; + pixel_x = 3 + }, +/obj/item/assembly/prox_sensor{ + pixel_x = -4; + pixel_y = 7 + }, +/obj/effect/decal/cleanable/oil/streak, +/turf/open/floor/plating, +/area/station/commons/lounge) +"fn" = ( +/obj/effect/decal/cleanable/blood/tracks, +/obj/effect/decal/cleanable/blood/gibs/down, +/turf/open/floor/plating, +/area/station/commons/lounge) +"fG" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"fJ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/station/service/kitchen) +"fW" = ( +/obj/effect/decal/cleanable/generic, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/ash, +/turf/open/floor/iron, +/area/station/commons/lounge) +"fZ" = ( +/turf/open/floor/plating, +/turf/open/floor/plating, +/turf/open/floor/plating, +/area/station/commons/lounge) +"gH" = ( +/obj/machinery/grill, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"gJ" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/commons/lounge) +"gK" = ( +/obj/effect/landmark/start/hangover, +/turf/open/floor/plating, +/turf/open/floor/plating, +/area/station/commons/lounge) +"gZ" = ( +/obj/effect/spawner/random/structure/crate_abandoned, +/turf/open/floor/plating, +/area/station/commons/lounge) +"hd" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/service/theater) +"he" = ( +/obj/effect/landmark/start/bartender, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/service/bar) +"hj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/service/bar) +"hm" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"hA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/service/theater) +"hB" = ( +/obj/machinery/light/cold/directional/north, +/obj/effect/spawner/random/trash/hobo_squat, +/turf/open/floor/plating, +/area/station/commons/lounge) +"hC" = ( +/turf/open/floor/plating, +/area/station/commons/lounge) +"hI" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/trash/cigbutt, +/turf/open/floor/plating, +/area/station/service/bar) +"if" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"iq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"iu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"iY" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/service/bar) +"ji" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/service/theater) +"js" = ( +/obj/machinery/duct, +/obj/machinery/door/window/left/directional/north{ + name = "Dumbwaiter Safety Door" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/food/flour, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"jA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/white/side{ + dir = 5 + }, +/area/station/service/kitchen) +"jG" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/service/theater) +"jO" = ( +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"jW" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/service/theater) +"kb" = ( +/obj/structure/table/wood, +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_x = -5; + pixel_y = 8 + }, +/turf/open/floor/wood, +/area/station/service/bar) +"kc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/ash, +/turf/open/floor/iron, +/area/station/commons/lounge) +"kn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron, +/area/station/commons/lounge) +"kz" = ( +/obj/machinery/vending/autodrobe, +/turf/open/floor/iron/white, +/area/station/service/theater) +"kA" = ( +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"kI" = ( +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/plating, +/area/station/service/theater) +"lb" = ( +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/glass, +/area/station/service/kitchen) +"lg" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"ls" = ( +/obj/item/chair/plastic, +/obj/item/chair/plastic{ + pixel_y = 12 + }, +/obj/item/chair/plastic{ + pixel_y = 6 + }, +/turf/open/floor/plating, +/area/station/commons/lounge) +"lz" = ( +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/service/kitchen) +"lH" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/effect/spawner/random/entertainment/lighter, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/service/bar) +"lU" = ( +/turf/closed/mineral/random/stationside/asteroid/porus, +/area/station/asteroid) +"mp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/service/bar) +"ms" = ( +/obj/effect/spawner/random/structure/table, +/turf/open/floor/plating, +/area/station/commons/lounge) +"mC" = ( +/turf/closed/wall, +/area/station/service/theater) +"mE" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"mP" = ( +/obj/machinery/newscaster/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/service/theater) +"mW" = ( +/obj/machinery/button/door/directional/south{ + id = "playerscantreadthis"; + name = "Kitchen Shutters Control" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"mY" = ( +/obj/effect/decal/cleanable/generic, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/commons/lounge) +"na" = ( +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/station/service/kitchen) +"nk" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"nu" = ( +/obj/structure/table, +/obj/item/storage/bag/tray, +/turf/open/floor/plating, +/area/station/service/kitchen) +"nx" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/service/theater) +"nS" = ( +/obj/structure/chair/wood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/service/theater) +"nY" = ( +/obj/effect/decal/cleanable/food/flour, +/obj/structure/cable, +/obj/machinery/power/floodlight{ + anchored = 1; + name = "inefficient floodlight"; + light_setting_list = list(0,5,7,9); + light_color = "#FFF0BE"; + light_power = 1.2 + }, +/turf/open/floor/catwalk_floor, +/area/station/service/kitchen) +"nZ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "The Cantina" + }, +/turf/open/floor/plating, +/area/station/commons/lounge) +"of" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/service/theater) +"oj" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/three, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/service/theater) +"on" = ( +/obj/structure/sign/poster/contraband/clown{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/station/service/theater) +"oq" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/musician/piano/minimoog, +/turf/open/floor/plating, +/area/station/service/theater) +"ow" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"ox" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/service/kitchen) +"oA" = ( +/obj/machinery/restaurant_portal/bar, +/turf/open/floor/plating, +/area/station/commons/lounge) +"oI" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/bananalamp{ + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/theater) +"oK" = ( +/obj/structure/shipping_container/nanotrasen, +/turf/open/floor/plating, +/area/station/commons/lounge) +"oL" = ( +/obj/structure/chair/wood, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/landmark/start/clown, +/turf/open/floor/iron, +/area/station/service/theater) +"oO" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"oT" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"oW" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"oY" = ( +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, +/obj/structure/rack, +/turf/open/floor/plating, +/area/station/service/kitchen) +"pa" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/commons/lounge) +"pd" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/commons/lounge) +"pe" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/rack, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/effect/spawner/random/decoration/paint, +/obj/item/airlock_painter/decal/tile, +/turf/open/floor/plating, +/area/station/service/theater) +"pu" = ( +/obj/structure/chair, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/west, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"pH" = ( +/obj/structure/chair, +/obj/effect/landmark/start/assistant, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"pJ" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/bar) +"pL" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Civilian - Theatre Backstage" + }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/service/theater) +"pO" = ( +/obj/effect/spawner/random/trash/graffiti, +/turf/open/floor/plating, +/area/station/commons/lounge) +"pQ" = ( +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/duct, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Bar Maintenance Hatch" + }, +/obj/effect/spawner/random/structure/barricade, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/security) +"qm" = ( +/obj/machinery/holopad, +/turf/open/floor/plating, +/area/station/service/theater) +"qu" = ( +/turf/open/floor/plating, +/area/station/service/kitchen) +"qC" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/plating, +/area/station/service/theater) +"qE" = ( +/obj/structure/rack, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband{ + pixel_y = 5; + pixel_x = 2 + }, +/obj/item/poster/random_contraband{ + pixel_y = 3 + }, +/turf/open/floor/plating, +/area/station/service/theater) +"qF" = ( +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/plating, +/area/station/service/theater) +"qQ" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Theatre Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/department/cargo) +"qR" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"qX" = ( +/obj/item/toy/basketball, +/obj/item/toy/beach_ball/baseball, +/obj/structure/closet/crate/trashcart{ + name = "sport cart"; + desc = "A heavy, metal trashcart repurposed to hold various sport stuff." + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility vest used in sport zones."; + name = "High visibility jersey" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility vest used in sport zones."; + name = "High visibility jersey" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility vest used in sport zones."; + name = "High visibility jersey" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility vest used in sport zones."; + name = "High visibility jersey" + }, +/obj/item/clothing/gloves/boxing, +/obj/item/clothing/gloves/boxing/green, +/turf/open/floor/plating, +/area/station/commons/lounge) +"rd" = ( +/obj/machinery/processor, +/obj/structure/cable, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"rs" = ( +/obj/structure/table, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/effect/landmark/start/hangover, +/turf/open/floor/plating, +/area/station/commons/lounge) +"ru" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/spawner/random/structure/tank_holder, +/turf/open/floor/plating, +/area/station/service/theater) +"rL" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + location = "Kitchen"; + name = "navigation beacon (Kitchen Delivery)" + }, +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/window/right/directional/west{ + name = "Kitchen Delivery Chute"; + req_access = "kitchen" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/cargo) +"sd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/service/theater) +"se" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/service/bar) +"sf" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small/directional/south, +/obj/effect/spawner/random/trash/food_packaging, +/turf/open/floor/plating, +/area/station/service/bar) +"sk" = ( +/turf/closed/wall, +/area/station/service/kitchen) +"sm" = ( +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/commons/lounge) +"st" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/cable, +/obj/machinery/light/small/directional/north, +/turf/open/floor/catwalk_floor, +/area/station/service/theater) +"sx" = ( +/obj/structure/table/reinforced, +/obj/structure/window/spawner, +/obj/item/reagent_containers/cup/glass/bottle/small{ + list_reagents = list(/datum/reagent/consumable/ethanol/bacchus_blessing = 30); + name = "the strong stuff"; + desc = "This glass bottle has 'the strong stuff' written messily on it in marker, are you sure you should be drinking this?" + }, +/turf/open/floor/plating, +/area/station/service/bar) +"sK" = ( +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/service/theater) +"sR" = ( +/obj/structure/table/wood, +/obj/structure/mirror/directional/south, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/item/food/pie/cream, +/turf/open/floor/iron, +/area/station/service/theater) +"tc" = ( +/obj/effect/landmark/start/cook, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"td" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/service/theater) +"tK" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 2 + }, +/obj/effect/mapping_helpers/mail_sorting/service/theater, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"tV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/service/theater) +"up" = ( +/obj/machinery/griddle, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"us" = ( +/obj/structure/closet/crate/wooden/toy, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/service/theater) +"uN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/food/egg_smudge, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"uV" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/station/service/theater) +"vf" = ( +/obj/structure/chair/plastic{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/commons/lounge) +"vo" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"vr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/turf/open/floor/plating, +/area/station/commons/lounge) +"vP" = ( +/obj/structure/sign/clock/directional/north, +/turf/open/floor/glass, +/area/station/service/kitchen) +"wa" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/lounge) +"wu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atm, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/service/theater) +"wx" = ( +/obj/structure/grille/broken, +/obj/item/shard{ + icon_state = "medium" + }, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/plating, +/area/station/service/theater) +"wy" = ( +/obj/effect/decal/cleanable/shreds, +/obj/effect/spawner/random/structure/barricade, +/turf/open/floor/plating, +/area/station/commons/lounge) +"wB" = ( +/obj/effect/spawner/random/structure/table, +/obj/item/paper/crumpled, +/turf/open/floor/plating, +/area/station/commons/lounge) +"wI" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/spawner/random/structure/barricade, +/turf/open/floor/plating, +/area/station/commons/lounge) +"wK" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/spawner/random/structure/table_or_rack, +/obj/effect/spawner/random/maintenance/four, +/obj/effect/spawner/random/entertainment/money_small, +/obj/effect/spawner/random/entertainment/money_small, +/obj/effect/spawner/random/entertainment/coin, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"wM" = ( +/obj/structure/chair/stool/bar/directional/north, +/turf/open/floor/plating, +/turf/open/floor/plating, +/area/station/commons/lounge) +"wO" = ( +/obj/structure/chair/stool/directional/north, +/obj/machinery/light/small/built/directional/south, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"xa" = ( +/obj/structure/table/reinforced, +/turf/open/floor/plating, +/area/station/service/bar) +"xu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/commons/lounge) +"xM" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/decal/cleanable/oil, +/obj/structure/closet/crate/maint, +/obj/effect/spawner/random/exotic/technology, +/turf/open/floor/plating, +/area/station/commons/lounge) +"xR" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/service/theater) +"ye" = ( +/obj/structure/table, +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/commons/lounge) +"yh" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/commons/lounge) +"yE" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/service/bar) +"yJ" = ( +/obj/structure/closet/secure_closet/freezer/cream_pie, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron, +/area/station/service/theater) +"yL" = ( +/obj/structure/table/wood, +/obj/machinery/chem_master/condimaster{ + desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; + name = "HoochMaster Deluxe" + }, +/turf/open/floor/wood, +/area/station/service/bar) +"yM" = ( +/obj/structure/table, +/obj/machinery/requests_console/directional/west{ + assistance_requestable = 1; + department = "Kitchen"; + name = "Kitchen Requests Console"; + supplies_requestable = 1 + }, +/obj/item/storage/bag/tray, +/obj/item/food/piedough, +/obj/item/kitchen/rollingpin, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"yQ" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/obj/structure/mannequin/wood{ + name = "Marty the mannequin"; + desc = "The bane of radio telescope array operators everywhere."; + max_integrity = 600 + }, +/turf/open/floor/plating, +/area/station/commons/lounge) +"yY" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Service - Bar Lounge South East" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/barsign/directional/south, +/turf/open/floor/plating, +/area/station/commons/lounge) +"zh" = ( +/obj/effect/decal/cleanable/oil/streak, +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/commons/lounge) +"zK" = ( +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"zM" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/mob/living/basic/cockroach, +/turf/open/floor/wood, +/area/station/service/bar) +"zN" = ( +/obj/effect/landmark/start/cook, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"zP" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"zV" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Ap" = ( +/obj/structure/closet/secure_closet/freezer/cream_pie, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/service/theater) +"As" = ( +/obj/effect/turf_decal/siding/thinplating/corner{ + dir = 1 + }, +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"AE" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4 + }, +/obj/effect/mapping_helpers/mail_sorting/service/kitchen, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"AF" = ( +/obj/effect/landmark/start/hangover, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Bi" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/bar) +"Bj" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Service - Bar Lounge North West" + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/effect/spawner/random/structure/table_or_rack, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Bk" = ( +/obj/machinery/duct, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/plating, +/area/station/service/kitchen) +"Bq" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/landmark/navigate_destination/kitchen, +/obj/machinery/holopad, +/obj/structure/cable, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"Bs" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/turf/open/floor/plating, +/area/station/commons/lounge) +"BE" = ( +/obj/structure/table, +/obj/item/reagent_containers/cup/soup_pot, +/obj/item/kitchen/spoon/soup_ladle, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"BF" = ( +/obj/structure/chair/wood, +/turf/open/floor/plating, +/area/station/service/theater) +"BK" = ( +/obj/structure/ladder, +/obj/structure/cable, +/obj/structure/cable, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"BN" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/bar) +"BX" = ( +/obj/effect/decal/cleanable/oil/streak, +/obj/effect/decal/cleanable/oil/streak, +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/commons/lounge) +"BY" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/trash/food_packaging, +/turf/open/floor/plating, +/area/station/service/bar) +"Cf" = ( +/turf/open/floor/plating, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Ci" = ( +/obj/structure/shipping_container/conarex, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Cm" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Co" = ( +/obj/machinery/duct, +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"Cp" = ( +/obj/structure/sink/kitchen/directional/south, +/obj/item/radio/intercom/directional/west, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/station/service/kitchen) +"Ct" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/stove, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"CC" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"CF" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"CG" = ( +/turf/closed/wall, +/area/station/maintenance/department/cargo) +"CJ" = ( +/obj/machinery/duct, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/food/flour, +/turf/open/floor/plating, +/area/station/service/kitchen) +"CL" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/turf/open/floor/plating, +/area/station/service/kitchen) +"CR" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/turf/open/floor/plating, +/area/station/service/kitchen) +"Dd" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/service/theater) +"Dj" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Kitchen" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/service/kitchen) +"Ds" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/entertainment/drugs, +/turf/open/floor/plating, +/area/station/service/bar) +"Dy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/service/bar) +"DA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "The Cantina" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"DG" = ( +/obj/effect/spawner/random/trash/bucket, +/obj/effect/decal/cleanable/shreds, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Ev" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/station/service/theater) +"ED" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/plasma, +/turf/open/floor/plating, +/area/station/service/theater) +"EG" = ( +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"EP" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/turf/open/floor/plating, +/area/station/service/kitchen) +"EV" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Fb" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, +/obj/effect/decal/cleanable/food/flour, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"Fc" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Service - Kitchen East" + }, +/obj/machinery/deepfryer, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"Fi" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"Fl" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/plasma, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Fz" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/landmark/start/hangover, +/turf/open/floor/plating, +/area/station/service/theater) +"FW" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/assistant, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"FY" = ( +/obj/structure/closet/mini_fridge, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/food_or_drink/booze, +/obj/effect/spawner/random/trash/bacteria, +/obj/effect/spawner/random/trash/bacteria, +/turf/open/floor/plating, +/area/station/service/theater) +"Gl" = ( +/obj/machinery/light_switch/directional/south{ + pixel_x = -8 + }, +/obj/machinery/firealarm/directional/east, +/obj/item/kirbyplants/random, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"Gs" = ( +/obj/item/chair, +/obj/effect/decal/cleanable/vomit/old, +/obj/structure/sign/poster/contraband/mothic_rations{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Gv" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/service/bar) +"Gy" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/item/food/urinalcake, +/turf/open/floor/plating, +/area/station/service/kitchen) +"GB" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/commons/lounge) +"GE" = ( +/obj/machinery/duct, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/food/flour, +/turf/open/floor/plating, +/area/station/service/kitchen) +"GN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"GO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"GP" = ( +/obj/structure/chair/stool/directional/north, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"GS" = ( +/obj/machinery/door/airlock{ + name = "Theatre Backstage" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/service/theater) +"GT" = ( +/obj/structure/table/wood/poker, +/obj/effect/spawner/random/entertainment/deck, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"GV" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"Hb" = ( +/turf/open/floor/plating, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Hj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/service/theater) +"Hq" = ( +/obj/structure/table, +/obj/item/knife/kitchen, +/obj/machinery/reagentgrinder{ + pixel_x = -5; + pixel_y = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"Ht" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/station/service/bar) +"HF" = ( +/obj/effect/decal/cleanable/oil/streak, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Ik" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/station/service/kitchen) +"In" = ( +/obj/structure/frame/computer, +/turf/open/floor/plating, +/area/station/commons/lounge) +"IA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Jg" = ( +/obj/item/stack/tile/catwalk_tile, +/turf/open/floor/plating, +/area/station/service/theater) +"Jl" = ( +/obj/structure/table/reinforced, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/service/bar) +"JH" = ( +/obj/effect/spawner/random/entertainment/musical_instrument{ + spawn_loot_count = 2; + spawn_loot_double = 0; + spawn_random_offset = 1 + }, +/obj/structure/rack, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/item/wirerod, +/turf/open/floor/plating, +/area/station/service/theater) +"JI" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"JN" = ( +/obj/machinery/vending/dinnerware, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"JT" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/station/commons/lounge) +"JW" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/bar) +"Kl" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/service/bar) +"KN" = ( +/obj/structure/table/wood/poker, +/obj/effect/landmark/start/hangover, +/obj/item/storage/dice, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"KT" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/plating, +/area/station/service/kitchen) +"KW" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Civilian - Theatre Stage" + }, +/obj/item/radio/intercom/directional/east, +/obj/structure/rack, +/obj/effect/spawner/random/engineering/material_cheap, +/obj/effect/spawner/random/mod/maint, +/turf/open/floor/plating, +/area/station/service/theater) +"KX" = ( +/obj/structure/shipping_container/gorlex, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Lh" = ( +/obj/structure/dresser, +/turf/open/floor/iron/white, +/area/station/service/theater) +"Lj" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/service/theater) +"Lk" = ( +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Ln" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/service/kitchen) +"Lw" = ( +/obj/structure/table/wood, +/obj/structure/mirror/directional/south, +/obj/item/lipstick/random{ + pixel_x = -2; + pixel_y = -2 + }, +/turf/open/floor/plating, +/area/station/service/theater) +"LD" = ( +/obj/structure/table/wood/poker, +/obj/effect/spawner/random/entertainment/gambling, +/turf/open/floor/plating, +/area/station/commons/lounge) +"LQ" = ( +/obj/effect/spawner/random/trash/grime, +/turf/open/floor/wood, +/area/station/service/bar) +"Mr" = ( +/obj/effect/turf_decal/trimline/dark_blue/corner, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"ME" = ( +/obj/machinery/elevator_control_panel/directional/north{ + desc = "A small control panel used to move the kitchen dumbwaiter up and down."; + linked_elevator_id = "dumbwaiter_lift"; + name = "Dumbwaiter Control Panel"; + preset_destination_names = list("2"="Hydroponics","3"="Kitchen") + }, +/obj/structure/disposalpipe/trunk, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"MO" = ( +/turf/closed/wall, +/area/station/commons/lounge) +"MS" = ( +/turf/open/floor/wood, +/area/station/service/bar) +"MV" = ( +/obj/structure/mecha_wreckage/ripley, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/recharge_floor, +/area/station/commons/lounge) +"MX" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"Na" = ( +/obj/structure/table/reinforced, +/obj/structure/window/spawner/directional/north, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/service/bar) +"Np" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/food/egg_smudge, +/turf/open/floor/catwalk_floor, +/area/station/service/kitchen) +"NC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/plasma, +/turf/open/floor/plating, +/area/station/commons/lounge) +"NI" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/station/service/bar) +"NP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/chem_pile, +/turf/open/floor/wood, +/area/station/service/bar) +"Oc" = ( +/mob/living/basic/cockroach, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Ol" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"Ov" = ( +/obj/structure/ladder, +/obj/effect/landmark/event_spawn, +/obj/machinery/light/broken/directional/south, +/turf/open/floor/wood, +/area/station/service/bar) +"Ow" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/service/theater) +"Oz" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/service/bar) +"OT" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plating, +/area/station/commons/lounge) +"OZ" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 1 + }, +/obj/structure/table_frame/wood, +/turf/open/floor/iron, +/area/station/service/theater) +"Pc" = ( +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Pd" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/spawner/random/structure/girder, +/turf/open/floor/plating, +/area/station/service/theater) +"Pg" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/theater) +"Pp" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "The Cantina" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Pq" = ( +/obj/machinery/light/cold/directional/west, +/obj/effect/spawner/random/structure/crate_loot, +/turf/open/floor/plating, +/area/station/commons/lounge) +"PJ" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/item/plate, +/turf/open/floor/plating, +/area/station/service/kitchen) +"PS" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/lounge) +"PW" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/maintenance/glass{ + name = "Bar"; + normal_integrity = 300 + }, +/obj/effect/mapping_helpers/airlock/access/all/service/bar, +/turf/open/floor/catwalk_floor, +/area/station/service/bar) +"Qm" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Qp" = ( +/mob/living/basic/cockroach, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Qu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/service/theater) +"Qx" = ( +/obj/item/broken_bottle{ + pixel_y = -5 + }, +/turf/open/floor/plating, +/area/station/commons/lounge) +"QC" = ( +/turf/template_noop, +/area/template_noop) +"QE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/service/theater) +"QF" = ( +/obj/structure/table/reinforced, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/service/bar) +"QM" = ( +/turf/open/floor/iron, +/area/station/commons/lounge) +"QR" = ( +/obj/machinery/duct, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"QX" = ( +/turf/open/floor/plating, +/area/station/service/theater) +"QZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"Rd" = ( +/obj/effect/decal/cleanable/food/flour, +/obj/machinery/oven, +/turf/open/floor/plating, +/area/station/service/kitchen) +"Rl" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"RJ" = ( +/obj/structure/table/wood/poker, +/obj/effect/spawner/random/entertainment/money_small, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"RN" = ( +/obj/structure/sink/kitchen/directional/south, +/turf/open/floor/plating, +/area/station/service/kitchen) +"RO" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white/side{ + dir = 9 + }, +/area/station/service/kitchen) +"RS" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/ash/large, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Sa" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/effect/spawner/random/trash/grille_or_waste, +/turf/open/floor/plating, +/area/station/service/theater) +"Sg" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"So" = ( +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/service/kitchen) +"St" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/sign/poster/contraband/random/directional/south, +/obj/effect/spawner/random/structure/closet_maintenance, +/turf/open/floor/plating, +/area/station/service/theater) +"SI" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/commons/lounge) +"SJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/service/bar) +"SO" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/obj/effect/turf_decal/bot_white, +/obj/item/reagent_containers/condiment/rice, +/obj/item/reagent_containers/condiment/sugar, +/obj/structure/sign/poster/contraband/moffuchis_pizza{ + pixel_y = 32 + }, +/obj/item/reagent_containers/condiment/flour, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"SU" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/commons/lounge) +"TE" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/service/theater) +"TF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/theater) +"TU" = ( +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"TV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/station/commons/lounge) +"TZ" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Ud" = ( +/turf/open/misc/asteroid, +/area/station/asteroid) +"Uf" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/random/entertainment/drugs, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Ul" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/service/theater) +"Um" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"UD" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/insectguts, +/turf/open/floor/wood, +/area/station/service/bar) +"UV" = ( +/obj/structure/cable, +/mob/living/carbon/human/species/monkey/punpun, +/obj/machinery/holopad, +/turf/open/floor/wood, +/area/station/service/bar) +"UW" = ( +/obj/structure/shipping_container/donk_co, +/turf/open/floor/plating, +/area/station/commons/lounge) +"UX" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Va" = ( +/obj/item/chair/stool/bar, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Vd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash/grime, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"Vq" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/atm, +/obj/item/shard{ + pixel_x = 14 + }, +/obj/item/stack/rods{ + pixel_y = -4 + }, +/obj/effect/decal/cleanable/glass, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"Vs" = ( +/obj/structure/rack, +/obj/item/wrench, +/obj/machinery/light/small/directional/east, +/obj/effect/spawner/random/decoration/glowstick, +/turf/open/floor/plating, +/area/station/service/theater) +"Vv" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/spawner/random/trash/bin, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"VL" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Civilian - Skill Games" + }, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"VU" = ( +/turf/closed/wall, +/area/station/service/bar) +"VY" = ( +/obj/machinery/duct, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"VZ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/service/kitchen) +"Wj" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/structure/sign/poster/contraband/microwave{ + pixel_y = 32 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"Wq" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/service/bar) +"Ws" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Wz" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Skill Games" + }, +/turf/open/floor/plating, +/area/station/commons/lounge) +"WA" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"WF" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/matches{ + pixel_y = 1; + pixel_x = -4 + }, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_x = 8; + pixel_y = 5 + }, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_x = 8; + pixel_y = 5 + }, +/turf/open/floor/iron, +/area/station/service/bar) +"WP" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/spawner/random/structure/barricade, +/turf/open/floor/plating, +/area/station/commons/lounge) +"WW" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + location = "Theatre"; + name = "navigation beacon (Theatre Delivery)" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/window/right/directional/south{ + name = "Theatre Delivery Chute"; + req_access = "theatre" + }, +/obj/effect/turf_decal/loading_area, +/turf/open/floor/plating, +/area/station/maintenance/department/cargo) +"WX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/machinery/door/window/right/directional/north{ + name = "Bar Delivery Chute" + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + location = "Bar"; + name = "navigation beacon (Bar Delivery)" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/cargo) +"Xa" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"Xq" = ( +/obj/machinery/holopad{ + pixel_y = 16 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"Xu" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/chair/stool/bar, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"Xv" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/steam_vent, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"Xy" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/catwalk_floor, +/area/station/service/theater) +"XA" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/service/kitchen) +"XD" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/ash, +/turf/open/floor/iron, +/area/station/commons/lounge) +"XG" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/catwalk_floor, +/area/station/service/theater) +"XI" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"XL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/commons/lounge) +"XN" = ( +/obj/machinery/restaurant_portal/restaurant, +/obj/machinery/camera/directional/north{ + c_tag = "Service - Bar Lounge North East" + }, +/obj/machinery/airalarm/directional/east, +/obj/structure/sign/poster/contraband/eat{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/station/commons/lounge) +"XR" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor, +/area/station/commons/lounge) +"XS" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor, +/area/station/service/theater) +"Yg" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/service/bar) +"Ys" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/commons/lounge) +"YM" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/turf/open/floor/plating, +/area/station/service/kitchen) +"YQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/station/commons/lounge) +"YX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/grimy, +/area/station/commons/lounge) +"ZD" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/service/theater) +"ZG" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"ZZ" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/plasma, +/turf/open/floor/plating, +/area/station/service/theater) + +(1,1,1) = {" +cu +cu +cu +cu +cu +cu +cu +cu +cu +cu +pQ +cu +cu +cu +cu +cu +cu +MO +MO +MO +QC +QC +QC +QC +QC +"} +(2,1,1) = {" +cu +hC +Ci +gZ +xM +Pq +cS +hC +KX +TZ +hC +eF +ch +wy +MO +CF +LD +GT +wO +MO +QC +QC +QC +QC +QC +"} +(3,1,1) = {" +cu +hC +hC +hC +Ys +Cm +hC +hC +hC +XL +hC +hC +oK +qX +MO +Um +RJ +KN +GP +MO +QC +QC +QC +QC +QC +"} +(4,1,1) = {" +cu +hC +hC +pO +hC +Ys +hC +hC +hC +XL +hC +hC +hC +MO +MO +nk +iq +GV +VL +MO +MO +QC +QC +QC +QC +"} +(5,1,1) = {" +cu +hB +In +eF +hC +UW +hC +hC +hC +HF +hC +hC +hC +MO +eT +JI +mE +Xq +oT +eT +MO +QC +QC +QC +QC +"} +(6,1,1) = {" +cu +Uf +dc +DG +hC +hC +hC +hC +hC +BX +Ys +hC +eF +MO +Vq +EG +iq +Vd +GV +wK +MO +QC +QC +QC +QC +"} +(7,1,1) = {" +cu +MV +Ws +fn +hC +hC +wB +ms +cS +zh +hC +Ys +hC +MO +fG +GP +iu +YX +Mr +Vv +MO +QC +QC +QC +QC +"} +(8,1,1) = {" +cu +MO +MO +MO +MO +MO +MO +MO +MO +MO +MO +wI +WP +MO +MO +EV +dS +Wz +EV +MO +MO +MO +QC +QC +QC +"} +(9,1,1) = {" +lU +lU +sk +sk +sk +sk +sk +sk +sk +sk +MO +hC +ad +pu +by +zP +if +hC +hC +rs +yQ +MO +QC +QC +QC +"} +(10,1,1) = {" +lU +sk +sk +Cp +yM +eu +gH +dB +CC +sk +Bj +eY +QR +hC +Ys +Pc +RS +kc +hC +mY +aC +MO +MO +MO +MO +"} +(11,1,1) = {" +lU +sk +hm +Bk +Np +GN +dI +QZ +mW +sk +Gs +xu +ad +ap +PS +yh +cl +yh +yh +pa +zV +TV +bX +dC +EV +"} +(12,1,1) = {" +lU +sk +SO +VY +bO +vo +qu +aW +RO +CR +gK +Oc +XI +GB +QF +xa +xa +dV +xa +Gv +ZG +JT +Qx +hC +EV +"} +(13,1,1) = {" +sk +sk +dl +GE +up +uN +tc +VZ +ox +YM +Cf +Va +FW +lH +VU +mp +iY +NI +UD +VU +Bi +UX +pa +SU +Pp +"} +(14,1,1) = {" +sk +lb +Fb +CJ +Rd +ow +qu +Ln +Ik +PJ +Hb +bk +oO +Ds +Kl +Dy +JW +pJ +Ht +yE +xa +ls +QM +sm +nZ +"} +(15,1,1) = {" +sk +vP +aL +js +nY +Bq +BK +rd +fJ +Gy +fZ +fW +Xu +WF +Yg +he +Ov +eU +UV +MS +xa +vf +wa +oA +EV +"} +(16,1,1) = {" +sk +lb +JN +Co +Ct +Rl +XA +dD +ox +KT +wM +Va +oO +BY +LQ +SJ +kb +yL +Oz +zM +xa +OT +hC +sm +nZ +"} +(17,1,1) = {" +sk +sk +ME +lz +ev +XA +zN +ed +ox +CL +Bs +yh +AE +sf +VU +Wq +NP +hj +BN +VU +se +Qm +lg +Xv +DA +"} +(18,1,1) = {" +lU +sk +Wj +zK +up +nu +BE +Hq +jA +EP +vr +wa +Fi +pd +Jl +hI +hI +sx +PW +Na +kn +IA +qR +SI +EV +"} +(19,1,1) = {" +lU +sk +oW +jO +TU +So +na +kA +WA +Dj +As +XR +Sg +Ol +Ol +Ol +Ol +Ol +Ol +Xa +tK +MX +pH +ye +EV +"} +(20,1,1) = {" +lU +sk +sk +RN +cA +Fc +cc +oY +Gl +sk +XN +hC +GO +Ys +Lk +hC +Qp +XD +Fl +QM +yY +MO +MO +MO +MO +"} +(21,1,1) = {" +Ud +Ud +CG +rL +CG +CG +CG +CG +sk +sk +mC +mC +mP +ZZ +Pc +AF +NC +YQ +gJ +kI +td +MO +QC +QC +QC +"} +(22,1,1) = {" +Ud +Ud +Ud +Ud +Ud +Ud +Ud +CG +yJ +oL +Lw +mC +wu +ED +Ul +uV +Pg +cr +FY +Ul +td +MO +QC +QC +QC +"} +(23,1,1) = {" +Ud +Ud +Ud +Ud +Ud +Ud +Ud +CG +Ap +jW +oI +mC +st +QX +nS +xR +qm +Ev +hd +qF +tV +MO +QC +QC +QC +"} +(24,1,1) = {" +lU +lU +lU +lU +lU +Ud +Ud +CG +on +bh +sR +mC +QE +dA +BF +QX +dA +dA +nx +QX +TF +MO +QC +QC +QC +"} +(25,1,1) = {" +lU +lU +lU +lU +lU +Ud +Ud +CG +pL +of +OZ +mC +Xy +Ow +Sa +qC +oq +wx +Pd +ru +td +CG +lU +lU +lU +"} +(26,1,1) = {" +lU +lU +lU +lU +lU +Ud +Ud +CG +us +bv +cn +mC +sd +Dd +Jg +Jg +Fz +QX +QX +Lj +td +WX +lU +lU +lU +"} +(27,1,1) = {" +lU +lU +lU +lU +lU +Ud +Ud +WW +QX +Qu +jG +GS +ei +ei +ei +ei +XS +ji +ji +ji +St +CG +lU +lU +lU +"} +(28,1,1) = {" +lU +lU +lU +lU +lU +Ud +Ud +CG +ZD +Hj +TE +mC +pe +sK +aS +sd +QX +aS +QX +QX +qE +CG +lU +lU +lU +"} +(29,1,1) = {" +lU +lU +lU +lU +lU +Ud +Ud +CG +kz +Lh +cT +mC +mC +bP +Vs +hA +XG +KW +oj +JH +CG +CG +lU +lU +lU +"} +(30,1,1) = {" +lU +lU +lU +lU +lU +Ud +Ud +CG +CG +CG +CG +CG +CG +CG +CG +qQ +CG +CG +CG +CG +CG +lU +lU +lU +lU +"} diff --git a/monkestation/_maps/RandomBars/Tram/tram_bar_ocean.dmm b/monkestation/_maps/RandomBars/Tram/tram_bar_ocean.dmm new file mode 100644 index 000000000000..4089a4392821 --- /dev/null +++ b/monkestation/_maps/RandomBars/Tram/tram_bar_ocean.dmm @@ -0,0 +1,1957 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ae" = ( +/turf/closed/wall, +/area/station/service/bar) +"aq" = ( +/obj/structure/chair/sofa/left/brown{ + dir = 1 + }, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"at" = ( +/obj/structure/table/reinforced/rglass, +/obj/effect/spawner/random/entertainment/gambling, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"au" = ( +/obj/structure/table/reinforced/rglass, +/obj/structure/desk_bell{ + pixel_x = -7 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"aw" = ( +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"bj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"by" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"bK" = ( +/obj/structure/mirror/directional/east, +/turf/open/floor/fake_seafloor/heavy, +/area/station/service/theater) +"bZ" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/kitchen/rollingpin, +/obj/item/knife/kitchen, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"cv" = ( +/obj/machinery/oven, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"cP" = ( +/obj/structure/chair/sofa/middle/brown{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"cS" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"cW" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"cY" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"de" = ( +/obj/machinery/firealarm/directional/north, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"di" = ( +/obj/machinery/elevator_control_panel/directional/north{ + desc = "A small control panel used to move the kitchen dumbwaiter up and down."; + linked_elevator_id = "dumbwaiter_lift"; + name = "Dumbwaiter Control Panel"; + preset_destination_names = list("2"="Hydroponics","3"="Kitchen") + }, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"dr" = ( +/turf/closed/wall, +/area/station/service/kitchen) +"dA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock{ + name = "Theatre Backstage" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/obj/machinery/door/firedoor, +/turf/open/floor/fake_seafloor, +/area/station/service/theater) +"dQ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"eF" = ( +/turf/closed/wall, +/area/station/service/theater) +"eT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/theater) +"eV" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_x = -5; + pixel_y = 8 + }, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"eW" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 8 + }, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"fE" = ( +/obj/structure/table/reinforced/rglass, +/obj/effect/spawner/random/entertainment/dice, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"fM" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/chem_dispenser/drinks{ + dir = 8 + }, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"gn" = ( +/obj/effect/landmark/start/cook, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"gx" = ( +/obj/structure/closet/secure_closet/freezer/cream_pie, +/obj/machinery/light/small/directional/east, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/theater) +"gy" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/book/manual/chef_recipes, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"gE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"gG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"gZ" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/machinery/door/firedoor, +/obj/effect/spawner/random/food_or_drink/soup, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"hb" = ( +/obj/structure/table/reinforced/rglass, +/obj/effect/spawner/random/entertainment/musical_instrument, +/turf/open/floor/fake_seafloor/heavy, +/area/station/service/theater) +"it" = ( +/obj/machinery/door/airlock/public/glass{ + name = "The Cantina" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"iz" = ( +/obj/machinery/chem_master/condimaster{ + desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; + name = "HoochMaster Deluxe" + }, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"iE" = ( +/obj/structure/chair/stool/bar, +/obj/effect/landmark/start/assistant, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"jg" = ( +/obj/structure/chair/sofa/right/brown, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"jw" = ( +/obj/structure/chair/sofa/left/brown, +/obj/effect/landmark/start/hangover, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"jH" = ( +/obj/structure/chair/stool, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"jT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"jZ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/public/glass{ + name = "Kitchen" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"kP" = ( +/obj/structure/chair/stool, +/obj/effect/landmark/start/assistant, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"lb" = ( +/turf/open/openspace, +/area/station/commons/lounge) +"ls" = ( +/obj/machinery/stove, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"lL" = ( +/turf/template_noop, +/area/template_noop) +"lR" = ( +/obj/structure/table/reinforced/rglass, +/obj/effect/spawner/random/entertainment/deck, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"lZ" = ( +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"mh" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/mail_sorting/service/theater, +/obj/structure/disposalpipe/sorting/mail/flip, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"mm" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/door/firedoor, +/obj/effect/spawner/random/entertainment/cigarette_pack, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"mE" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/machinery/door/firedoor, +/obj/effect/spawner/random/entertainment/money, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"mG" = ( +/obj/structure/table/reinforced/rglass, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"nl" = ( +/obj/structure/dresser, +/turf/open/floor/fake_seafloor/heavy, +/area/station/service/theater) +"nL" = ( +/obj/machinery/processor, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"nM" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"nN" = ( +/obj/structure/ladder, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"nS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"om" = ( +/obj/machinery/restaurant_portal/bar, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"oq" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"oL" = ( +/obj/structure/table/reinforced/rglass, +/obj/effect/spawner/random/entertainment/money_medium, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"pG" = ( +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"pI" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"pR" = ( +/turf/closed/mineral/random/fake_ocean, +/area/station/commons/lounge) +"qd" = ( +/obj/item/radio/intercom/directional/east, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"qq" = ( +/obj/effect/area_lighting_helper/max_alpha_blue, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"qB" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/holosign_creator/robot_seat/bar, +/obj/machinery/door/firedoor, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"qO" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/camera/directional/west, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"qX" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"re" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"rk" = ( +/obj/structure/chair/sofa/middle/brown{ + dir = 4 + }, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"sh" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/storage/fancy/cigarettes/cigars/havana, +/obj/effect/spawner/random/entertainment/lighter, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"sr" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/item/reagent_containers/condiment/rice, +/obj/machinery/airalarm/directional/north, +/obj/structure/cable, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"sE" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"sI" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Dumbwaiter Safety Door" + }, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"sO" = ( +/obj/machinery/disposal/bin, +/obj/machinery/newscaster/directional/west, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"ta" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/door/firedoor, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"tt" = ( +/obj/machinery/deepfryer, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"tT" = ( +/obj/machinery/griddle, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"tV" = ( +/obj/structure/chair/sofa/left/brown, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"vp" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"vV" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/reagent_containers/cup/soup_pot, +/obj/item/reagent_containers/cup/soup_pot, +/obj/item/kitchen/spoon/soup_ladle, +/obj/item/kitchen/spoon/soup_ladle, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"wn" = ( +/obj/machinery/camera/directional/east, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"wE" = ( +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/east_offset, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"wK" = ( +/obj/structure/chair/sofa/middle/brown{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"wM" = ( +/obj/structure/chair/sofa/left/brown{ + dir = 4 + }, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"wZ" = ( +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"xd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"xn" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"xu" = ( +/obj/structure/table/reinforced/rglass, +/obj/effect/spawner/random/entertainment/plushie, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"xH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/east_offset, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"xI" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/door/firedoor, +/obj/effect/spawner/random/food_or_drink/snack, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"xM" = ( +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"xN" = ( +/obj/structure/table/reinforced/rglass, +/obj/effect/spawner/random/food_or_drink/cake_ingredients, +/obj/item/reagent_containers/condiment/enzyme, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"yC" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"yO" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"za" = ( +/obj/structure/chair/sofa/right/brown{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"zl" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/bar, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"zr" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/fake_seafloor/heavy, +/area/station/service/theater) +"zx" = ( +/obj/structure/chair/sofa/right/brown{ + dir = 4 + }, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"zC" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"AF" = ( +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"AI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"AK" = ( +/obj/item/radio/intercom/directional/south, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"AN" = ( +/obj/machinery/restaurant_portal/restaurant, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"Bb" = ( +/obj/structure/table/reinforced/rglass, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"BE" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/toy/crayon/spraycan/mimecan, +/turf/open/floor/fake_seafloor/heavy, +/area/station/service/theater) +"BJ" = ( +/obj/structure/chair/sofa/middle/brown{ + dir = 8 + }, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"BO" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4 + }, +/obj/effect/mapping_helpers/mail_sorting/service/kitchen, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"Cp" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"Cr" = ( +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/theater) +"Cw" = ( +/obj/machinery/vending/autodrobe, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/theater) +"Dh" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"Du" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"DE" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"Ee" = ( +/obj/item/radio/intercom/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"Eq" = ( +/obj/structure/chair/sofa/left/brown{ + dir = 8 + }, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"EF" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"EI" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"ET" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/public/glass{ + name = "The Cantina" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"Fb" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/door/firedoor, +/obj/effect/spawner/random/food_or_drink/booze, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"Fn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/west_offset, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"FG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/table/reinforced/rglass, +/obj/effect/spawner/random/entertainment/musical_instrument, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/theater) +"Gm" = ( +/obj/structure/chair/sofa/right/brown{ + dir = 8 + }, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"Gq" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"Gx" = ( +/obj/structure/chair/sofa/right/brown{ + dir = 1 + }, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"GF" = ( +/obj/effect/landmark/navigate_destination/bar, +/obj/effect/area_lighting_helper/max_alpha_blue, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"GX" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/machinery/camera/directional/north, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"HW" = ( +/obj/structure/chair/stool/bar, +/obj/effect/landmark/start/hangover, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"Ib" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"Id" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/table/reinforced/rglass, +/obj/effect/spawner/random/entertainment/musical_instrument, +/turf/open/floor/fake_seafloor/heavy, +/area/station/service/theater) +"Ir" = ( +/obj/effect/landmark/start/hangover, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"IY" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/public/glass{ + name = "The Cantina" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"Jl" = ( +/obj/effect/landmark/start/hangover, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"Jy" = ( +/obj/structure/closet/crate/wooden/toy, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/theater) +"JI" = ( +/obj/machinery/atm, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"Kh" = ( +/obj/structure/table/reinforced/rglass, +/obj/effect/spawner/random/entertainment/money_small, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"Kt" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"KM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/theater) +"KU" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/lipstick/random{ + pixel_x = 2; + pixel_y = 2 + }, +/turf/open/floor/fake_seafloor/heavy, +/area/station/service/theater) +"KW" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"Le" = ( +/obj/structure/chair/stool, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"Lj" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/firealarm/directional/west, +/obj/structure/table/reinforced/rglass, +/obj/item/toy/crayon/spraycan/lubecan, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/theater) +"LK" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"Mz" = ( +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"ML" = ( +/obj/machinery/airalarm/directional/south, +/mob/living/carbon/human/species/monkey/punpun, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"MN" = ( +/obj/structure/chair/sofa/middle/brown, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"MX" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/door/firedoor, +/obj/effect/spawner/random/food_or_drink/snack/lizard, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"Nq" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"Nt" = ( +/obj/structure/ladder, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"NJ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"NN" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"NY" = ( +/obj/structure/chair/sofa/middle/brown{ + dir = 1 + }, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"Oj" = ( +/turf/open/floor/fake_seafloor/heavy, +/area/station/service/theater) +"Or" = ( +/obj/effect/mapping_helpers/airlock/access/all/service/theatre/east_offset, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/theater) +"Pc" = ( +/obj/structure/closet/secure_closet/freezer/cream_pie, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/theater) +"Pg" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" + }, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"Px" = ( +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"PH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"PN" = ( +/obj/machinery/airalarm/directional/south, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"QD" = ( +/obj/machinery/grill, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"QI" = ( +/obj/machinery/airalarm/directional/south, +/obj/structure/cable, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/theater) +"QJ" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"Rf" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"Rj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"Rp" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"Rt" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/food/baguette, +/turf/open/floor/fake_seafloor/heavy, +/area/station/service/theater) +"RC" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"SL" = ( +/obj/machinery/vending/autodrobe, +/turf/open/floor/fake_seafloor/heavy, +/area/station/service/theater) +"Ta" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/machinery/door/firedoor, +/obj/item/storage/fancy/donut_box, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"Tk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/cook, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"Ty" = ( +/obj/structure/table/reinforced/rglass, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/machinery/camera/directional/west, +/turf/open/floor/fake_seafloor/heavy, +/area/station/service/theater) +"TG" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/holosign_creator/robot_seat/restaurant, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"TJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/camera/directional/east, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"TZ" = ( +/obj/machinery/vending/boozeomat, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"Uk" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"Um" = ( +/turf/closed/wall, +/area/station/commons/lounge) +"UQ" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"Wg" = ( +/obj/effect/landmark/navigate_destination/kitchen, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"Wq" = ( +/obj/effect/area_lighting_helper/max_alpha_blue, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"Wu" = ( +/obj/effect/landmark/start/hangover, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/fake_seafloor, +/area/station/commons/lounge) +"XD" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/storage/dice, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"XN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"XX" = ( +/obj/structure/table/reinforced/rglass, +/obj/machinery/reagentgrinder{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_x = 6; + pixel_y = 5 + }, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"Yh" = ( +/obj/machinery/button/door/directional/south{ + id = "playerscantreadthis"; + name = "Kitchen Shutters Control" + }, +/obj/machinery/stove, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"Yl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) +"Yn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"Ys" = ( +/obj/structure/table/reinforced/rglass, +/obj/item/lipstick/random{ + pixel_x = -2; + pixel_y = -2 + }, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/theater) +"YG" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/fake_seafloor/spawning, +/area/station/commons/lounge) +"Zc" = ( +/obj/structure/table/reinforced/rglass, +/obj/effect/spawner/random/entertainment/toy, +/turf/open/floor/fake_seafloor/medium, +/area/station/commons/lounge) +"ZI" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"ZJ" = ( +/obj/structure/mirror/directional/west, +/obj/structure/table/reinforced/rglass, +/obj/item/flashlight/lamp/bananalamp{ + pixel_y = 3 + }, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/theater) +"ZK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/bartender, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/bar) +"ZQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/fake_seafloor/ironsand, +/area/station/service/kitchen) + +(1,1,1) = {" +aw +Le +aw +AF +pR +jg +mG +aq +pR +AF +Fn +pR +jg +sE +at +aq +pR +pR +pR +pR +pR +lL +lL +lL +lL +"} +(2,1,1) = {" +Le +xu +Le +AF +pR +MN +fE +NY +pR +AF +aw +pR +MN +mG +mG +NY +pR +aw +wM +rk +zx +lL +lL +lL +lL +"} +(3,1,1) = {" +AF +Le +aw +AF +pR +tV +mG +za +pR +AF +aw +pR +tV +mG +mG +za +pR +aw +mG +mG +xu +lL +lL +lL +lL +"} +(4,1,1) = {" +AF +kP +aw +AF +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +aw +mG +mG +mG +lL +lL +lL +lL +"} +(5,1,1) = {" +Le +XD +Le +AF +AF +AF +AF +AF +AF +AF +AF +AF +AF +AF +AF +AF +AF +aw +Gm +BJ +Eq +lL +lL +lL +lL +"} +(6,1,1) = {" +AF +Le +AF +AF +AF +Ir +AF +AF +AF +AF +AF +AF +Ir +AF +Cp +jT +Rp +AF +pR +pR +pR +lL +lL +lL +lL +"} +(7,1,1) = {" +AF +AF +AF +AF +AF +AF +AF +AF +AF +AF +AF +nM +AF +AF +AF +jT +AF +AF +AF +AF +AF +lL +lL +lL +lL +"} +(8,1,1) = {" +AF +Le +Le +AF +yC +zC +zC +zC +zC +zC +zC +zC +zC +zC +zC +Rj +Rj +Rj +Rj +Yn +jT +Um +lL +lL +lL +"} +(9,1,1) = {" +Le +mG +lR +Le +xd +LK +HW +LK +LK +LK +LK +HW +iE +LK +LK +LK +LK +om +AF +DE +Wu +Um +lL +lL +lL +"} +(10,1,1) = {" +Le +at +mG +Le +xd +Bb +ta +ta +ta +Fb +xI +au +mm +Fb +ta +xI +qB +ae +GX +wZ +Du +Um +Um +Um +Um +"} +(11,1,1) = {" +di +Le +Le +AF +xd +Fb +XN +pG +pG +pG +pG +GF +pG +pG +pG +pG +pG +ae +Px +DE +YG +AF +AF +AK +Um +"} +(12,1,1) = {" +pR +AF +AF +AF +xd +MX +PH +PH +eV +TZ +fM +oL +eW +iz +sh +pG +ML +ae +Px +DE +YG +AF +AF +AF +it +"} +(13,1,1) = {" +pR +pR +AF +AF +xd +ta +cS +PH +PH +TJ +AI +ZK +PH +PH +PH +PH +by +ae +xM +oq +re +zC +zC +zC +ET +"} +(14,1,1) = {" +pR +pR +pR +EF +Ee +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ZI +zl +Nq +Nq +Nq +AF +AF +PN +Um +"} +(15,1,1) = {" +pR +pR +lb +sI +xd +dr +Nt +sO +QD +Mz +tt +tt +cv +lZ +ls +ae +nN +ae +JI +Ir +Nq +AF +Wq +Jl +Um +"} +(16,1,1) = {" +pR +pR +pR +EF +BO +jZ +Uk +Yl +gG +ZQ +ZQ +qq +lZ +lZ +Yh +dr +dr +dr +de +AF +Nq +AF +AF +AF +it +"} +(17,1,1) = {" +pR +pR +AF +AF +NJ +dr +sr +lZ +lZ +bj +Tk +pI +gn +lZ +lZ +qO +yO +gy +AF +gE +Dh +Dh +Dh +NN +IY +"} +(18,1,1) = {" +pR +AF +AF +Ir +NJ +dr +Kt +lZ +Pg +bZ +XX +tT +xN +vV +nL +lZ +lZ +cW +AF +Ib +AF +AF +AF +AF +Um +"} +(19,1,1) = {" +aw +Le +Le +AF +vp +dr +QJ +lZ +lZ +lZ +lZ +Wg +lZ +lZ +lZ +lZ +lZ +cW +AF +Ib +AF +AF +AF +xM +Um +"} +(20,1,1) = {" +Le +mG +at +Le +NJ +dr +TG +cW +gZ +cW +mE +cY +Ta +cW +cW +gZ +cW +KW +AF +Ib +AF +Um +lL +lL +lL +"} +(21,1,1) = {" +Le +lR +mG +Le +NJ +AN +LK +LK +LK +LK +LK +LK +LK +LK +LK +LK +LK +LK +AF +Ib +AF +Um +lL +lL +lL +"} +(22,1,1) = {" +AF +Le +kP +AF +RC +AF +AF +AF +Ir +AF +AF +AF +AF +AF +AF +AF +AF +Gq +AF +Ib +AF +Um +lL +lL +lL +"} +(23,1,1) = {" +AF +AF +AF +AF +dQ +re +re +re +re +re +re +mh +re +re +re +re +re +re +re +qX +Ir +Um +lL +lL +lL +"} +(24,1,1) = {" +AF +Le +aw +AF +AF +AF +AF +AF +AF +AF +AF +RC +AF +AF +AF +AF +AF +nS +AF +AF +AF +Um +lL +lL +lL +"} +(25,1,1) = {" +Le +Zc +Le +AF +AF +AF +AF +AF +AF +AF +AF +RC +AF +AF +AF +AF +Ir +AF +AF +AF +AF +AF +pR +pR +pR +"} +(26,1,1) = {" +aw +Le +aw +AF +wn +AF +UQ +AF +AF +AF +qd +RC +AF +AF +AF +AF +AF +AF +AF +AF +AF +aw +wM +wK +zx +"} +(27,1,1) = {" +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +eF +RC +AF +AF +AF +AF +AF +AF +AF +AF +AF +aw +mG +mG +mG +"} +(28,1,1) = {" +hb +Rt +BE +KU +Ty +Id +Cw +Lj +ZJ +QI +eF +NJ +EI +jH +EI +EI +pR +jg +mG +aq +pR +aw +mG +Zc +mG +"} +(29,1,1) = {" +zr +Oj +Oj +Oj +Oj +Cr +Cr +KM +KM +eT +dA +xn +Le +XD +Le +EI +pR +MN +Kh +NY +pR +aw +Gm +cP +Eq +"} +(30,1,1) = {" +SL +bK +Oj +nl +Ys +Pc +gx +FG +Or +Jy +eF +Rf +aw +Le +aw +xH +pR +jw +mG +Gx +pR +wE +pR +pR +pR +"} diff --git a/monkestation/_maps/RandomBars/Tram/tram_rvb_bar.dmm b/monkestation/_maps/RandomBars/Tram/tram_rvb_bar.dmm new file mode 100644 index 000000000000..16b39375c74e --- /dev/null +++ b/monkestation/_maps/RandomBars/Tram/tram_rvb_bar.dmm @@ -0,0 +1,4157 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ax" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair/stool/bar/directional/south{ + color = "#0000FF"; + desc = "A metal bar stool. Someone has hastily spray-painted these chairs blue" + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"aG" = ( +/obj/machinery/vending/snack, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/lounge) +"aL" = ( +/obj/structure/sign/clock/directional/north, +/turf/open/openspace, +/area/station/commons/lounge) +"aR" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"bh" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/white/warning{ + dir = 8 + }, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron, +/area/station/commons/lounge) +"bo" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"bw" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/barricade/security, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"bS" = ( +/obj/effect/decal/cleanable/confetti, +/obj/structure/cable, +/turf/open/floor/iron/vaporwave, +/area/station/service/theater) +"bZ" = ( +/obj/structure/rack, +/obj/item/holosign_creator/robot_seat/restaurant, +/obj/item/book/manual/chef_recipes, +/obj/item/knife/kitchen, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) +"cu" = ( +/obj/structure/chair/sofa/right{ + color = "#3b88df"; + desc = "You sit in this. Either by will or force. It has been recently reupholstered with a fresh blue cloth."; + dir = 8; + name = "blue sofa" + }, +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"cy" = ( +/obj/machinery/vending/cola/red, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"cD" = ( +/obj/structure/chair/sofa/right{ + color = "#3b88df"; + desc = "You sit in this. Either by will or force. It has been recently reupholstered with a fresh blue cloth."; + dir = 4; + name = "blue sofa" + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"cG" = ( +/obj/effect/turf_decal/tile/dark/half, +/obj/effect/landmark/start/mime, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white/smooth_half, +/area/station/service/theater) +"cH" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/machinery/light/dim/directional/south, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/poster/official/random/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"cI" = ( +/obj/structure/chair/sofa/left{ + color = "#3b88df"; + desc = "You sit in this. Either by will or force. It has been recently reupholstered with a fresh blue cloth."; + dir = 8; + name = "blue sofa" + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"cZ" = ( +/turf/closed/wall, +/area/station/service/theater) +"dk" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 8 + }, +/obj/machinery/atm{ + pixel_x = 30; + pixel_y = 0 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"dn" = ( +/obj/effect/decal/cleanable/confetti, +/obj/structure/closet/secure_closet/freezer/cream_pie, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/vaporwave, +/area/station/service/theater) +"dp" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/obj/machinery/light/dim/directional/south, +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"dy" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"dS" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/iron, +/area/station/commons/lounge) +"dT" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"ep" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/effect/landmark/start/bartender, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/service/bar) +"eB" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Service - Bar Lounge South East" + }, +/obj/structure/cable, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) +"eF" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/turf/open/floor/iron, +/area/station/commons/lounge) +"eJ" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"eP" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"eW" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"eX" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"fl" = ( +/obj/effect/mapping_helpers/airlock/access/all/service/bar, +/obj/machinery/door/airlock{ + name = "Bar Storage" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/service/bar) +"fm" = ( +/obj/effect/decal/cleanable/confetti, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/bananalamp{ + pixel_y = 3 + }, +/turf/open/floor/iron/vaporwave, +/area/station/service/theater) +"fr" = ( +/obj/item/radio/intercom/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/white/smooth_edge{ + dir = 8 + }, +/area/station/service/theater) +"fG" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + location = "Bar"; + name = "navigation beacon (Bar Delivery)" + }, +/obj/machinery/door/window/right/directional/north{ + name = "Bar Delivery Chute" + }, +/obj/effect/turf_decal/trimline/yellow/warning, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/service/bar) +"fI" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/landmark/start/assistant, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"fR" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/lounge) +"fU" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/item/kirbyplants{ + icon_state = "plant-19" + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"fW" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + location = "Theatre"; + name = "navigation beacon (Theatre Delivery)" + }, +/obj/machinery/door/window/right/directional/south{ + name = "Theatre Delivery Chute"; + req_access = "theatre" + }, +/obj/effect/turf_decal/trimline/yellow/warning, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/service/theater) +"gb" = ( +/obj/effect/turf_decal/tile/dark{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/structure/sink/kitchen/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/station/service/bar) +"gh" = ( +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"gy" = ( +/obj/effect/mapping_helpers/airlock/access/all/service/bar, +/obj/machinery/door/airlock{ + name = "Bar Storage" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/service/bar) +"gN" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + location = "Kitchen"; + name = "navigation beacon (Kitchen Delivery)" + }, +/obj/machinery/door/window/right/directional/west{ + name = "Kitchen Delivery Chute"; + req_access = "kitchen" + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/commons/lounge) +"gX" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"hN" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/commons/lounge) +"hW" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/effect/spawner/random/entertainment/deck, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark, +/turf/open/floor/iron, +/area/station/commons/lounge) +"hZ" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 8 + }, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron, +/area/station/commons/lounge) +"ib" = ( +/obj/machinery/button/door/directional/south{ + id = "playerscantreadthis"; + name = "Kitchen Shutters Control" + }, +/obj/structure/table, +/obj/machinery/processor{ + pixel_y = 12 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Service - Bar Lounge South East" + }, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"ic" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"ij" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/service/bar) +"ip" = ( +/obj/structure/table/wood, +/obj/item/lipstick/random{ + pixel_x = 2; + pixel_y = 2 + }, +/turf/open/floor/iron/vaporwave, +/area/station/service/theater) +"iE" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/obj/effect/turf_decal/trimline/white/corner{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/lounge) +"js" = ( +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/obj/machinery/door/window/left/directional/north{ + name = "Dumbwaiter Safety Door" + }, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/structure/barricade/sandbags, +/turf/open/floor/iron, +/area/station/commons/lounge) +"jv" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/decal/cleanable/confetti, +/obj/structure/dresser, +/turf/open/floor/iron, +/area/station/service/theater) +"jG" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" + }, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) +"jP" = ( +/obj/machinery/grill, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) +"jW" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/service/kitchen) +"ke" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/lounge) +"kl" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/lounge) +"kq" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/iron, +/area/station/commons/lounge) +"kw" = ( +/obj/structure/closet/secure_closet/bar, +/obj/item/gun/ballistic/shotgun/doublebarrel, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/bar) +"ky" = ( +/obj/effect/turf_decal/tile/dark/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white/smooth_edge{ + dir = 4 + }, +/area/station/service/theater) +"kC" = ( +/obj/structure/table, +/obj/structure/table, +/obj/machinery/microwave, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"kM" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"kV" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light/dim/directional/west, +/obj/machinery/recharger, +/turf/open/floor/iron, +/area/station/commons/lounge) +"ln" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron, +/area/station/commons/lounge) +"lB" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"lZ" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/item/gun/ballistic/revolver/russian, +/turf/open/floor/iron, +/area/station/commons/lounge) +"mb" = ( +/obj/structure/chair/stool/bar/directional/south{ + color = "#0000FF"; + desc = "A metal bar stool. Someone has hastily spray-painted these chairs blue" + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/lounge) +"ml" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"mw" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/white/corner, +/turf/open/floor/iron, +/area/station/commons/lounge) +"mO" = ( +/obj/structure/table, +/obj/item/storage/bag/tray, +/obj/item/kitchen/rollingpin, +/obj/item/clothing/head/utility/chefhat{ + color = "#AF2020"; + name = "blood-red chef's hat" + }, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"mP" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/table/wood, +/obj/item/clothing/head/costume/irs, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/service/bar) +"mQ" = ( +/obj/machinery/vending/autodrobe, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron, +/area/station/service/theater) +"mS" = ( +/obj/machinery/duct, +/obj/effect/decal/cleanable/food/flour, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"mZ" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/lounge) +"nk" = ( +/obj/machinery/vending/donksofttoyvendor, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) +"no" = ( +/obj/structure/rack, +/obj/item/food/pie/cream, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/vaporwave, +/area/station/service/theater) +"nB" = ( +/obj/machinery/vending/wardrobe/bar_wardrobe, +/turf/open/floor/wood, +/area/station/service/bar) +"nR" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/kitchen/spoon{ + pixel_x = -2; + pixel_y = 7 + }, +/obj/item/kitchen/fork{ + pixel_x = -10; + pixel_y = 7 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/service/kitchen) +"nU" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"nY" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"ob" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Bar Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/plating, +/area/station/service/kitchen) +"oc" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) +"og" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/camera/directional/north{ + c_tag = "Civilian - Theatre Backstage" + }, +/obj/structure/closet/crate/wooden/toy, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/service/theater) +"op" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"os" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"ov" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/lounge) +"ox" = ( +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/turf/open/floor/iron/white/side, +/area/station/service/bar) +"oA" = ( +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/station/service/bar) +"oC" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/structure/chair/stool/bar/directional/south{ + color = "#0000FF"; + desc = "A metal bar stool. Someone has hastily spray-painted these chairs blue"; + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"oH" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/light/dim/directional/west, +/obj/machinery/duct, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"oJ" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/recharger, +/turf/open/floor/iron, +/area/station/commons/lounge) +"oO" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"pa" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron, +/area/station/commons/lounge) +"pb" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/effect/turf_decal/tile/dark/fourcorners, +/obj/structure/desk_bell{ + pixel_x = 7; + pixel_y = 12 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/service/bar) +"pp" = ( +/obj/effect/landmark/start/cook, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"pE" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"pJ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"pN" = ( +/obj/structure/closet/lasertag/blue, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/obj/machinery/camera/directional/east, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/iron, +/area/station/commons/lounge) +"pP" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron, +/area/station/commons/lounge) +"qf" = ( +/obj/structure/closet/lasertag/red, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron, +/area/station/commons/lounge) +"ql" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"qn" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark, +/turf/open/floor/iron, +/area/station/commons/lounge) +"qG" = ( +/obj/effect/turf_decal/tile/dark/half/contrasted{ + dir = 8 + }, +/obj/structure/table, +/obj/item/food/baguette, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/turf/open/floor/iron/white/smooth_edge{ + dir = 4 + }, +/area/station/service/theater) +"qW" = ( +/obj/structure/chair/sofa/left{ + color = "#3b88df"; + desc = "You sit in this. Either by will or force. It has been recently reupholstered with a fresh blue cloth."; + dir = 4; + name = "blue sofa" + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron, +/area/station/commons/lounge) +"rm" = ( +/obj/structure/closet/lasertag/red, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light/dim/directional/west, +/obj/structure/sign/poster/official/enlist{ + pixel_x = -32 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"ru" = ( +/obj/machinery/griddle, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"ry" = ( +/obj/effect/landmark/navigate_destination/kitchen, +/obj/effect/decal/cleanable/food/flour, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"rG" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/machinery/firealarm/directional/east, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/commons/lounge) +"rV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"sj" = ( +/turf/closed/wall, +/area/station/service/kitchen) +"sq" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"sC" = ( +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"sI" = ( +/obj/machinery/vending/cola/blue, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"sL" = ( +/obj/machinery/door/airlock/public/glass{ + name = "The Cantina" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/commons/lounge) +"sO" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/lounge) +"sP" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"tk" = ( +/obj/structure/table/wood, +/obj/structure/mirror/directional/south, +/obj/item/clothing/glasses/eyepatch, +/turf/open/floor/iron/vaporwave, +/area/station/service/theater) +"tn" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/door/firedoor, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/station/service/kitchen) +"tt" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"tw" = ( +/obj/machinery/restaurant_portal/bar, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/turf_decal/tile/dark{ + dir = 8 + }, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron, +/area/station/commons/lounge) +"tx" = ( +/obj/effect/turf_decal/tile/dark/half/contrasted{ + dir = 4 + }, +/obj/machinery/firealarm/directional/east, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron/white/smooth_edge{ + dir = 8 + }, +/area/station/service/theater) +"tG" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Service - Bar Lounge South East" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/service/bar) +"tL" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) +"tT" = ( +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/side, +/area/station/service/bar) +"uf" = ( +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/duct, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"ug" = ( +/obj/machinery/door/airlock/freezer, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) +"uu" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/machinery/light/dim/directional/south, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"uw" = ( +/obj/structure/musician/piano, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"uJ" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/turf/open/floor/iron, +/area/station/service/theater) +"uK" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/obj/machinery/vending/snack/blue, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"uP" = ( +/obj/structure/table, +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/item/food/piedough, +/obj/effect/spawner/random/food_or_drink/cake_ingredients, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"uQ" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/machinery/requests_console/directional/west{ + assistance_requestable = 1; + department = "Kitchen"; + name = "Kitchen Requests Console"; + supplies_requestable = 1 + }, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"uS" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/lounge) +"uX" = ( +/obj/structure/rack, +/obj/item/hand_labeler, +/obj/item/stack/package_wrap, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) +"vn" = ( +/obj/machinery/restaurant_portal/restaurant, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/camera/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/lounge) +"vp" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/lounge) +"vQ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"wx" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/iron, +/area/station/commons/lounge) +"wD" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/machinery/light/dim/directional/west, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white/corner, +/area/station/service/bar) +"wF" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/service/bar) +"wG" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/lounge) +"xb" = ( +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/structure/table/wood, +/obj/item/holosign_creator/robot_seat/bar, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/station/service/bar) +"xj" = ( +/obj/machinery/vending/donksofttoyvendor, +/obj/effect/turf_decal/tile/dark_blue/fourcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) +"xl" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"xC" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/lounge) +"xV" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"xX" = ( +/obj/machinery/stove, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"yb" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Theatre Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/commons/lounge) +"yi" = ( +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/duct, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/lounge) +"yu" = ( +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/landmark/navigate_destination/bar, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/side, +/area/station/service/bar) +"yz" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"yW" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"yY" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) +"zk" = ( +/turf/closed/mineral/random/stationside/asteroid/porus, +/area/station/asteroid) +"zm" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"zn" = ( +/obj/structure/reagent_dispensers/cooking_oil, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) +"zz" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron, +/area/station/commons/lounge) +"zD" = ( +/obj/effect/turf_decal/tile/dark{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/mob/living/carbon/human/species/monkey/punpun, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/station/service/bar) +"zF" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/obj/item/reagent_containers/condiment/rice, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) +"zQ" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/machinery/light/dim/directional/east, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/commons/lounge) +"At" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 8 + }, +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Av" = ( +/obj/effect/turf_decal/tile/dark/half, +/obj/structure/table, +/obj/item/lipstick/random{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/clothing/glasses/monocle, +/turf/open/floor/iron/white/smooth_half, +/area/station/service/theater) +"Ax" = ( +/obj/structure/closet/secure_closet/freezer/meat, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) +"Ay" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark{ + dir = 8 + }, +/obj/machinery/vending/boozeomat{ + pixel_y = -32 + }, +/obj/machinery/light/dim/directional/west, +/obj/structure/sign/poster/official/work_for_a_future{ + pixel_x = -31; + pixel_y = 4 + }, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/service/bar) +"AG" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/obj/machinery/light/dim/directional/east, +/obj/machinery/recharger, +/turf/open/floor/iron, +/area/station/commons/lounge) +"AR" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/service/bar) +"AX" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Bc" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/white/warning, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Bi" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) +"Bv" = ( +/obj/item/kirbyplants{ + icon_state = "plant-14" + }, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) +"By" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/item/storage/dice, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark, +/turf/open/floor/iron, +/area/station/commons/lounge) +"BV" = ( +/obj/effect/spawner/structure/window, +/turf/open/space/basic, +/area/station/commons/lounge) +"Cd" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Kitchen" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/machinery/duct, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"Co" = ( +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"CD" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"CP" = ( +/obj/machinery/door/window/left/directional/north{ + dir = 4; + name = "Dumbwaiter Safety Door" + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Di" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/turf/closed/wall, +/area/station/service/kitchen) +"Dn" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Dp" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Dr" = ( +/turf/closed/wall, +/area/station/service/bar) +"Dx" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"DB" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/machinery/light/small/directional/west, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) +"DK" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/lounge) +"DL" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"DT" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/service/kitchen) +"Eu" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/effect/turf_decal/tile/dark/fourcorners, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/service/bar) +"EN" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"EY" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Ft" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/machinery/light/dim/directional/east, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/station/service/bar) +"Fy" = ( +/obj/machinery/light/dim/directional/north, +/obj/structure/closet/secure_closet/freezer/cream_pie, +/turf/open/floor/iron/vaporwave, +/area/station/service/theater) +"FQ" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"FT" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Ga" = ( +/turf/open/floor/iron/vaporwave, +/area/station/service/theater) +"Gc" = ( +/obj/machinery/griddle, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"Gi" = ( +/obj/structure/chair/sofa/right{ + color = "#3b88df"; + desc = "You sit in this. Either by will or force. It has been recently reupholstered with a fresh blue cloth."; + dir = 8; + name = "blue sofa" + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Gs" = ( +/obj/structure/table/wood/fancy/red, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "playerscantreadthis"; + name = "Kitchen Counter Shutters" + }, +/obj/structure/desk_bell{ + pixel_w = 8; + pixel_x = 7 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/service/kitchen) +"GF" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/service/bar) +"GS" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/service/bar) +"GT" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/lounge) +"He" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Hj" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Hk" = ( +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/mail_sorting/service/theater, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 2 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Hm" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/service/bar) +"Hp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white/smooth_edge{ + dir = 4 + }, +/area/station/service/theater) +"Hw" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"HD" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"HR" = ( +/obj/structure/closet/lasertag/blue, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/obj/machinery/light/dim/directional/east, +/obj/structure/sign/poster/official/enlist{ + pixel_x = 32 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"HZ" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Ic" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/structure/barricade/sandbags, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Ii" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Io" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Ip" = ( +/obj/structure/closet/lasertag/blue, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Iq" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/station/commons/lounge) +"IB" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/duct, +/obj/machinery/camera/directional/north, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/commons/lounge) +"IC" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/lounge) +"IQ" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/duct, +/obj/machinery/atm{ + pixel_x = -30; + pixel_y = 0 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Jn" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/white/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Jp" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/machinery/chem_master/condimaster{ + desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; + name = "HoochMaster Deluxe" + }, +/turf/open/floor/iron, +/area/station/service/bar) +"Jt" = ( +/obj/effect/turf_decal/tile/dark/half/contrasted{ + dir = 4 + }, +/obj/structure/mirror/directional/north, +/obj/structure/table, +/obj/item/reagent_containers/cup/glass/bottle/bottleofnothing, +/turf/open/floor/iron/white/smooth_edge{ + dir = 8 + }, +/area/station/service/theater) +"Jv" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Jy" = ( +/obj/effect/decal/cleanable/confetti, +/obj/structure/chair/wood, +/obj/effect/landmark/start/clown, +/turf/open/floor/iron/vaporwave, +/area/station/service/theater) +"Jz" = ( +/obj/structure/chair/stool/bar/directional/south{ + color = "#0000FF"; + desc = "A metal bar stool. Someone has hastily spray-painted these chairs blue" + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"JQ" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Ka" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Kh" = ( +/obj/structure/chair/sofa/right{ + color = "#3b88df"; + desc = "You sit in this. Either by will or force. It has been recently reupholstered with a fresh blue cloth."; + dir = 4; + name = "blue sofa" + }, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Km" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) +"Kt" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4; + invisibility = 101 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"KA" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/white/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"KY" = ( +/obj/structure/chair/sofa/left{ + color = "#3b88df"; + desc = "You sit in this. Either by will or force. It has been recently reupholstered with a fresh blue cloth."; + dir = 4; + name = "blue sofa" + }, +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark, +/obj/machinery/camera/directional/north, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Lg" = ( +/obj/machinery/deepfryer, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"LC" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/turf_decal/tile/dark{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"LS" = ( +/obj/effect/turf_decal/tile/dark{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/station/service/bar) +"LW" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark, +/obj/machinery/light/dim/directional/north, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Mb" = ( +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/white/warning{ + dir = 1 + }, +/obj/machinery/light/dim/directional/north, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Mr" = ( +/obj/machinery/barsign/directional/south{ + icon_state = "theouterspess" + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"ME" = ( +/obj/machinery/elevator_control_panel/directional/north{ + desc = "A small control panel used to move the kitchen dumbwaiter up and down."; + linked_elevator_id = "dumbwaiter_lift"; + name = "Dumbwaiter Control Panel"; + preset_destination_names = list("2"="Hydroponics","3"="Kitchen") + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark, +/turf/open/floor/iron, +/area/station/commons/lounge) +"MO" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/effect/spawner/random/entertainment/deck, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Nn" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/machinery/light/dim/directional/north, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/commons/lounge) +"NE" = ( +/obj/structure/chair/stool/bar/directional/south{ + color = "#0000FF"; + desc = "A metal bar stool. Someone has hastily spray-painted these chairs blue" + }, +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"NM" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_x = -5; + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/station/service/bar) +"NT" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/light/dim/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/commons/lounge) +"NV" = ( +/obj/machinery/vending/dinnerware, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"NZ" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) +"Om" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Or" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/effect/turf_decal/tile/dark/fourcorners, +/obj/effect/spawner/random/entertainment/lighter, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/service/bar) +"Oz" = ( +/obj/machinery/door/airlock/public/glass{ + name = "The Cantina" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/lounge) +"OG" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/effect/turf_decal/tile/dark/fourcorners, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/service/bar) +"OK" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/service/bar) +"OX" = ( +/obj/structure/reagent_dispensers/beerkeg, +/obj/machinery/light/dim/directional/west, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/station/service/bar) +"Pb" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Pg" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/structure/barricade/security, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"PI" = ( +/obj/effect/decal/cleanable/confetti, +/turf/closed/wall, +/area/station/commons/lounge) +"PT" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"PV" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Qo" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"QA" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) +"QC" = ( +/turf/template_noop, +/area/template_noop) +"QR" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Rc" = ( +/obj/machinery/deepfryer, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"Rf" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/structure/barricade/sandbags, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Ru" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/commons/lounge) +"RC" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/lounge) +"RP" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) +"RY" = ( +/obj/effect/turf_decal/tile/dark/half, +/obj/machinery/light/dim/directional/north, +/obj/structure/rack, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/white/smooth_half, +/area/station/service/theater) +"Sc" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Sd" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Sj" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Sm" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Su" = ( +/obj/machinery/door/airlock{ + name = "Theatre Backstage" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 2 + }, +/turf/open/floor/iron, +/area/station/service/theater) +"SJ" = ( +/obj/effect/turf_decal/tile/dark{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/service/bar) +"Tb" = ( +/obj/structure/chair/sofa/left{ + color = "#3b88df"; + desc = "You sit in this. Either by will or force. It has been recently reupholstered with a fresh blue cloth."; + dir = 8; + name = "blue sofa" + }, +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Td" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/structure/chair/stool/bar/directional/south{ + color = "#0000FF"; + desc = "A metal bar stool. Someone has hastily spray-painted these chairs blue"; + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Tj" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Tu" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Tv" = ( +/obj/effect/decal/cleanable/food/flour, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"Tz" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/lounge) +"TH" = ( +/turf/closed/wall, +/area/station/commons/lounge) +"TI" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/mail_sorting/service/kitchen, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"TL" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/obj/machinery/camera/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"TS" = ( +/obj/structure/closet/lasertag/red, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/camera/directional/west, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Ub" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/structure/barricade/security, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Ue" = ( +/turf/open/misc/asteroid, +/area/station/asteroid) +"Uk" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Ul" = ( +/obj/structure/table, +/obj/item/reagent_containers/condiment/enzyme, +/obj/item/reagent_containers/cup/soup_pot, +/obj/item/kitchen/spoon/soup_ladle, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"Ux" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/chair/stool/bar/directional/south{ + color = "#0000FF"; + desc = "A metal bar stool. Someone has hastily spray-painted these chairs blue"; + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Uz" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/firealarm/directional/west, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/lounge) +"UQ" = ( +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/lounge) +"UU" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/white/warning{ + dir = 4 + }, +/obj/machinery/light/dim/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/lounge) +"UW" = ( +/obj/machinery/door/window/left/directional/north{ + dir = 8; + name = "Dumbwaiter Safety Door" + }, +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Vb" = ( +/obj/effect/turf_decal/tile/dark_blue/anticorner/contrasted, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Vg" = ( +/obj/structure/sink/kitchen/directional/east, +/obj/machinery/duct, +/obj/effect/decal/cleanable/food/egg_smudge, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"Vw" = ( +/obj/machinery/door/airlock/public/glass{ + name = "The Cantina" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Vy" = ( +/obj/effect/turf_decal/tile/dark{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/machinery/camera/directional/south{ + c_tag = "Service - Bar Lounge South East" + }, +/obj/machinery/firealarm/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/station/service/bar) +"VL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"VP" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/duct, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/lounge) +"VT" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Bar Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/machinery/duct, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/commons/lounge) +"Wb" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Wm" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/turf_decal/tile/dark{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Ww" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/service/bar) +"WK" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/structure/barricade/sandbags, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/lounge) +"WV" = ( +/obj/effect/turf_decal/tile/dark_blue, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 1 + }, +/obj/structure/chair/stool/bar/directional/south{ + color = "#0000FF"; + desc = "A metal bar stool. Someone has hastily spray-painted these chairs blue"; + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/lounge) +"XM" = ( +/obj/machinery/oven, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"XP" = ( +/obj/effect/landmark/start/cook, +/obj/effect/decal/cleanable/food/flour, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) +"Yg" = ( +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/lounge) +"Yq" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/lounge) +"YD" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/theater) +"Ze" = ( +/obj/effect/turf_decal/tile/dark_blue/opposingcorners, +/obj/effect/turf_decal/tile/dark/opposingcorners{ + dir = 1 + }, +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/bar) +"Zo" = ( +/obj/effect/turf_decal/tile/dark/opposingcorners, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/service/theater) +"Zu" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/service/theater) +"ZG" = ( +/obj/effect/turf_decal/tile/dark_blue/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark_blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"ZI" = ( +/obj/structure/chair/stool/bar/directional/west, +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/lounge) + +(1,1,1) = {" +zk +zk +zk +zk +Ue +Ue +Ue +Ue +Ue +Ue +Ue +Ue +Ue +Ue +sj +sj +sj +sj +sj +sj +QC +QC +QC +QC +QC +"} +(2,1,1) = {" +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +Ue +Ue +Ue +sj +zF +DB +jP +zn +sj +QC +QC +QC +QC +QC +"} +(3,1,1) = {" +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +Ue +Ue +Ue +ob +yY +yY +yY +tL +sj +QC +QC +QC +QC +QC +"} +(4,1,1) = {" +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +Ue +Ue +sj +sj +QA +Ax +Ax +eB +sj +sj +QC +QC +QC +QC +"} +(5,1,1) = {" +zk +zk +zk +zk +zk +zk +zk +zk +Ue +Ue +Ue +Ue +Ue +sj +Km +Bi +uX +bZ +NZ +jG +sj +QC +QC +QC +QC +"} +(6,1,1) = {" +zk +zk +zk +zk +zk +zk +zk +zk +Ue +Ue +Ue +Ue +Ue +sj +sj +ug +sj +sj +sj +sj +sj +QC +QC +QC +QC +"} +(7,1,1) = {" +zk +zk +zk +zk +zk +zk +zk +zk +Ue +Ue +Ue +Ue +Ue +sj +uQ +vQ +ru +Gc +Vg +Lg +sj +QC +QC +QC +QC +"} +(8,1,1) = {" +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +TH +VT +sj +kC +vQ +ry +VL +pp +Rc +sj +sj +QC +QC +QC +"} +(9,1,1) = {" +zk +zk +TH +TH +TH +TH +TH +TH +TH +TH +TH +TH +mZ +sj +Ul +XP +uP +XM +mS +pJ +NV +sj +QC +QC +QC +"} +(10,1,1) = {" +zk +TH +TH +dS +FQ +TS +rm +qf +FQ +GT +Uz +TH +IB +Di +rV +CD +mO +xX +Co +ib +sj +sj +TH +TH +TH +"} +(11,1,1) = {" +zk +TH +NT +eX +eW +ln +eW +eW +eW +eW +PT +kV +mZ +tn +Tv +ql +eP +eP +gh +gh +Cd +VP +IQ +aG +BV +"} +(12,1,1) = {" +zk +TH +Ru +vp +uS +Ka +uS +ke +Ka +Ka +Ka +Wb +mZ +DT +DT +jW +DT +nR +Gs +DT +sj +vn +Kt +Bv +BV +"} +(13,1,1) = {" +TH +TH +pa +HZ +bw +zm +zm +zm +Ub +nY +EN +cy +xl +Yg +ZI +uf +yi +ZI +ZI +ZI +oH +IC +TI +DK +Vw +"} +(14,1,1) = {" +TH +nk +CP +PV +pE +mw +UU +Jn +pE +pE +pE +oJ +QR +wG +wG +oO +wG +RC +wG +Tz +nU +wG +kl +Uk +sL +"} +(15,1,1) = {" +TH +TH +aL +js +Ic +Bc +TH +Mb +Ic +WK +yW +Iq +Qo +sP +DL +pP +yW +sO +yW +yW +pP +lB +kM +ic +BV +"} +(16,1,1) = {" +TH +xj +UW +qn +fR +KA +bh +iE +qn +qn +qn +eF +aR +tt +Sm +sq +Sm +sq +Sm +HD +JQ +sq +Dn +Wm +sL +"} +(17,1,1) = {" +TH +TH +ME +gX +Pg +Rf +Rf +Rf +Pg +gX +Pb +sI +eJ +uw +wx +Dp +Tu +xC +UQ +xC +UQ +xC +ov +EY +Oz +"} +(18,1,1) = {" +zk +TH +Hj +yz +yz +yz +yz +Yq +yz +yz +dT +Tj +eJ +Td +os +Hk +TL +LC +Ux +oC +WV +dk +FT +fU +BV +"} +(19,1,1) = {" +zk +TH +zQ +AX +Sj +zz +dy +Pb +Pb +Pb +sC +AG +ZG +kq +Sc +cH +TH +hZ +Jv +At +dp +TH +Nn +uK +BV +"} +(20,1,1) = {" +zk +TH +TH +Dx +Om +Ip +HR +pN +Om +Om +Vb +PI +rG +Hw +fI +xV +Dr +Dr +AR +AR +Dr +Dr +TH +TH +TH +"} +(21,1,1) = {" +Ue +Ue +TH +gN +TH +TH +TH +cZ +Zu +Zu +Zu +cZ +TH +tw +He +mb +Or +wD +mP +SJ +Ay +Dr +QC +QC +QC +"} +(22,1,1) = {" +Ue +Ue +Ue +Ue +Ue +Ue +Ue +cZ +dn +Ga +tk +cZ +KY +cD +oc +Jz +OG +tT +ep +GS +Vy +Dr +QC +QC +QC +"} +(23,1,1) = {" +Ue +Ue +Ue +Ue +Ue +Ue +Ue +cZ +Fy +Jy +fm +Zu +By +MO +ml +ax +pb +yu +NM +wF +gb +Dr +QC +QC +QC +"} +(24,1,1) = {" +zk +zk +zk +zk +zk +Ue +Ue +cZ +no +bS +ip +Zu +Gi +Tb +RP +ax +OG +tT +Jp +Ze +LS +Dr +QC +QC +QC +"} +(25,1,1) = {" +zk +zk +zk +zk +zk +Ue +Ue +cZ +jv +YD +mQ +cZ +LW +bo +oc +ax +OG +ox +Ww +GF +zD +Dr +zk +zk +zk +"} +(26,1,1) = {" +zk +zk +zk +zk +zk +Ue +Ue +cZ +og +Zo +uJ +Su +Sd +Io +op +NE +Eu +Ft +xb +oA +OK +fG +zk +zk +zk +"} +(27,1,1) = {" +zk +zk +zk +zk +zk +Ue +Ue +fW +ky +Hp +qG +cZ +qW +Kh +oc +Mr +Dr +Dr +Dr +fl +Dr +Dr +zk +zk +zk +"} +(28,1,1) = {" +zk +zk +zk +zk +zk +Ue +Ue +cZ +RY +cG +Av +Zu +hW +lZ +hN +uu +Dr +OX +kw +ij +nB +Dr +zk +zk +zk +"} +(29,1,1) = {" +zk +zk +zk +zk +zk +Ue +Ue +cZ +Jt +fr +tx +Zu +cu +cI +Om +Ii +gy +Hm +Hm +tG +Dr +Dr +zk +zk +zk +"} +(30,1,1) = {" +zk +zk +zk +zk +zk +Ue +Ue +cZ +cZ +cZ +cZ +cZ +TH +TH +TH +yb +Dr +Dr +Dr +Dr +Dr +zk +zk +zk +zk +"} diff --git a/monkestation/_maps/RandomBars/Tram/tram_slum_bar.dmm b/monkestation/_maps/RandomBars/Tram/tram_slum_bar.dmm new file mode 100644 index 000000000000..be30d1525c04 --- /dev/null +++ b/monkestation/_maps/RandomBars/Tram/tram_slum_bar.dmm @@ -0,0 +1,2154 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"au" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Kitchen Delivery Chute"; + req_access = "kitchen" + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + location = "Kitchen"; + name = "navigation beacon (Kitchen Delivery)" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/cargo) +"ay" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/stone, +/area/station/commons/lounge) +"aL" = ( +/turf/open/openspace, +/area/station/service/kitchen) +"bx" = ( +/obj/structure/table, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"bD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"cl" = ( +/obj/structure/cable, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"cy" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"cN" = ( +/obj/machinery/restaurant_portal/restaurant, +/turf/open/floor/stone, +/area/station/commons/lounge) +"de" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/stone, +/area/station/commons/lounge) +"df" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall/mineral/iron, +/area/station/commons/lounge) +"dw" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/stone, +/area/station/commons/lounge) +"dN" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/stone, +/area/station/commons/lounge) +"dR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/clown, +/obj/structure/chair/wood/wings{ + dir = 4 + }, +/obj/effect/decal/cleanable/food/pie_smudge, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"dV" = ( +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/stone, +/area/station/commons/lounge) +"ec" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"ei" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"eL" = ( +/obj/structure/table/wood, +/obj/item/food/pie/cream, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"eW" = ( +/turf/closed/wall/mineral/iron, +/area/station/service/kitchen) +"fB" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "drawbridge"; + color = "#5c4300" + }, +/turf/open/floor/iron/stairs/old, +/area/station/commons/lounge) +"fL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"fR" = ( +/obj/effect/landmark/start/mime, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"fU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/wood, +/obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"gd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"gj" = ( +/obj/structure/table/wood, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/stone, +/area/station/commons/lounge) +"gT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"hb" = ( +/obj/machinery/light/dim/directional/west, +/turf/open/misc/dirt{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/station/commons/lounge) +"he" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"hG" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/stone, +/area/station/commons/lounge) +"hL" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood, +/obj/item/fireaxe/boneaxe, +/obj/item/food/pie/cream{ + pixel_x = -8; + pixel_y = 3 + }, +/obj/item/food/pie/cream{ + pixel_y = 2 + }, +/obj/item/food/pie/cream{ + pixel_x = 10; + pixel_y = 3 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"hN" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/stone, +/area/station/commons/lounge) +"hR" = ( +/obj/structure/chair/greyscale{ + dir = 1 + }, +/turf/open/floor/stone, +/area/station/commons/lounge) +"ii" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"iv" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/obj/structure/chair/sofa/left/maroon{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"iF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/stone, +/area/station/commons/lounge) +"iM" = ( +/obj/structure/table/wood, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "grungekitchen"; + name = "Kitchen Counter Shutters"; + dir = 8 + }, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"iQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/stone, +/area/station/commons/lounge) +"iY" = ( +/turf/open/floor/stone, +/area/station/commons/lounge) +"jh" = ( +/turf/closed/wall/mineral/iron, +/area/station/maintenance/department/security) +"jo" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"js" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Dumbwaiter Safety Door" + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/obj/machinery/button/door/directional/west{ + id = "grungekitchen" + }, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"jZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/chem_master/condimaster{ + desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; + name = "HoochMaster Deluxe" + }, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"ki" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"kv" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/service/bar, +/obj/machinery/door/airlock/wood, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"kI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/holosign_creator/robot_seat/restaurant, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"ln" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/crate_loot, +/turf/open/floor/stone, +/area/station/commons/lounge) +"lG" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/musician/piano, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"lI" = ( +/obj/item/reagent_containers/cup/glass/bottle/hooch, +/turf/open/floor/stone, +/area/station/commons/lounge) +"mh" = ( +/obj/structure/table/wood, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"mm" = ( +/obj/structure/cable, +/obj/structure/chair/sofa/right/maroon{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"mD" = ( +/turf/closed/wall/mineral/iron, +/area/station/service/bar/atrium) +"mE" = ( +/turf/open/floor/wood/tile, +/area/station/service/theater) +"mW" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"mZ" = ( +/obj/machinery/button/door/directional/east{ + id = "drawbridge" + }, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"nd" = ( +/obj/effect/landmark/start/hangover, +/obj/structure/cable, +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/stone, +/area/station/commons/lounge) +"nk" = ( +/turf/closed/wall/mineral/iron, +/area/station/commons/lounge) +"nm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"nq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash, +/turf/open/floor/stone, +/area/station/commons/lounge) +"nr" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"nw" = ( +/obj/structure/cable, +/obj/structure/chair/sofa/middle/maroon{ + dir = 8 + }, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"nD" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "grungebar"; + name = "Kitchen Counter Shutters"; + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"nM" = ( +/obj/machinery/vending/autodrobe, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"nT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"nW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/bar, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"nY" = ( +/obj/structure/closet/crate/wooden/toy, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"oi" = ( +/obj/machinery/oven, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"oj" = ( +/obj/machinery/holopad, +/obj/effect/landmark/navigate_destination/kitchen, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"oA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/cook, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"oB" = ( +/obj/effect/landmark/start/hangover, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"oF" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/stone, +/area/station/service/theater) +"oV" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"oW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/stool/directional/east, +/turf/open/floor/stone, +/area/station/commons/lounge) +"pR" = ( +/obj/effect/landmark/start/mime, +/obj/structure/chair/wood/wings{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"pV" = ( +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"qi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/trash, +/turf/open/floor/stone, +/area/station/commons/lounge) +"qS" = ( +/obj/structure/table/wood/poker, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"qT" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"rf" = ( +/obj/structure/bonfire/prelit, +/turf/open/floor/stone, +/area/station/commons/lounge) +"rm" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Bar Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/department/security) +"rQ" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/stone, +/area/station/service/theater) +"sd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"sk" = ( +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/machinery/door/airlock/wood, +/obj/effect/turf_decal/weather/dirt, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"sI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood, +/obj/item/food/baguette, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"ui" = ( +/turf/open/chasm{ + icon_state = "moon_shaft"; + icon = 'goon/icons/turf/floors.dmi'; + dir = 4 + }, +/area/station/service/theater) +"uw" = ( +/obj/structure/cable, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"uB" = ( +/obj/machinery/deepfryer, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"uL" = ( +/turf/closed/wall/mineral/iron, +/area/station/maintenance/department/cargo) +"uS" = ( +/obj/effect/landmark/start/clown, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"vb" = ( +/obj/effect/landmark/start/hangover, +/turf/open/misc/dirt{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/station/commons/lounge) +"vA" = ( +/obj/structure/chair/stool/directional/east, +/turf/open/floor/stone, +/area/station/commons/lounge) +"vS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/stone, +/area/station/commons/lounge) +"wg" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/turf/open/floor/stone, +/area/station/commons/lounge) +"wq" = ( +/obj/machinery/stove, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"wG" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/machinery/door/airlock/wood, +/obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"xh" = ( +/obj/machinery/light/dim/directional/east, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"xr" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/stone, +/area/station/service/theater) +"xw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/dresser, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"xJ" = ( +/obj/structure/cable, +/obj/structure/chair/sofa/middle/maroon{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"xK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"xX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood, +/turf/open/floor/stone, +/area/station/commons/lounge) +"yu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"yE" = ( +/obj/structure/table, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/item/book/manual/chef_recipes, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"yH" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"yM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/stone, +/area/station/commons/lounge) +"yP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"yT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"zk" = ( +/turf/closed/mineral/random/stationside/asteroid/porus, +/area/station/asteroid) +"zl" = ( +/obj/machinery/door/window/right/directional/north{ + name = "Bar Delivery Chute" + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + location = "Bar"; + name = "navigation beacon (Bar Delivery)" + }, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/cargo) +"zn" = ( +/obj/machinery/vending/dinnerware, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"zw" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Theatre Maintenance Hatch" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/department/cargo) +"AA" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"AE" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "drawbridge"; + color = "#5c4300" + }, +/turf/open/floor/iron/stairs/old, +/area/station/commons/lounge) +"AL" = ( +/obj/machinery/computer/slot_machine, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/stone, +/area/station/commons/lounge) +"AU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"BI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/boozeomat, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"BQ" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/stone, +/area/station/commons/lounge) +"Cj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/ladder, +/mob/living/carbon/human/species/monkey/punpun, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"Cn" = ( +/obj/machinery/button/door/directional/west{ + id = "grungebar" + }, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"Co" = ( +/turf/open/misc/dirt{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/station/commons/lounge) +"Cs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"Cz" = ( +/obj/structure/table/wood, +/obj/item/instrument/violin, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"Di" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood, +/obj/item/lipstick/random{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"Dr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"DJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/freezer/cream_pie, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"Eu" = ( +/obj/effect/landmark/start/assistant, +/turf/open/misc/dirt{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/station/commons/lounge) +"EE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/stove, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"ER" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/stone, +/area/station/commons/lounge) +"ES" = ( +/obj/structure/table/wood/poker, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"EX" = ( +/obj/machinery/grill, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"Fv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"FA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"FS" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/stone, +/area/station/commons/lounge) +"GC" = ( +/obj/effect/spawner/random/structure/crate_loot, +/turf/open/floor/stone, +/area/station/commons/lounge) +"GF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/stool/directional/east, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/stone, +/area/station/commons/lounge) +"GL" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/weather/dirt{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "grungebar"; + name = "Kitchen Counter Shutters"; + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"GW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/trashcart/filled, +/obj/item/switchblade, +/turf/open/floor/stone, +/area/station/commons/lounge) +"Hg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/reagent_containers/condiment/enzyme, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"Hh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"Hw" = ( +/obj/structure/ladder, +/obj/machinery/light/dim/directional/west, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"HP" = ( +/obj/structure/table/wood, +/obj/structure/mirror/directional/west, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"HQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/greyscale{ + dir = 8; + pixel_x = 4 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/stone, +/area/station/commons/lounge) +"Ik" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/stone, +/area/station/commons/lounge) +"Il" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/turf/open/floor/stone, +/area/station/commons/lounge) +"Jk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"Jn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/bartender, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"Jx" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood, +/obj/item/melee/cleric_mace, +/obj/item/food/pie/cream, +/obj/item/food/pie/cream{ + pixel_x = -9; + pixel_y = -10 + }, +/obj/item/food/pie/cream{ + pixel_x = 8; + pixel_y = 10 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"JO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"Kc" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"Kk" = ( +/obj/machinery/door/window/right/directional/south{ + name = "Theatre Delivery Chute"; + req_access = "theatre" + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=2"; + location = "Theatre"; + name = "navigation beacon (Theatre Delivery)" + }, +/obj/effect/turf_decal/loading_area, +/turf/open/floor/plating, +/area/station/maintenance/department/cargo) +"Kl" = ( +/obj/structure/table, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"Ks" = ( +/obj/structure/chair/greyscale, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/stone, +/area/station/commons/lounge) +"Kt" = ( +/obj/structure/railing, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/stone, +/area/station/service/theater) +"Lf" = ( +/turf/open/chasm{ + icon_state = "moon_shaft"; + icon = 'goon/icons/turf/floors.dmi'; + dir = 1 + }, +/area/station/service/theater) +"Lk" = ( +/obj/machinery/computer/slot_machine, +/turf/open/floor/stone, +/area/station/commons/lounge) +"Lm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/stone, +/area/station/commons/lounge) +"Lx" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"Mc" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/machinery/door/airlock/wood/glass, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"Md" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/stone, +/area/station/commons/lounge) +"ME" = ( +/obj/machinery/elevator_control_panel/directional/north{ + desc = "A small control panel used to move the kitchen dumbwaiter up and down."; + linked_elevator_id = "dumbwaiter_lift"; + name = "Dumbwaiter Control Panel"; + preset_destination_names = list("2"="Hydroponics","3"="Kitchen") + }, +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"MN" = ( +/turf/closed/wall/mineral/iron, +/area/station/service/theater) +"Ne" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"Nk" = ( +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"NB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/north, +/obj/structure/table/wood, +/turf/open/floor/stone, +/area/station/commons/lounge) +"NQ" = ( +/obj/effect/spawner/random/trash, +/turf/open/floor/stone, +/area/station/commons/lounge) +"NR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/bed/maint{ + pixel_x = 2 + }, +/obj/effect/mob_spawn/corpse/human/assistant, +/turf/open/floor/stone, +/area/station/commons/lounge) +"Or" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall/mineral/iron, +/area/station/commons/lounge) +"Os" = ( +/obj/structure/cable, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"Pe" = ( +/obj/machinery/vending/sustenance, +/turf/open/floor/stone, +/area/station/commons/lounge) +"Pg" = ( +/obj/structure/table/wood, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"Pl" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/stone, +/area/station/service/theater) +"Pp" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/stone, +/area/station/service/theater) +"Pt" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/button/door/directional/east{ + id = "drawbridge" + }, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"QC" = ( +/turf/template_noop, +/area/template_noop) +"QD" = ( +/obj/structure/sink/kitchen/directional/south, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"QQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"QS" = ( +/obj/machinery/restaurant_portal/bar, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/stone, +/area/station/commons/lounge) +"QV" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"RI" = ( +/obj/structure/closet/secure_closet/freezer/cream_pie, +/obj/machinery/light/directional/west, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"RK" = ( +/obj/machinery/light/dim/directional/north, +/turf/open/misc/dirt{ + initial_gas_mix = "o2=22;n2=82;TEMP=293.15" + }, +/area/station/commons/lounge) +"RT" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"RU" = ( +/obj/structure/bed/maint, +/obj/effect/landmark/start/assistant, +/turf/open/floor/stone, +/area/station/commons/lounge) +"RY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"So" = ( +/obj/structure/table, +/obj/machinery/processor{ + pixel_y = 9 + }, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"SI" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "grungebar"; + name = "Kitchen Counter Shutters"; + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"SJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"SN" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"SP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/stone, +/area/station/commons/lounge) +"Tj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"Ts" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"Tz" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 6 + }, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"TX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/cook, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"Ud" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/turf/open/floor/stone, +/area/station/commons/lounge) +"Ue" = ( +/turf/open/misc/asteroid, +/area/station/asteroid) +"UG" = ( +/obj/structure/table/wood, +/obj/structure/cable, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "grungekitchen"; + name = "Kitchen Counter Shutters"; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/diagonal, +/area/station/service/kitchen) +"Vi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"Vn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/stone, +/area/station/commons/lounge) +"VC" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/stone, +/area/station/commons/lounge) +"VF" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/table/wood, +/obj/structure/cable, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"VK" = ( +/obj/structure/table/wood, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/reagentgrinder{ + pixel_x = -6; + pixel_y = 5 + }, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"Wq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/stone, +/area/station/commons/lounge) +"WN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/hangover, +/turf/open/floor/stone, +/area/station/commons/lounge) +"WV" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/turf/open/floor/stone, +/area/station/commons/lounge) +"WW" = ( +/obj/machinery/button/door/directional/east{ + id = "grungebar" + }, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"WY" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/weather/dirt{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "grungebar"; + name = "Kitchen Counter Shutters"; + dir = 4 + }, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"XE" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"Yp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/wood/tile, +/area/station/service/bar/atrium) +"Yt" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/stone, +/area/station/commons/lounge) +"YK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/tracks{ + dir = 5 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"Zk" = ( +/obj/structure/table/wood, +/turf/open/floor/stone, +/area/station/commons/lounge) +"Zr" = ( +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood/tile, +/area/station/service/theater) +"ZG" = ( +/obj/structure/table/wood, +/obj/item/lipstick/random{ + pixel_x = -2; + pixel_y = -2 + }, +/turf/open/floor/wood/tile, +/area/station/service/theater) + +(1,1,1) = {" +zk +zk +zk +zk +Ue +Ue +Ue +Ue +Ue +Ue +Ue +Ue +Ue +Ue +jh +jh +jh +nk +nk +nk +QC +QC +QC +QC +QC +"} +(2,1,1) = {" +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +Ue +Ue +Ue +jh +qi +iF +GW +rf +nk +QC +QC +QC +QC +QC +"} +(3,1,1) = {" +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +Ue +Ue +Ue +jh +iY +dN +nq +HQ +nk +QC +QC +QC +QC +QC +"} +(4,1,1) = {" +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +Ue +Ue +jh +jh +nq +df +nk +df +nk +nk +QC +QC +QC +QC +"} +(5,1,1) = {" +zk +zk +zk +zk +zk +zk +zk +zk +Ue +Ue +Ue +Ue +Ue +jh +GC +NQ +qi +dN +WN +RU +nk +QC +QC +QC +QC +"} +(6,1,1) = {" +zk +zk +zk +zk +zk +zk +zk +zk +Ue +Ue +Ue +Ue +Ue +jh +qi +iY +Ik +NQ +lI +Ud +nk +QC +QC +QC +QC +"} +(7,1,1) = {" +zk +zk +zk +zk +zk +zk +zk +zk +Ue +Ue +Ue +Ue +Ue +jh +dN +iY +Or +df +df +nk +nk +nk +QC +QC +QC +"} +(8,1,1) = {" +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +zk +jh +rm +jh +qi +NQ +dN +Lk +AL +Lk +ln +nk +QC +QC +QC +"} +(9,1,1) = {" +zk +zk +nk +nk +nk +nk +nk +nk +nk +nk +nk +nk +BQ +nk +iY +dN +iY +qi +iY +NQ +NR +nk +QC +QC +QC +"} +(10,1,1) = {" +zk +nk +nk +Zk +xX +hR +dw +Il +Ks +yM +gj +QS +hN +nk +wg +wg +nk +nk +nk +nk +nk +nk +nk +nk +nk +"} +(11,1,1) = {" +zk +nk +Pe +dN +vS +ay +Yt +ay +Wq +iY +Vn +ER +dV +Co +Co +Co +Co +Co +hb +Co +Co +Co +FS +de +AE +"} +(12,1,1) = {" +zk +df +NB +dN +SP +dN +iQ +dN +Wq +dN +Lm +iY +WV +Co +Co +Co +Co +vb +Co +vb +vb +Co +Co +VC +AE +"} +(13,1,1) = {" +nk +nk +cN +iY +vA +vA +nk +vA +GF +vA +oW +Md +Co +Co +mD +mD +mD +GL +GL +GL +nD +mD +mD +mD +mD +"} +(14,1,1) = {" +eW +eW +eW +eW +iM +iM +eW +iM +UG +iM +iM +eW +Co +Co +mD +cy +nr +uw +nm +uw +uw +Cn +cy +mh +mD +"} +(15,1,1) = {" +eW +eW +aL +js +pV +pV +Hw +oV +qT +oV +oV +eW +Co +Co +kv +Nk +Cj +gd +Jk +nW +VK +Jn +Nk +BI +mD +"} +(16,1,1) = {" +eW +eW +eW +uB +oA +kI +bx +Hg +qT +he +pV +sk +Co +Co +mD +Yp +WW +cy +Nk +cy +ki +xh +Pt +jZ +mD +"} +(17,1,1) = {" +eW +eW +ME +oV +pV +Kl +oj +yE +qT +oV +wq +eW +Co +Co +mD +mD +mD +WY +WY +WY +SI +mD +mD +mD +mD +"} +(18,1,1) = {" +zk +eW +zn +pV +oV +Tj +AA +Tz +qT +pV +So +eW +RK +Co +Co +Co +Co +vb +vb +Co +nd +hN +hG +de +AE +"} +(19,1,1) = {" +zk +eW +ii +oV +gT +yu +yu +nT +qT +oV +EE +eW +Co +Co +Co +Co +Co +Co +Eu +Co +Co +VC +Wq +hG +fB +"} +(20,1,1) = {" +zk +eW +eW +QD +mZ +FA +Lx +cl +yT +TX +bx +eW +Co +Co +MN +MN +MN +MN +MN +MN +MN +MN +nk +nk +nk +"} +(21,1,1) = {" +Ue +Ue +uL +au +uL +uL +uL +uL +QV +oV +pV +eW +Co +Co +MN +Jx +Kt +Lf +ui +rQ +mW +MN +QC +QC +QC +"} +(22,1,1) = {" +Ue +Ue +Ue +Ue +Ue +Ue +Ue +uL +oi +EX +oi +eW +Eu +Co +MN +hL +Pl +oF +xr +Pp +eL +MN +QC +QC +QC +"} +(23,1,1) = {" +Ue +Ue +Ue +Ue +Ue +Ue +Ue +uL +eW +eW +eW +eW +RK +Co +MN +Cz +Dr +yH +fL +Dr +RT +MN +QC +QC +QC +"} +(24,1,1) = {" +zk +zk +zk +zk +zk +Ue +Ue +uL +DJ +HP +RI +MN +Co +Co +Mc +bD +dR +ei +Vi +pR +mE +MN +QC +QC +QC +"} +(25,1,1) = {" +zk +zk +zk +zk +zk +Ue +Ue +uL +Hh +uS +mE +MN +wG +MN +MN +oB +mE +YK +Kc +Ts +Ts +uL +zk +zk +zk +"} +(26,1,1) = {" +zk +zk +zk +zk +zk +Ue +Ue +uL +xw +Ts +ec +Ts +mE +ZG +MN +lG +mE +Ts +mE +Zr +XE +zl +zk +zk +zk +"} +(27,1,1) = {" +zk +zk +zk +zk +zk +Ue +Ue +Kk +mE +AU +RY +JO +QQ +Pg +MN +Fv +Fv +yP +SJ +jo +ES +uL +zk +zk +zk +"} +(28,1,1) = {" +zk +zk +zk +zk +zk +Ue +Ue +uL +Os +SN +xK +fR +Cs +Cs +fU +Cs +Ts +Ts +Zr +sd +qS +uL +zk +zk +zk +"} +(29,1,1) = {" +zk +zk +zk +zk +zk +Ue +Ue +uL +VF +Di +sI +nY +nM +nY +MN +Ne +mm +nw +xJ +iv +uL +uL +zk +zk +zk +"} +(30,1,1) = {" +zk +zk +zk +zk +zk +Ue +Ue +uL +uL +uL +uL +uL +uL +uL +uL +zw +uL +uL +uL +uL +uL +zk +zk +zk +zk +"} diff --git a/monkestation/_maps/RandomEngines/KiloStation/singularity.dmm b/monkestation/_maps/RandomEngines/KiloStation/singularity.dmm index 2aac264c7682..ea81c388e03d 100644 --- a/monkestation/_maps/RandomEngines/KiloStation/singularity.dmm +++ b/monkestation/_maps/RandomEngines/KiloStation/singularity.dmm @@ -38,7 +38,7 @@ /turf/open/floor/iron, /area/station/engineering/supermatter/room) "fx" = ( -/obj/structure/cable, +/obj/structure/cable/layer1, /turf/open/floor/plating, /area/station/engineering/supermatter/room) "fN" = ( @@ -195,6 +195,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/supermatter/room) +"nB" = ( +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/supermatter/room) "ob" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -208,7 +215,7 @@ "oe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/window/plasma, -/obj/structure/cable, +/obj/structure/cable/multilayer/connected, /turf/open/floor/iron, /area/station/engineering/supermatter/room) "or" = ( @@ -220,14 +227,13 @@ /turf/open/floor/iron, /area/station/engineering/supermatter/room) "oN" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Departures Lounge"; - name = "shuttle camera" - }, /obj/machinery/light/blacklight/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, +/obj/machinery/camera/emp_proof/directional/west{ + c_tag = "Singularity Engine #2" + }, /turf/open/floor/iron, /turf/open/floor/iron, /turf/open/floor/iron, @@ -298,9 +304,8 @@ /turf/open/floor/iron, /area/station/engineering/supermatter/room) "th" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Departures Lounge"; - name = "shuttle camera" +/obj/machinery/camera/emp_proof/directional/north{ + c_tag = "Singularity Engine #3" }, /turf/open/floor/plating, /area/station/engineering/supermatter/room) @@ -471,6 +476,15 @@ }, /turf/open/floor/iron, /area/station/engineering/supermatter/room) +"Ga" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/layer1, +/obj/structure/cable, +/obj/machinery/camera/emp_proof/directional/west{ + c_tag = "Singularity Engine #4" + }, +/turf/open/space/basic, +/area/station/engineering/supermatter/room) "Hs" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, @@ -535,13 +549,12 @@ /turf/open/floor/plating, /area/station/engineering/supermatter/room) "LD" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Departures Lounge"; - name = "shuttle camera" - }, /obj/machinery/light/blacklight/directional/north, /obj/structure/cable, /obj/machinery/airalarm/directional/north, +/obj/machinery/camera/emp_proof/directional/north{ + c_tag = "Singularity Engine #1" + }, /turf/open/floor/iron, /area/station/engineering/supermatter/room) "LZ" = ( @@ -592,6 +605,7 @@ "NS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/sign/directions/ptl/directional/east, +/obj/machinery/light/blacklight/directional/east, /turf/open/floor/iron, /area/station/engineering/supermatter/room) "OT" = ( @@ -987,7 +1001,7 @@ IJ cY cY cY -vF +Ga vF XV cY @@ -1206,8 +1220,8 @@ LD oK xG xG +nB kI -re NS oe RN @@ -1229,9 +1243,9 @@ rW Qn nb dq +nb mS zs -zs fx Ar zs diff --git a/monkestation/_maps/RandomEngines/KiloStation/supermatter.dmm b/monkestation/_maps/RandomEngines/KiloStation/supermatter.dmm index f18c49ac4ab4..8b2727b91ebf 100644 --- a/monkestation/_maps/RandomEngines/KiloStation/supermatter.dmm +++ b/monkestation/_maps/RandomEngines/KiloStation/supermatter.dmm @@ -460,8 +460,9 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "re" = ( -/obj/structure/sign/warning/no_smoking{ - pixel_x = 30 +/obj/structure/cable, +/obj/machinery/power/terminal{ + dir = 4 }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -488,10 +489,8 @@ /turf/open/floor/circuit/red, /area/station/engineering/supermatter/room) "sz" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 4 - }, /obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "sF" = ( @@ -508,7 +507,6 @@ /area/station/engineering/supermatter/room) "sY" = ( /obj/effect/turf_decal/loading_area, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) "th" = ( @@ -538,6 +536,9 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/warning/no_smoking{ + pixel_x = 30 + }, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "uc" = ( @@ -606,6 +607,11 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/engineering/supermatter/room) +"vz" = ( +/obj/structure/cable, +/obj/machinery/power/smes/engineering, +/turf/open/floor/circuit/red, +/area/station/engineering/supermatter/room) "vD" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, @@ -1446,10 +1452,6 @@ /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) "Wo" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, @@ -1493,10 +1495,6 @@ /turf/closed/wall/r_wall, /area/station/engineering/supermatter) "Yu" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister, /obj/effect/turf_decal/box, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) @@ -2012,7 +2010,7 @@ LO rW Qn dq -Ar +vz Ee fx Ar diff --git a/monkestation/_maps/RandomEngines/MetaStation/singularity.dmm b/monkestation/_maps/RandomEngines/MetaStation/singularity.dmm index f5d3388cd14e..89885f867efa 100644 --- a/monkestation/_maps/RandomEngines/MetaStation/singularity.dmm +++ b/monkestation/_maps/RandomEngines/MetaStation/singularity.dmm @@ -376,9 +376,8 @@ /area/station/engineering/supermatter/room) "AZ" = ( /obj/item/kirbyplants/random, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Engine Room North-West"; - network = list("ss13","engine","engineering") +/obj/machinery/camera/emp_proof/directional/north{ + c_tag = "Singularity Engine #1" }, /turf/open/floor/carpet/black, /area/station/engineering/supermatter/room) @@ -611,6 +610,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) +"Rw" = ( +/obj/structure/grille, +/obj/machinery/camera/emp_proof/directional/west{ + c_tag = "Singularity Engine #4" + }, +/turf/open/space/basic, +/area/station/engineering/supermatter/room) "Sh" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, @@ -634,6 +640,12 @@ "SS" = ( /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"UU" = ( +/obj/machinery/camera/emp_proof/directional/east{ + c_tag = "Singularity Engine #3" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room) "Vk" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -644,9 +656,8 @@ /turf/open/floor/plating, /area/station/engineering/supermatter/room) "Vn" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Engine Room North-West"; - network = list("ss13","engine","engineering") +/obj/machinery/camera/emp_proof/directional/north{ + c_tag = "Singularity Engine #2" }, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) @@ -938,7 +949,7 @@ je je "} (10,1,1) = {" -zC +UU np gQ HO @@ -1108,7 +1119,7 @@ An An ol An -Bc +Rw nM KS KS diff --git a/monkestation/_maps/RandomEngines/MetaStation/supermatter.dmm b/monkestation/_maps/RandomEngines/MetaStation/supermatter.dmm index a69772f2a04a..de068cb2ac8a 100644 --- a/monkestation/_maps/RandomEngines/MetaStation/supermatter.dmm +++ b/monkestation/_maps/RandomEngines/MetaStation/supermatter.dmm @@ -172,6 +172,10 @@ "je" = ( /turf/template_noop, /area/space) +"jw" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/dark, +/area/station/engineering/supermatter/room) "kf" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/glass{ @@ -227,10 +231,6 @@ /obj/effect/turf_decal/bot{ dir = 1 }, -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) "nM" = ( @@ -693,10 +693,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 1 - }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "HO" = ( @@ -1194,8 +1192,8 @@ eg ZC yT Qn -ck -ck +jw +jw UI Yf MT diff --git a/monkestation/_maps/RandomEngines/TramStation/singularity.dmm b/monkestation/_maps/RandomEngines/TramStation/singularity.dmm index 51f8cfccb601..6a41ab8ffb85 100644 --- a/monkestation/_maps/RandomEngines/TramStation/singularity.dmm +++ b/monkestation/_maps/RandomEngines/TramStation/singularity.dmm @@ -156,9 +156,8 @@ /area/station/engineering/supermatter/room) "qR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Engine Room North-West"; - network = list("ss13","engine","engineering") +/obj/machinery/camera/emp_proof/directional/north{ + c_tag = "Singularity Engine #2" }, /turf/open/floor/iron, /area/station/engineering/supermatter/room) @@ -355,11 +354,10 @@ /area/space/nearstation) "OY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Engine Room North-West"; - network = list("ss13","engine","engineering") - }, /obj/machinery/power/energy_accumulator/grounding_rod, +/obj/machinery/camera/emp_proof/directional/north{ + c_tag = "Singularity Engine #1" + }, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) "Pi" = ( @@ -491,6 +489,12 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"ZX" = ( +/obj/machinery/camera/emp_proof/directional/north{ + c_tag = "Singularity Engine #3" + }, +/turf/open/space/basic, +/area/station/engineering/supermatter/room) (1,1,1) = {" TZ @@ -942,7 +946,7 @@ Gn Ho Ho Ho -Zh +ZX Zh jS zz diff --git a/monkestation/_maps/RandomEngines/TramStation/supermatter.dmm b/monkestation/_maps/RandomEngines/TramStation/supermatter.dmm index 386c03667bad..666694e1d186 100644 --- a/monkestation/_maps/RandomEngines/TramStation/supermatter.dmm +++ b/monkestation/_maps/RandomEngines/TramStation/supermatter.dmm @@ -13,8 +13,6 @@ /area/station/engineering/supermatter) "bw" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/obj/machinery/meter, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "bG" = ( @@ -31,14 +29,12 @@ /area/station/engineering/supermatter/room) "cL" = ( /obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 4 - }, /obj/effect/turf_decal/trimline/yellow/arrow_ccw, /obj/effect/turf_decal/trimline/yellow/arrow_cw{ dir = 1 }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "dt" = ( @@ -309,12 +305,6 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter) -"ln" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/engine, -/area/station/engineering/supermatter/room) "lr" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 4; @@ -446,10 +436,6 @@ /area/station/engineering/supermatter) "oe" = ( /obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -825,10 +811,6 @@ /area/station/engineering/supermatter/room) "Fs" = ( /obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "FF" = ( @@ -1591,7 +1573,7 @@ ft XW Rq ix -ln +TD oe Qg TU diff --git a/monkestation/_maps/templates/map_contest_showcase.dmm b/monkestation/_maps/templates/map_contest_showcase.dmm new file mode 100644 index 000000000000..9b34646ddb86 --- /dev/null +++ b/monkestation/_maps/templates/map_contest_showcase.dmm @@ -0,0 +1,57811 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aD" = ( +/obj/effect/landmark/start/clown, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"bg" = ( +/obj/effect/landmark/start/detective, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"cx" = ( +/obj/effect/landmark/start/chief_engineer, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"eA" = ( +/obj/effect/landmark/observer_start, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"eS" = ( +/obj/effect/landmark/start/cargo_technician, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"ft" = ( +/obj/machinery/gravity_generator/main, +/turf/open/indestructible/hotelwood, +/area/mapping_showcase) +"gx" = ( +/obj/effect/landmark/start/medical_doctor, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"gK" = ( +/obj/effect/landmark/start/head_of_security, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"iX" = ( +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"ks" = ( +/obj/effect/landmark/start/lawyer, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"kQ" = ( +/obj/effect/landmark/start/roboticist, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"mm" = ( +/obj/effect/landmark/start/geneticist, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"mA" = ( +/obj/effect/landmark/start/ai, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"mD" = ( +/obj/effect/landmark/start/bitrunner, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"ng" = ( +/obj/effect/landmark/start/chemist, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"px" = ( +/obj/effect/landmark/start/cook, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"rp" = ( +/obj/effect/landmark/start/research_director, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"rG" = ( +/obj/effect/landmark/start/prisoner, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"se" = ( +/obj/effect/landmark/start/depsec/engineering, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"sy" = ( +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"sJ" = ( +/obj/effect/landmark/start/assistant, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"tK" = ( +/obj/effect/landmark/start/chaplain, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"wQ" = ( +/obj/effect/landmark/event_spawn, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"wV" = ( +/obj/effect/landmark/start/shaft_miner, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"xv" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"xW" = ( +/obj/effect/landmark/start/warden, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"yc" = ( +/obj/effect/landmark/start/botanist, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"ys" = ( +/obj/effect/landmark/start/bartender, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"zv" = ( +/obj/effect/landmark/start/depsec/supply, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"zN" = ( +/obj/effect/landmark/start/quartermaster, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"BA" = ( +/obj/effect/landmark/start/head_of_personnel, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"BE" = ( +/obj/effect/landmark/start/scientist, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"DC" = ( +/obj/effect/landmark/start/virologist, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"EE" = ( +/turf/open/space/basic, +/area/mapping_showcase) +"EK" = ( +/obj/effect/landmark/start/janitor, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"EO" = ( +/obj/effect/landmark/start/hangover, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Fk" = ( +/turf/open/indestructible/hotelwood, +/area/mapping_showcase) +"Fl" = ( +/obj/effect/landmark/start/psychologist, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Ht" = ( +/obj/effect/landmark/start/cyborg, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"HQ" = ( +/obj/effect/landmark/start/mime, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"KR" = ( +/obj/structure/fans/tiny/forcefield, +/turf/open/indestructible/hotelwood, +/area/mapping_showcase) +"KY" = ( +/obj/effect/oshan_launch_point/player, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Og" = ( +/obj/structure/fans/tiny/forcefield{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/mapping_showcase) +"Po" = ( +/obj/effect/landmark/start/station_engineer, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Qu" = ( +/obj/effect/landmark/start/chief_medical_officer, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Sw" = ( +/obj/effect/landmark/start/librarian, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Tk" = ( +/obj/effect/landmark/start/depsec/medical, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Tw" = ( +/obj/effect/landmark/start/captain, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"TG" = ( +/obj/machinery/computer/communications, +/turf/open/indestructible/hotelwood, +/area/mapping_showcase) +"TU" = ( +/obj/effect/landmark/start/depsec/science, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Vf" = ( +/obj/effect/landmark/start/paramedic, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"WR" = ( +/turf/closed/indestructible/alien, +/area/mapping_showcase) +"YH" = ( +/obj/effect/landmark/start/security_officer, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) + +(1,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(2,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(3,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(4,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +WR +WR +WR +WR +WR +WR +EE +EE +EE +"} +(5,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +WR +Fk +Fk +Fk +TG +WR +EE +EE +EE +"} +(6,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +WR +Fk +ft +Fk +WR +WR +EE +EE +EE +"} +(7,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +WR +Fk +Fk +Fk +WR +EE +EE +EE +EE +"} +(8,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +WR +WR +WR +WR +WR +EE +EE +EE +EE +"} +(9,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(10,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(11,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(12,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(13,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(14,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(15,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(16,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(17,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(18,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(19,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(20,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(21,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(22,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(23,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(24,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(25,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(26,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(27,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(28,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(29,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(30,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(31,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(32,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(33,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(34,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(35,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(36,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(37,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(38,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(39,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(40,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(41,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(42,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(43,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(44,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(45,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(46,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(47,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(48,1,1) = {" +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 +EE +EE +WR +WR +WR +WR +WR +WR +Og +Og +Og +Og +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +Og +Og +Og +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +Og +Og +Og +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +Og +Og +Og +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +Og +Og +Og +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +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 +EE +EE +EE +"} +(49,1,1) = {" +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 +EE +EE +WR +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +KR +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 +EE +EE +EE +"} +(50,1,1) = {" +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 +EE +EE +WR +Fk +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +KY +Fk +KR +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 +EE +EE +EE +"} +(51,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +iX +Fk +KR +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 +EE +EE +EE +"} +(52,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(53,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +mA +Fk +WR +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 +EE +EE +EE +"} +(54,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +sJ +Fk +WR +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 +EE +EE +EE +"} +(55,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +sy +Fk +WR +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 +EE +EE +EE +"} +(56,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +ys +Fk +WR +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 +EE +EE +EE +"} +(57,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +mD +Fk +WR +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 +EE +EE +EE +"} +(58,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +yc +Fk +WR +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 +EE +EE +EE +"} +(59,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +Tw +Fk +WR +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 +EE +EE +EE +"} +(60,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +eS +Fk +WR +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 +EE +EE +EE +"} +(61,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +tK +Fk +WR +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 +EE +EE +EE +"} +(62,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +ng +Fk +WR +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 +EE +EE +EE +"} +(63,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +cx +Fk +WR +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 +EE +EE +EE +"} +(64,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +Qu +Fk +WR +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 +EE +EE +EE +"} +(65,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +aD +Fk +WR +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 +EE +EE +EE +"} +(66,1,1) = {" +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 +EE +EE +KR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +px +Fk +WR +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 +EE +EE +EE +"} +(67,1,1) = {" +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 +EE +EE +KR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +Ht +Fk +WR +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 +EE +EE +EE +"} +(68,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +se +Fk +WR +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 +EE +EE +EE +"} +(69,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +Tk +Fk +WR +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 +EE +EE +EE +"} +(70,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +TU +Fk +WR +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 +EE +EE +EE +"} +(71,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +zv +Fk +WR +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 +EE +EE +EE +"} +(72,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +bg +Fk +WR +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 +EE +EE +EE +"} +(73,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +mm +Fk +WR +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 +EE +EE +EE +"} +(74,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +KR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +EO +Fk +WR +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 +EE +EE +EE +"} +(75,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +KR +Fk +BA +Fk +WR +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 +EE +EE +EE +"} +(76,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +gK +Fk +WR +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 +EE +EE +EE +"} +(77,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +EK +Fk +WR +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 +EE +EE +EE +"} +(78,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +ks +Fk +WR +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 +EE +EE +EE +"} +(79,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +Sw +Fk +WR +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 +EE +EE +EE +"} +(80,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +gx +Fk +KR +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 +EE +EE +EE +"} +(81,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +HQ +Fk +KR +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 +EE +EE +EE +"} +(82,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +Vf +Fk +KR +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 +EE +EE +EE +"} +(83,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +rG +Fk +WR +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 +EE +EE +EE +"} +(84,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +Fl +Fk +WR +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 +EE +EE +EE +"} +(85,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +zN +Fk +WR +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 +EE +EE +EE +"} +(86,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +rp +Fk +WR +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 +EE +EE +EE +"} +(87,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +kQ +Fk +WR +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 +EE +EE +EE +"} +(88,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +BE +Fk +WR +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 +EE +EE +EE +"} +(89,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +YH +Fk +WR +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 +EE +EE +EE +"} +(90,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +wV +Fk +WR +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 +EE +EE +EE +"} +(91,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +Po +Fk +WR +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 +EE +EE +EE +"} +(92,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +DC +Fk +WR +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 +EE +EE +EE +"} +(93,1,1) = {" +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 +EE +EE +KR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +xW +Fk +WR +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 +EE +EE +EE +"} +(94,1,1) = {" +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 +EE +EE +KR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +eA +Fk +WR +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 +EE +EE +EE +"} +(95,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(96,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(97,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(98,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(99,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(100,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(101,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(102,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(103,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(104,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(105,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +KR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(106,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +KR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(107,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +KR +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 +EE +EE +EE +"} +(108,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +KR +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 +EE +EE +EE +"} +(109,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +KR +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 +EE +EE +EE +"} +(110,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(111,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(112,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(113,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(114,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(115,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(116,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(117,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(118,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(119,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(120,1,1) = {" +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 +EE +EE +KR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(121,1,1) = {" +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 +EE +EE +KR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(122,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(123,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(124,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(125,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(126,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(127,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(128,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(129,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +KR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(130,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(131,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(132,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(133,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(134,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(135,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(136,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(137,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(138,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(139,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(140,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(141,1,1) = {" +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 +EE +EE +KR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +KR +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 +EE +EE +EE +"} +(142,1,1) = {" +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 +EE +EE +KR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +KR +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 +EE +EE +EE +"} +(143,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +KR +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 +EE +EE +EE +"} +(144,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(145,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(146,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(147,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(148,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +KR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(149,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(150,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(151,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(152,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(153,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(154,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(155,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(156,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(157,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(158,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(159,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(160,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +KR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(161,1,1) = {" +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 +EE +EE +KR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(162,1,1) = {" +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 +EE +EE +KR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(163,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(164,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(165,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(166,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(167,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(168,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(169,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(170,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(171,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(172,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(173,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(174,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(175,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(176,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +KR +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 +EE +EE +EE +"} +(177,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +KR +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 +EE +EE +EE +"} +(178,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +KR +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 +EE +EE +EE +"} +(179,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(180,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(181,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(182,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(183,1,1) = {" +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 +EE +EE +WR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(184,1,1) = {" +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 +EE +EE +KR +Fk +iX +Fk +WR +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 +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 +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 +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 +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +EE +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(185,1,1) = {" +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 +EE +EE +KR +Fk +iX +Fk +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(186,1,1) = {" +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 +EE +EE +WR +Fk +wQ +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +iX +Fk +WR +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 +EE +EE +EE +"} +(187,1,1) = {" +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 +EE +EE +WR +Fk +xv +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +iX +Fk +WR +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 +EE +EE +EE +"} +(188,1,1) = {" +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 +EE +EE +WR +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +Fk +WR +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 +EE +EE +EE +"} +(189,1,1) = {" +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 +EE +EE +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +Og +Og +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +Og +Og +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +Og +Og +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +Og +Og +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +Og +Og +Og +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +WR +Og +Og +Og +Og +WR +WR +WR +WR +WR +WR +WR +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 +EE +EE +EE +"} +(190,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(191,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(192,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(193,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(194,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(195,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(196,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(197,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(198,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(199,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(200,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(201,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(202,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(203,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(204,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(205,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(206,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(207,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(208,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(209,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(210,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(211,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(212,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(213,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(214,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(215,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(216,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(217,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(218,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(219,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(220,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(221,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(222,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(223,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(224,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(225,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(226,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(227,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(228,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(229,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(230,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(231,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(232,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(233,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(234,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(235,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(236,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(237,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(238,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} +(239,1,1) = {" +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 +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 +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 +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 +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 +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 +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 +EE +"} diff --git a/monkestation/_maps/templates/showcase_tram_bars.dmm b/monkestation/_maps/templates/showcase_tram_bars.dmm new file mode 100644 index 000000000000..73b1474fd577 --- /dev/null +++ b/monkestation/_maps/templates/showcase_tram_bars.dmm @@ -0,0 +1,57811 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"bc" = ( +/obj/effect/landmark/start/station_engineer, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"dx" = ( +/obj/effect/landmark/start/scientist, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"dU" = ( +/obj/effect/landmark/start/captain, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"eL" = ( +/obj/effect/landmark/start/detective, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"fd" = ( +/obj/effect/landmark/start/research_director, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"ic" = ( +/obj/machinery/computer/communications, +/turf/open/indestructible/hotelwood, +/area/mapping_showcase) +"ih" = ( +/obj/effect/landmark/start/medical_doctor, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"ks" = ( +/obj/effect/landmark/start/prisoner, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"kN" = ( +/obj/effect/landmark/start/depsec/science, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"kO" = ( +/obj/effect/landmark/start/geneticist, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"ok" = ( +/obj/structure/fans/tiny/forcefield{ + dir = 8 + }, +/turf/open/indestructible/hotelwood, +/area/mapping_showcase) +"pg" = ( +/obj/effect/oshan_launch_point/player, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"qT" = ( +/turf/open/indestructible/hotelwood, +/area/mapping_showcase) +"sj" = ( +/obj/effect/landmark/start/lawyer, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"uh" = ( +/obj/machinery/gravity_generator/main, +/turf/open/indestructible/hotelwood, +/area/mapping_showcase) +"uI" = ( +/obj/structure/fans/tiny/forcefield, +/turf/open/indestructible/hotelwood, +/area/mapping_showcase) +"uT" = ( +/obj/effect/landmark/start/paramedic, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"yq" = ( +/turf/open/space/basic, +/area/mapping_showcase) +"zV" = ( +/obj/effect/landmark/start/cyborg, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Aa" = ( +/obj/effect/landmark/start/bartender, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Cb" = ( +/obj/effect/landmark/start/botanist, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"CA" = ( +/obj/effect/landmark/start/chief_medical_officer, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"CB" = ( +/obj/effect/landmark/start/cargo_technician, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Dg" = ( +/obj/effect/landmark/start/head_of_security, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"DO" = ( +/obj/effect/landmark/start/bitrunner, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"DW" = ( +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Ed" = ( +/obj/effect/landmark/start/assistant, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Et" = ( +/obj/effect/landmark/start/quartermaster, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Fz" = ( +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Ho" = ( +/turf/closed/indestructible/alien, +/area/mapping_showcase) +"HP" = ( +/obj/effect/landmark/start/chaplain, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"IC" = ( +/obj/effect/landmark/start/shaft_miner, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"IH" = ( +/obj/effect/landmark/start/roboticist, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Lh" = ( +/obj/effect/landmark/start/hangover, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Mz" = ( +/obj/effect/landmark/start/depsec/engineering, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"MK" = ( +/obj/effect/landmark/start/mime, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Nn" = ( +/obj/effect/landmark/start/warden, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"NA" = ( +/obj/effect/landmark/start/librarian, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Ow" = ( +/obj/effect/landmark/start/head_of_personnel, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"PC" = ( +/obj/effect/landmark/start/virologist, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Qr" = ( +/obj/effect/landmark/start/ai, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"QR" = ( +/obj/effect/landmark/start/cook, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"QX" = ( +/obj/effect/landmark/start/chief_engineer, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"RD" = ( +/obj/effect/landmark/start/depsec/medical, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"RT" = ( +/obj/effect/landmark/start/janitor, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Sv" = ( +/obj/effect/landmark/start/chemist, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"Vk" = ( +/obj/effect/landmark/start/psychologist, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"VE" = ( +/obj/effect/landmark/observer_start, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"VN" = ( +/obj/effect/landmark/event_spawn, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"VT" = ( +/obj/effect/landmark/start/security_officer, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"WQ" = ( +/obj/effect/landmark/start/clown, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"XG" = ( +/obj/effect/landmark/generic_maintenance_landmark, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) +"YJ" = ( +/obj/effect/landmark/start/depsec/supply, +/turf/open/indestructible/bluespace, +/area/mapping_showcase) + +(1,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(2,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(3,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(4,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +Ho +Ho +Ho +Ho +Ho +yq +yq +yq +"} +(5,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +qT +qT +ic +Ho +yq +yq +yq +"} +(6,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +uh +qT +Ho +Ho +yq +yq +yq +"} +(7,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +qT +qT +Ho +yq +yq +yq +yq +"} +(8,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +Ho +Ho +Ho +Ho +yq +yq +yq +yq +"} +(9,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(10,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(11,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(12,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(13,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(14,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(15,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(16,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(17,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(18,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(19,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(20,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(21,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(22,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(23,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(24,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(25,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(26,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(27,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(28,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(29,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(30,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(31,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(32,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(33,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(34,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(35,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(36,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(37,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(38,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(39,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(40,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(41,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(42,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(43,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(44,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +Ho +Ho +Ho +Ho +Ho +ok +ok +ok +ok +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +ok +ok +ok +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +ok +ok +ok +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +ok +ok +ok +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +ok +ok +ok +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(45,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(46,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +pg +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(47,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +Fz +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +Fz +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(48,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Fz +qT +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(49,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Qr +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(50,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Ed +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(51,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +DW +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(52,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Aa +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(53,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +DO +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(54,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Cb +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(55,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +dU +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(56,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +CB +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(57,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +HP +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(58,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Sv +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(59,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +QX +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(60,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +CA +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(61,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +WQ +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(62,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +QR +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(63,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +zV +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(64,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Mz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(65,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +RD +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(66,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +kN +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(67,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +YJ +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(68,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +eL +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(69,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +kO +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(70,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Lh +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(71,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Ow +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(72,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Dg +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(73,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +RT +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(74,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +sj +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(75,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +NA +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(76,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +ih +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(77,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +MK +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(78,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +uT +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(79,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Fz +qT +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +ks +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(80,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Fz +qT +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Vk +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(81,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Et +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(82,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +fd +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(83,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +IH +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(84,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +dx +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(85,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +VT +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(86,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +IC +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(87,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +bc +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(88,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +PC +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(89,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Nn +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(90,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +VE +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(91,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(92,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(93,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(94,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(95,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(96,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(97,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(98,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(99,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(100,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(101,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(102,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(103,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(104,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(105,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(106,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(107,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(108,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(109,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(110,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(111,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Fz +qT +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(112,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Fz +qT +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(113,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(114,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(115,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(116,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(117,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(118,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(119,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(120,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(121,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(122,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(123,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(124,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(125,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(126,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(127,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(128,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(129,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(130,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(131,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(132,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(133,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(134,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(135,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(136,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(137,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(138,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(139,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(140,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(141,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(142,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(143,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Fz +qT +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(144,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Fz +qT +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(145,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(146,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(147,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(148,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(149,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(150,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(151,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(152,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(153,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(154,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(155,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(156,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(157,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(158,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(159,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(160,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(161,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(162,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(163,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(164,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(165,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(166,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(167,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(168,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(169,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(170,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(171,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(172,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(173,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(174,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +uI +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(175,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Fz +qT +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(176,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(177,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(178,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(179,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(180,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(181,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +uI +qT +Fz +qT +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Fz +qT +Ho +Ho +Ho +Ho +Ho +Ho +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(182,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +VN +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +Fz +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(183,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +XG +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +Fz +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(184,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +qT +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(185,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +ok +ok +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +ok +ok +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +ok +ok +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +ok +ok +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +ok +ok +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +Ho +ok +ok +ok +ok +Ho +Ho +Ho +Ho +Ho +Ho +Ho +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(186,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(187,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(188,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(189,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(190,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(191,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(192,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(193,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(194,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(195,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(196,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(197,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(198,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(199,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(200,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(201,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(202,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(203,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(204,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(205,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(206,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(207,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(208,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(209,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(210,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(211,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(212,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(213,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(214,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(215,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(216,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(217,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(218,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(219,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(220,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(221,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(222,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(223,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(224,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(225,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(226,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(227,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(228,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(229,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(230,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(231,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(232,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(233,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(234,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(235,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(236,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(237,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(238,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} +(239,1,1) = {" +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +yq +"} diff --git a/monkestation/code/__HELPERS/mobs.dm b/monkestation/code/__HELPERS/mobs.dm deleted file mode 100644 index cf7a6bba7065..000000000000 --- a/monkestation/code/__HELPERS/mobs.dm +++ /dev/null @@ -1,19 +0,0 @@ -GLOBAL_LIST_INIT(fur_tone_names, list( - "ffffff" = "Albino", - "ffb089" = "Chimp", - "aeafb3" = "Grey", - "bfd0ca" = "Snow", - "ce7d54" = "Orange", - "c47373" = "Red", - "f4e2d5" = "Cream" - )) - -GLOBAL_LIST_INIT(fur_tones, sort_list(list( - "ffffff", - "ffb089", - "aeafb3", - "bfd0ca", - "ce7d54", - "c47373", - "f4e2d5", - ))) diff --git a/monkestation/code/__HELPERS/turfs.dm b/monkestation/code/__HELPERS/turfs.dm new file mode 100644 index 000000000000..16b4c6c88758 --- /dev/null +++ b/monkestation/code/__HELPERS/turfs.dm @@ -0,0 +1,14 @@ +/**Shake() and then explode a turf based on the passed vars + * shake_duration: how long to shake the turf for before calling explosion() + * explosion_stats: a list of what stats to give the called explosion() + * sound: if passed then what sound to play at the start of the shaking, if a list is passed then it will pick() from that list +**/ +/turf/proc/structural_collapse(shake_duration = 1 SECONDS, explosion_stats = list(1, 2, 3), sound/played_sound) + if(QDELETED(src)) + return + + if(played_sound) + playsound(src, (islist(played_sound) ? pick(played_sound) : played_sound), 60) + visible_message(span_userdanger("\The [src] looks like its about to collapse!")) + Shake(0.2, 0.2, shake_duration) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(explosion), src, explosion_stats[1], explosion_stats[2], explosion_stats[3]), shake_duration) diff --git a/monkestation/code/datums/brain_damage/magic.dm b/monkestation/code/datums/brain_damage/magic.dm new file mode 100644 index 000000000000..01a451e8c53e --- /dev/null +++ b/monkestation/code/datums/brain_damage/magic.dm @@ -0,0 +1,65 @@ +/datum/brain_trauma/magic/stalker_multiple + name = "Stalking Phantoms" + desc = "Patient is stalked by multiple phantoms only they can see." + scan_desc = "extra-EXTRA-sensory paranoia" + gain_text = span_warning("You feel like the gods have released the hounds...") + lose_text = span_notice("You no longer feel the wrath of the gods watching you.") + + var/list/stalkers = list() + + var/close_stalker = FALSE //For heartbeat + +/datum/brain_trauma/magic/stalker_multiple/Destroy() + for (var/stalker in stalkers) + QDEL_NULL(stalker) + return ..() + +/datum/brain_trauma/magic/stalker_multiple/on_gain() + create_stalker_multiple(10) + return ..() + +/datum/brain_trauma/magic/stalker_multiple/proc/create_stalker() + var/turf/stalker_source = locate(owner.x + pick(-12, 12), owner.y + pick(-12, -6, 0, 6, 12), owner.z) //random corner + var/obj/effect/client_image_holder/stalker_phantom/stalker = new(stalker_source, owner) + stalkers += stalker + +/datum/brain_trauma/magic/stalker_multiple/proc/create_stalker_multiple(count) + var/turf/stalker_source = locate(owner.x + pick(-12, 12), owner.y + pick(-12, -6, 0, 6, 12), owner.z) //random corner + + for (var/x = 0; x < count; x++) + var/obj/effect/client_image_holder/stalker_phantom/stalker = new(stalker_source, owner) + stalkers += stalker + +/datum/brain_trauma/magic/stalker_multiple/on_lose() + for (var/stalker in stalkers) + QDEL_NULL(stalker) + return ..() + +/datum/brain_trauma/magic/stalker_multiple/on_life(seconds_per_tick, times_fired) + // Dead and unconscious people are not interesting to the psychic stalker. + if(owner.stat != CONSCIOUS) + return + + // Not even nullspace will keep it at bay. + for (var/obj/effect/client_image_holder/stalker_phantom/stalker in stalkers) + if(!stalker || !stalker.loc || stalker.z != owner.z) + qdel(stalker) + create_stalker() + + for (var/obj/effect/client_image_holder/stalker_phantom/stalker in stalkers) + if(get_dist(owner, stalker) <= 1) + playsound(owner, 'sound/magic/demon_attack1.ogg', 10) + owner.visible_message(span_warning("[owner] is torn apart by invisible claws!"), span_userdanger("Ghostly claws tear your body apart!")) + owner.take_bodypart_damage(rand(20, 45), wound_bonus=CANT_WOUND) + else if(SPT_PROB(30, seconds_per_tick)) + stalker.forceMove(get_step_towards(stalker, owner)) + if(get_dist(owner, stalker) <= 8) + if(!close_stalker) + var/sound/slowbeat = sound('sound/health/slowbeat.ogg', repeat = TRUE) + owner.playsound_local(owner, slowbeat, 40, 0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) + close_stalker = TRUE + else + if(close_stalker) + owner.stop_sound_channel(CHANNEL_HEARTBEAT) + close_stalker = FALSE + ..() diff --git a/monkestation/code/datums/components/turf_healing.dm b/monkestation/code/datums/components/turf_healing.dm index 107d2f3e187f..2acaacb2de74 100644 --- a/monkestation/code/datums/components/turf_healing.dm +++ b/monkestation/code/datums/components/turf_healing.dm @@ -33,4 +33,4 @@ if(entry == STAMINA) healed_mob.stamina.adjust(healing_types[entry] * seconds_per_tick * 0.5) continue - healed_mob.apply_damage_type((-healing_types[entry] * seconds_per_tick * 0.5), entry) + healed_mob.heal_damage_type((healing_types[entry] * seconds_per_tick * 0.5), entry) diff --git a/monkestation/code/datums/diseases/advance/symptoms/clockwork.dm b/monkestation/code/datums/diseases/advance/symptoms/clockwork.dm index 5e3cf22383f4..11a159fbef40 100644 --- a/monkestation/code/datums/diseases/advance/symptoms/clockwork.dm +++ b/monkestation/code/datums/diseases/advance/symptoms/clockwork.dm @@ -145,16 +145,16 @@ if(replacebody) for(var/obj/item/bodypart/Oldlimb in Host.bodyparts) if(!IS_ORGANIC_LIMB(Oldlimb)) - if(robustbits && Oldlimb.brute_reduction < 3 || Oldlimb.burn_reduction < 2) - Oldlimb.burn_reduction = max(4, Oldlimb.burn_reduction) - Oldlimb.brute_reduction = max(5, Oldlimb.brute_reduction) + if(robustbits && Oldlimb.brute_modifier < 3 || Oldlimb.burn_modifier < 2) + Oldlimb.burn_modifier = max(4, Oldlimb.burn_modifier) + Oldlimb.brute_modifier = max(5, Oldlimb.brute_modifier) continue switch(Oldlimb.body_zone) if(BODY_ZONE_HEAD)//i wish i knew how to transfer external organs from old limb to new limb, but i dont. var/obj/item/bodypart/head/robot/clockwork/newlimb = new() if(robustbits) - newlimb.brute_reduction = 5 - newlimb.burn_reduction = 4 + newlimb.brute_modifier = 5 + newlimb.burn_modifier = 4 newlimb.replace_limb(Host, TRUE) Host.visible_message("Your head feels numb, and cold.
") qdel(Oldlimb) @@ -162,8 +162,8 @@ if(BODY_ZONE_CHEST)//i wish i knew how to transfer external organs from old limb to new limb, but i dont. var/obj/item/bodypart/chest/robot/clockwork/newlimb = new() if(robustbits) - newlimb.brute_reduction = 5 - newlimb.burn_reduction = 4 + newlimb.brute_modifier = 5 + newlimb.burn_modifier = 4 newlimb.replace_limb(Host, TRUE) Host.visible_message("Your [Oldlimb] feels numb, and cold.
") qdel(Oldlimb) @@ -171,8 +171,8 @@ if(BODY_ZONE_L_ARM) var/obj/item/bodypart/arm/left/robot/clockwork/newlimb = new() if(robustbits) - newlimb.brute_reduction = 5 - newlimb.burn_reduction = 4 + newlimb.brute_modifier = 5 + newlimb.burn_modifier = 4 newlimb.replace_limb(Host, TRUE) Host.visible_message("Your [Oldlimb] feels numb, and cold.
") qdel(Oldlimb) @@ -180,8 +180,8 @@ if(BODY_ZONE_R_ARM) var/obj/item/bodypart/arm/right/robot/clockwork/newlimb = new() if(robustbits) - newlimb.brute_reduction = 5 - newlimb.burn_reduction = 4 + newlimb.brute_modifier = 5 + newlimb.burn_modifier = 4 newlimb.replace_limb(Host, TRUE) Host.visible_message("Your [Oldlimb] feels numb, and cold.") qdel(Oldlimb) @@ -189,8 +189,8 @@ if(BODY_ZONE_L_LEG) var/obj/item/bodypart/leg/left/robot/clockwork/newlimb = new() if(robustbits) - newlimb.brute_reduction = 5 - newlimb.burn_reduction = 4 + newlimb.brute_modifier = 5 + newlimb.burn_modifier = 4 newlimb.replace_limb(Host, TRUE) Host.visible_message("Your [Oldlimb] feels numb, and cold.") qdel(Oldlimb) @@ -198,8 +198,8 @@ if(BODY_ZONE_R_LEG) var/obj/item/bodypart/leg/right/robot/clockwork/newlimb = new() if(robustbits) - newlimb.brute_reduction = 5 - newlimb.burn_reduction = 4 + newlimb.brute_modifier = 5 + newlimb.burn_modifier = 4 newlimb.replace_limb(Host, TRUE) Host.visible_message("Your [Oldlimb] feels numb, and cold.") qdel(Oldlimb) @@ -215,8 +215,8 @@ Host.dna.species.regenerate_organs(Host, replace_current = TRUE) for(var/obj/item/bodypart/Oldlimb in Host.bodyparts) if(!IS_ORGANIC_LIMB(Oldlimb)) - Oldlimb.burn_reduction = initial(Oldlimb.burn_reduction) - Oldlimb.brute_reduction = initial(Oldlimb.brute_reduction) + Oldlimb.burn_modifier = initial(Oldlimb.burn_modifier) + Oldlimb.brute_modifier = initial(Oldlimb.brute_modifier) /datum/symptom/robotic_adaptation/OnRemove(datum/disease/advance/advanced_disease) advanced_disease.infectable_biotypes -= MOB_ROBOTIC diff --git a/monkestation/code/datums/patreon_data.dm b/monkestation/code/datums/patreon_data.dm index 41746daa702d..1fea17ce093e 100644 --- a/monkestation/code/datums/patreon_data.dm +++ b/monkestation/code/datums/patreon_data.dm @@ -41,6 +41,8 @@ if(query_get_rank.NextRow()) if(query_get_rank.item[1]) owned_rank = query_get_rank.item[1] + if(owned_rank == "UNSUBBED2") + owned_rank = NO_RANK else owned_rank = NO_RANK qdel(query_get_rank) @@ -67,6 +69,6 @@ return FALSE /datum/patreon_data/proc/is_donator() - if(owned_rank != NO_RANK) + if((owned_rank != NO_RANK) && (owned_rank != UNSUBBED)) return TRUE return FALSE diff --git a/monkestation/code/datums/quirks/negative_quirks.dm b/monkestation/code/datums/quirks/negative_quirks.dm index e52ce25a73b2..84a9716adda7 100644 --- a/monkestation/code/datums/quirks/negative_quirks.dm +++ b/monkestation/code/datums/quirks/negative_quirks.dm @@ -202,3 +202,19 @@ /datum/quirk/item_quirk/allergic/post_add() if(isipc(quirk_holder)) //monkestation addition to_chat(quirk_holder, span_boldnotice("Your chassis feels frail.")) + +/datum/quirk/extra_sensory_paranoia + name = "Extra-Sensory Paranoia" + desc = "You feel like something wants to kill you..." + mob_trait = TRAIT_PARANOIA + value = -8 + icon = "fa-optin-monster" // "fa-ghost" + +/datum/quirk/extra_sensory_paranoia/add() + var/datum/brain_trauma/magic/stalker/T = new() + var/mob/living/carbon/human/H = quirk_holder + H.gain_trauma(T, TRAUMA_RESILIENCE_ABSOLUTE) + +/datum/quirk/extra_sensory_paranoia/remove() + var/mob/living/carbon/human/H = quirk_holder + H.cure_trauma_type(/datum/brain_trauma/magic/stalker, TRAUMA_RESILIENCE_ABSOLUTE) diff --git a/monkestation/code/datums/stamina_container.dm b/monkestation/code/datums/stamina_container.dm index ec338c43e9f3..62b3afa7b4ca 100644 --- a/monkestation/code/datums/stamina_container.dm +++ b/monkestation/code/datums/stamina_container.dm @@ -81,3 +81,4 @@ update() if((amt < 0) && is_regenerating) pause(STAMINA_REGEN_TIME) + return amt diff --git a/monkestation/code/datums/status_effects/food_buffs.dm b/monkestation/code/datums/status_effects/food_buffs.dm index ebf4c084f6a5..ce177b143cdc 100644 --- a/monkestation/code/datums/status_effects/food_buffs.dm +++ b/monkestation/code/datums/status_effects/food_buffs.dm @@ -67,7 +67,7 @@ if(ishuman(owner)) var/mob/living/carbon/user = owner for(var/obj/item/bodypart/limbs in user.bodyparts) - limbs.brute_reduction += 3 + limbs.brute_modifier -= 0.1 return ..() /datum/status_effect/food/resistance/on_remove() @@ -75,7 +75,7 @@ if(ishuman(owner)) var/mob/living/carbon/user = owner for(var/obj/item/bodypart/limbs in user.bodyparts) - limbs.brute_reduction -= 3 + limbs.brute_modifier += 0.1 #define DURATION_LOSS 250 diff --git a/monkestation/code/datums/twitch_data.dm b/monkestation/code/datums/twitch_data.dm new file mode 100644 index 000000000000..7197a30e2681 --- /dev/null +++ b/monkestation/code/datums/twitch_data.dm @@ -0,0 +1,65 @@ +/client + var/datum/twitch_data/twitch + +/datum/twitch_data + ///the client that owns this data + var/client/owner + ///the stored twitch client key for the information + var/client_key + ///the stored twitch rank collected from the server + var/owned_rank = NO_TWITCH_SUB + ///access rank in numbers + var/access_rank = 0 + + + + +/datum/twitch_data/New(client/created_client) + . = ..() + if(!created_client) + return + + if(!SSdbcore.IsConnected()) + owned_rank = ACCESS_TWITCH_SUB_TIER_3 ///this is a testing variable + return + + owner = created_client + + fetch_rank(owner.ckey) + + assign_twitch_rank() + + +/datum/twitch_data/proc/fetch_rank(ckey) + var/datum/db_query/query_get_rank = SSdbcore.NewQuery("SELECT twitch_rank FROM [format_table_name("player")] WHERE ckey = '[ckey]'") + if(query_get_rank.warn_execute()) + if(query_get_rank.NextRow()) + if(query_get_rank.item[1]) + owned_rank = query_get_rank.item[1] + if(owned_rank == "") + owned_rank = NO_TWITCH_SUB + else + owned_rank = NO_TWITCH_SUB + qdel(query_get_rank) + + +/datum/twitch_data/proc/assign_twitch_rank() + switch(owned_rank) + if(TWITCH_SUB_TIER_1) + access_rank = ACCESS_TWITCH_SUB_TIER_1 + if(TWITCH_SUB_TIER_2) + access_rank = ACCESS_TWITCH_SUB_TIER_2 + if(TWITCH_SUB_TIER_3) + access_rank = ACCESS_TWITCH_SUB_TIER_3 + +/datum/twitch_data/proc/has_access(rank) + if(!access_rank) + assign_twitch_rank() + if(rank <= access_rank) + return TRUE + return FALSE + +/datum/twitch_data/proc/is_donator() + if(owned_rank != NO_TWITCH_SUB) + return TRUE + return FALSE diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index b81446d7280b..7a1f3dd3e4e9 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -50,7 +50,7 @@ ADD_TRAIT(H, TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT) H.Unconscious(80) - var/list/candidates = poll_candidates_for_mob("Do you want to play as [clonename]'s defective clone?", null, null, null, 100, H, POLL_IGNORE_DEFECTIVECLONE) + var/list/candidates = poll_candidates_for_mob("Do you want to play as [clonename]'s defective clone?", null, null, 10 SECONDS, H, POLL_IGNORE_DEFECTIVECLONE) if(LAZYLEN(candidates)) var/mob/dead/observer/C = pick(candidates) H.key = C.key diff --git a/monkestation/code/game/machinery/prize_vendor.dm b/monkestation/code/game/machinery/prize_vendor.dm index ee326f17b647..bee4c1113541 100644 --- a/monkestation/code/game/machinery/prize_vendor.dm +++ b/monkestation/code/game/machinery/prize_vendor.dm @@ -143,8 +143,8 @@ /obj/machinery/prize_vendor/pets name = "Pet Prize Vendor" desc = "Friend dispenser." - dispense_list_override = list(/mob/living/simple_animal/parrot/natural = 3, - /mob/living/simple_animal/sloth = 3, + dispense_list_override = list(/mob/living/basic/parrot = 3, + /mob/living/basic/sloth = 3, /mob/living/simple_animal/pet/cat = 3, /mob/living/basic/pet/fox = 3, /mob/living/simple_animal/pet/gondola = 1, diff --git a/monkestation/code/game/objects/effects/landmark.dm b/monkestation/code/game/objects/effects/landmark.dm new file mode 100644 index 000000000000..508b4d82c6fc --- /dev/null +++ b/monkestation/code/game/objects/effects/landmark.dm @@ -0,0 +1,128 @@ +// Monkestation Additional Navigation Markers for the Navigate Verb -Dexee +// The code/markers here may be able to be used for a future expansion or completely new navigation/location system that both crew, antags, and pAIs alike will be able to use. + +// Non-station Specific Markers + +/obj/effect/landmark/navigate_destination/common/portbowsolar + location = "Port Bow Solar Array" + +/obj/effect/landmark/navigate_destination/common/portquartersolar + location = "Port Quarter Solar Array" + +/obj/effect/landmark/navigate_destination/common/starboardbowsolar + location = "Starboard Bow Solar Array" + +/obj/effect/landmark/navigate_destination/common/starboardquartersolar + location = "Starboard Quarter Solar Array" + +/obj/effect/landmark/navigate_destination/common/fitness + location = "Fitness" + +/obj/effect/landmark/navigate_destination/common/cryogenics + location = "Cryogenics" + +/obj/effect/landmark/navigate_destination/common/vaccommissary + location = "Vacant Commissary" + +/obj/effect/landmark/navigate_destination/common/artstorage + location = "Art Storage" + +/obj/effect/landmark/navigate_destination/common/barber + location = "Barber" + +/obj/effect/landmark/navigate_destination/common/auxbaseconst + location = "Aux Base Construction" + +/obj/effect/landmark/navigate_destination/common/holodeck + location = "Holodeck" + +/obj/effect/landmark/navigate_destination/common/construction + location = "Construction Site" + +/obj/effect/landmark/navigate_destination/common/shitter + location = "Toilet" + +/obj/effect/landmark/navigate_destination/common/bitrunner + location = "Bitrunner Den" + +/obj/effect/landmark/navigate_destination/common/theatrebackstage + location = "Theatre Backstage" + +/obj/effect/landmark/navigate_destination/common/dorms + location = "Dormitories" + +// Icebox Specific +/obj/effect/landmark/navigate_destination/icebox/maintsbar + location = "Maintenance Bar" + +// Tramstation Specific + +/obj/effect/landmark/navigate_destination/tram/bankofcargo + location = "Bank of Cargo" + +/obj/effect/landmark/navigate_destination/tram/abandonedmechbay + location = "Abandoned Mechbay" + +/obj/effect/landmark/navigate_destination/tram/radshelter + location = "Radiation Shelter" + +// Oshan Specific +/obj/effect/landmark/navigate_destination/oshan/miningelevator + location = "Miners' Elevator" + +// Metastation Specific + +// Deltastation specific + +/obj/effect/landmark/navigate_destination/delta/abandsci + location = "Abandoned Science Labs" + +/obj/effect/landmark/navigate_destination/delta/abandgambling + location = "Abandoned Gambling Den" + +/obj/effect/landmark/navigate_destination/delta/abandlibrary + location = "Abandoned Library" + +/obj/effect/landmark/navigate_destination/delta/evamaint + location = "EVA Maintenance" + +/obj/effect/landmark/navigate_destination/delta/pioffice + location = "Private Investigator's Office" + +/obj/effect/landmark/navigate_destination/delta/abandtheatre + location = "Abandoned Theatre" + +/obj/effect/landmark/navigate_destination/delta/abandkitchen + location = "Abandoned Kitchen" + +/obj/effect/landmark/navigate_destination/delta/abandgameroom + location = "Abandoned Game Den" + +/obj/effect/landmark/navigate_destination/delta/abandmedbay + location = "Abandoned Medbay" + +/obj/effect/landmark/navigate_destination/delta/abandmarketbay + location = "Abandoned Market Bay" + +// Centcom Areas +/obj/effect/landmark/navigate_destination/centcom/medical + location = "CentCom Medical" + +/obj/effect/landmark/navigate_destination/centcom/hydro + location = "CentCom Hydroponics" + +/obj/effect/landmark/navigate_destination/centcom/borbop + location = "Borbop's Bar" + +/obj/effect/landmark/navigate_destination/centcom/kitchen + location = "CentCom Kitchen" + +/obj/effect/landmark/navigate_destination/centcom/duelbutton + location = "Thunderdome" + +/obj/effect/landmark/navigate_destination/centcom/boxing + location = "Boxing Ring" + +/obj/effect/landmark/navigate_destination/centcom/dresser + location = "Dressing Room" + diff --git a/monkestation/code/game/objects/effects/spawners/random/fishing.dm b/monkestation/code/game/objects/effects/spawners/random/fishing.dm new file mode 100644 index 000000000000..e750264cd1a8 --- /dev/null +++ b/monkestation/code/game/objects/effects/spawners/random/fishing.dm @@ -0,0 +1,8 @@ +/obj/effect/spawner/random/fishing_rods + name = "fish rod spawner" + desc = "Fish fear me" + loot = list(/obj/item/fishing_rod = 3, + /obj/item/fishing_rod/bone = 3, + /obj/item/fishing_rod/telescopic = 3, + /obj/item/fishing_rod/tech = 2, + /obj/item/fishing_rod/telescopic/master = 1) diff --git a/monkestation/code/game/objects/items/choice_beacon.dm b/monkestation/code/game/objects/items/choice_beacon.dm index c881353427a8..fe00d08e0b2c 100644 --- a/monkestation/code/game/objects/items/choice_beacon.dm +++ b/monkestation/code/game/objects/items/choice_beacon.dm @@ -10,7 +10,7 @@ /datum/pet_command/idle, /datum/pet_command/free, /datum/pet_command/follow, - /datum/pet_command/point_targetting/fetch, + /datum/pet_command/point_targeting/fetch, /datum/pet_command/play_dead, ) @@ -25,11 +25,10 @@ /mob/living/basic/axolotl, /mob/living/basic/mouse, /mob/living/basic/mouse/rat, - /mob/living/simple_animal/parrot, + /mob/living/basic/parrot, /mob/living/basic/butterfly, /mob/living/basic/bee/friendly, /mob/living/basic/crab, - /mob/living/basic/crab/spycrab, /mob/living/basic/pet/penguin/baby, /mob/living/basic/pet/fox, /mob/living/simple_animal/pet/cat, diff --git a/monkestation/code/game/objects/items/effects/honk_platinum.dm b/monkestation/code/game/objects/items/effects/honk_platinum.dm index c4deebd28552..2cfaf15bdc81 100644 --- a/monkestation/code/game/objects/items/effects/honk_platinum.dm +++ b/monkestation/code/game/objects/items/effects/honk_platinum.dm @@ -4,12 +4,13 @@ /obj/item/effect_granter/honk_platinum/grant_effect(mob/living/carbon/granter) - var/mob/living/simple_animal/parrot/honk_platinum/new_honk = new(granter.loc) + var/mob/living/basic/parrot/honk_platinum/new_honk = new(granter.loc) new_honk.mind_initialize() var/datum/mind/granters_mind = granter.mind granters_mind.transfer_to(new_honk) + new_honk.adjust_hand_count(2) qdel(granter) . = ..() diff --git a/monkestation/code/game/objects/items/guns/SRN.dm b/monkestation/code/game/objects/items/guns/SRN.dm index ddd8f996a809..63e66f9cf9f4 100644 --- a/monkestation/code/game/objects/items/guns/SRN.dm +++ b/monkestation/code/game/objects/items/guns/SRN.dm @@ -61,7 +61,7 @@ damage = 10 ricochets_max = 0 //it's a MISSILE -/obj/projectile/bullet/SRN_rocket/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/SRN_rocket/on_hit(atom/target, blocked = 0, pierce_hit) ..() if(ishuman(target)) var/mob/living/carbon/human/M = target diff --git a/monkestation/code/game/objects/items/guns/crank_guns.dm b/monkestation/code/game/objects/items/guns/crank_guns.dm new file mode 100644 index 000000000000..5c96a49462cd --- /dev/null +++ b/monkestation/code/game/objects/items/guns/crank_guns.dm @@ -0,0 +1,49 @@ +/obj/item/gun/energy/laser/musket/syndicate + name = "syndicate laser musket" + desc = "A powerful laser(?) weapon, its 4 tetradimensional capacitors can hold 2 shots each, totaling to 8 shots. \ + Putting your hand on the control panel gives you a strange tingling feeling, this is probably how you charge it." + icon = 'monkestation/icons/obj/guns/guns.dmi' + icon_state = "musket_syndie" + inhand_icon_state = "musket_syndie" + lefthand_file = 'monkestation/icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'monkestation/icons/mob/inhands/weapons/guns_righthand.dmi' + worn_icon_state = "las_musket_syndie" + ammo_type = list(/obj/item/ammo_casing/energy/laser/musket/syndicate) + w_class = WEIGHT_CLASS_NORMAL +/obj/item/gun/energy/laser/musket/syndicate/Initialize(mapload) //it takes two hand slots and costs 12 tc, they deserve fast recharging + . = ..() + AddComponent( \ + /datum/component/gun_crank, \ + charging_cell = get_cell(), \ + charge_amount = 250, \ + cooldown_time = 1.5 SECONDS, \ + charge_sound = 'sound/weapons/laser_crank.ogg', \ + charge_sound_cooldown_time = 1.3 SECONDS, \ + ) + +/obj/projectile/beam/laser/musket + damage = 30 + stamina = 45 + +/obj/projectile/beam/laser/musket/prime + damage = 35 + stamina = 60 + +/obj/projectile/beam/disabler/smoothbore/prime + stamina = 65 + +/obj/item/ammo_casing/energy/laser/musket + fire_sound = 'sound/weapons/lasercannonfire.ogg' + +/obj/item/ammo_casing/energy/laser/musket/syndicate + projectile_type = /obj/projectile/beam/laser/musket/syndicate + e_cost = 125 + fire_sound = 'sound/weapons/laser2.ogg' + +/obj/projectile/beam/laser/musket/syndicate + name = "resonant laser" + damage = 30 + stamina = 65 + weak_against_armour = FALSE + armour_penetration = 25 //less powerful than armor piercing rounds + wound_bonus = 10 diff --git a/monkestation/code/game/objects/items/guns/wt_ammo.dm b/monkestation/code/game/objects/items/guns/wt_ammo.dm new file mode 100644 index 000000000000..6da2a152b2f0 --- /dev/null +++ b/monkestation/code/game/objects/items/guns/wt_ammo.dm @@ -0,0 +1,48 @@ +/obj/item/ammo_box/magazine/wt550m9/wtrub + name = "wt550 magazine (Rubber 4.6x30mm)" + icon = 'monkestation/icons/obj/guns/ammo.dmi' + icon_state = "46x30mmtR-20" + base_icon_state = "46x30mmtR" + ammo_type = /obj/item/ammo_casing/c46x30mm/rub + +/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon_state() + . = ..() + icon_state = "[base_icon_state]-[round(ammo_count(), 4)]" + +/obj/item/ammo_casing/c46x30mm/rub + name = "4.6x30mm rubber bullet casing" + desc = "A 4.6x30mm rubber bullet casing." + projectile_type = /obj/projectile/bullet/c46x30mm/rub + +/obj/projectile/bullet/c46x30mm/rub + name = "4.6x30mm rubber bullet" + damage = 4 + stamina = 35 + embedding = null + sharpness = NONE + +/obj/item/ammo_box/magazine/wt550m9/wtsalt + name = "wt550 magazine (Saltshot 4.6x30mm)" + icon = 'monkestation/icons/obj/guns/ammo.dmi' + icon_state = "46x30mmtS-20" + base_icon_state = "46x30mmtS" + ammo_type = /obj/item/ammo_casing/c46x30mm/salt + +/obj/item/ammo_box/magazine/wt550m9/wtic/update_icon_state() + . = ..() + icon_state = "[base_icon_state]-[round(ammo_count(), 4)]" + +/obj/item/ammo_casing/c46x30mm/salt + name = "4.6x30mm saltshot bullet casing" + desc = "A 4.6x30mm saltshot bullet casing." + projectile_type = /obj/projectile/bullet/c46x30mm/salt + +/obj/projectile/bullet/c46x30mm/salt + name = "4.6x30mm saltshot bullet" + damage = 0 + stamina = 30 + embedding = null + sharpness = NONE + +/obj/item/gun/ballistic/automatic/wt550/no_mag + spawnwithmagazine = FALSE diff --git a/monkestation/code/game/objects/items/implants/hardlight.dm b/monkestation/code/game/objects/items/implants/hardlight.dm index e0c5c5bbd24d..94e5a5becbe2 100644 --- a/monkestation/code/game/objects/items/implants/hardlight.dm +++ b/monkestation/code/game/objects/items/implants/hardlight.dm @@ -1,27 +1,79 @@ /obj/item/implant/hard_spear name = "hardlight spear implant" - icon = 'monkestation/icons/obj/implants.dmi' - icon_state = "lightspear" //Shows up as the action button icon + actions_types = null implant_color = "b" - uses = -1 - COOLDOWN_DECLARE(hardlight_implant_cooldown) + allow_multiple = TRUE + var/timerid + var/deltime = 3 SECONDS + /// The typepath of the spell we give to people. (yes this is copy pasted from spell implants, yes this has different functionality) + var/datum/action/cooldown/spell/spell_type = /datum/action/cooldown/spell/conjure_item/hardlight_spear + /// The actual spell we give to the person on implant + var/datum/action/cooldown/spell/spell_to_give + /// Does this implant contain a spell + var/spell_inside = FALSE + /// What is the level of the spell inside + var/spell_inside_level = 1 -/obj/item/implant/hard_spear/activate() - if(!COOLDOWN_FINISHED(src, hardlight_implant_cooldown)) //Thanks implant_abductor.dm for the help <3 - to_chat(imp_in, "You must wait [COOLDOWN_TIMELEFT(src, hardlight_implant_cooldown)*0.1] seconds to use [src] again!") +/obj/item/implant/hard_spear/Initialize(mapload) + . = ..() + if(!spell_type) return - var/obj/item/spear/hardlight_spear/summoned_spear - summoned_spear = new /obj/item/spear/hardlight_spear(imp_in.loc) - if(imp_in.put_in_hands(summoned_spear,TRUE)) - to_chat(imp_in, "A spear manifests in your hand.") - playsound(imp_in, 'sound/weapons/saberon.ogg', 35, 1) - QDEL_IN(summoned_spear, 10 SECONDS) - COOLDOWN_START(src, hardlight_implant_cooldown, 20 SECONDS) - else - to_chat(imp_in, "You must have a free hand to summon a spear!") + spell_to_give = new spell_type(src) + +/obj/item/implant/hard_spear/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) + . = ..() + if (!.) return + if (!spell_to_give) + return FALSE + + var/datum/action/cooldown/spell/existing = locate(spell_to_give) in user.actions + if(existing) + if(!existing.level_spell()) + to_chat(target, span_boldnotice("The implant is unable to upgrade your hardlight spear further")) + return FALSE + timerid = QDEL_IN_STOPPABLE(src, deltime) + return TRUE + spell_inside = TRUE + spell_to_give.Grant(target) + return TRUE + +/obj/item/implant/hard_spear/removed(mob/living/source, silent, special) + . = ..() + if (!.) + return FALSE + + if(spell_inside) + if(spell_to_give) + spell_inside_level = spell_to_give.spell_level + spell_to_give.Remove(source) + if(source.stat != DEAD && !silent) + to_chat(source, span_boldnotice("")) + + if(timerid) + deltimer(timerid) + timerid = null + + +/obj/item/implant/hard_spear/Destroy() + QDEL_NULL(spell_to_give) + return ..() + +/obj/item/implant/hard_spear/get_data() + var/dat = {"Implant Specifications:
+ Name: Aetherofusion Hardlight Weapons Platform
+ Life: 67 years in a dead host.
+ Important Notes: The insertion of additional copies of this implant will upgrade the orignal one. Efficacy not shown after 5 upgrades.
+
+ Implant Details:
+ Function: Preforms and maintains a series of classified modifications to the body.
+ Special Features: Allows the implantee to control a single hardlight spear, further implants will allow for up to 4 additional spears.
+ System Resonance: Internal resonance level suggests a [spell_to_give] is contained within.
+ Integrity: Implant acquires waste material in the blood for self-repair, giving it an unlimited lifespan in a living host."} + return dat + /obj/item/implanter/hard_spear name = "implanter (hardlight spear)" imp_type = /obj/item/implant/hard_spear @@ -31,42 +83,215 @@ desc = "A glass case containing a hardlight spear implant." imp_type = /obj/item/implant/hard_spear -/obj/item/spear/hardlight_spear + +/obj/item/implant/hard_spear/max + name = "hardlight spear implant" + spell_type = /datum/action/cooldown/spell/conjure_item/hardlight_spear/max + allow_multiple = FALSE + +/obj/item/implant/hard_spear/get_data() + var/dat = {"Implant Specifications:
+ Name: Aetherofusion Experimental Resonance System
+ Life: 8 millennia in a dead host.
+ Important Notes: The insertion of additional copies of this implant will do nothing, you cannot improve on perfection.
+
+ Implant Details:
+ Function: CLASSIFIED.
+ Special Features: Allows the implantee to control seven hardlight spears.
+ System Resonance: Internal resonance level is above readable levels.
+ Integrity: Implant acquires waste material in the blood for self-repair, giving it an unlimited lifespan in a living host."} + return dat + +/obj/item/implanter/hard_spear/max + name = "implanter (hardlight spear)" + imp_type = /obj/item/implant/hard_spear/max + +/obj/item/implantcase/hard_spear/max + name = "implant case - 'Hardlight Spear'" + desc = "A glass case containing a hardlight spear implant." + imp_type = /obj/item/implant/hard_spear/max + +/datum/action/cooldown/spell/conjure_item/hardlight_spear + name = "Hardlight Spear" + desc = "Summon a spear of light to strike down your foes." + button_icon = 'monkestation/icons/obj/items_and_weapons.dmi' + button_icon_state = "lightspear" + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_HANDS_BLOCKED|AB_CHECK_INCAPACITATED + sound = 'sound/weapons/saberon.ogg' + + school = SCHOOL_CONJURATION + cooldown_time = 20 SECONDS + invocation_type = INVOCATION_NONE + + spell_requirements = SPELL_REQUIRES_HUMAN + antimagic_flags = NONE + spell_max_level = 5 //max is actually 7(the point where the sprites stop working), but the implant can only reach 5 + + delete_old = FALSE + item_type = /obj/item/gun/magic/hardlight_spear + +/datum/action/cooldown/spell/conjure_item/hardlight_spear/before_cast(mob/living/cast_on) + . = ..() + for(var/I in cast_on.get_contents()) + if(istype(I, /obj/item/gun/magic/hardlight_spear)) + return . | SPELL_CANCEL_CAST + + +/datum/action/cooldown/spell/conjure_item/hardlight_spear/make_item() + . = ..() + var/obj/item/gun/magic/hardlight_spear/made_spear = . + made_spear.spears_left = spell_level-1 + +/datum/action/cooldown/spell/conjure_item/hardlight_spear/get_spell_title() + switch(spell_level) + if(2) + return "Upgraded " + if(3) + return "Recursive " + if(4) + return "Resonant " + if(5) + return "Ascended " + if(6) + return "Overwhelming " + if(7) + return "Commmanding " + + return "" + +/datum/action/cooldown/spell/conjure_item/hardlight_spear/max + name = "Commmanding Hardlight Spear" + cooldown_time = 10 SECONDS + spell_level = 7 + +/datum/action/cooldown/spell/conjure_item/hardlight_spear/max/get_spell_title() + return "" //commanding commanding + +/obj/item/gun/magic/hardlight_spear //listen man + name = "hardlight spear" + desc = "A spear made out of hardened light." + fire_sound = 'sound/weapons/fwoosh.ogg' + pinless = TRUE + force = 25 + wound_bonus = -5 + bare_wound_bonus = 20 + armour_penetration = 18 + block_chance = 0 + sharpness = SHARP_POINTY + w_class = WEIGHT_CLASS_HUGE + antimagic_flags = NONE + hitsound = 'sound/weapons/blade1.ogg' icon = 'monkestation/icons/obj/items_and_weapons.dmi' icon_state = "lightspear" inhand_icon_state = "lightspear" - icon_prefix = "lightspear" worn_icon_state = "none" lefthand_file = 'monkestation/icons/mob/inhands/polearms_lefthand.dmi' righthand_file = 'monkestation/icons/mob/inhands/polearms_righthand.dmi' - name = "hardlight spear" - desc = "A spear made out of hardened light." - force = 15 - w_class = WEIGHT_CLASS_BULKY - slot_flags = NONE + slot_flags = null + can_charge = FALSE //ITS A SPEAR + item_flags = NEEDS_PERMIT | DROPDEL | ABSTRACT | NO_MAT_REDEMPTION + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF light_system = MOVABLE_LIGHT light_outer_range = 3 light_power = 1 - throwforce = 25 - throw_speed = 6 - armour_penetration = 18 - hitsound = 'sound/weapons/blade1.ogg' - sharpness = SHARP_POINTY + max_charges = 1 + var/spears_left = 5 + ammo_type = /obj/item/ammo_casing/magic/hardlight_spear -/obj/item/spear/hardlight_spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) +/obj/item/gun/magic/hardlight_spear/Initialize(mapload) . = ..() - if(hit_atom && !QDELETED(hit_atom)) - if(istype(hit_atom, /mob/living)) //Living mobs handle hit sounds differently. - var/volume = get_volume_by_throwforce_and_or_w_class() - playsound(hit_atom, 'sound/weapons/genhit.ogg',volume, TRUE, -1) - else - playsound(src, drop_sound, 60, ignore_walls = FALSE) - qdel(src) //Deletes when it gets thrown at somethign - return hit_atom.hitby(src, 0, 0, throwingdatum=throwingdatum) - -/obj/item/spear/hardlight_spear/unembedded() + AddComponent(/datum/component/jousting) + + AddComponent(/datum/component/butchering, \ + speed = 10 SECONDS, \ + effectiveness = 70, \ + ) + + block_chance = 5+spears_left*5 + +/obj/item/gun/magic/hardlight_spear/worn_overlays(mutable_appearance/standing, isinhands) . = ..() - QDEL_NULL(src) //Deletes itself when unembedded + if(!isinhands) //HOW ARE YOU DOING THIS + return + if(!spears_left) + return + var/mutable_appearance/back_spear_overlay + switch(spears_left) + if(0) + return + if(1) + back_spear_overlay = mutable_appearance('monkestation/icons/effects/hardlightspear.dmi', "spear1", MOB_SHIELD_LAYER) + if(2) + back_spear_overlay = mutable_appearance('monkestation/icons/effects/hardlightspear.dmi', "spear2", MOB_SHIELD_LAYER) + if(3) + back_spear_overlay = mutable_appearance('monkestation/icons/effects/hardlightspear.dmi', "spear3", MOB_SHIELD_LAYER) + if(4) + back_spear_overlay = mutable_appearance('monkestation/icons/effects/hardlightspear.dmi', "spear4", MOB_SHIELD_LAYER) + if(5) + back_spear_overlay = mutable_appearance('monkestation/icons/effects/hardlightspear.dmi', "spear5", MOB_SHIELD_LAYER) + if(6) + back_spear_overlay = mutable_appearance('monkestation/icons/effects/hardlightspear.dmi', "spear6", MOB_SHIELD_LAYER) + back_spear_overlay.pixel_x = -32 + . += back_spear_overlay + + +/obj/item/gun/magic/hardlight_spear/can_trigger_gun(mob/living/user, akimbo_usage) // This isn't really a gun, so it shouldn't be checking for TRAIT_NOGUNS, a firing pin (pinless), or a trigger guard (guardless) + if(akimbo_usage) + return FALSE //this would be kinda weird while shooting someone down. return TRUE +/obj/item/gun/magic/hardlight_spear/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) + . = ..() + if(!.) + return + if(spears_left) + var/obj/item/gun/magic/hardlight_spear/spear = new type + spear.spears_left = spears_left - 1 + qdel(src) + user.put_in_hands(spear) + else + user.dropItemToGround(src, TRUE) + +/obj/item/ammo_casing/magic/hardlight_spear + name = "please god report this" + desc = "Why god why" + slot_flags = null + projectile_type = /obj/projectile/bullet/hardlight_spear + heavy_metal = FALSE + +/obj/item/ammo_casing/magic/hardlight_spear/ready_proj(atom/target, mob/living/user, quiet, zone_override, atom/fired_from) + if(!loaded_projectile) + return + + if(isliving(target)) + loaded_projectile.homing = TRUE + loaded_projectile.homing_turn_speed = 40 + loaded_projectile.set_homing_target(target) + + return ..() + +/obj/projectile/bullet/hardlight_spear + name = "hardlight spear" + icon = 'monkestation/icons/obj/guns/projectiles.dmi' + icon_state = "lightspear" + damage = 45 + armour_penetration = 10 + wound_bonus = 5 + bare_wound_bonus = 60 + wound_falloff_tile = 0 + embed_falloff_tile = 0 + speed = 0.4 //lower = faster + shrapnel_type = /obj/item/shrapnel/bullet/spear + hitsound = 'sound/weapons/bladeslice.ogg' + hitsound_wall = 'sound/weapons/parry.ogg' + embedding = list(embed_chance=100, fall_chance=2, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.5, pain_mult=5, jostle_pain_mult=6, rip_time=10) +/obj/item/shrapnel/bullet/spear + name = "hardlight spear" + icon = 'monkestation/icons/obj/items_and_weapons.dmi' + icon_state = "lightspear" + +/obj/item/shrapnel/bullet/spear/unembedded() + . = ..() + QDEL_NULL(src) //Deletes itself when unembedded + return TRUE diff --git a/monkestation/code/game/objects/items/miningweapons.dm b/monkestation/code/game/objects/items/miningweapons.dm index 13d1cfe3d1f7..4e687c135ecb 100644 --- a/monkestation/code/game/objects/items/miningweapons.dm +++ b/monkestation/code/game/objects/items/miningweapons.dm @@ -11,7 +11,7 @@ the same technology into a smaller more portable package. The machete design was chosen as to make a much easier to handle and less cumbersome frame. Of course \ the smaller package means that the power is not as high as the original crusher design, but the different shell makes it capable of blocking basic attacks." force = 15 - block_chance = 50 + block_chance = 25 w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BELT throwforce = 5 @@ -22,10 +22,10 @@ attack_verb_continuous = list("slashes", "cuts", "cleaves", "chops", "swipes") attack_verb_simple = list("cleave", "chop", "cut", "swipe", "slash") sharpness = SHARP_EDGED - actions_types = NONE + actions_types = list(/datum/action/item_action/toggle_light) obj_flags = NONE - light_system = NONE - light_outer_range = 0 + light_system = MOVABLE_LIGHT + light_outer_range = 5 light_on = FALSE charged = TRUE charge_time = 10 @@ -65,10 +65,10 @@ attack_verb_continuous = list("pierces", "stabs", "impales", "pokes", "jabs") attack_verb_simple = list("imaple", "stab", "pierce", "jab", "poke") sharpness = SHARP_EDGED - actions_types = NONE + actions_types = list(/datum/action/item_action/toggle_light) obj_flags = UNIQUE_RENAME - light_system = NONE - light_outer_range = 0 + light_system = MOVABLE_LIGHT + light_outer_range = 8 light_on = FALSE charged = TRUE charge_time = 15 @@ -114,7 +114,7 @@ attack_verb_continuous = list("slams", "crushes", "smashes", "flattens", "pounds") attack_verb_simple = list("slam", "crush", "smash", "flatten", "pound") sharpness = NONE - actions_types = NONE + actions_types = list(/datum/action/item_action/toggle_light) obj_flags = UNIQUE_RENAME light_system = MOVABLE_LIGHT light_outer_range = 5 @@ -167,10 +167,10 @@ attack_verb_continuous = list("swipes", "slashes", "cuts", "slaps") attack_verb_simple = list("swipe", "slash", "cut", "slap") sharpness = SHARP_POINTY - actions_types = NONE + actions_types = list(/datum/action/item_action/toggle_light) obj_flags = UNIQUE_RENAME light_system = MOVABLE_LIGHT - light_outer_range = 5 + light_outer_range = 4 light_on = FALSE charged = TRUE charge_time = 2 diff --git a/monkestation/code/game/objects/items/mothlet_grenade.dm b/monkestation/code/game/objects/items/mothlet_grenade.dm index f642e33d3678..6a51961b8cdc 100644 --- a/monkestation/code/game/objects/items/mothlet_grenade.dm +++ b/monkestation/code/game/objects/items/mothlet_grenade.dm @@ -26,9 +26,9 @@ embedding = list(embed_chance=0, ignore_throwspeed_threshold=TRUE, fall_chance=1) -/obj/projectile/bullet/shrapnel/mothlet/on_hit(owner) +/obj/projectile/bullet/shrapnel/mothlet/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() - if(iscarbon(owner) && prob(50)) - var/mob/living/carbon/carbon_owner = owner + if(iscarbon(target) && prob(50)) + var/mob/living/carbon/carbon_owner = target carbon_owner.unequip_everything() diff --git a/monkestation/code/game/objects/items/storage/uplink_kits.dm b/monkestation/code/game/objects/items/storage/uplink_kits.dm index aabb3983d513..71ca4839d822 100644 --- a/monkestation/code/game/objects/items/storage/uplink_kits.dm +++ b/monkestation/code/game/objects/items/storage/uplink_kits.dm @@ -4,6 +4,12 @@ /obj/item/storage/box/syndie_kit/imp_hard_spear/PopulateContents() new /obj/item/implanter/hard_spear(src) +/obj/item/storage/box/syndie_kit/imp_hard_spear/max + name = "commanding hardlight spear implant box" + +/obj/item/storage/box/syndie_kit/imp_hard_spear/max/PopulateContents() + new /obj/item/implanter/hard_spear/max(src) + /obj/item/storage/box/syndimaid diff --git a/monkestation/code/game/sound.dm b/monkestation/code/game/sound.dm index c9309e817d9d..072ece63bd35 100644 --- a/monkestation/code/game/sound.dm +++ b/monkestation/code/game/sound.dm @@ -67,7 +67,7 @@ return GLOB.always_state /datum/ui_module/volume_mixer/proc/set_channel_volume(channel, vol, mob/user) - if(channel == CHANNEL_LOBBYMUSIC) + if((channel == CHANNEL_LOBBYMUSIC) || (channel == CHANNEL_MASTER_VOLUME)) if(isnewplayer(user)) user.client.media.update_volume(0.5 + (vol * 0.05)) @@ -77,6 +77,8 @@ /proc/get_channel_name(channel) switch(channel) + if(CHANNEL_MASTER_VOLUME) + return "Master Volume" if(CHANNEL_LOBBYMUSIC) return "Lobby Music" if(CHANNEL_ADMIN) diff --git a/monkestation/code/game/turfs/open/water.dm b/monkestation/code/game/turfs/open/water.dm new file mode 100644 index 000000000000..2ec9f204db49 --- /dev/null +++ b/monkestation/code/game/turfs/open/water.dm @@ -0,0 +1,24 @@ +/turf/open/water + ///Do we give the player_sink component + var/sinking = FALSE + ///If we have one then what should our player_sink max_sinkage be set to, leave unset for default sinkage + var/max_sinkage + +/turf/open/water/Initialize(mapload) + . = ..() + if(sinking) + RegisterSignal(src, COMSIG_ATOM_ENTERED, PROC_REF(try_add_sinking)) + +/turf/open/water/proc/try_add_sinking(turf/open/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) + if(arrived.GetComponent(/datum/component/player_sink)) + return + arrived.AddComponent(/datum/component/player_sink, max_sinkage = src.max_sinkage, type_to_add = src.type) + +/turf/open/water/beach/biodome/sinking + name = "Water" + desc = "You get the feeling that somebody's bothered to actually make this water partly functional..." + sinking = TRUE + +//the tram beachside bar has 1 tile of this +/turf/open/water/beach/biodome/sinking/deep + max_sinkage = 28 diff --git a/monkestation/code/modules/admin/ggg/where_are_your_fingers.dm b/monkestation/code/modules/admin/ggg/where_are_your_fingers.dm new file mode 100644 index 000000000000..a209e53dd53b --- /dev/null +++ b/monkestation/code/modules/admin/ggg/where_are_your_fingers.dm @@ -0,0 +1,19 @@ +/// Rips off the target's arms +/datum/smite/where_are_your_fingers + name = "Where are your fingers?" + +/datum/smite/where_are_your_fingers/effect(client/user, mob/living/target) + . = ..() + + if (!iscarbon(target)) + to_chat(user, span_warning("This must be used on a carbon mob."), confidential = TRUE) + return + + var/mob/living/carbon/carbon_target = target + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), carbon_target, 'monkestation/sound/effects/ggg/whereareyourfingers.mp3', 70), 0 SECONDS) + + for (var/_limb in carbon_target.bodyparts) + var/obj/item/bodypart/limb = _limb + if (limb.body_part == HEAD || limb.body_part == CHEST || limb.body_part == LEG_LEFT || limb.body_part == LEG_RIGHT) + continue + addtimer(CALLBACK(limb, TYPE_PROC_REF(/obj/item/bodypart/, dismember)), 5 SECONDS) diff --git a/monkestation/code/modules/admin/smites/dagothkillsmite.dm b/monkestation/code/modules/admin/smites/dagothkillsmite.dm new file mode 100644 index 000000000000..e8c58260673d --- /dev/null +++ b/monkestation/code/modules/admin/smites/dagothkillsmite.dm @@ -0,0 +1,25 @@ +// Dagoth KILL Smite! (ported from Biblefart code) - Dexee +// tweaked the name of this to make it extremely apparent that someone's gonna get fucked up. completely and utterly apparent. will be making a separate funny smite that doesn't kill + +/datum/smite/dagothkillsmite + name = "Dagoth KILL Smite" + +/datum/smite/dagothkillsmite/effect(client/user, mob/living/target) + . = ..() + if (!iscarbon(target)) + to_chat(user, span_warning("This must be used on a carbon mob."), confidential = TRUE) + return + var/mob/living/carbon/human/Person = target + var/turf/Location = get_turf(target) + var/turf/T = get_step(get_step(Person, NORTH), NORTH) + to_chat(Person,span_ratvar("What a grand and intoxicating innocence. Perish.")) + T.Beam(Person, icon_state="lightning[rand(1,12)]", time = 1.5 SECONDS) + Person.unequip_everything() + Person.Paralyze(15) + playsound(target,'sound/magic/lightningshock.ogg', 50, 1) + playsound(target,'monkestation/sound/misc/dagothgod.ogg', 80) + Person.electrocution_animation(15) + spawn(15) + Person.gib() + playsound(Location,'sound/effects/explosion3.ogg', 75, 1) + return diff --git a/monkestation/code/modules/admin/smites/dagothstripsmite.dm b/monkestation/code/modules/admin/smites/dagothstripsmite.dm new file mode 100644 index 000000000000..89839cd60fa1 --- /dev/null +++ b/monkestation/code/modules/admin/smites/dagothstripsmite.dm @@ -0,0 +1,17 @@ +// The Dagoth Strip! To have something that doesn't kill but you still wanna humiliate someone! -Dexee + +/datum/smite/dagothstripsmite + name = "Dagoth STRIP" + +/datum/smite/dagothstripsmite/effect(client/user, mob/living/target) + . = ..() + if (!iscarbon(target)) + to_chat(user, span_warning("This must be used on a carbon mob."), confidential = TRUE) + return + var/mob/living/carbon/human/Person = target + to_chat(Person,span_ratvar("Why have you come unprepared?")) + Person.unequip_everything() + Person.Paralyze(15) + playsound(target,'monkestation/sound/misc/dagothgod.ogg', 80) + return + diff --git a/monkestation/code/modules/aesthetics/objects/railing.dm b/monkestation/code/modules/aesthetics/objects/railing.dm index 3814ef943151..9fc5af17deae 100644 --- a/monkestation/code/modules/aesthetics/objects/railing.dm +++ b/monkestation/code/modules/aesthetics/objects/railing.dm @@ -8,6 +8,8 @@ var/neighbor_status = list() ///list of smoothing we need doing +/obj/structure/railing/wood + custom_materials = list(/datum/material/wood = 100) /obj/structure/railing/Initialize(mapload) . = ..() diff --git a/monkestation/code/modules/antagonists/clock_cult/mechas/mecha_effects.dm b/monkestation/code/modules/antagonists/clock_cult/mechas/mecha_effects.dm index f9ec021a6e6a..7e09522241e2 100644 --- a/monkestation/code/modules/antagonists/clock_cult/mechas/mecha_effects.dm +++ b/monkestation/code/modules/antagonists/clock_cult/mechas/mecha_effects.dm @@ -38,7 +38,7 @@ else marked_mob.Paralyze(0.5 SECONDS) marked_mob.Knockdown(3 SECONDS) - marked_mob.apply_damage_type(30, BURN) + marked_mob.apply_damage(30, BURN) marked_mob.visible_message(span_warning("[marked_mob] is hit by a judicial explosion!"), span_warning("You feel the ground beneath you heat up!")) sleep(0.3 SECONDS) diff --git a/monkestation/code/modules/antagonists/clock_cult/mobs/clockwork_marauder.dm b/monkestation/code/modules/antagonists/clock_cult/mobs/clockwork_marauder.dm index 7a4203c2912b..7a570ecf21f9 100644 --- a/monkestation/code/modules/antagonists/clock_cult/mobs/clockwork_marauder.dm +++ b/monkestation/code/modules/antagonists/clock_cult/mobs/clockwork_marauder.dm @@ -119,7 +119,7 @@ GLOBAL_LIST_EMPTY(clockwork_marauders) /datum/ai_controller/basic_controller/clockwork_marauder blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/clockwork_marauder() + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance @@ -137,10 +137,6 @@ GLOBAL_LIST_EMPTY(clockwork_marauders) action_cooldown = 1.2 SECONDS -/datum/targetting_datum/basic/clockwork_marauder - stat_attack = HARD_CRIT - - /obj/item/nullrod/Initialize(mapload) . = ..() AddElement(/datum/element/bane, /mob/living/basic/clockwork_marauder, 1, 15, FALSE) diff --git a/monkestation/code/modules/antagonists/clock_cult/mobs/cogscarab.dm b/monkestation/code/modules/antagonists/clock_cult/mobs/cogscarab.dm index 530238aaab16..d15c714cd5a4 100644 --- a/monkestation/code/modules/antagonists/clock_cult/mobs/cogscarab.dm +++ b/monkestation/code/modules/antagonists/clock_cult/mobs/cogscarab.dm @@ -4,7 +4,7 @@ GLOBAL_LIST_EMPTY(cogscarabs) //====Cogscarab==== -/mob/living/simple_animal/drone/cogscarab +/mob/living/basic/drone/cogscarab name = "Cogscarab" desc = "A mechanical device, filled with twisting cogs and mechanical parts, built to maintain Reebe." icon_state = "drone_clock" @@ -31,7 +31,7 @@ GLOBAL_LIST_EMPTY(cogscarabs) var/stay_on_reebe = TRUE //No you can't go wielding guns like that. -/mob/living/simple_animal/drone/cogscarab/Initialize(mapload) +/mob/living/basic/drone/cogscarab/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NOGUNS, "cogscarab") GLOB.cogscarabs += src @@ -40,16 +40,16 @@ GLOBAL_LIST_EMPTY(cogscarabs) /datum/actionspeed_modifier/cogscarab multiplicative_slowdown = 0.6 -/mob/living/simple_animal/drone/cogscarab/death(gibbed) +/mob/living/basic/drone/cogscarab/death(gibbed) GLOB.cogscarabs -= src . = ..() -/mob/living/simple_animal/drone/cogscarab/Life(seconds, times_fired) +/mob/living/basic/drone/cogscarab/Life(seconds, times_fired) if(!on_reebe(src) && !GLOB.ratvar_risen && GLOB.abscond_markers && stay_on_reebe) try_servant_warp(src, get_turf(pick(GLOB.abscond_markers))) . = ..() -/mob/living/simple_animal/drone/cogscarab/Destroy() +/mob/living/basic/drone/cogscarab/Destroy() GLOB.cogscarabs -= src return ..() @@ -61,7 +61,7 @@ GLOBAL_LIST_EMPTY(cogscarabs) icon = 'monkestation/icons/obj/clock_cult/clockwork_objects.dmi' icon_state = "cogscarab_shell" mob_name = "cogscarab" - mob_type = /mob/living/simple_animal/drone/cogscarab + mob_type = /mob/living/basic/drone/cogscarab role_ban = ROLE_CLOCK_CULTIST prompt_name = "a cogscarab" you_are_text = "You are a cogscarab!" diff --git a/monkestation/code/modules/antagonists/clock_cult/ratvar.dm b/monkestation/code/modules/antagonists/clock_cult/ratvar.dm index c68e0c0ef4c9..15ef901a7840 100644 --- a/monkestation/code/modules/antagonists/clock_cult/ratvar.dm +++ b/monkestation/code/modules/antagonists/clock_cult/ratvar.dm @@ -109,7 +109,7 @@ GLOBAL_DATUM(cult_ratvar, /obj/ratvar) if(!user.mind) //this should not happen but just to be safe return . = ..() - var/mob/living/simple_animal/drone/created_drone = new /mob/living/simple_animal/drone/cogscarab(get_turf(src)) + var/mob/living/basic/drone/created_drone = new /mob/living/basic/drone/cogscarab(get_turf(src)) created_drone.flags_1 |= (flags_1 & ADMIN_SPAWNED_1) user.mind.transfer_to(created_drone, TRUE) diff --git a/monkestation/code/modules/antagonists/clock_cult/scriptures/_scripture.dm b/monkestation/code/modules/antagonists/clock_cult/scriptures/_scripture.dm index 4265294de515..881d3420c5bf 100644 --- a/monkestation/code/modules/antagonists/clock_cult/scriptures/_scripture.dm +++ b/monkestation/code/modules/antagonists/clock_cult/scriptures/_scripture.dm @@ -402,10 +402,8 @@ GLOBAL_LIST_EMPTY(clock_scriptures_by_type) return ..() -/datum/action/cooldown/spell/pointed/slab/InterceptClickOn(mob/living/caller, params, atom/clicked_atom) - parent_scripture?.click_on(clicked_atom) - - +/datum/action/cooldown/spell/pointed/slab/InterceptClickOn(mob/living/caller, params, atom/target) + parent_scripture?.click_on(target) /// Generate all scriptures in a global assoc of name:ref. Only needs to be done once /proc/generate_clockcult_scriptures() diff --git a/monkestation/code/modules/antagonists/clock_cult/scriptures/preservation/clockwork_armaments.dm b/monkestation/code/modules/antagonists/clock_cult/scriptures/preservation/clockwork_armaments.dm index 7ffded8b7c17..74b3888b62ed 100644 --- a/monkestation/code/modules/antagonists/clock_cult/scriptures/preservation/clockwork_armaments.dm +++ b/monkestation/code/modules/antagonists/clock_cult/scriptures/preservation/clockwork_armaments.dm @@ -37,4 +37,4 @@ base_outfit.equip(invoker) - invoker.put_in_hands(new weapon_path, FALSE, forced = FALSE) + invoker.put_in_hands(new weapon_path, FALSE) diff --git a/monkestation/code/modules/antagonists/clock_cult/structures/sigil/sigil_submission.dm b/monkestation/code/modules/antagonists/clock_cult/structures/sigil/sigil_submission.dm index 8453567642d6..861d0bb629cc 100644 --- a/monkestation/code/modules/antagonists/clock_cult/structures/sigil/sigil_submission.dm +++ b/monkestation/code/modules/antagonists/clock_cult/structures/sigil/sigil_submission.dm @@ -32,7 +32,7 @@ GLOB.main_clock_cult?.check_member_distribution() if(isdrone(converted_mob) && (GLOB.cogscarabs.len < MAXIMUM_COGSCARABS)) - var/mob/living/simple_animal/drone/cogscarab/cogger = new /mob/living/simple_animal/drone/cogscarab(get_turf(src)) + var/mob/living/basic/drone/cogscarab/cogger = new /mob/living/basic/drone/cogscarab(get_turf(src)) cogger.key = converted_mob.key cogger.mind?.add_antag_datum(/datum/antagonist/clock_cultist) cogger.visible_message("A light envelops \the [converted_mob]! As the light fades you see it has become a cogscarab!", diff --git a/monkestation/code/modules/antagonists/clock_cult/structures/traps/trap.dm b/monkestation/code/modules/antagonists/clock_cult/structures/traps/trap.dm index add2ffa96064..0f8060466485 100644 --- a/monkestation/code/modules/antagonists/clock_cult/structures/traps/trap.dm +++ b/monkestation/code/modules/antagonists/clock_cult/structures/traps/trap.dm @@ -117,7 +117,7 @@ outputs |= input.parent -/// Adds this as an output to the targetted component's `outputs` list +/// Adds this as an output to the targeted component's `outputs` list /datum/component/clockwork_trap/proc/add_output(datum/component/clockwork_trap/output) output.outputs |= parent diff --git a/monkestation/code/modules/antagonists/florida_man/florida_events.dm b/monkestation/code/modules/antagonists/florida_man/florida_events.dm index aa63c44d3cda..2cb54c226321 100644 --- a/monkestation/code/modules/antagonists/florida_man/florida_events.dm +++ b/monkestation/code/modules/antagonists/florida_man/florida_events.dm @@ -3,6 +3,9 @@ typepath = /datum/round_event/ghost_role/florida_man weight = 14 max_occurrences = 3 + track = EVENT_TRACK_MODERATE + tags = list(TAG_DESTRUCTIVE, TAG_COMBAT, TAG_EXTERNAL) + checks_antag_cap = TRUE /datum/round_event/ghost_role/florida_man minimum_required = 1 diff --git a/monkestation/code/modules/antagonists/slasher/__base_slasher_additions.dm b/monkestation/code/modules/antagonists/slasher/__base_slasher_additions.dm new file mode 100644 index 000000000000..861100e1a014 --- /dev/null +++ b/monkestation/code/modules/antagonists/slasher/__base_slasher_additions.dm @@ -0,0 +1,13 @@ +/atom/movable/screen/fullscreen/soul_punishment + icon_state = "soul_punishment" + alpha = 60 + +/atom/movable/screen/fullscreen/nearby // made seperate from soul punishment because the intensity gets worse over time + icon_state = "soul_punishment" + alpha = 100 + +/mob/living + /// A weak reference to the team monitor component contained within the monitor holder, used for certain antagoists so they can track + var/datum/component/team_monitor/team_monitor + ///a reference to a stored /datum/component/tracking_beacon used by victims of antags + var/datum/component/tracking_beacon/tracking_beacon diff --git a/monkestation/code/modules/antagonists/slasher/abilities/_slasher_base.dm b/monkestation/code/modules/antagonists/slasher/abilities/_slasher_base.dm new file mode 100644 index 000000000000..4dec439f57b4 --- /dev/null +++ b/monkestation/code/modules/antagonists/slasher/abilities/_slasher_base.dm @@ -0,0 +1,13 @@ +/datum/action/cooldown/slasher + name = "Slasher Possession" + desc = "You've been possessed by the Slasher... not actually, please report this to coders" + background_icon = 'goon/icons/mob/slasher.dmi' + background_icon_state = "slasher_background" + button_icon = 'goon/icons/mob/slasher.dmi' + button_icon_state = "slasher_template" + buttontooltipstyle = "cult" + transparent_when_unavailable = TRUE + click_to_activate = FALSE + +/datum/action/cooldown/slasher/IsAvailable(feedback = FALSE) + return next_use_time <= world.time diff --git a/monkestation/code/modules/antagonists/slasher/abilities/blood_walk.dm b/monkestation/code/modules/antagonists/slasher/abilities/blood_walk.dm new file mode 100644 index 000000000000..e846a42139a0 --- /dev/null +++ b/monkestation/code/modules/antagonists/slasher/abilities/blood_walk.dm @@ -0,0 +1,72 @@ +/datum/action/cooldown/slasher/blood_walk + name = "Blood Trail" + desc = "Begin trailing blood in your wake. Spooky! " + button_icon_state = "trail_blood" + + cooldown_time = 30 SECONDS + +/datum/action/cooldown/slasher/blood_walk/Activate(atom/target) + . = ..() + if(isliving(target)) + var/mob/living/mob_target = target + mob_target.set_timed_status_effect(15 SECONDS, /datum/status_effect/blood_trial) + + +/datum/status_effect/blood_trial + id = "blood_trial" + alert_type = null + +/datum/status_effect/blood_trial/on_creation(mob/living/new_owner, duration = 15 SECONDS) + src.duration = duration + return ..() + +/datum/status_effect/blood_trial/on_apply() + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + return TRUE + +/datum/status_effect/blood_trial/on_remove() + UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) + + +/datum/status_effect/blood_trial/proc/find_pool_by_blood_state(turf/turfLoc, typeFilter = null) + for(var/obj/effect/decal/cleanable/blood/pool in turfLoc) + if(pool.blood_state == BLOOD_STATE_HUMAN && (!typeFilter || istype(pool, typeFilter))) + return pool + + +/datum/status_effect/blood_trial/proc/on_move(atom/movable/mover, turf/old_loc) + var/turf/oldLocTurf = get_turf(old_loc) + if(prob(5)) + for(var/mob/living/carbon/human/human in view(7, oldLocTurf)) + if(human == owner) + continue + human.emote("scream") + human.stamina.adjust(-5) + human.Shake(duration = 3 SECONDS) + human.emote("cries blood") + var/turf/turf = get_turf(human) + var/list/blood_drop = list(human.get_blood_id() = 3) + turf.add_liquid_list(blood_drop, FALSE, 300) + + var/obj/effect/decal/cleanable/blood/footprints/oldLocFP = find_pool_by_blood_state(oldLocTurf, /obj/effect/decal/cleanable/blood/footprints) + if(oldLocFP) + // Footprints found in the tile we left, add us to it + if (!(oldLocFP.exited_dirs & mover.dir)) + oldLocFP.exited_dirs |= mover.dir + oldLocFP.update_appearance() + + else + oldLocFP = new(oldLocTurf) + if(!QDELETED(oldLocFP)) ///prints merged + oldLocFP.blood_state = BLOOD_STATE_HUMAN + oldLocFP.exited_dirs |= mover.dir + oldLocFP.bloodiness = 100 + oldLocFP.update_appearance() + + var/obj/effect/decal/cleanable/blood/footprints/FP = new(get_turf(100)) + if(!QDELETED(FP)) ///prints merged + FP.blood_state = BLOOD_STATE_HUMAN + FP.entered_dirs |= mover.dir + FP.bloodiness = 100 + FP.update_appearance() + diff --git a/monkestation/code/modules/antagonists/slasher/abilities/incorporealize.dm b/monkestation/code/modules/antagonists/slasher/abilities/incorporealize.dm new file mode 100644 index 000000000000..450051f08fe8 --- /dev/null +++ b/monkestation/code/modules/antagonists/slasher/abilities/incorporealize.dm @@ -0,0 +1,127 @@ +/datum/action/cooldown/slasher/incorporealize + name = "Incorporealize" + desc = "Become incorporeal, capable of moving through walls and being completely invisible, but unable to interact with the world. Can only be used when corporeal and when not in view of any human being." + button_icon_state = "incorporealize" + cooldown_time = 20 SECONDS + + var/jaunt_type = /obj/effect/dummy/phased_mob + +/datum/action/cooldown/slasher/incorporealize/Activate(atom/target) + var/datum/antagonist/slasher/slasherdatum = owner.mind.has_antag_datum(/datum/antagonist/slasher) + var/area/owner_area = get_area(owner) + var/turf/owner_turf = get_turf(owner) + + /** + * Here we start our checks + * We cant do it in PreActivate() since that for some reason does not work + */ + + // Standard jaunt checks + + if(!owner_area || !owner_turf) + return // nullspaced? + + if(owner_area.area_flags & NOTELEPORT) + to_chat(owner, span_danger("Some dull, universal force is stopping you from going incorporeal here.")) + return + + if(owner_turf?.turf_flags & NOJAUNT) + to_chat(owner, span_danger("An otherwordly force is preventing you from going incorporeal here.")) + return + + // Unique slasher checks + + if(!slasherdatum) + to_chat(owner, span_warning("You should not have this ability or your slasher antagonist datum was deleted, please contact coders")) + return + + if(slasherdatum.soul_punishment >= 2) + to_chat(owner, span_boldwarning("The souls you have stolen are preventing you from going incorporeal!")) + return + + for(var/mob/living/watchers in view(9, target) - target) + target.balloon_alert(owner, "you can only vanish unseen.") + return + + . = ..() + + if(is_jaunting(target)) + . = exit_jaunt(target) + else + . = enter_jaunt(target) + +/datum/action/cooldown/slasher/incorporealize/proc/enter_jaunt(mob/living/jaunter) + var/datum/antagonist/slasher/slasherdatum = owner.mind.has_antag_datum(/datum/antagonist/slasher) + + update_the_button(jaunter) + + animate(jaunter, alpha = 0, time = 1.5 SECONDS) + SLEEP_CHECK_DEATH(1.5 SECONDS, src) + + var/obj/effect/dummy/phased_mob/jaunt = new jaunt_type(get_turf(jaunter), jaunter) + + RegisterSignal(jaunt, COMSIG_MOB_EJECTED_FROM_JAUNT, PROC_REF(on_jaunt_exited)) + jaunter.add_traits(list(TRAIT_MAGICALLY_PHASED, TRAIT_RUNECHAT_HIDDEN), REF(src)) + jaunter.drop_all_held_items() + ADD_TRAIT(jaunter, TRAIT_NO_TRANSFORM, INNATE_TRAIT) + + // Give them some bloody hands to prevent them from doing things + var/obj/item/bloodcrawl/left_hand = new(jaunter) + var/obj/item/bloodcrawl/right_hand = new(jaunter) + left_hand.icon_state = "bloodhand_right" // Icons swapped intentionally.. + right_hand.icon_state = "bloodhand_left" // ..because perspective, or something + jaunter.put_in_hands(left_hand) + jaunter.put_in_hands(right_hand) + + // Make sure they wont be burning for 20 seconds + jaunter.extinguish_mob() + REMOVE_TRAIT(jaunter, TRAIT_NO_TRANSFORM, INNATE_TRAIT) + + slasherdatum.corporeal = FALSE + + // This needs to happen at the end, after all the traits and stuff is handled + SEND_SIGNAL(jaunter, COMSIG_MOB_ENTER_JAUNT, src, jaunt) + return jaunt + +/datum/action/cooldown/slasher/incorporealize/proc/exit_jaunt(mob/living/unjaunter) + var/datum/antagonist/slasher/slasherdatum = owner.mind.has_antag_datum(/datum/antagonist/slasher) + var/obj/effect/dummy/phased_mob/jaunt = unjaunter.loc + + update_the_button(unjaunter) + + jaunt.eject_jaunter() + + animate(unjaunter, alpha = 255, time = 1.5 SECONDS) + SLEEP_CHECK_DEATH(1.5 SECONDS, src) + + for(var/obj/item/bloodcrawl/blood_hand in unjaunter.held_items) + unjaunter.temporarilyRemoveItemFromInventory(blood_hand, force = TRUE) + qdel(blood_hand) + + slasherdatum.corporeal = TRUE + + return TRUE + +/datum/action/cooldown/slasher/incorporealize/proc/update_the_button(atom/target) + if(is_jaunting(target)) + name = "Incorporealize" + desc = "Become incorporeal, capable of moving through walls and being completely invisible, but unable to interact with the world. Can only be used when corporeal and when not in view of any human being. " + button_icon_state = "incorporealize" + else + name = "Corporealize" + desc = "Manifest your being from your incorporeal state." + button_icon_state = "corporealize" + build_all_button_icons(UPDATE_BUTTON_NAME|UPDATE_BUTTON_ICON) + +/datum/action/cooldown/slasher/incorporealize/proc/on_jaunt_exited(obj/effect/dummy/phased_mob/jaunt, mob/living/unjaunter) + unjaunter.remove_traits(list(TRAIT_MAGICALLY_PHASED, TRAIT_RUNECHAT_HIDDEN), REF(src)) + // This needs to happen at the end, after all the traits and stuff is handled + SEND_SIGNAL(unjaunter, COMSIG_MOB_AFTER_EXIT_JAUNT, src) + +/datum/action/cooldown/slasher/incorporealize/Remove(mob/living/remove_from) + exit_jaunt(remove_from) + if(!is_jaunting(remove_from)) // In case you have made exit_jaunt conditional, as in mirror walk + return ..() + var/obj/effect/dummy/phased_mob/jaunt = remove_from.loc + jaunt.eject_jaunter() + return ..() diff --git a/monkestation/code/modules/antagonists/slasher/abilities/recall_machette.dm b/monkestation/code/modules/antagonists/slasher/abilities/recall_machette.dm new file mode 100644 index 000000000000..6092e2ebb499 --- /dev/null +++ b/monkestation/code/modules/antagonists/slasher/abilities/recall_machette.dm @@ -0,0 +1,87 @@ +/datum/action/cooldown/slasher/summon_machette + name = "Summon Machette" + desc = "Summon your machete to your active hand, or create one if it doesn't exist. This machete deals 15 BRUTE on hit increasing by 2.5 for every soul you own, and stuns on throw." + + button_icon_state = "summon_machete" + + cooldown_time = 15 SECONDS + + var/obj/item/slasher_machette/stored_machette + + +/datum/action/cooldown/slasher/summon_machette/Destroy() + . = ..() + QDEL_NULL(stored_machette) + +/datum/action/cooldown/slasher/summon_machette/Activate(atom/target) + . = ..() + if(!stored_machette) + stored_machette = new /obj/item/slasher_machette + var/datum/antagonist/slasher/slasherdatum = owner.mind.has_antag_datum(/datum/antagonist/slasher) + if(!slasherdatum) + return + slasherdatum.linked_machette = stored_machette + + if(!owner.put_in_hands(stored_machette)) + stored_machette.forceMove(get_turf(owner)) + +/obj/item/slasher_machette + name = "slasher's machete" + desc = "An old machete, clearly showing signs of wear and tear due to its age." + + icon = 'goon/icons/obj/items/weapons.dmi' + icon_state = "welder_machete" + hitsound = 'goon/sounds/impact_sounds/Flesh_Cut_1.ogg' + + inhand_icon_state = "PKMachete0" + lefthand_file = 'monkestation/icons/mob/inhands/weapons/melee_lefthand.dmi' + righthand_file = 'monkestation/icons/mob/inhands/weapons/melee_righthand.dmi' + + force = 15 //damage increases by 2.5 for every soul they take + throwforce = 15 //damage goes up by 2.5 for every soul they take + + tool_behaviour = TOOL_CROWBAR // lets you pry open doors forcibly + + sharpness = SHARP_EDGED + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + + +/obj/item/slasher_machette/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + . = ..() + if(iscarbon(hit_atom)) + var/mob/living/carbon/hit_carbon = hit_atom + hit_carbon.blood_volume -= throwforce + hit_carbon.Knockdown(3 SECONDS) + playsound(src, 'goon/sounds/impact_sounds/Flesh_Stab_3.ogg', 25, 1) + +/obj/item/slasher_machette/attack_hand(mob/user, list/modifiers) + if(isliving(user)) + var/mob/living/living_user = user + if(!user.mind.has_antag_datum(/datum/antagonist/slasher)) + forceMove(get_turf(user)) + user.emote("scream") + living_user.adjustBruteLoss(force) + to_chat(user, span_warning("You scream out in pain as you hold the [src]!")) + if(ishuman(user)) + var/mob/living/carbon/human/human = user + var/turf/turf = get_turf(user) + var/list/blood_drop = list(human.get_blood_id() = 3) + turf.add_liquid_list(blood_drop, FALSE, 300) + return FALSE + . = ..() + +/obj/item/slasher_machette/attack(mob/living/target_mob, mob/living/user, params) + if(isliving(user)) + var/mob/living/living_user = user + if(!user.mind.has_antag_datum(/datum/antagonist/slasher)) + forceMove(get_turf(user)) + user.emote("scream") + living_user.adjustBruteLoss(force) + to_chat(user, span_warning("You scream out in pain as you hold the [src]!")) + if(ishuman(user)) + var/mob/living/carbon/human/human = user + var/turf/turf = get_turf(user) + var/list/blood_drop = list(human.get_blood_id() = 3) + turf.add_liquid_list(blood_drop, FALSE, 300) + return FALSE + . = ..() diff --git a/monkestation/code/modules/antagonists/slasher/abilities/slasher_regenerate.dm b/monkestation/code/modules/antagonists/slasher/abilities/slasher_regenerate.dm new file mode 100644 index 000000000000..fb65b24e7557 --- /dev/null +++ b/monkestation/code/modules/antagonists/slasher/abilities/slasher_regenerate.dm @@ -0,0 +1,38 @@ +/datum/action/cooldown/slasher/regenerate + name = "Regenerate" + desc = "Quickly regenerate your being, restoring most if not all lost health, repairing wounds, and removing all stuns." + + button_icon_state = "regenerate" + + cooldown_time = 75 SECONDS + + +/datum/action/cooldown/slasher/regenerate/Activate(atom/target) + . = ..() + if(isliving(target)) + var/mob/living/mob_target = target + mob_target.set_timed_status_effect(5 SECONDS, /datum/status_effect/bloody_heal) // should heal most damage over 5 seconds + + +/datum/status_effect/bloody_heal + id = "bloody_heal" + alert_type = null + tick_interval = 1 SECONDS + +/datum/status_effect/bloody_heal/on_creation(mob/living/new_owner, duration = 5 SECONDS) + src.duration = duration + return ..() + +/datum/status_effect/bloody_heal/tick(seconds_per_tick, times_fired) + . = ..() + if(!ishuman(owner)) + return + var/mob/living/carbon/human/human_owner = owner + human_owner.exit_stamina_stun() + human_owner.AdjustAllImmobility(-20 * seconds_per_tick) + human_owner.stamina.adjust(20) + human_owner.adjustBruteLoss(-35) + human_owner.adjustFireLoss(-20, FALSE) + human_owner.adjustOxyLoss(-20) + human_owner.adjustToxLoss(-20) + human_owner.blood_volume = BLOOD_VOLUME_NORMAL diff --git a/monkestation/code/modules/antagonists/slasher/abilities/soul_steal.dm b/monkestation/code/modules/antagonists/slasher/abilities/soul_steal.dm new file mode 100644 index 000000000000..63dd1c195655 --- /dev/null +++ b/monkestation/code/modules/antagonists/slasher/abilities/soul_steal.dm @@ -0,0 +1,103 @@ +/mob/living/carbon/human + /// Has our soul been sucked, this makes us pale white. + var/soul_sucked = FALSE + +/datum/action/cooldown/slasher/soul_steal + name = "Soul Steal" + desc = "You can use this ability to suck souls. You can only do this ability if you are not incorporeal" + + button_icon_state = "soul_steal" + + click_to_activate = TRUE + + cooldown_time = 20 SECONDS // maximum cooldown you can have for eating souls + + var/sucking_time = 4 SECONDS // how long should we suck for? + + var/quick_eater = FALSE // used in an activate() check to see if they recently ate a soul + +/datum/action/cooldown/slasher/soul_steal/Activate(atom/target) + + var/mob/living/carbon/human/human_target = target + var/mob/living/carbon/human/human_owner = owner + var/datum/antagonist/slasher/slasherdatum = human_owner.mind.has_antag_datum(/datum/antagonist/slasher) + + /** + * Here we start our checks + * We cant do it in PreActivate() since that for some reason does not work + */ + + if(!slasherdatum) // is this person even a slasher? mostly a safety check + to_chat(owner, span_warning("You should not have this ability or your slasher antagonist datum was deleted, please contact coders")) + return + + if(isopenturf(target) || isclosedturf(target)) // dont say anything, they probably mis-clicked + return + + if(human_owner == human_target) // you cant suck yourself, no comment + return + + if(slasherdatum.last_soul_sucked + slasherdatum.soul_digestion > world.time) // they are a speedrunner, mark them as such + quick_eater = TRUE + + // After this point, give chat messages about failures + + if(!slasherdatum.corporeal) + to_chat(owner, span_warning("You cannot suck souls whilst incorporeal!")) + return + + if(!ishuman(target)) // are they trying to suck a corgi? + to_chat(owner, span_warning("You can only suck the souls of humans")) + return + + if(!human_target.mind) // are they trying to suck a monkey? + to_chat(owner, span_warning("This target doesn't seem to have a soul to suck.")) + return + + if(human_target.soul_sucked) // are they trying to suck the person being revived 5 times? + to_chat(owner, span_warning("Their soul has already been sucked.")) + return + + if(human_target.stat != DEAD) // are they trying to suck the person in anasthesia? + to_chat(owner, span_notice("This human is not dead. You can't steal their soul.")) + return + + if(quick_eater) // you cant speedrun sucking, take it slow + to_chat(owner, span_boldwarning("You feel as if you should slow down with eating their soul...")) + sucking_time = 20 SECONDS // 5 times bigger + + /** + * If all the checks succeed, we begin our actual work + */ + + . = ..() + + to_chat(owner, span_boldwarning("You remember that you need to stand perfectly still to consume their soul...")) + + if(!do_after(owner, sucking_time, target)) // you gotta stand perfectly still to consume da soul + to_chat(owner, span_boldwarning("You got distracted and was unable to consume your victims soul!")) + return FALSE + + if(quick_eater) + to_chat(owner, span_boldwarning("You can feel your mind slipping, you feel as though bad things will happen if you absorb more souls so quickly!")) + else + to_chat(owner, span_boldwarning("You successfully consumed your victims soul!")) + + human_target.soul_sucked = TRUE + + if(human_target.dna.species.use_skintones) // make them deathly white, afterall they dont have a soul anymore + human_target.skin_tone = "albino" + human_target.dna.update_ui_block(DNA_SKIN_TONE_BLOCK) + else // we dont discriminate, even skeletons can be white... (arent they already white?) + human_target.dna.features["mcolor"] = "#FFFFFF" + human_target.dna.update_uf_block(DNA_MUTANT_COLOR_BLOCK) + + human_target.update_body(is_creating = TRUE) + + slasherdatum.souls_sucked++ + slasherdatum.check_soul_punishment() + slasherdatum.last_soul_sucked = world.time + + // lets make their machette stronger + slasherdatum.linked_machette.force += 2.5 + slasherdatum.linked_machette.throwforce += 2.5 diff --git a/monkestation/code/modules/antagonists/slasher/abilities/stalk_target.dm b/monkestation/code/modules/antagonists/slasher/abilities/stalk_target.dm new file mode 100644 index 000000000000..1606f1c43ebd --- /dev/null +++ b/monkestation/code/modules/antagonists/slasher/abilities/stalk_target.dm @@ -0,0 +1,35 @@ +/datum/action/cooldown/slasher/stalk_target + name = "Stalk Target" + desc = "Get a target to stalk, standing near them for 3 minutes will rip their soul from their body. YOU MUST PROTECT THEM FROM HARM." + + button_icon_state = "slasher_possession" + + cooldown_time = 5 MINUTES + +/datum/action/cooldown/slasher/stalk_target/Activate(atom/target) + . = ..() + var/list/possible_targets = list() + for(var/datum/mind/possible_target as anything in get_crewmember_minds()) + if(possible_target == owner.mind) + continue + if(!ishuman(possible_target.current)) + continue + if(possible_target.current.stat == DEAD) + continue + possible_targets += possible_target.current + + var/datum/antagonist/slasher/slasherdatum = owner.mind.has_antag_datum(/datum/antagonist/slasher) + if(slasherdatum && slasherdatum.stalked_human) + qdel(slasherdatum.stalked_human.tracking_beacon) + + var/mob/living/living_target = pick(possible_targets) + var/mob/living/carbon/human/owner_human = owner + if(!owner_human.team_monitor) + owner_human.tracking_beacon = owner_human.AddComponent(/datum/component/tracking_beacon, "slasher", null, null, TRUE, "#00660e") + owner_human.team_monitor = owner_human.AddComponent(/datum/component/team_monitor, "slasher", null, owner_human.tracking_beacon) + + living_target.tracking_beacon = living_target.AddComponent(/datum/component/tracking_beacon, "slasher", null, null, TRUE, "#660000") + if(slasherdatum) + slasherdatum.stalked_human = living_target + owner_human.team_monitor.add_to_tracking_network(living_target.tracking_beacon) + owner_human.team_monitor.show_hud(owner_human) diff --git a/monkestation/code/modules/antagonists/slasher/abilities/terror_screech.dm b/monkestation/code/modules/antagonists/slasher/abilities/terror_screech.dm new file mode 100644 index 000000000000..d27fae7f1866 --- /dev/null +++ b/monkestation/code/modules/antagonists/slasher/abilities/terror_screech.dm @@ -0,0 +1,38 @@ +/datum/action/cooldown/slasher/terror + name = "Screech of Terror" + desc = "Inflict near paralyzing fear to those around you." + button_icon_state = "stagger_group" + + cooldown_time = 45 SECONDS + + +/datum/action/cooldown/slasher/terror/Activate(atom/target) + . = ..() + var/datum/antagonist/slasher/slasherdatum = owner.mind.has_antag_datum(/datum/antagonist/slasher) + + if(!slasherdatum) + to_chat(owner, span_warning("You should not have this ability or your slasher antagonist datum was deleted, please contact coders")) + return + + if(!slasherdatum.corporeal) // if he is incorporeal, dont stun people + playsound(owner, 'monkestation/sound/voice/terror.ogg', 20, falloff_exponent = 0, use_reverb = FALSE) + for(var/mob/living/carbon/human/human in view(7, owner)) + if(human == owner) + continue + to_chat(human, span_warning("You hear a distant screech... this cant possibly be good")) + human.Shake(duration = 1 SECONDS) + return + + playsound(owner, 'monkestation/sound/voice/terror.ogg', 100, falloff_exponent = 0, use_reverb = FALSE) + for(var/mob/living/carbon/human/human in view(7, owner)) + if(human == owner) + continue + human.overlay_fullscreen("terror", /atom/movable/screen/fullscreen/curse, 1) + human.Shake(duration = 5 SECONDS) + human.stamina.adjust(-60) + human.emote("scream") + human.SetParalyzed(1.5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(remove_overlay), human), 5 SECONDS) + +/datum/action/cooldown/slasher/terror/proc/remove_overlay(mob/living/carbon/human/remover) + remover.clear_fullscreen("terror", 10) diff --git a/monkestation/code/modules/antagonists/slasher/components/team_monitor.dm b/monkestation/code/modules/antagonists/slasher/components/team_monitor.dm new file mode 100644 index 000000000000..0b36588a0e70 --- /dev/null +++ b/monkestation/code/modules/antagonists/slasher/components/team_monitor.dm @@ -0,0 +1,603 @@ +#define ALT_APPEARENCE_ID "team_monitor" + +//================== +// Helpers +//================== + +//A list that tracks everything that should be tracked by team monitors +//Assoc list: +// Key = Frequency +// Value = Components +GLOBAL_LIST_EMPTY(tracker_huds) +GLOBAL_LIST_EMPTY(tracker_beacons) + +//Gets the first free team element, useful for creating new teams +//Special key is for what kind of team frequency it should be +//Everything that has a team monitor can be configured to change what frequency it tracks on +//The special key can be used to make keys like synd5 or synd83 to prevent centcom tracking syndies. +/proc/get_free_team_frequency(special_key = "") + var/sanity = 5 + //5 attempts to find a free team element, should never get that far + while(sanity > 0) + sanity -- + var/random_id = rand(1, 999) + var/key = "[random_id]" + if(!GLOB.tracker_beacons.Find("[special_key][key]")) + return key + //Return something anyways + var/random_id = rand(1, 999) + var/key = "[random_id]" + return key + +//Adds a new tracking hud +/proc/add_tracker_hud(frequency_added, datum/component/component_added) + if(!frequency_added) + return + if(islist(GLOB.tracker_huds[frequency_added])) + GLOB.tracker_huds[frequency_added] |= component_added + else + GLOB.tracker_huds[frequency_added] = list(component_added) + +//Adds a new tracking beacon +/proc/add_tracker_beacon(frequency_added, datum/component/component_added) + if(!frequency_added) + return + if(islist(GLOB.tracker_beacons[frequency_added])) + GLOB.tracker_beacons[frequency_added] |= component_added + else + GLOB.tracker_beacons[frequency_added] = list(component_added) + +/proc/get_all_beacons_on_frequency(frequency, base_frequency) + if(!frequency) + return GLOB.tracker_beacons["[base_frequency]-GLOB"] + var/list/found_beacons = list() + if(islist(GLOB.tracker_beacons[frequency])) + found_beacons.Add(GLOB.tracker_beacons[frequency]) + if(islist(GLOB.tracker_beacons["[base_frequency]-GLOB"])) + found_beacons.Add(GLOB.tracker_beacons["[base_frequency]-GLOB"]) + return found_beacons + +/proc/get_all_watchers_on_frequency(frequency, team_key = "", global_freq = FALSE) + if(global_freq) + . = list() + for(var/tracker_freq in GLOB.tracker_huds) + for(var/datum/component/team_monitor/TM as() in GLOB.tracker_huds[tracker_freq]) + if(TM.team_freq_key == team_key) + . += TM + else + return GLOB.tracker_huds[frequency] + +//================== +// Component +// - HUD COMPONENT +// - HANDLES POINTING TOWARDS TRACKED BEACONS +//================== + +//The component that handles tracking atoms +/datum/component/team_monitor + /// The frequency of the team signals we are trackings + /// Key <-- cannot be changed + var/team_freq_key = "debug" + /// Final compiled: Consists of key then numbers between 1 and 999 + var/team_frequency = "" + /// The atoms we are actually tracking + /// Key = Beacon component + /// Value = image + var/list/tracking = list() + /// Who are we updating for + var/mob/updating = null + /// Distance from center + /// Probably in pixels or something idk + var/distance = 20 + /// Should we display the hud in the firstplace + var/hud_visible = TRUE + /// The attached beacon: Ignore this one + var/datum/component/tracking_beacon/attached_beacon + /// If we can track beacons within the same zgroup (e.g. on a multiz station) + var/multiz = TRUE + +/datum/component/team_monitor/Initialize(frequency_key, frequency, _attached_beacon, _multiz = TRUE) + multiz = _multiz + team_freq_key = frequency_key + if(frequency) + team_frequency = "[frequency_key][frequency]" + else + team_frequency = null + + attached_beacon = _attached_beacon + + get_matching_beacons() + add_tracker_hud(team_frequency, src) + +/datum/component/team_monitor/Destroy(force, silent) + if(team_frequency) + GLOB.tracker_huds[team_frequency] -= src + + //Stop processing + STOP_PROCESSING(SSprocessing, src) + + //Remove the HUD from the equipped mob + if(updating) + hide_hud(updating) + + //Dispose + if(attached_beacon) + if(attached_beacon.attached_monitor == src) + attached_beacon.attached_monitor = null + attached_beacon = null + + . = ..() + +//Gets the active trackers for when the team_monitor component +//is initialized while other trackers are already active. +/datum/component/team_monitor/proc/get_matching_beacons() + for(var/datum/component/tracking_beacon/beacon as() in get_all_beacons_on_frequency(team_frequency, team_freq_key)) + if(beacon != attached_beacon && (beacon.updating || beacon.always_update)) + add_to_tracking_network(beacon) + +//=========== +// Handles the parent being moved and updates the direction of the arrows. +//=========== + +/datum/component/team_monitor/process() + update_all_directions() + +//When the parent is removed, we need to update our arrows +//Also if we are visible update the arrows of anything tracking us +/datum/component/team_monitor/proc/parent_moved() + SIGNAL_HANDLER + + //Update our alt appearances + update_all_directions() + +//Updates the direction of the arrows for all atoms we are tracking +/datum/component/team_monitor/proc/update_all_directions() + if(!updating) + return + for(var/datum/component/tracking_beacon/beacon as() in tracking) + update_atom_dir(beacon) + +//Update the arrow towards another atom +/datum/component/team_monitor/proc/update_atom_dir(datum/component/tracking_beacon/beacon) + if(!updating || !updating.hud_used || !beacon || !beacon.visible) + return + var/atom/movable/screen/arrow/screen = tracking[beacon] + var/turf/target_turf = get_turf(beacon.parent) + var/turf/parent_turf = get_turf(parent) + var/share_z = target_turf.z == parent_turf.z + if((!share_z && (!multiz)) || target_turf == parent_turf) + if(screen) + //Remove the screen + updating.hud_used.team_finder_arrows -= screen + qdel(screen) + tracking[beacon] = null + //Update their hud + updating.hud_used.show_hud(updating.hud_used.hud_version, updating) + return + if(!screen) + //Create the screen + screen = new + screen.alpha = 240 + if(multiz && !share_z && screen.color != beacon.z_diff_colour) + screen.color = beacon.z_diff_colour + else if(screen.color != beacon.colour) + screen.color = beacon.colour + screen.hud = updating.hud_used + updating.hud_used.team_finder_arrows += screen + tracking[beacon] = screen + //Update their hud + updating.hud_used.show_hud(updating.hud_used.hud_version, updating) + if(multiz && !share_z && screen.color != beacon.z_diff_colour) + screen.color = beacon.z_diff_colour + else if(screen.color != beacon.colour) + screen.color = beacon.colour + var/matrix/rotationMatrix = matrix() + rotationMatrix.Scale(1.5) + rotationMatrix.Translate(0, -distance) + rotationMatrix.Turn(get_angle(target_turf, parent_turf)) + animate(screen, transform = rotationMatrix, time = 2) + +//=========== +// Handles hiding / showing the hud when equipped +//=========== + +/datum/component/team_monitor/proc/show_hud(mob/target) + //Our hud is disabled + if(!hud_visible || !target) + return + updating = target + //Start processing to update in weird situations + START_PROCESSING(SSprocessing, src) + //Register parent signal + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(parent_moved)) + //Mob doesnt have a hud, dont add hud arrows + if(!target.hud_used) + return + for(var/datum/component/tracking_beacon/key in tracking) + if(!key.visible) // calling show_hud should not show hidden beacons + continue + var/atom/movable/screen/arrow/arrow = new + arrow.alpha = 240 + var/turf/target_turf = get_turf(key.parent) + var/turf/parent_turf = get_turf(parent) + if(multiz && target_turf.z != parent_turf.z && arrow.color != key.z_diff_colour) + arrow.color = key.z_diff_colour + else if(arrow.color != key.colour) + arrow.color = key.colour + arrow.hud = target.hud_used + target.hud_used.team_finder_arrows += arrow + tracking[key] = arrow + //Update their hud + target.hud_used.show_hud(target.hud_used.hud_version, target) + update_all_directions() + +/datum/component/team_monitor/proc/hide_hud(mob/target) + updating = null + //Stop processing + STOP_PROCESSING(SSprocessing, src) + if(!target) + return + //UnRegister parent signal + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + //Remove our arrows + for(var/key in tracking) + var/atom/movable/screen/arrow = tracking[key] + if(!arrow) + continue + if(target.hud_used) + target.hud_used.team_finder_arrows -= arrow + qdel(arrow) + tracking[key] = null + //Update their hud + if(target.hud_used) + target.hud_used.show_hud(target.hud_used.hud_version, target) + +//=========== +// Handles user interaction +// - Disabling hud transmission +// - Disabling hud view +// - Changing transmission frequency +//=========== + +/datum/component/team_monitor/proc/toggle_hud(new_hud_status, mob/user) + hud_visible = new_hud_status + if(hud_visible && !updating) + show_hud(user) + else if(!hud_visible) + hide_hud(user) + +/datum/component/team_monitor/proc/change_frequency(mob/user) + //Get new frequency + var/new_freq = input(user, "Enter a new frequency (1 - 999):", "Frequency Change", 1) as num|null + if(!new_freq) + to_chat(user, "Invalid frequency. Encrypted tracking HUD disabled.") + return + if(new_freq < 1 || new_freq > 999) + to_chat(user, "Frequency is out of range. Must be between 1 and 999.") + return + set_frequency(new_freq) + to_chat(user, "Tracking HUD now scanning on frequency [team_frequency].") + //Set frequency of the linked beacon + if(attached_beacon) + attached_beacon.set_frequency(new_freq) + +/datum/component/team_monitor/proc/set_frequency(new_frequency) + var/hud_on = hud_visible + var/mob/user = updating + //Remove tracking from old frequency + if(team_frequency) + if(updating) + toggle_hud(FALSE, updating) + //Remove from the global frequency + GLOB.tracker_huds[team_frequency] -= src + //Clear tracking + tracking.Cut() + team_frequency = "[team_freq_key][new_frequency]" + //Add tracking to new frequency + if(!team_frequency) + return + //Adds our tracking component to the global list of trackers + add_tracker_hud(team_frequency, src) + //Gets the other trackers on our frequency + get_matching_beacons() + //Show hud if needed + if(user) + toggle_hud(hud_on, user) + +//Adds a new atom to the tracking monitor, will create a hud element that tracks them +//TODO: Add the screen if already equipped +//Should be the only way atoms are added to the tracking list +/datum/component/team_monitor/proc/add_to_tracking_network(datum/component/tracking_beacon/beacon) + if(beacon != attached_beacon) + if(updating?.hud_used) + var/atom/movable/screen/arrow/arrow = new + arrow.alpha = 240 + var/turf/target_turf = get_turf(beacon.parent) + var/turf/parent_turf = get_turf(parent) + if(multiz && target_turf.z != parent_turf.z && arrow.color != beacon.z_diff_colour) + arrow.color = beacon.z_diff_colour + else if(arrow.color != beacon.colour) + arrow.color = beacon.colour + arrow.hud = updating.hud_used + updating.hud_used.team_finder_arrows += arrow + tracking[beacon] = arrow + //Update arrow direction + update_atom_dir(beacon) + //Update their hud + updating.hud_used.show_hud(updating.hud_used.hud_version, updating) + else + tracking[beacon] = null + +// ============ +// Worn version, hides when dequipped +// ============ + +/datum/component/team_monitor/worn/Initialize(frequency_key, frequency, _attached_beacon) + var/obj/item/clothing/item = parent + if(!istype(item)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(parent_equipped)) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(parent_dequpped)) + ..() + +//=========== +// Handles being equipped / dequipped +//=========== + +//The parent equipped an item with a team_monitor, check if its in the right slot and apply the hud +//Also needs to enable other trackers pointers towards us +/datum/component/team_monitor/worn/proc/parent_equipped(datum/source, mob/equipper, slot) + SIGNAL_HANDLER + + var/obj/item/clothing/item = parent + if(!istype(item)) + return + if(item.slot_flags & slot) //Was equipped to a valid slot for this item? + show_hud(equipper) + else + hide_hud(equipper) + +//Disable our hud +//Disable the pointers to us +/datum/component/team_monitor/worn/proc/parent_dequpped(datum/source, mob/user) + SIGNAL_HANDLER + + hide_hud(user) + +/datum/component/team_monitor/worn/Destroy(force, silent) + //Unregister signals + if(parent) + UnregisterSignal(parent, COMSIG_ITEM_EQUIPPED) + UnregisterSignal(parent, COMSIG_ITEM_DROPPED) + return ..() + +//================== +// Component +// - TRACKER COMPONENT +// - HANDLES UPDATING TRACKERS WHEN MOVED +//================== + +/datum/component/tracking_beacon + /// The frequency of the team signals we are trackings + /// Key <-- cannot be changed + var/team_freq_key = "debug" + /// Final compiled: Consists of key then numbers between 1 and 999 + var/team_frequency = "" + /// Are we visible to other trackers? + var/visible = TRUE + /// Our colour + var/colour = "#FFFFFF" + /// Colour when on a different z level + var/z_diff_colour = "#808080" + /// Who are we updating for + var/mob/updating = null + /// Do we have an attached monitor? + var/datum/component/team_monitor/attached_monitor + /// Should we update when not equipped? + var/always_update = FALSE + /// Global signal? + var/global_signal = FALSE + +/datum/component/tracking_beacon/Initialize(_frequency_key, _frequency, _attached_monitor, _visible = TRUE, _colour = "#ffffff", _global = FALSE, _always_update = FALSE, _z_diff_colour = "#808080") + . = ..() + + //Set vars + colour = _colour + z_diff_colour = _z_diff_colour + attached_monitor = _attached_monitor + always_update = _always_update + global_signal = _global + + //Set the frequency we are transmitting on + team_freq_key = _frequency_key + if(_global) + team_frequency = "[_frequency_key]-GLOB" + else if(_frequency) + team_frequency = "[_frequency_key][_frequency]" + else + team_frequency = null + + //Add ourselves to the tracking network + add_tracker_beacon(team_frequency, src) + + //Register tracking signal + if(always_update) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(update_position)) + else + //Reigster equipping signals + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(parent_equipped)) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(parent_dequpped)) + + //Set our visibility on the tracking network + toggle_visibility(_visible) + +/datum/component/tracking_beacon/Destroy(force, silent) + //Unregister signals + if(parent) + //Register tracking signal + if(always_update) + UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) + else + UnregisterSignal(parent, COMSIG_ITEM_EQUIPPED) + UnregisterSignal(parent, COMSIG_ITEM_DROPPED) + + //Unregister movement signal + if(updating) + UnregisterSignal(updating, COMSIG_MOVABLE_MOVED) + + //Goodbye, it was a good life + remove_from_huds() + + //Remove from the global network + if(team_frequency) + GLOB.tracker_beacons[team_frequency] -= src + + if(attached_monitor?.attached_beacon == src) + attached_monitor.attached_beacon = null + attached_monitor = null + + . = ..() + +//=========== +// Equip/Dequip transmission handling +//=========== + +//The parent equipped an item with a team_monitor, check if its in the right slot and apply the hud +//Also needs to enable other trackers pointers towards us +/datum/component/tracking_beacon/proc/parent_equipped(datum/source, mob/equipper, slot) + SIGNAL_HANDLER + + var/obj/item/clothing/item = parent + if(!istype(item)) + return + if(item.slot_flags & slot) //Was equipped to a valid slot for this item? + updating = equipper + toggle_visibility(TRUE) + RegisterSignal(updating, COMSIG_MOVABLE_MOVED, PROC_REF(update_position)) + else + toggle_visibility(FALSE) + if(updating) + UnregisterSignal(updating, COMSIG_MOVABLE_MOVED) + updating = null + +//Disable our hud +//Disable the pointers to us +/datum/component/tracking_beacon/proc/parent_dequpped(datum/source, mob/user) + SIGNAL_HANDLER + + toggle_visibility(FALSE) + if(updating) + UnregisterSignal(updating, COMSIG_MOVABLE_MOVED) + updating = null + +//=========== +// Visibility Handling +//=========== + +//Toggle visibility +//If visibility is disabled we will hide ourselves from others +/datum/component/tracking_beacon/proc/toggle_visibility(new_vis) + visible = new_vis + //If we are updating toggle our visibility + if((updating || always_update) && visible) + add_to_huds() + else + remove_from_huds() + +//=========== +// Position Updating +//=========== + +/datum/component/tracking_beacon/proc/update_position() + SIGNAL_HANDLER + + //Update everyone tracking us + if(!visible) + return + if(!team_frequency) + return + for(var/datum/component/team_monitor/TM as() in get_all_watchers_on_frequency(team_frequency, team_freq_key, global_signal)) + if(TM != attached_monitor) + TM.update_atom_dir(src) + +//=========== +// Showing on huds +//=========== + +//Remove ourselves from other tracking components +/datum/component/tracking_beacon/proc/remove_from_huds() + if(!team_frequency) + return + for(var/datum/component/team_monitor/team_monitor as() in get_all_watchers_on_frequency(team_frequency, team_freq_key, global_signal)) + //Remove ourselves from the tracking list + var/atom/movable/screen/arrow = team_monitor.tracking[src] + team_monitor.tracking.Remove(src) + //Delete the arrow pointing to use + if(!arrow) + continue + if(team_monitor.updating?.hud_used) + team_monitor.updating.hud_used.team_finder_arrows -= arrow + //Update their hud + team_monitor.updating.hud_used.show_hud(team_monitor.updating.hud_used.hud_version, team_monitor.updating) + qdel(arrow) + +//Add ourselves to other tracking components +/datum/component/tracking_beacon/proc/add_to_huds() + //If we are invisibile, dont bother + if(!visible) + return + //Find other trackers and add ourselves to their tracking network + if(!team_frequency) + return + for(var/datum/component/team_monitor/team_monitor as() in get_all_watchers_on_frequency(team_frequency, team_freq_key, global_signal)) + if(team_monitor != attached_monitor) + team_monitor.add_to_tracking_network(src) + +//=========== +// Handles user interaction +// - Disabling hud transmission +// - Disabling hud view +// - Changing transmission frequency +//=========== + +/datum/component/tracking_beacon/proc/change_frequency(mob/user) + //Get new frequency + var/new_freq = input(user, "Enter a new frequency (1 - 999):", "Frequency Change", 1) as num|null + if(!new_freq) + to_chat(user, "Invalid frequency. Encrypted tracking beacon disabled.") + return + if(new_freq < 1 || new_freq > 999) + to_chat(user, "Frequency is out of range. Must be between 1 and 999.") + return + set_frequency(new_freq) + to_chat(user, "Tracking HUD now transmitting on frequency [team_frequency].") + //Set frequency of the linked tracker + if(attached_monitor) + attached_monitor.set_frequency(new_freq) + +/datum/component/tracking_beacon/proc/set_frequency(new_frequency) + //Remove tracking from old frequency + if(team_frequency) + //Disable the beacon on other trackers + toggle_visibility(FALSE) + //Remove from the global frequency + GLOB.tracker_beacons[team_frequency] -= src + team_frequency = "[team_freq_key][new_frequency]" + //Add tracking to new frequency + if(!team_frequency) + return + //Adds our tracking component to the global list of trackers + add_tracker_beacon(team_frequency, src) + //Set our visibility on the tracking network + toggle_visibility(visible) + +//======= +// Generic Arrow, No special effects +//======= + +/atom/movable/screen/arrow + icon = 'monkestation/icons/mob/hud.dmi' + icon_state = "hud_arrow" + screen_loc = ui_team_finder + +#undef ALT_APPEARENCE_ID diff --git a/monkestation/code/modules/antagonists/slasher/ghost_role.dm b/monkestation/code/modules/antagonists/slasher/ghost_role.dm new file mode 100644 index 000000000000..c3bcb3140536 --- /dev/null +++ b/monkestation/code/modules/antagonists/slasher/ghost_role.dm @@ -0,0 +1,36 @@ +/datum/round_event_control/slasher + name = "Slasher" + typepath = /datum/round_event/ghost_role/slasher + weight = 14 // for now + max_occurrences = 2 + track = EVENT_TRACK_MODERATE + tags = list(TAG_SPOOKY, TAG_COMBAT, TAG_EXTERNAL) + checks_antag_cap = TRUE + +/datum/round_event/ghost_role/slasher + minimum_required = 1 + role_name = "Slasher" + fakeable = FALSE + +/datum/round_event/ghost_role/slasher/spawn_role() + var/list/candidates = get_candidates() + var/turf/spawn_loc = find_safe_turf()//Used for the Drop Pod type of spawn + + if(!candidates.len) + return NOT_ENOUGH_PLAYERS + + var/mob/dead/selected = pick_n_take(candidates) + var/mob/living/carbon/human/slasher = new(spawn_loc) //This is to catch errors by just giving them a location in general. + + slasher.dna.update_dna_identity() + var/datum/mind/Mind = new /datum/mind(selected.key) + Mind.special_role = "Slasher" + Mind.active = 1 + Mind.transfer_to(slasher) + Mind.add_antag_datum(/datum/antagonist/slasher) + + + message_admins("[ADMIN_LOOKUPFLW(slasher)] has been made into Slasher.") + log_game("[key_name(slasher)] was spawned as Slasher by an event.") + spawned_mobs += slasher + return SUCCESSFUL_SPAWN diff --git a/monkestation/code/modules/antagonists/slasher/slasher_datum.dm b/monkestation/code/modules/antagonists/slasher/slasher_datum.dm new file mode 100644 index 000000000000..254e05958e2c --- /dev/null +++ b/monkestation/code/modules/antagonists/slasher/slasher_datum.dm @@ -0,0 +1,167 @@ +/datum/outfit/slasher + name = "Slasher Outfit" + suit = /obj/item/clothing/suit/apron/slasher + uniform = /obj/item/clothing/under/color/random/slasher + shoes = /obj/item/clothing/shoes/slasher_shoes + mask = /obj/item/clothing/mask/gas/slasher + +/datum/antagonist/slasher + name = "\improper Slasher" + show_in_antagpanel = TRUE + roundend_category = "slashers" + antagpanel_category = "Slasher" + job_rank = ROLE_SLASHER + antag_hud_name = "slasher" + show_name_in_check_antagonists = TRUE + hud_icon = 'monkestation/icons/mob/slasher.dmi' + preview_outfit = /datum/outfit/slasher + show_to_ghosts = TRUE + + ///the linked machette that the slasher can summon even if destroyed and is unique to them + var/obj/item/slasher_machette/linked_machette + ///toggles false/true if we are visible in order to breathe out or in + var/breath_out = FALSE + ///rallys the amount of souls effects are based on this + var/souls_sucked = 0 + ///when we sucked our last soul in world time + var/last_soul_sucked = 0 + ///cooldown we should have for soul sucking without downside + var/soul_digestion = 5 MINUTES + ///our current soul punishment state + var/soul_punishment = 0 + ///our cached brute_mod + var/cached_brute_mod = 0 + ///processes to heartbeat + var/heartbeat_processes = 0 + ///processes until wail if above punishment threshold + var/wailing_processes = 0 + ///our breath processes + var/breath_processes = 0 + ///list of mobs that have been given a overlay so we can remove later + var/list/mobs_with_fullscreens = list() + ///this is needed because it double fires sometimes before finishing + var/is_hudchecking = FALSE + /// the mob we are stalking + var/mob/living/carbon/human/stalked_human + /// how close we are in % to finishing stalking + var/stalk_precent = 0 + /// are we corporeal + var/corporeal = TRUE + ///ALL Powers currently owned + var/list/datum/action/cooldown/slasher/powers = list() + +/datum/antagonist/slasher/apply_innate_effects(mob/living/mob_override) + . = ..() + var/mob/living/current_mob = mob_override || owner.current + + ADD_TRAIT(current_mob, TRAIT_BATON_RESISTANCE, "slasher") + ADD_TRAIT(current_mob, TRAIT_CLUMSY, "slasher") + ADD_TRAIT(current_mob, TRAIT_DUMB, "slasher") + ADD_TRAIT(current_mob, TRAIT_NODEATH, "slasher") + ADD_TRAIT(current_mob, TRAIT_LIMBATTACHMENT, "slasher") + + var/mob/living/carbon/carbon = current_mob + var/obj/item/organ/internal/eyes/shadow/shadow = new + shadow.Insert(carbon, drop_if_replaced = FALSE) + + RegisterSignal(current_mob, COMSIG_LIVING_LIFE, PROC_REF(LifeTick)) + + ///abilities galore + for(var/datum/action/cooldown/slasher/listed_slasher as anything in subtypesof(/datum/action/cooldown/slasher)) + var/datum/action/cooldown/slasher/new_ability = new listed_slasher + new_ability.Grant(current_mob) + powers |= new_ability + + var/mob/living/carbon/human/human = current_mob + human.equipOutfit(/datum/outfit/slasher) + cached_brute_mod = human.dna.species.brutemod + + +/datum/antagonist/slasher/on_removal() + . = ..() + owner.current.remove_traits(list(TRAIT_BATON_RESISTANCE, TRAIT_CLUMSY, TRAIT_NODEATH, TRAIT_DUMB, TRAIT_LIMBATTACHMENT), "slasher") + for(var/datum/action/cooldown/slasher/listed_slasher as anything in powers) + listed_slasher.Remove(owner.current) + +/datum/antagonist/slasher/proc/LifeTick(mob/living/source, seconds_per_tick, times_fired) + if(corporeal) + breath_processes++ + if(breath_processes >= 2) + breath_processes = 0 + if(breath_out) + source.emote("exhale") + breath_out = FALSE + else + source.emote("inhale") + breath_out = TRUE + + heartbeat_processes++ + if(heartbeat_processes >= 4) + heartbeat_processes = 0 + for(var/mob/living/carbon/human in view(7, source)) + if(human == source) + continue + human.playsound_local(human, 'sound/health/slowbeat.ogg', 40, FALSE, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) + + if(stalked_human) + for(var/mob/living/carbon/human in view(7, source)) + if(stalked_human != human) + continue + if(stalked_human.stat == DEAD) + failed_stalking() + stalk_precent += (1 / 1.8) + if(stalk_precent >= 100) + finish_stalking() + + if(!is_hudchecking) + is_hudchecking = TRUE + var/list/starting_humans = list() + starting_humans += mobs_with_fullscreens + for(var/mob/living/carbon/human in view(7, source)) + if(!(human in mobs_with_fullscreens)) + mobs_with_fullscreens += human + human.overlay_fullscreen("slasher_prox", /atom/movable/screen/fullscreen/nearby, 1) + else + starting_humans -= human + + if(length(starting_humans)) + for(var/mob/living/carbon/human in starting_humans) + human.clear_fullscreen("slasher_prox", 15) + mobs_with_fullscreens -= human + is_hudchecking = FALSE + + for(var/obj/machinery/light/listed_light in view(3, source)) + if(prob(10)) + listed_light.break_light_tube() + + var/turf/TT = get_turf(source) + var/turf/T = pick(RANGE_TURFS(4,TT)) + + if(prob(5)) + new /obj/effect/gibspawner/generic(T) + + if(soul_punishment >= 2) + wailing_processes++ + if(wailing_processes >= 8) + wailing_processes = 0 + playsound(owner.current, 'monkestation/sound/voice/terror-cry.ogg', 50, falloff_exponent = 0, use_reverb = FALSE) + owner.current.emote("wails") + var/mob/living/carbon/human/human = owner.current + human.blood_volume -= 10 + var/turf/turf = get_turf(human) + var/list/blood_drop = list(human.get_blood_id() = 10) + turf.add_liquid_list(blood_drop, FALSE, 300) + +/datum/antagonist/slasher/proc/finish_stalking() + to_chat(owner, span_boldwarning("You have finished spooking your victim, and have harvested part of their soul!")) + if(linked_machette) + linked_machette.force += 2.5 + linked_machette.throwforce += 2.5 + stalked_human = null + +/datum/antagonist/slasher/proc/failed_stalking() + to_chat(owner, span_boldwarning("You let your victim be taken before it was time!")) + if(linked_machette) + linked_machette.force -= 5 + linked_machette.throwforce -= 5 + stalked_human = null diff --git a/monkestation/code/modules/antagonists/slasher/slasher_outfit/slasher_footwear.dm b/monkestation/code/modules/antagonists/slasher/slasher_outfit/slasher_footwear.dm new file mode 100644 index 000000000000..854969079328 --- /dev/null +++ b/monkestation/code/modules/antagonists/slasher/slasher_outfit/slasher_footwear.dm @@ -0,0 +1,10 @@ +/obj/item/clothing/shoes/slasher_shoes + name = "Industrial Boots" + icon_state = "jackboots" + inhand_icon_state = "jackboots" + clothing_traits = list(TRAIT_NO_SLIP_ALL) + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + +/obj/item/clothing/shoes/slasher_shoes/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, "slasher") diff --git a/monkestation/code/modules/antagonists/slasher/slasher_outfit/slasher_headgear.dm b/monkestation/code/modules/antagonists/slasher/slasher_outfit/slasher_headgear.dm new file mode 100644 index 000000000000..790d0f430f64 --- /dev/null +++ b/monkestation/code/modules/antagonists/slasher/slasher_outfit/slasher_headgear.dm @@ -0,0 +1,17 @@ +/obj/item/clothing/mask/gas/slasher + name = "slasher's gas mask" + desc = "A close-fitting sealed gas mask, this one seems to be protruding some kind of dark aura." + + icon = 'icons/obj/clothing/head/utility.dmi' + worn_icon = 'icons/mob/clothing/head/utility.dmi' + icon_state = "welding" + inhand_icon_state = "welding" + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + slowdown = 1 + +/obj/item/clothing/mask/gas/slasher/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, "slasher") + +/obj/item/clothing/mask/gas/slasher/adjustmask() + return diff --git a/monkestation/code/modules/antagonists/slasher/slasher_outfit/slasher_middlewear.dm b/monkestation/code/modules/antagonists/slasher/slasher_outfit/slasher_middlewear.dm new file mode 100644 index 000000000000..54e41adb4d2d --- /dev/null +++ b/monkestation/code/modules/antagonists/slasher/slasher_outfit/slasher_middlewear.dm @@ -0,0 +1,17 @@ +/obj/item/clothing/suit/apron/slasher + name = "butcher's apron" + desc = "A brown butcher's apron, you can feel an aura of something dark radiating off of it." + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + + icon_state = "slasher" + inhand_icon_state = null + +/obj/item/clothing/suit/apron/slasher/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, "slasher") + +/obj/item/clothing/under/color/random/slasher + name = "butcher's jumpsuit" + clothing_traits = list(TRAIT_NODROP) + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + diff --git a/monkestation/code/modules/antagonists/slasher/slasher_punishment.dm b/monkestation/code/modules/antagonists/slasher/slasher_punishment.dm new file mode 100644 index 000000000000..5a7049729e69 --- /dev/null +++ b/monkestation/code/modules/antagonists/slasher/slasher_punishment.dm @@ -0,0 +1,8 @@ +/datum/antagonist/slasher/proc/check_soul_punishment() + if(last_soul_sucked + soul_digestion < world.time) + return + soul_punishment++ + addtimer(CALLBACK(src, PROC_REF(remove_punishment_layer)), 5 MINUTES) + +/datum/antagonist/slasher/proc/remove_punishment_layer() + soul_punishment-- diff --git a/monkestation/code/modules/antagonists/traitor/objectives/final_objective/become_wizard.dm b/monkestation/code/modules/antagonists/traitor/objectives/final_objective/become_wizard.dm new file mode 100644 index 000000000000..ef29cab8c6d1 --- /dev/null +++ b/monkestation/code/modules/antagonists/traitor/objectives/final_objective/become_wizard.dm @@ -0,0 +1,132 @@ +/datum/traitor_objective/ultimate/wizard + name = "Go to %AREA% and invoke a rune of power." + description = "Go to %AREA% and draw a rune of power with the provided impliment. Then, invoke the rune to gain great magical power." + + ///Area where the rune must be drawn + var/area/area_of_power + ///Have we sent our spraycan yet + var/spraycan_sent = FALSE + +/datum/traitor_objective/ultimate/wizard/generate_objective(datum/mind/generating_for, list/possible_duplicates) + var/list/possible_areas = GLOB.the_station_areas.Copy() + var/list/extra_blacklisted_areas = list(/area/station/hallway, /area/station/security, /area/station/ai_monitored) + for(var/area/possible_area as anything in possible_areas) + if(is_type_in_list(possible_area, (TRAITOR_OBJECTIVE_BLACKLISTED_AREAS + extra_blacklisted_areas)) || initial(possible_area.outdoors)) + possible_areas -= possible_area + + if(!length(possible_areas)) + return FALSE + + area_of_power = pick(possible_areas) + replace_in_name("%AREA%", initial(area_of_power.name)) + return TRUE + +/datum/traitor_objective/ultimate/wizard/generate_ui_buttons(mob/user) + var/list/buttons = list() + if(!spraycan_sent) + buttons += add_ui_button("", "Pressing this will materialize an enchanted spraycan in your hand.", "wifi", "spraycan") + return buttons + +/datum/traitor_objective/ultimate/wizard/ui_perform_action(mob/living/user, action) + . = ..() + switch(action) + if("spraycan") + if(spraycan_sent) + return + + spraycan_sent = TRUE + var/obj/item/traitor_spraycan/enchanted/spray = new(user.drop_location()) + spray.owning_mind = WEAKREF(user.mind) + user.put_in_hands(spray) + spray.balloon_alert(user, "\The [spray] materializes in your hand.") + +//the spraycan + +/obj/item/traitor_spraycan + ///Is our rune multi stage + var/multi_stage = TRUE + +/obj/item/traitor_spraycan/enchanted + name = "enchanted seditious spraycan" + desc = "An enchanted spraycan able to draw a single rune of power." + multi_stage = FALSE + ///Weakref to the mind that owns this spraycan, used for transfer to the rune + var/datum/weakref/owning_mind + +/obj/item/traitor_spraycan/enchanted/try_draw_new_rune(mob/living/user, turf/target_turf) + for(var/turf/nearby_turf as anything in RANGE_TURFS(1, target_turf)) + if(isindestructiblewall(nearby_turf) || is_type_in_typecache(nearby_turf, no_draw_turfs)) + user.balloon_alert(user, "Invalid floor!") + return + + draw_rune(user, target_turf) + +/obj/item/traitor_spraycan/enchanted/draw_rune(mob/living/user, turf/target_turf) + drawing_rune = TRUE + target_turf.balloon_alert(user, "Drawing rune...") + var/obj/effect/temp_visual/wizard_rune/traitor_drawing/draw_effect = new(target_turf) + if(!do_after(user, 4 SECONDS, target_turf)) + target_turf.balloon_alert(user, "Interrupted!") + drawing_rune = FALSE + qdel(draw_effect) + new /obj/effect/temp_visual/wizard_rune/failed(target_turf) + return + + var/evaporated_obstacles = FALSE + for(var/atom/possible_obstacle in range(1, target_turf)) + if(!possible_obstacle.density) + continue + evaporated_obstacles = TRUE + new /obj/effect/temp_visual/emp/pulse(possible_obstacle) + + if(iswallturf(possible_obstacle)) + var/turf/closed/wall/wall = possible_obstacle + wall.dismantle_wall(devastated = TRUE) + continue + possible_obstacle.atom_destruction("magic") + + if(evaporated_obstacles) + playsound(target_turf, 'sound/magic/blind.ogg', 100, TRUE) + + target_turf.balloon_alert(user, "Rune created.") + var/obj/effect/grand_rune/traitor/new_rune = new(target_turf) + new_rune.owning_mind = WEAKREF(owning_mind?.resolve()) + expended = TRUE + desc = "A very suspicious looking spraycan, it's empty." + drawing_rune = FALSE +//the rune + +#define TRAITOR_RUNE_INVOKE_TIME 30 SECONDS //you just have to invoke it once but it takes a while to channel +#define TRAITOR_GRAND_RUNE_INVOKES_TO_COMPLETE 1 + +/obj/effect/grand_rune/traitor + name = "suspicious rune" + desc = "A flowing circle of shapes and runes is etched into the floor, it has an odd red tint." + icon = 'monkestation/icons/effects/96x96.dmi' + icon_state = "traitor_wizard_rune" + spell_colour = "#780000" + invoke_time = TRAITOR_RUNE_INVOKE_TIME + invokes_needed = TRAITOR_GRAND_RUNE_INVOKES_TO_COMPLETE + +/obj/effect/grand_rune/traitor/get_invoke_time() + return invoke_time + +/obj/effect/grand_rune/traitor/on_invocation_complete(mob/living/user) + is_in_use = FALSE + playsound(src,'sound/magic/staff_change.ogg', 75, TRUE) + user.mind?.make_wizard() + trigger_side_effects() + tear_reality() + icon = 'icons/effects/96x96.dmi' + flick("activate", src) + addtimer(CALLBACK(src, PROC_REF(remove_rune)), 6) + +#undef TRAITOR_RUNE_INVOKE_TIME +#undef TRAITOR_GRAND_RUNE_INVOKES_TO_COMPLETE + +//the temp visual for drawing the rune + +/obj/effect/temp_visual/wizard_rune/traitor_drawing + icon = 'monkestation/icons/effects/96x96.dmi' + icon_state = "traitor_wizard_rune_draw" + duration = 4 SECONDS diff --git a/monkestation/code/modules/antagonists/traitor/objectives/tide_bug_department.dm b/monkestation/code/modules/antagonists/traitor/objectives/tide_bug_department.dm new file mode 100644 index 000000000000..482219859cc7 --- /dev/null +++ b/monkestation/code/modules/antagonists/traitor/objectives/tide_bug_department.dm @@ -0,0 +1,166 @@ +/datum/traitor_objective_category/tide_bug_department + name = "Tide Bug Department" + objectives = list(/datum/traitor_objective/tide_bug_department = 1, + /datum/traitor_objective/tide_bug_department/high_risk_department = 1) + +/datum/traitor_objective/tide_bug_department + name = "Disrupt the operations of %DEPARTMENT% by placing a T1de virus bug in %AREA%." + description = "Use the button below to materialize the T1de virus bug within your hand, where you'll then be able to place it in %AREA%. \ + One minute after the bug is placed it will randomly open, bolt, and or electrify all airlocks in the department, \ + if the bug is destroyed before this, the objective will fail." + progression_minimum = 10 MINUTES + progression_reward = list(5 MINUTES, 10 MINUTES) + telecrystal_reward = list(2, 3) + + ///What departments can we pick from mapped to their base area type + var/list/valid_departments = list(/datum/job_department/cargo = /area/station/cargo, + /datum/job_department/medical = /area/station/medical, + /datum/job_department/science = /area/station/science, + /datum/job_department/engineering = /area/station/engineering) //service is too low security for them to be worth anything(sorry clown) + ///The department chosen for this objective to target + var/datum/job_department/targeted_department + ///The area chosen for this objective to target + var/area/targeted_area + ///Have we sent them the bug yet + var/bug_sent = FALSE + ///The areas affected by this bug + var/list/affected_areas + +/datum/traitor_objective/tide_bug_department/high_risk_department + progression_minimum = 30 MINUTES + progression_reward = list(15 MINUTES, 20 MINUTES) + telecrystal_reward = list(3, 4) + valid_departments = list(/datum/job_department/command = /area/station/command, + /datum/job_department/security = /area/station/security) + +/datum/traitor_objective/tide_bug_department/can_generate_objective(datum/mind/generating_for, list/possible_duplicates) + if(length(possible_duplicates)) + return FALSE + return TRUE + +/datum/traitor_objective/tide_bug_department/generate_objective(datum/mind/generating_for, list/possible_duplicates) + var/datum/job/role = generating_for.assigned_role + for(var/datum/traitor_objective/tide_bug_department/objective as anything in possible_duplicates) + valid_departments -= objective.targeted_department + for(var/datum/job_department/department as anything in role.departments_list) //breaking into your own department should not be an objective + valid_departments -= department + + if(!length(valid_departments)) + return FALSE + + targeted_department = SSjob.joinable_departments_by_type[pick(valid_departments)] + + var/list/valid_areas = typecacheof(valid_departments[targeted_department.type]) + var/list/blacklisted_areas = typecacheof(TRAITOR_OBJECTIVE_BLACKLISTED_AREAS + /area/station/security/checkpoint) //sec checkpoint is fine for weakpoints but not tide bugs + affected_areas = GLOB.the_station_areas.Copy() + for(var/area/possible_area as anything in affected_areas) + if(is_type_in_typecache(possible_area, blacklisted_areas) || !is_type_in_typecache(possible_area, valid_areas) || initial(possible_area.outdoors)) + affected_areas -= possible_area + + if(!length(affected_areas)) + return FALSE + + targeted_area = pick(affected_areas) + + replace_in_name("%DEPARTMENT%", targeted_department.department_name) + replace_in_name("%AREA%", initial(targeted_area.name)) + return TRUE + +/datum/traitor_objective/tide_bug_department/generate_ui_buttons(mob/user) + var/list/buttons = list() + if(!bug_sent) + buttons += add_ui_button("", "Pressing this will materialize a T1de virus bug in your hand.", "globe", "bug") + return buttons + +/datum/traitor_objective/tide_bug_department/ui_perform_action(mob/user, action) + . = ..() + if(action == "bug") + if(bug_sent) + return + bug_sent = TRUE + var/obj/item/traitor_bug/bug = new(user.drop_location(), src) + user.put_in_hands(bug) + bug.balloon_alert(user, "The Tide virus bug materializes in your hand.") + AddComponent(/datum/component/traitor_objective_register, bug, \ + succeed_signals = list(COMSIG_TRAITOR_BUG_ACTIVATED), \ + fail_signals = list(COMSIG_PARENT_QDELETING), \ + penalty = telecrystal_penalty) + bug.objective_weakref = WEAKREF(src) + +/obj/item/traitor_bug + ///Weakref to our objective + var/datum/weakref/objective_weakref + +/obj/item/traitor_bug/interact(mob/user) + . = ..() + var/datum/traitor_objective/tide_bug_department/resolved_objective = objective_weakref?.resolve() + if(!resolved_objective?.targeted_area) + return + + var/turf/location = drop_location() + if(!location) + return + + var/area/current_area = get_area(location) + if(!istype(current_area, resolved_objective.targeted_area)) + balloon_alert(user, "you can't deploy this here!") + return + + if(!do_after(user, deploy_time, src)) + return + + var/obj/structure/traitor_bug/new_bug = new(location) + new_bug.bug_item_ref = src + transfer_fingerprints_to(new_bug) + transfer_fibers_to(new_bug) + moveToNullspace() //this used to be handled by the objective completing as soon as this was planted, but due to needing to check for things after that its just easier to do it this way + +/obj/structure/traitor_bug + name = "suspicious device" + desc = "It looks dangerous. Best you leave this alone." + + anchored = TRUE + + icon = 'icons/obj/device_syndie.dmi' + icon_state = "bug-animated" + /// Ref to our bug item + var/obj/item/traitor_bug/bug_item_ref + +/obj/structure/traitor_bug/Initialize(mapload) + . = ..() + addtimer(CALLBACK(src, PROC_REF(tide_department)), 60 SECONDS) + +/obj/structure/traitor_bug/deconstruct(disassembled) + QDEL_NULL(bug_item_ref) + return ..() + +/obj/structure/traitor_bug/proc/tide_department() + if(!bug_item_ref) + return + + SEND_SIGNAL(bug_item_ref, COMSIG_TRAITOR_BUG_ACTIVATED) + + var/datum/traitor_objective/tide_bug_department/resolved_objective = bug_item_ref.objective_weakref?.resolve() + if(!resolved_objective?.affected_areas) + return + + SEND_GLOBAL_SIGNAL(COMSIG_GLOBAL_GREY_TIDE_TRAITOR, resolved_objective.affected_areas, TRUE) + +#define TIME_TO_UNBOLT 3 MINUTES +/obj/machinery/door/airlock/proc/traitor_bug_tide() + if(obj_flags & EMAGGED) + return + + unbolt() + open() + +//its random if it gets bolted or electrifried or not + if(prob(70)) + bolt() + + if(prob(30)) + set_electrified(MACHINE_ELECTRIFIED_PERMANENT) + + addtimer(CALLBACK(src, PROC_REF(unbolt)), TIME_TO_UNBOLT) //unbolt the airlocks in 3 minutes + +#undef TIME_TO_UNBOLT diff --git a/monkestation/code/modules/antagonists/traitor/uplink_handler.dm b/monkestation/code/modules/antagonists/traitor/uplink_handler.dm new file mode 100644 index 000000000000..4848d52468e5 --- /dev/null +++ b/monkestation/code/modules/antagonists/traitor/uplink_handler.dm @@ -0,0 +1,8 @@ +/datum/uplink_handler + /// Extra stuff that cannot be purchased by an uplink, regardless of flag. + var/list/locked_entries = list() + +///Add items to our locked_entries +/datum/uplink_handler/proc/add_locked_entries(list/items_to_add) + for(var/datum/uplink_item/item as anything in items_to_add) + locked_entries |= item diff --git a/monkestation/code/modules/antagonists/uplink_items/bundles.dm b/monkestation/code/modules/antagonists/uplink_items/bundles.dm deleted file mode 100644 index bccbba83f232..000000000000 --- a/monkestation/code/modules/antagonists/uplink_items/bundles.dm +++ /dev/null @@ -1,31 +0,0 @@ -/datum/uplink_item/bundles_tc/surplus/lootbox - name = "Syndicate Lootbox Crate" - desc = "A dusty crate from the back of the Syndicate warehouse. Rumored to contain a valuable assortment of items, \ - With their all new kit, codenamed 'scam' the syndicate attempted to extract the energy of the die of fate to \ - make a loot-box style system but failed, so instead just fake their randomness using ook's evil twin brother to sniff out the items to shove in it. \ - Item price not guaranteed. Can contain normally unobtainable items." - lock_other_purchases = TRUE - -/datum/uplink_item/bundles_tc/surplus/lootbox/purchase(mob/user, datum/uplink_handler/handler, atom/movable/source) - crate_tc_value = rand(1,20) // randomise how much it costs, from 5 to 100 TC - crate_tc_value *= 5 - if(crate_tc_value == 5) //horrible luck, welcome to gambling - crate_tc_value *= 0 - to_chat(user, span_warning("You feel an overwhelming sense of pride and accomplishment.")) - if(crate_tc_value == 100) // Jackpot, how lucky - crate_tc_value *= 2 - print_command_report("Congratulations to [user] for being the [rand(2, 9)]th lucky winner of the syndicate lottery! \ - Dread Admiral Sabertooth has authorised the beaming of your special equipment immediately! Happy hunting operative.", - "Syndicate Gambling Division High Command", TRUE) - var/obj/structure/closet/crate/surplus_crate = new crate_type() - if(!istype(surplus_crate)) - CRASH("crate_type is not a crate") - var/list/possible_items = generate_possible_items(user, handler) - - fill_crate(surplus_crate, possible_items) - - podspawn(list( // unlike other chests, lets give them the chest with STYLE - "target" = get_turf(user), - "style" = STYLE_SYNDICATE, - "spawn" = surplus_crate, - )) diff --git a/monkestation/code/modules/antagonists/uplink_items/species.dm b/monkestation/code/modules/antagonists/uplink_items/species.dm deleted file mode 100644 index d39476f11b82..000000000000 --- a/monkestation/code/modules/antagonists/uplink_items/species.dm +++ /dev/null @@ -1,15 +0,0 @@ -//Species Specific Items - -/datum/uplink_item/race_restricted/monkey_barrel - name = "Angry Monkey Barrel" - desc = "Expert Syndicate Scientists put pissed a couple monkeys off and put them in a barrel. It isn't that complicated, but it's very effective" - cost = 7 - item = /obj/item/grenade/monkey_barrel - restricted_species = list(SPECIES_SIMIAN) - -/datum/uplink_item/race_restricted/monkey_ball - name = "Monkey Ball" - desc = "Stolen experimental MonkeTech designed to bring a monkey's speed to dangerous levels." - cost = 12 - item = /obj/vehicle/ridden/monkey_ball - restricted_species = list(SPECIES_SIMIAN) diff --git a/monkestation/code/modules/antagonists/uplink_items/weapons.dm b/monkestation/code/modules/antagonists/uplink_items/weapons.dm deleted file mode 100644 index 9a597b7d4b75..000000000000 --- a/monkestation/code/modules/antagonists/uplink_items/weapons.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/uplink_item/implants/hardlight - name = "Hardlight Spear Implant" - desc = "An implant injected into the body, and later activated at the user's will. It will summon a spear \ - made out of hardlight that the user can use to wreak havoc." - item = /obj/item/storage/box/syndie_kit/imp_hard_spear - cost = 10 diff --git a/monkestation/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm b/monkestation/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm new file mode 100644 index 000000000000..c0da0a38941d --- /dev/null +++ b/monkestation/code/modules/antagonists/wizard/grand_ritual/grand_rune.dm @@ -0,0 +1,9 @@ +#define GRAND_RUNE_INVOKES_TO_COMPLETE 3 //moved from the upstream file to here as this is where its used now + +/obj/effect/grand_rune + ///Weakref to our owning mind + var/datum/weakref/owning_mind + ///How many times this rune needs to be invoked to complete + var/invokes_needed = GRAND_RUNE_INVOKES_TO_COMPLETE + +#undef GRAND_RUNE_INVOKES_TO_COMPLETE diff --git a/monkestation/code/modules/art_sci_overrides/activators/_base.dm b/monkestation/code/modules/art_sci_overrides/activators/_base.dm new file mode 100644 index 000000000000..57c25345fc73 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/activators/_base.dm @@ -0,0 +1,19 @@ +/datum/artifact_activator + /// Name given to activator + var/name = "Generic Activator" + ///bitflag list of needed stimuli + var/required_stimuli = NONE + /// our baseline amount needed to even think about triggering (do this in setup otherwise its gonna be static) + var/base_trigger_amount = 0 + ///the highest number our trigger can be + var/highest_trigger_amount = 0 + ///the end goal of the amount we need set by setup below + var/amount = 0 + ///the hint we want to pass into the componenet for when we hit hint triggers + var/list/hint_texts = list("emits a faint noise..") + +/datum/artifact_activator/proc/setup(potency) + amount = round(max(base_trigger_amount, base_trigger_amount + (highest_trigger_amount - base_trigger_amount) * (potency/100))) + +/datum/artifact_activator/proc/grab_hint() + return pick(hint_texts) diff --git a/monkestation/code/modules/art_sci_overrides/activators/range.dm b/monkestation/code/modules/art_sci_overrides/activators/range.dm new file mode 100644 index 000000000000..dd946af80fbe --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/activators/range.dm @@ -0,0 +1,51 @@ +//range artifacts require stimuli to fall within a range between amount and upper range +// hint range and hint chance are added onto range to see if something we should pull a hint for the user + +/datum/artifact_activator/range + name = "Generic Range Trigger" + //the upper range of the weapon basically between amount, and upper_range + var/upper_range = 0 + ///Hint range goes like amount - hint_range to upper_range + hint_range + var/hint_range = 0 + ///if we are in the hint range the odds of pulling a hint out. + var/hint_prob = 15 + +/datum/artifact_activator/range/setup(potency) + . = ..() + upper_range = amount + (hint_range * 2) + +/datum/artifact_activator/range/force + name = "Physical Trauma" + required_stimuli = STIMULUS_FORCE + highest_trigger_amount = 30 //any higher than this and its gonna be practically impossible to trigger + hint_prob = 50 + hint_range = 10 + hint_texts = list("you almost want to start hitting things.", "a good whack might fix this.") + +/datum/artifact_activator/range/heat + name = "Heat Sensisty" + required_stimuli = STIMULUS_HEAT + hint_range = 20 + highest_trigger_amount = 15000 + hint_texts = list("it feels like someone messed with the thermostat.", "it feels unpleasent being near") + +/datum/artifact_activator/range/heat/New() + base_trigger_amount = rand(350, 1000) + +/datum/artifact_activator/range/shock + name = "Electrical Charged" + required_stimuli = STIMULUS_SHOCK + highest_trigger_amount = 10000 // requires atleast t2 parts to trigger a max roll one + hint_range = 500 + hint_texts = list("you can feel the static in the air", "your hairs stand on their ends") + +/datum/artifact_activator/range/shock/New() + base_trigger_amount = rand(400, 1200) + +/datum/artifact_activator/range/radiation + name = "Radioactivity" + required_stimuli = STIMULUS_RADIATION + highest_trigger_amount = 10 + hint_range = 2 + base_trigger_amount = 1 //x-ray machine goes from 1-10 + hint_texts = list("emits a hum that resembles the Super Matter", "you could swear you saw your bones for a second") diff --git a/monkestation/code/modules/art_sci_overrides/activators/touch.dm b/monkestation/code/modules/art_sci_overrides/activators/touch.dm new file mode 100644 index 000000000000..4cdee177fd24 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/activators/touch.dm @@ -0,0 +1,20 @@ +//touch artifacts are just if something comes into contact without a range IE if someone touches an artifact + +/datum/artifact_activator/touch + name = "Generic Contact Trigger" + required_stimuli = STIMULUS_DATA | STIMULUS_CARBON_TOUCH | STIMULUS_SILICON_TOUCH + +/datum/artifact_activator/touch/data + name = "Data" + required_stimuli = STIMULUS_DATA + hint_texts = list("It yearns for information") + +/datum/artifact_activator/touch/carbon + name = "Carbon Touch" + required_stimuli = STIMULUS_CARBON_TOUCH + hint_texts = list("You swear you hear the artifact saying it yearns for flesh.", "One touch couldn't hurt could it?") + +/datum/artifact_activator/touch/silicon + name = "Silicon Touch" + required_stimuli = STIMULUS_SILICON_TOUCH + hint_texts = list("It feels like it's malfunctioning") diff --git a/monkestation/code/modules/art_sci_overrides/artifact_components/_base_component.dm b/monkestation/code/modules/art_sci_overrides/artifact_components/_base_component.dm new file mode 100644 index 000000000000..46606e039d65 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_components/_base_component.dm @@ -0,0 +1,231 @@ +#define BASE_MAX_ACTIVATORS 2 + +/datum/component/artifact + dupe_mode = COMPONENT_DUPE_UNIQUE + ///object related to this datum for spawning + var/obj/associated_object + ///actual specific object for this instance + var/obj/holder + ///list weight for picking this artifact datum (0 = never) + var/weight = 0 + ///size class for visuals (ARTIFACT_SIZE_TINY,ARTIFACT_SIZE_SMALL,ARTIFACT_SIZE_LARGE) + var/artifact_size = ARTIFACT_SIZE_LARGE + ///type name for displaying on analysis forms + var/type_name = "Generic Artifact Type" + /// fake name for when unanalyzed + var/fake_name + ///the randomly generated name using our origin + var/generated_name + ///Is the artifact active? + var/active = FALSE + ///activators that activate the artifact + var/list/datum/artifact_activator/activators = list() + var/max_activators = BASE_MAX_ACTIVATORS + ///Valid activators to pick + var/list/valid_activators = list( + /datum/artifact_activator/touch/carbon, + /datum/artifact_activator/touch/silicon, + /datum/artifact_activator/touch/data, + + /datum/artifact_activator/range/force, + /datum/artifact_activator/range/heat, + /datum/artifact_activator/range/shock, + /datum/artifact_activator/range/radiation, + ) + ///valid list of faults with their weights [10 is base] + var/list/valid_faults = list( + /datum/artifact_fault/ignite = 10, + /datum/artifact_fault/warp = 10, + /datum/artifact_fault/reagent/poison = 10, + /datum/artifact_fault/death = 2, + /datum/artifact_fault/tesla_zap = 5, + /datum/artifact_fault/shrink = 10, + /datum/artifact_fault/explosion = 2, + ) + ///origin datum + var/datum/artifact_origin/artifact_origin + ///origin datums to pick + var/list/valid_origins = list( + /datum/artifact_origin/narsie, + /datum/artifact_origin/wizard, + /datum/artifact_origin/silicon, + /datum/artifact_origin/precursor, + /datum/artifact_origin/martian, + ) + var/activation_message + var/activation_sound + var/deactivation_message + var/deactivation_sound + var/hint_text = "emits a faint noise.." + var/examine_hint + var/mutable_appearance/act_effect + /// Potency in percentage, used for making more strong artifacts need more stimulus. (1% - 100%) 100 is strongest. + var/potency = 1 + + ///structure description from x-ray machines + var/xray_result = "NONE" + ///we store our analysis form var here + var/obj/item/sticker/analysis_form/analysis + + var/mutable_appearance/extra_effect + ///the fault we picked from the listed ones + var/datum/artifact_fault/chosen_fault + ///the amount of freebies we get + var/freebies = 3 + +/datum/component/artifact/Initialize(forced_origin = null) + . = ..() + if(!isobj(parent)) + return COMPONENT_INCOMPATIBLE + + holder = parent + GLOB.running_artifact_list[holder] = src + + if(forced_origin) + valid_origins = list(forced_origin) + var/picked_origin = pick(valid_origins) + artifact_origin = new picked_origin + fake_name = "[pick(artifact_origin.name_vars["adjectives"])] [pick(isitem(holder) ? artifact_origin.name_vars["small-nouns"] : artifact_origin.name_vars["large-nouns"])]" + var/picked_fault = pick_weight(valid_faults) + chosen_fault = new picked_fault + + generated_name = artifact_origin.generate_name() + if(!generated_name) + generated_name = "[pick(artifact_origin.name_vars["adjectives"])] [pick(isitem(holder) ? artifact_origin.name_vars["small-nouns"] : artifact_origin.name_vars["large-nouns"])]" + + holder.name = fake_name + holder.desc = "You have absolutely no clue what this thing is or how it got here." + + var/dat_icon + switch(artifact_size) + if(ARTIFACT_SIZE_LARGE) + holder.icon = artifact_origin.icon_file_large + dat_icon = "[artifact_origin.sprite_name]-[rand(1,artifact_origin.max_icons)]" + if(ARTIFACT_SIZE_SMALL) + holder.icon = artifact_origin.icon_file_medium + dat_icon = "[artifact_origin.sprite_name]-[rand(1,artifact_origin.max_item_icons)]" + if(ARTIFACT_SIZE_TINY) + holder.icon = artifact_origin.icon_file_small + dat_icon = "[artifact_origin.sprite_name]-[rand(1,artifact_origin.max_item_icons_small)]" + holder.icon_state = dat_icon + + //wizards got an extract MA for the gem coloring, if we have extras add them below this + if(artifact_origin.type_name == ORIGIN_WIZARD) + extra_effect = mutable_appearance(holder.icon, "[holder.icon_state]-gem", ABOVE_OBJ_LAYER, offset_spokesman = holder) + extra_effect.color = random_rgb_pairlists(artifact_origin.overlays_reds, artifact_origin.overlays_blues, artifact_origin.overlays_greens, artifact_origin.overlays_alpha) + + holder.update_appearance() // force an all update specifically to try and apply secondary overlays + + act_effect = mutable_appearance(holder.icon, "[holder.icon_state]fx", offset_spokesman = holder, alpha = rand(artifact_origin.overlays_alpha[1], artifact_origin.overlays_alpha[2])) + act_effect.color = random_rgb_pairlists(artifact_origin.overlays_reds, artifact_origin.overlays_blues, artifact_origin.overlays_greens, artifact_origin.overlays_alpha) + act_effect.overlays += emissive_appearance(act_effect.icon, act_effect.icon_state, holder, alpha = act_effect.alpha) + activation_sound = pick(artifact_origin.activation_sounds) + if(LAZYLEN(artifact_origin.deactivation_sounds)) + deactivation_sound = pick(artifact_origin.deactivation_sounds) + + var/activator_amount = rand(1,max_activators) + while(activator_amount>0) + var/selection = pick(valid_activators) + valid_activators -= selection + activators += new selection() + activator_amount-- + + ADD_TRAIT(holder, TRAIT_HIDDEN_EXPORT_VALUE, INNATE_TRAIT) + setup() + potency = clamp(potency, 0, 100) + for(var/datum/artifact_activator/activator in activators) + activator.setup(potency) + hint_text = activator.grab_hint() + +/datum/component/artifact/RegisterWithParent() + RegisterSignals(parent, list(COMSIG_ATOM_DESTRUCTION, COMSIG_PARENT_QDELETING), PROC_REF(on_destroy)) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(parent, COMSIG_STICKER_STICKED, PROC_REF(on_sticker)) + RegisterSignal(parent, COMSIG_STICKER_UNSTICKED, PROC_REF(on_desticker)) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_unarmed)) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attackby)) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_ROBOT, PROC_REF(on_robot_attack)) + RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, PROC_REF(emp_act)) + RegisterSignal(parent, COMSIG_ATOM_EX_ACT, PROC_REF(ex_act)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) + +/datum/component/artifact/UnregisterFromParent() + GLOB.running_artifact_list -= parent + UnregisterSignal(parent, list( + COMSIG_PARENT_EXAMINE, + COMSIG_ATOM_UPDATE_OVERLAYS, + COMSIG_STICKER_STICKED, + COMSIG_STICKER_UNSTICKED, + COMSIG_ATOM_ATTACK_HAND, + COMSIG_PARENT_ATTACKBY, + COMSIG_ATOM_ATTACK_ROBOT, + COMSIG_ATOM_EX_ACT, + COMSIG_ATOM_EMP_ACT, + )) + +/datum/component/artifact/proc/setup() + return + +/datum/component/artifact/proc/artifact_activate(silent) + if(active) //dont activate activated objects + return FALSE + + if(activation_sound && !silent) + playsound(holder, activation_sound, 75, TRUE) + if(activation_message && !silent) + holder.visible_message(span_notice("[holder] [activation_message]")) + active = TRUE + holder.add_overlay(act_effect) + effect_activate(silent) + return TRUE + +/datum/component/artifact/proc/artifact_deactivate(silent) + if(!active) + return + if(deactivation_sound && !silent) + playsound(holder, deactivation_sound, 75, TRUE) + if(deactivation_message && !silent) + holder.visible_message(span_notice("[holder] [deactivation_message]")) + active = FALSE + holder.cut_overlay(act_effect) + effect_deactivate(silent) + +/datum/component/artifact/proc/process_stimuli(stimuli, stimuli_value, triggers_faults = TRUE) + if(!stimuli || active) // if called without a stimuli dont bother, if active we dont wanna reactivate + return + var/checked_fault = FALSE + for(var/datum/artifact_activator/listed_activator in activators) + if(!(listed_activator.required_stimuli & stimuli)) + if(!triggers_faults) + continue + if(freebies >= 1) + freebies-- + continue + if(checked_fault) + continue + checked_fault = TRUE + if(prob(chosen_fault.trigger_chance)) + chosen_fault.on_trigger(src) + if(chosen_fault.visible_message) + holder.visible_message("[holder] [chosen_fault.visible_message]") + continue + checked_fault = TRUE + if(istype(listed_activator, /datum/artifact_activator/range)) + var/datum/artifact_activator/range/ranged_activator = listed_activator + //if we fail the range check check if we are in hint range to send out the hint + if(!ISINRANGE(stimuli_value, ranged_activator.amount, ranged_activator.upper_range)) + if(hint_text && !ISINRANGE(stimuli_value, ranged_activator.amount - ranged_activator.hint_range, ranged_activator.upper_range + ranged_activator.hint_range)) + continue + if(!prob(ranged_activator.hint_prob)) + continue + holder.visible_message(span_notice("[hint_text]")) + continue + artifact_activate() + +/datum/component/artifact/proc/stimulate_from_turf_heat(turf/target) + process_stimuli(STIMULUS_HEAT, target.return_air().temperature, FALSE) + +/datum/component/artifact/proc/stimulate_from_rad_act(intensity) + process_stimuli(STIMULUS_RADIATION, intensity) + +#undef BASE_MAX_ACTIVATORS diff --git a/monkestation/code/modules/art_sci_overrides/artifact_components/_base_component_signal_procs.dm b/monkestation/code/modules/art_sci_overrides/artifact_components/_base_component_signal_procs.dm new file mode 100644 index 000000000000..02155a0dea6a --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_components/_base_component_signal_procs.dm @@ -0,0 +1,92 @@ +/datum/component/artifact/proc/on_destroy(atom/source) + SIGNAL_HANDLER + UnregisterSignal(holder, COMSIG_IN_RANGE_OF_IRRADIATION) + if(!QDELETED(holder)) + holder.loc.visible_message(span_warning("[holder] [artifact_origin.destroy_message]")) + artifact_deactivate(TRUE) + if(!QDELETED(holder)) + qdel(holder) + +/datum/component/artifact/proc/on_examine(atom/source, mob/user, list/examine_list) + SIGNAL_HANDLER + if(examine_hint) + examine_list += examine_hint + +/datum/component/artifact/proc/on_sticker(atom/source, obj/item/sticker/sticker, mob/user) + SIGNAL_HANDLER + if(analysis) + to_chat(user, "You peel off [analysis], to make room for [sticker].") + sticker.peel() + if(!istype(sticker, /obj/item/sticker/analysis_form)) + return + analysis = sticker + +/datum/component/artifact/proc/on_desticker(atom/source) + SIGNAL_HANDLER + analysis = null + +/// Used to maintain the acid overlay on the parent [/atom]. +/datum/component/artifact/proc/on_update_overlays(atom/parent_atom, list/overlays) + SIGNAL_HANDLER + + if(!extra_effect) + return + overlays += extra_effect + +/datum/component/artifact/proc/on_unarmed(atom/source, mob/living/user) + SIGNAL_HANDLER + if(!user.Adjacent(holder)) + return + if(isAI(user) || isobserver(user)) //sanity + return + + if(user.pulling && isliving(user.pulling)) + if((user.istate & ISTATE_HARM) && user.pulling.Adjacent(holder) && user.grab_state > GRAB_PASSIVE) + holder.visible_message(span_warning("[user] forcefully shoves [user.pulling] against the [holder]!")) + on_unarmed(source, user.pulling) + else if(!(user.istate & ISTATE_HARM)) + holder.visible_message(span_notice("[user] gently pushes [user.pulling] against the [holder].")) + process_stimuli(STIMULUS_CARBON_TOUCH) + return + + if(artifact_size == ARTIFACT_SIZE_LARGE) //only large artifacts since the average spessman wouldnt notice) + user.visible_message(span_notice("[user] touches [holder].")) + + if(ishuman(user)) + var/mob/living/carbon/human/human = user + var/obj/item/bodypart/arm = human.get_active_hand() + if(arm.bodytype & BODYTYPE_ROBOTIC) + process_stimuli(STIMULUS_SILICON_TOUCH) + else + process_stimuli(STIMULUS_CARBON_TOUCH) + else if(iscarbon(user)) + process_stimuli(STIMULUS_CARBON_TOUCH) + else if(issilicon(user)) + process_stimuli(STIMULUS_SILICON_TOUCH) + + process_stimuli(STIMULUS_FORCE, 1) + + if(active) + effect_touched(user) + return + if(LAZYLEN(artifact_origin.touch_descriptors)) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), user, span_notice("[pick(artifact_origin.touch_descriptors)]")), 0.5 SECONDS) + +//just redirect to on_unarmed +/datum/component/artifact/proc/on_robot_attack(datum/source, mob/living/user) + SIGNAL_HANDLER + on_unarmed(source, user) + +/datum/component/artifact/proc/ex_act(atom/source, severity) + SIGNAL_HANDLER + process_stimuli(STIMULUS_FORCE, 25 * severity) + process_stimuli(STIMULUS_HEAT, 360 * severity) + +/datum/component/artifact/proc/emp_act(atom/source, severity) + SIGNAL_HANDLER + process_stimuli(STIMULUS_SHOCK, 800 * severity) + process_stimuli(STIMULUS_RADIATION, 2 * severity) + +/datum/component/artifact/proc/on_attackby(atom/source, obj/item/I, mob/user) + SIGNAL_HANDLER + I.on_artifact_interact(src, user) diff --git a/monkestation/code/modules/art_sci_overrides/artifact_components/_base_subtype_helpers.dm b/monkestation/code/modules/art_sci_overrides/artifact_components/_base_subtype_helpers.dm new file mode 100644 index 000000000000..1e3d17d80b91 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_components/_base_subtype_helpers.dm @@ -0,0 +1,9 @@ +// Effects for subtypes +/datum/component/artifact/proc/effect_activate(silent) + return +/datum/component/artifact/proc/effect_deactivate(silent) + return +/datum/component/artifact/proc/effect_touched(mob/living/user) + return +/datum/component/artifact/proc/effect_process() + return diff --git a/monkestation/code/modules/art_sci_overrides/artifact_components/bomb.dm b/monkestation/code/modules/art_sci_overrides/artifact_components/bomb.dm new file mode 100644 index 000000000000..476af7185a04 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_components/bomb.dm @@ -0,0 +1,152 @@ +/datum/component/artifact/bomb + examine_hint = span_warning("It is covered in very conspicuous markings.") + valid_activators = list( + /datum/artifact_activator/range/force, + /datum/artifact_activator/range/heat, + /datum/artifact_activator/range/shock, + /datum/artifact_activator/range/radiation + ) + deactivation_message = "sputters a bit, and falls silent once more." + xray_result = "COMPLEX" + var/dud = FALSE + var/dud_message = "sputters, failing to activate! Its a dud!" + var/initial_warning = "begins overloading, rattling violenty!" + var/explode_delay = 1 MINUTES // also delayed by finale_delay for fluff + var/explode_cooldown_time = 1 MINUTES + var/finale_delay = 6 SECONDS //delay before we actually deliver the payload for fluff + var/final_message = "reaches a catastrophic overload, cracks forming at its surface!" + var/sound/active_alarm = 'sound/effects/alert.ogg' // plays every alarm_cooldown_time when active + var/alarm_cooldown_time = 3 SECONDS + var/sound/final_sound = 'sound/misc/bloblarm.ogg' + COOLDOWN_DECLARE(activation_cooldown) + COOLDOWN_DECLARE(alarm_cooldown) + var/timer_id + var/do_alert = FALSE //do we send an announcement on activation + +/datum/component/artifact/bomb/setup() + if(prob(20)) + dud = TRUE + +/datum/component/artifact/bomb/effect_activate() + if(!COOLDOWN_FINISHED(src,explode_cooldown_time)) + holder.visible_message(span_warning("[holder] [deactivation_message]")) //rekt + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/component/artifact, artifact_deactivate)), 1 SECONDS) + return + holder.visible_message(span_bolddanger("[holder] [initial_warning]")) + COOLDOWN_START(src,activation_cooldown,explode_cooldown_time) + timer_id = addtimer(CALLBACK(src, PROC_REF(finale)), explode_delay, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) + if(do_alert && is_station_level(holder.z)) + priority_announce("A highly unstable object of type [type_name] has been activated at [get_area(holder)]. It has been marked on GPS, The crew is advised to get rid of it IMMEDIATELY.", null, SSstation.announcer.get_rand_report_sound(), has_important_message = TRUE) + holder.AddComponent(/datum/component/gps, "Unstable Object") + +/datum/component/artifact/bomb/effect_deactivate() + deltimer(timer_id) + +/datum/component/artifact/bomb/effect_process() + . = ..() + if(active && COOLDOWN_FINISHED(src,alarm_cooldown) && (COOLDOWN_TIMELEFT(src,alarm_cooldown) <= finale_delay)) + playsound(holder, active_alarm, 30, 1) + holder.Shake(duration = 1 SECONDS, shake_interval = 0.08 SECONDS) + COOLDOWN_START(src,alarm_cooldown, alarm_cooldown_time) + +/datum/component/artifact/bomb/proc/finale() + if(final_sound) + playsound(holder.loc, final_sound, 100, 1, -1) + if(finale_delay) + holder.visible_message(span_bolddanger("[holder] [final_message]")) + addtimer(CALLBACK(src, PROC_REF(payload)), finale_delay) + else + payload() + +/datum/component/artifact/bomb/on_destroy(/datum/source) + . = ..() + if(active) + payload() + deltimer(timer_id) + +/datum/component/artifact/bomb/proc/payload() + . = TRUE + if(dud || !active) + holder.visible_message(span_notice("[holder] [dud_message]")) + artifact_deactivate(TRUE) + return FALSE + +/// EXPLOSIVE BOMB + +/datum/component/artifact/bomb/explosive + associated_object = /obj/structure/artifact/bomb + type_name = "Bomb (explosive)" + weight = ARTIFACT_RARE + var/devast + var/heavy + var/light + +/datum/component/artifact/bomb/explosive/New() + . = ..() + devast = rand(1,3) + heavy = rand(2,4) + light = rand(3,10) + potency = (light + heavy + devast) * 2 + +/datum/component/artifact/bomb/explosive/payload() + if(!..()) + return FALSE + explosion(holder, devast,heavy,light,light*1.5) + on_destroy() + +/// DEVESTATING BOMB + +/datum/component/artifact/bomb/explosive/devastating + associated_object = /obj/structure/artifact/bomb/devastating + type_name = "Bomb (explosive, devastating)" + do_alert = TRUE + weight = ARTIFACT_VERYRARE + xray_result = "DENSE" + explode_delay = 2 MINUTES + +/datum/component/artifact/bomb/explosive/devastating/New() + ..() + devast = rand(3,7) + heavy = rand(7,12) + light = rand(10,25) + potency = (devast + heavy + light) * 2.25 // get real + +/// GAS BOMB + +/datum/component/artifact/bomb/gas + associated_object = /obj/structure/artifact/bomb/gas + type_name = "Bomb (gas)" + weight = ARTIFACT_RARE + xray_result = "POROUS" + initial_warning = "begins rattling violenty!" + final_message = "reaches a critical pressure, cracks forming at its surface!" + var/datum/gas/payload_gas + var/list/weighted_gas = list( + /datum/gas/plasma = 5, + /datum/gas/carbon_dioxide = 10, + /datum/gas/nitrous_oxide = 10, + /datum/gas/tritium = 5, + /datum/gas/hydrogen = 5, + /datum/gas/zauker = 2, + ) + +/datum/component/artifact/bomb/gas/setup() + . = ..() + payload_gas = pick_weight(weighted_gas) + +/datum/component/artifact/bomb/gas/payload() + if(!..()) + artifact_deactivate() + return FALSE + var/turf/open/O = get_turf(holder) + if(!isopenturf(O)) + artifact_deactivate() + return FALSE + var/datum/gas_mixture/merger = new + merger.assert_gas(payload_gas) + merger.assert_gas(/datum/gas/oxygen) + merger.gases[payload_gas][MOLES] = rand(150,2000) + merger.gases[/datum/gas/oxygen][MOLES] = 350 + merger.temperature = rand(200,3000) + O.assume_air(merger) + qdel(holder) diff --git a/monkestation/code/modules/art_sci_overrides/artifact_components/bonk.dm b/monkestation/code/modules/art_sci_overrides/artifact_components/bonk.dm new file mode 100644 index 000000000000..39b6136e894d --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_components/bonk.dm @@ -0,0 +1,38 @@ +/datum/component/artifact/bonk + associated_object = /obj/structure/artifact/bonk + weight = ARTIFACT_UNCOMMON + type_name = "Slammer" + activation_message = "opens up!" + deactivation_message = "closes up." + valid_activators = list( + /datum/artifact_activator/touch/carbon, + /datum/artifact_activator/touch/silicon + ) + ///force of the hit + var/hit_power = 1 + COOLDOWN_DECLARE(bonk_cooldown) + +/datum/component/artifact/bonk/setup() + hit_power = rand(0,35) + potency += hit_power + +/datum/component/artifact/bonk/effect_touched(mob/living/user) + if(!COOLDOWN_FINISHED(src, bonk_cooldown)) + return + + if(iscarbon(user)) + var/mob/living/carbon/carbon = user + if(!carbon.get_bodypart(BODY_ZONE_HEAD)) + holder.say("My condolences to your missing head.") //they can speak uhh galactic common because alien tech idk + holder.visible_message(span_notice("[holder] shakes [user][p_s()] hands with an apparatus.")) + playsound(get_turf(holder), 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + artifact_deactivate() + return + else + carbon.apply_damage(hit_power, BRUTE, BODY_ZONE_HEAD, carbon.run_armor_check(BODY_ZONE_HEAD, MELEE)) + holder.visible_message(span_danger("[holder] hits [carbon] over the head!")) + else + holder.visible_message(span_danger("[holder] slams [user]!")) + user.adjustBruteLoss(hit_power) + playsound(get_turf(holder), 'sound/misc/bonk.ogg', 80, FALSE) + COOLDOWN_START(src, bonk_cooldown, 1.5 SECONDS) diff --git a/monkestation/code/modules/art_sci_overrides/artifact_components/borger.dm b/monkestation/code/modules/art_sci_overrides/artifact_components/borger.dm new file mode 100644 index 000000000000..c0211d8d5872 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_components/borger.dm @@ -0,0 +1,45 @@ +/datum/component/artifact/borger + associated_object = /obj/structure/artifact/borger + weight = ARTIFACT_UNCOMMON + type_name = "Borger" + activation_message = "opens up!" + deactivation_message = "closes up." + valid_activators = list( + /datum/artifact_activator/touch/carbon, + /datum/artifact_activator/touch/silicon + ) + ///the time between each limb replacement + var/limb_replace_time = 1 SECONDS + COOLDOWN_DECLARE(borg_cooldown) + +/datum/component/artifact/borger/effect_touched(mob/living/user) + if(!iscarbon(user) || !COOLDOWN_FINISHED(src, borg_cooldown)) + holder.visible_message(span_smallnoticeital("[holder] does not react to [user].")) + return + + var/mob/living/carbon/carbon_target = user + var/timer = 2 SECONDS + for (var/_limb in carbon_target.bodyparts) + var/obj/item/bodypart/limb = _limb + if (limb.body_part == HEAD || limb.body_part == CHEST) + continue + switch(limb.body_part) + if(ARM_RIGHT) + var/obj/item/bodypart/arm/right/robot/new_limb = new + addtimer(CALLBACK(new_limb, TYPE_PROC_REF(/obj/item/bodypart/, try_attach_limb), carbon_target), timer + 5) + if(ARM_LEFT) + var/obj/item/bodypart/arm/left/robot/new_limb = new + addtimer(CALLBACK(new_limb, TYPE_PROC_REF(/obj/item/bodypart/, try_attach_limb), carbon_target), timer + 5) + if(LEG_RIGHT) + var/obj/item/bodypart/leg/right/robot/new_limb = new + addtimer(CALLBACK(new_limb, TYPE_PROC_REF(/obj/item/bodypart/, try_attach_limb), carbon_target), timer + 5) + if(LEG_LEFT) + var/obj/item/bodypart/leg/left/robot/new_limb = new + addtimer(CALLBACK(new_limb, TYPE_PROC_REF(/obj/item/bodypart/, try_attach_limb), carbon_target), timer + 5) + + addtimer(CALLBACK(limb, TYPE_PROC_REF(/obj/item/bodypart/, dismember)), timer) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), carbon_target, 'sound/effects/cartoon_pop.ogg', 70), timer) + addtimer(CALLBACK(carbon_target, TYPE_PROC_REF(/mob/living/, spin), 4, 1), timer - 0.4 SECONDS) + timer += 2 SECONDS + addtimer(CALLBACK(carbon_target, TYPE_PROC_REF(/mob/, Robotize)), timer + 5) + COOLDOWN_START(src, borg_cooldown, 10 SECONDS) diff --git a/monkestation/code/modules/art_sci_overrides/artifact_components/cell.dm b/monkestation/code/modules/art_sci_overrides/artifact_components/cell.dm new file mode 100644 index 000000000000..2c3ee53a1886 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_components/cell.dm @@ -0,0 +1,37 @@ +/datum/component/artifact/cell + associated_object = /obj/item/stock_parts/cell/artifact + artifact_size = ARTIFACT_SIZE_TINY + type_name = "Power Cell" + weight = ARTIFACT_UNCOMMON + xray_result = "SEGMENTED" + valid_activators = list( + /datum/artifact_activator/range/heat, + /datum/artifact_activator/range/shock, + /datum/artifact_activator/range/radiation + ) + valid_faults = list( + /datum/artifact_fault/ignite = 10, + /datum/artifact_fault/warp = 10, + /datum/artifact_fault/reagent/poison = 10, + /datum/artifact_fault/death = 2, + /datum/artifact_fault/tesla_zap = 5, + /datum/artifact_fault/grow = 10, + /datum/artifact_fault/explosion = 2, + ) + +/datum/component/artifact/cell/setup() + var/obj/item/stock_parts/cell/artifact/cell = holder + cell.corrupted = prob(10) //trolled + cell.maxcharge = rand(5 KW, 500 MW) // the heavenly battery + cell.charge = cell.maxcharge / 2 + cell.chargerate = rand(5000, round(cell.maxcharge * 0.4)) + potency += cell.maxcharge / 900 + potency += cell.chargerate / 4000 + +/datum/component/artifact/cell/effect_activate() + var/obj/item/stock_parts/cell/artifact/cell = holder + cell.ratingdesc = TRUE + +/datum/component/artifact/cell/effect_deactivate() + var/obj/item/stock_parts/cell/artifact/cell = holder + cell.ratingdesc = FALSE diff --git a/monkestation/code/modules/art_sci_overrides/artifact_components/forcegen.dm b/monkestation/code/modules/art_sci_overrides/artifact_components/forcegen.dm new file mode 100644 index 000000000000..95be5fbb3305 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_components/forcegen.dm @@ -0,0 +1,69 @@ +/obj/structure/artifact_forcefield + name = "forcefield" + desc = "A glowing barrier, completely impenetratable to your means. Possibly made by some nearby object." + icon = 'icons/effects/effects.dmi' + layer = ABOVE_ALL_MOB_LAYER + plane = ABOVE_GAME_PLANE + anchored = TRUE + pass_flags_self = PASSGLASS + density = TRUE + mouse_opacity = MOUSE_OPACITY_OPAQUE + resistance_flags = INDESTRUCTIBLE + can_atmos_pass = ATMOS_PASS_DENSITY + +/obj/structure/artifact_forcefield/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) + playsound(loc, 'sound/weapons/egloves.ogg', 80, TRUE) + +/datum/component/artifact/forcegen + associated_object = /obj/structure/artifact/forcegen + weight = ARTIFACT_UNCOMMON + type_name = "Forcefield Generator" + activation_message = "springs to life and starts emitting a forcefield!" + deactivation_message = "shuts down, its forcefields shutting down with it." + valid_activators = list( + /datum/artifact_activator/touch/carbon, + /datum/artifact_activator/touch/silicon, + /datum/artifact_activator/range/force + ) + var/cooldown_time //cooldown AFTER the shield lowers + var/shield_iconstate + var/list/projected_forcefields = list() + var/radius + var/shield_time + COOLDOWN_DECLARE(cooldown) + +/datum/component/artifact/forcegen/setup() + shield_iconstate = pick("shieldsparkles","empdisable","shield2","shield-old","shield-red","shield-green","shield-yellow") + activation_sound = pick('sound/mecha/mech_shield_drop.ogg') + deactivation_sound = pick('sound/mecha/mech_shield_raise.ogg','sound/magic/forcewall.ogg') + shield_time = rand(10,40) SECONDS + radius = rand(1,3) + cooldown_time = shield_time / 3 + potency += radius * 3 + shield_time / 30 + +/datum/component/artifact/forcegen/effect_activate() + if(!COOLDOWN_FINISHED(src,cooldown)) + holder.visible_message(span_notice("[holder] wheezes, shutting down.")) + artifact_deactivate(TRUE) + return + holder.anchored = TRUE + var/turf/our_turf = get_turf(holder) + var/list/bad_turfs + if(radius > 1) + bad_turfs = range(radius - 1, holder) + for(var/turf/open/floor in range(radius,holder)) + if(floor in bad_turfs) + continue + if(floor == our_turf) + continue + var/obj/field = new /obj/structure/artifact_forcefield(floor) + field.icon_state = shield_iconstate + projected_forcefields += field + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/component/artifact, artifact_deactivate)), shield_time) + COOLDOWN_START(src,cooldown,shield_time + cooldown_time) + +/datum/component/artifact/forcegen/effect_deactivate() + holder.anchored = FALSE + for(var/obj/field in projected_forcefields) + projected_forcefields -= field + qdel(field) diff --git a/monkestation/code/modules/art_sci_overrides/artifact_components/gun.dm b/monkestation/code/modules/art_sci_overrides/artifact_components/gun.dm new file mode 100644 index 000000000000..7425c524e47a --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_components/gun.dm @@ -0,0 +1,79 @@ +#define LOWEST_POSSIBLE_CLICK_CD 3 +#define HIGHEST_POSSIBLE_CLICK_CD 15 + +/datum/component/artifact/gun + associated_object = /obj/item/gun/magic/artifact + artifact_size = ARTIFACT_SIZE_SMALL + type_name = "Ranged Weapon" + weight = ARTIFACT_VERYUNCOMMON //rare + xray_result = "COMPLEX" + valid_activators = list( + /datum/artifact_activator/range/heat, + /datum/artifact_activator/range/shock, + /datum/artifact_activator/range/radiation + ) + valid_faults = list( + /datum/artifact_fault/ignite = 10, + /datum/artifact_fault/warp = 10, + /datum/artifact_fault/reagent/poison = 10, + /datum/artifact_fault/death = 2, + /datum/artifact_fault/tesla_zap = 5, + /datum/artifact_fault/grow = 10, + /datum/artifact_fault/explosion = 2, + ) + + //list of projectile exclusive projectiles + ///damage each shot does + var/damage + ///the icon state + var/projectile_icon + ///the damage type + var/dam_type + ///total ricochets + var/ricochets_max = 0 + ///chance to ricochets + var/ricochet_chance = 0 + ///range until it auto aims + var/ricochet_auto_aim_range = 0 + ///wound bonus for the shot + var/wound_bonus = CANT_WOUND + ///is it sharp? + var/sharpness = NONE + ///does it spread? if so how much + var/spread = 0 + + ///list of damage types + var/list/damage_types = list( + BRUTE, + BURN, + TOX, + OXY, + BRAIN, + STAMINA + ) + +/datum/component/artifact/gun/setup() + var/obj/item/gun/magic/artifact/our_wand = holder + var/obj/item/ammo_casing/casing = our_wand.chambered + //randomize our casing + casing.click_cooldown_override = rand(LOWEST_POSSIBLE_CLICK_CD, HIGHEST_POSSIBLE_CLICK_CD) + if(prob(30)) + casing.pellets = rand(1,3) + spread += 0.1 + + spread += prob(65) ? rand(0.0, 0.2) : rand(0.3, 1.0) + damage = rand(-5, 25) + + projectile_icon = pick("energy","scatterlaser","toxin","energy","spell","pulse1","bluespace","gauss","gaussweak","gaussstrong","redtrac","omnilaser","heavylaser","laser","infernoshot","cryoshot","arcane_barrage") + dam_type = pick(damage_types) + if(prob(30)) //bouncy + ricochets_max = rand(1, 40) + ricochet_chance = rand(80, 600) // will bounce off anything and everything, whether they like it or not + ricochet_auto_aim_range = rand(0, 4) + if(prob(50)) + wound_bonus = rand(CANT_WOUND, 15) + if(prob(40)) + sharpness = pick(SHARP_POINTY,SHARP_EDGED) + +#undef LOWEST_POSSIBLE_CLICK_CD +#undef HIGHEST_POSSIBLE_CLICK_CD diff --git a/monkestation/code/modules/art_sci_overrides/artifact_components/heal.dm b/monkestation/code/modules/art_sci_overrides/artifact_components/heal.dm new file mode 100644 index 000000000000..9177d7dea38e --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_components/heal.dm @@ -0,0 +1,62 @@ +#define PROCESSES_PER_HEAL 5 +/datum/component/artifact/heal + associated_object = /obj/structure/artifact/heal + weight = ARTIFACT_VERYUNCOMMON + type_name = "Single Healer" + activation_message = "starts emitting a soothing aura!" + deactivation_message = "becomes silent." + valid_activators = list( + /datum/artifact_activator/touch/carbon, + /datum/artifact_activator/touch/silicon + ) + ///list of damage types we heal, this is randomly removed from at setup + var/list/damage_types = list( + BRUTE, + BURN, + TOX, + OXY, + BRAIN, + CLONE, + ) + ///how much do we heal + var/heal_amount + ///process count + var/process_count = 0 + COOLDOWN_DECLARE(heal_cooldown) + +/datum/component/artifact/heal/setup() + heal_amount = rand(1,15) + potency += heal_amount + var/type_amount = prob(75) ? 4 : rand(2,4) //75% to remove 4 types for 1 heal type or 25% for 2 or 4 types removed + while(type_amount) + type_amount-- + damage_types -= pick(damage_types) + potency += 5 * (length(damage_types) - 1) + +/datum/component/artifact/heal/effect_touched(mob/living/user) + if(!COOLDOWN_FINISHED(src, heal_cooldown)) + return + var/damage_length = length(damage_types) + for(var/dam_type in damage_types) + user.heal_damage_type( (heal_amount / damage_length), dam_type) + to_chat(user, span_notice("You feel slightly refreshed!")) + new /obj/effect/temp_visual/heal(get_turf(user), COLOR_HEALING_CYAN) + COOLDOWN_START(src, heal_cooldown, 5 SECONDS) + +/datum/component/artifact/heal/effect_process() + if(potency < 75) + return + + process_count++ + if(process_count < PROCESSES_PER_HEAL) + return + process_count = 0 + + for(var/mob/living/carbon/user in view(5, src)) + var/damage_length = length(damage_types) + for(var/dam_type in damage_types) + user.heal_damage_type( (heal_amount / damage_length), dam_type) + to_chat(user, span_notice("You feel slightly refreshed!")) + new /obj/effect/temp_visual/heal(get_turf(user), COLOR_HEALING_CYAN) + +#undef PROCESSES_PER_HEAL diff --git a/monkestation/code/modules/art_sci_overrides/artifact_components/injector.dm b/monkestation/code/modules/art_sci_overrides/artifact_components/injector.dm new file mode 100644 index 000000000000..dc30a0192443 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_components/injector.dm @@ -0,0 +1,47 @@ +/datum/component/artifact/injector + associated_object = /obj/structure/artifact/injector + weight = ARTIFACT_UNCOMMON + type_name = "Injector" + activation_message = "opens up to reveal a large needle!" + deactivation_message = "pulls its needle inside, closing itself up." + xray_result = "SEGMENTED" + var/max_reagents // the total amount to dose the victim with + var/reagent_amount + var/list/reagent_datums = list() + var/cooldown_time = 10 SECONDS + COOLDOWN_DECLARE(activation_cooldown) + +/datum/component/artifact/injector/setup() + holder.create_reagents(200, NO_REACT | SEALED_CONTAINER) + reagent_amount = rand(10,25) + max_reagents = rand(1,2) + var/static/list/poisons_and_medicines = list() + if(!poisons_and_medicines.len) //mostly copied from reagents.dm but oh well + for(var/datum/reagent/reagent as anything in (subtypesof(/datum/reagent/toxin) + subtypesof(/datum/reagent/medicine))) + if(initial(reagent.chemical_flags) & REAGENT_CAN_BE_SYNTHESIZED) + poisons_and_medicines += reagent + switch(artifact_origin.type_name) + if(ORIGIN_NARSIE) + for(var/i in 1 to max_reagents) + reagent_datums += pick(poisons_and_medicines) //cult likes killing people ok + if(ORIGIN_WIZARD, ORIGIN_MARTIAN, ORIGIN_PRECURSOR) + max_reagents = rand(1,3) + reagent_amount = rand(1,50) + potency += 5 + for(var/i in 1 to max_reagents) + reagent_datums += get_random_reagent_id() // funny + if(ORIGIN_SILICON) + var/list/silicon_reagents = list(/datum/reagent/uranium, /datum/reagent/silicon, /datum/reagent/fuel, /datum/reagent/cyborg_mutation_nanomachines, /datum/reagent/fuel/oil, /datum/reagent/toxin/leadacetate) + for(var/i in 1 to max_reagents) + reagent_datums += pick(silicon_reagents) + potency += reagent_amount + max_reagents + +/datum/component/artifact/injector/effect_touched(mob/living/user) + if(!ishuman(user) || !COOLDOWN_FINISHED(src,activation_cooldown)) + holder.visible_message(span_smallnoticeital("[holder] does not react to [user].")) + return + for(var/reagent in reagent_datums) + holder.reagents.add_reagent(reagent, reagent_amount / reagent_datums.len) + holder.visible_message(span_danger("[holder] pricks [user] with its needle!"), span_userdanger("OW! You are pricked by [holder]!")) + holder.reagents.trans_to(user, holder.reagents.total_volume, transfered_by = holder, methods = INJECT) + COOLDOWN_START(src,activation_cooldown,cooldown_time) diff --git a/monkestation/code/modules/art_sci_overrides/artifact_components/lamp.dm b/monkestation/code/modules/art_sci_overrides/artifact_components/lamp.dm new file mode 100644 index 000000000000..c62124f20c62 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_components/lamp.dm @@ -0,0 +1,34 @@ + +/datum/component/artifact/lamp + associated_object = /obj/structure/artifact/lamp + weight = ARTIFACT_COMMON + type_name = "Lamp" + activation_message = "starts shining!" + deactivation_message = "stops shining." + +/datum/component/artifact/lamp/setup() + var/power + var/color = pick(COLOR_RED, COLOR_BLUE, COLOR_YELLOW, COLOR_GREEN, COLOR_PURPLE, COLOR_ORANGE) + var/range + switch(rand(1,100)) + if(1 to 75) + power = rand(2,5) + range = rand(2,5) + if(76 to 100) + range = rand(4,10) + power = rand(2,10) // the sun + + if(artifact_origin.type_name == ORIGIN_NARSIE && prob(40)) + color = COLOR_BLACK + holder.set_light_range_power_color(range, power, color) + potency += (range + power) * 2 + +/datum/component/artifact/lamp/effect_touched(mob/user) + holder.set_light_on(!holder.light_on) //toggle + to_chat(user, span_hear("[holder] clicks.")) + +/datum/component/artifact/lamp/effect_activate() + holder.set_light_on(TRUE) + +/datum/component/artifact/lamp/effect_deactivate() + holder.set_light_on(FALSE) diff --git a/monkestation/code/modules/art_sci_overrides/artifact_components/melee.dm b/monkestation/code/modules/art_sci_overrides/artifact_components/melee.dm new file mode 100644 index 000000000000..ea9e5a93e826 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_components/melee.dm @@ -0,0 +1,77 @@ +#define SPECIAL_LAUNCH "launch" +#define SPECIAL_IGNITE "ignite" +#define SPECIAL_TELEPORT "teleport" + +/datum/component/artifact/melee + associated_object = /obj/item/melee/artifact + artifact_size = ARTIFACT_SIZE_SMALL + type_name = "Melee Weapon" + weight = ARTIFACT_VERYUNCOMMON //rare + xray_result = "DENSE" + valid_activators = list( + /datum/artifact_activator/touch/silicon, + /datum/artifact_activator/range/heat, + /datum/artifact_activator/range/shock, + /datum/artifact_activator/range/radiation + ) + valid_faults = list( + /datum/artifact_fault/ignite = 10, + /datum/artifact_fault/warp = 10, + /datum/artifact_fault/reagent/poison = 10, + /datum/artifact_fault/death = 2, + /datum/artifact_fault/tesla_zap = 5, + /datum/artifact_fault/grow = 10, + /datum/artifact_fault/explosion = 2, + ) + var/active_force //force when active + var/active_reach + var/active_woundbonus = 0 + +/datum/component/artifact/melee/setup() //RNG incarnate + var/obj/item/melee/artifact/weapon = holder + weapon.special_cooldown_time = rand(3,8) SECONDS + active_force = rand(-10,30) + weapon.demolition_mod = rand(-1.0, 2.0) + weapon.force = active_force / 3 + weapon.throwforce = weapon.force + potency += abs(active_force) + if(prob(40)) + weapon.sharpness = pick(SHARP_EDGED,SHARP_POINTY) + if(weapon.sharpness == SHARP_POINTY) + weapon.attack_verb_continuous = list("stabs", "shanks", "pokes") + weapon.attack_verb_simple = list("stab", "shank", "poke") + else + weapon.attack_verb_continuous = list("slashes", "slices", "cuts") + weapon.attack_verb_simple = list("slash", "slice", "cut") + weapon.hitsound = 'sound/weapons/bladeslice.ogg' + potency += 9 + if(prob(30)) + active_woundbonus = rand(3,20) + if(prob(30)) + weapon.armour_penetration = rand(5,15)//this barely does anything inactive so its fine to have it always + if(prob(50)) + weapon.damtype = pick(BRUTE, BURN, TOX, STAMINA) + if(prob(10)) + active_reach = rand(1,3) // this CANT possibly backfire + potency += 20 + if(prob(30)) + potency += 15 + weapon.special = pick(SPECIAL_LAUNCH, SPECIAL_IGNITE, SPECIAL_TELEPORT) + +/datum/component/artifact/melee/effect_activate() + var/obj/item/melee/artifact/weapon = holder + weapon.reach = active_reach + weapon.force = active_force + weapon.wound_bonus = active_woundbonus + weapon.throwforce = weapon.force + +/datum/component/artifact/melee/effect_deactivate() + var/obj/item/melee/artifact/weapon = holder + weapon.force = active_force / 3 + weapon.throwforce = weapon.force + weapon.reach = 1 + weapon.wound_bonus = 0 + +#undef SPECIAL_LAUNCH +#undef SPECIAL_IGNITE +#undef SPECIAL_TELEPORT diff --git a/monkestation/code/modules/art_sci_overrides/artifact_components/repulsor.dm b/monkestation/code/modules/art_sci_overrides/artifact_components/repulsor.dm new file mode 100644 index 000000000000..412b52123822 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_components/repulsor.dm @@ -0,0 +1,59 @@ + +/datum/component/artifact/repulsor + associated_object = /obj/structure/artifact/repulsor + weight = ARTIFACT_COMMON + type_name = "Repulsor/Impulsor" + activation_message = "opens up, a weird aura starts emitting from it!" + deactivation_message = "closes up." + xray_result = "SEGMENTED" + var/attract = FALSE //if FALSE, repulse, otherwise, attract + var/strength + var/range + var/cooldown_time + COOLDOWN_DECLARE(cooldown) + +/datum/component/artifact/repulsor/setup() + attract = prob(40) + range = rand(1,3) + cooldown_time = rand(3,5) SECONDS + strength = rand(MOVE_FORCE_DEFAULT,MOVE_FORCE_OVERPOWERING) + potency += cooldown_time / 4 + strength / 3000 + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/component/artifact, artifact_deactivate)), round(20 * (potency * 10) SECONDS)) + +/datum/component/artifact/repulsor/effect_touched(mob/user) + if(!COOLDOWN_FINISHED(src,cooldown)) + return + pulse() + COOLDOWN_START(src,cooldown,cooldown_time) + +/datum/component/artifact/repulsor/effect_process() + . = ..() + if(prob(100 - potency)) + return + pulse() + +/datum/component/artifact/repulsor/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_ATOM_HITBY, PROC_REF(pulse)) + +/datum/component/artifact/repulsor/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, COMSIG_ATOM_HITBY) + +/datum/component/artifact/repulsor/proc/pulse(datum/source,atom/movable/thrown, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) + SIGNAL_HANDLER + if(!active) + return + holder.visible_message(span_warning("[holder] emits a pulse of energy, throwing things [attract ? "towards it!" : "away from it!"]")) + var/owner_turf = get_turf(holder) + if(isnull(thrown)) + for(var/atom/movable/throwee in oview(range,holder)) + if(throwee.anchored) + continue + if(attract) + throwee.safe_throw_at(holder, strength / 3000, 1, force = strength) + else + var/throwtarget = get_edge_target_turf(get_turf(throwee), get_dir(owner_turf, get_step_away(throwee, owner_turf))) + throwee.safe_throw_at(throwtarget, strength / 3000, 1, force = strength) + else if(throwingdatum?.thrower) + thrown.safe_throw_at(throwingdatum.thrower, get_dist(holder, throwingdatum.thrower), 1, force = strength) diff --git a/monkestation/code/modules/art_sci_overrides/artifact_components/vomit.dm b/monkestation/code/modules/art_sci_overrides/artifact_components/vomit.dm new file mode 100644 index 000000000000..24b901492867 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_components/vomit.dm @@ -0,0 +1,49 @@ +/datum/component/artifact/vomit + associated_object = /obj/structure/artifact/vomit + weight = ARTIFACT_UNCOMMON + type_name = "Vomiting Inducer" + activation_message = "starts emitting disgusting imagery!" + deactivation_message = "falls silent, its aura dissipating!" + valid_origins = list( + /datum/artifact_origin/narsie, + /datum/artifact_origin/wizard, + /datum/artifact_origin/martian, + ) //silicons dont like organic stuff or something + var/range = 0 + var/spew_range = 1 + var/spew_organs = FALSE + var/bloody_vomit = FALSE + COOLDOWN_DECLARE(cooldown) + +/datum/component/artifact/vomit/setup() + switch(rand(1,100)) + if(1 to 84) + range = rand(2,3) + if(85 to 100) //15% + range = rand(2,7) + if(prob(12)) + spew_organs = TRUE //trolling + potency += 20 + if(prob(40)) + spew_range = rand(1,5) + potency += spew_range + bloody_vomit = prob(50) + potency += (range) * 4 + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/component/artifact, artifact_deactivate)), round(30 * (potency * 10) SECONDS)) + +/datum/component/artifact/vomit/on_examine(atom/source, mob/user, list/examine_list) + . = ..() + var/mob/living/carbon/carbon = user + if(active && istype(carbon) && carbon.stat < UNCONSCIOUS) + examine_list += span_warning("It has an [spew_organs ? "extremely" : ""] disgusting aura! [prob(20) ? "..is that a felinid?" : ""]") + carbon.vomit(blood = bloody_vomit, stun = (spew_organs ? TRUE : prob(25)), distance = spew_range) + if(spew_organs && prob(40)) + carbon.spew_organ() + +/datum/component/artifact/vomit/effect_process() + for(var/mob/living/carbon/viewed in view(range, src)) + if(prob(100 - potency)) + continue + viewed.vomit(blood = bloody_vomit, stun = (spew_organs ? TRUE : prob(25)), distance = spew_range) + if(spew_organs && prob(10)) + viewed.spew_organ() diff --git a/monkestation/code/modules/art_sci_overrides/artifact_items/artifact_cell.dm b/monkestation/code/modules/art_sci_overrides/artifact_items/artifact_cell.dm new file mode 100644 index 000000000000..5f20f628b830 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_items/artifact_cell.dm @@ -0,0 +1,14 @@ +/obj/item/stock_parts/cell/artifact + icon = 'icons/obj/artifacts.dmi' + icon_state = "narnar-1" + resistance_flags = LAVA_PROOF | ACID_PROOF | INDESTRUCTIBLE + ratingdesc = FALSE + charge_light_type = null + var/datum/component/artifact/assoc_comp = /datum/component/artifact/cell + +ARTIFACT_SETUP(/obj/item/stock_parts/cell/artifact, SSobj) + +/obj/item/stock_parts/cell/artifact/use(amount, force) //dont use power unless active + . = FALSE + if(assoc_comp.active) + return ..() diff --git a/monkestation/code/modules/art_sci_overrides/artifact_items/artifact_gun.dm b/monkestation/code/modules/art_sci_overrides/artifact_items/artifact_gun.dm new file mode 100644 index 000000000000..37c02bba1e0d --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_items/artifact_gun.dm @@ -0,0 +1,50 @@ +/obj/item/ammo_casing/magic/artifact + projectile_type = /obj/projectile/magic/artifact + +/obj/item/ammo_casing/magic/artifact/ready_proj(atom/target, mob/living/user, quiet, zone_override = "", atom/fired_from) + if(!loaded_projectile) + return + var/datum/component/artifact/gun/gun = fired_from.GetComponent(/datum/component/artifact/gun) + loaded_projectile.damage = gun.damage / pellets + loaded_projectile.icon_state = gun.projectile_icon + loaded_projectile.damage_type = gun.dam_type + loaded_projectile.ricochets_max = gun.ricochets_max + loaded_projectile.ricochet_chance = gun.ricochet_chance + loaded_projectile.ricochet_auto_aim_range = gun.ricochet_auto_aim_range + loaded_projectile.wound_bonus = gun.wound_bonus + loaded_projectile.sharpness = gun.sharpness + loaded_projectile.spread = gun.spread + return ..() + +/obj/projectile/magic/artifact + name = "incomprehensible energy" + antimagic_flags = null + ricochet_incidence_leeway = 0 + ricochet_decay_chance = 0.9 + hitsound_wall = SFX_RICOCHET + impact_effect_type = /obj/effect/temp_visual/impact_effect + + +/obj/item/gun/magic/artifact + icon = 'icons/obj/artifacts.dmi' + icon_state = "narnar-item-1" + resistance_flags = LAVA_PROOF | ACID_PROOF | INDESTRUCTIBLE + icon = 'icons/obj/artifacts.dmi' + inhand_icon_state = "plasmashiv" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + ammo_type = /obj/item/ammo_casing/magic/artifact + school = SCHOOL_UNSET + max_charges = 8 + pinless = TRUE + recharge_rate = 1 + antimagic_flags = null + var/datum/component/artifact/assoc_comp = /datum/component/artifact/gun + +ARTIFACT_SETUP(/obj/item/gun/magic/artifact, SSobj) + +/obj/item/gun/magic/artifact/can_shoot() + return assoc_comp.active + +/obj/item/gun/magic/artifact/shoot_with_empty_chamber() + return diff --git a/monkestation/code/modules/art_sci_overrides/artifact_items/artifact_melee.dm b/monkestation/code/modules/art_sci_overrides/artifact_items/artifact_melee.dm new file mode 100644 index 000000000000..3ad1b89385d4 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_items/artifact_melee.dm @@ -0,0 +1,41 @@ +#define SPECIAL_LAUNCH "launch" +#define SPECIAL_IGNITE "ignite" +#define SPECIAL_TELEPORT "teleport" + +/obj/item/melee/artifact + icon = 'icons/obj/artifacts.dmi' + icon_state = "narnar-1" + resistance_flags = LAVA_PROOF | ACID_PROOF | INDESTRUCTIBLE + icon = 'icons/obj/artifacts.dmi' + inhand_icon_state = "plasmashiv" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + var/special_cooldown_time + var/special + var/datum/component/artifact/assoc_comp = /datum/component/artifact/melee + COOLDOWN_DECLARE(special_cooldown) + +ARTIFACT_SETUP(/obj/item/melee/artifact, SSobj) + +/obj/item/melee/artifact/afterattack(mob/living/victim, mob/user, proximity) + if(!istype(victim) || !assoc_comp.active || !COOLDOWN_FINISHED(src,special_cooldown) || !special || !proximity) + return + . |= AFTERATTACK_PROCESSED_ITEM + switch(special) + if(SPECIAL_IGNITE) + victim.adjust_fire_stacks(5) + if(victim.ignite_mob(silent = TRUE)) + victim.visible_message(span_warning("[victim] catches fire!"), ignored_mobs = victim) + to_chat(victim, span_userdanger("You feel a sudden wave of heat as you burst into flames!")) + if(SPECIAL_LAUNCH) + var/owner_turf = get_turf(user) + var/throwtarget = get_edge_target_turf(owner_turf, get_dir(owner_turf, get_step_away(victim, owner_turf))) + victim.safe_throw_at(throwtarget, rand(3,7), 1, force = MOVE_FORCE_VERY_STRONG) + if(SPECIAL_TELEPORT) + if(victim.move_resist < MOVE_FORCE_OVERPOWERING) + do_teleport(victim, get_turf(victim), 15, channel = TELEPORT_CHANNEL_BLUESPACE) + COOLDOWN_START(src,special_cooldown,special_cooldown_time) + +#undef SPECIAL_LAUNCH +#undef SPECIAL_IGNITE +#undef SPECIAL_TELEPORT diff --git a/monkestation/code/modules/art_sci_overrides/artifact_objects/artifact_powergen.dm b/monkestation/code/modules/art_sci_overrides/artifact_objects/artifact_powergen.dm new file mode 100644 index 000000000000..b2a37bb18adc --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_objects/artifact_powergen.dm @@ -0,0 +1,112 @@ +#define MAX_POSSIBLE_GEN 800 MW +#define SIDEEFFECT_THRESHOLD 100 KW +#define SHITFUCK_THRESHOLD 600 MW + +/obj/machinery/power/generator_artifact + icon = 'icons/obj/artifacts.dmi' + icon_state = "narnar-1" + resistance_flags = LAVA_PROOF | ACID_PROOF | INDESTRUCTIBLE + use_power = NO_POWER_USE + circuit = null + density = TRUE + anchored = FALSE + var/datum/component/artifact/assoc_comp = /datum/component/artifact/generator + +ARTIFACT_SETUP(/obj/machinery/power/generator_artifact, SSmachines) + +/datum/component/artifact/generator + associated_object = /obj/machinery/power/generator_artifact + type_name = "Power Generator" + weight = ARTIFACT_RARE + valid_activators = list( + /datum/artifact_activator/range/heat, + /datum/artifact_activator/range/shock, + /datum/artifact_activator/range/radiation + ) + valid_origins = list( + /datum/artifact_origin/wizard, + /datum/artifact_origin/silicon, + /datum/artifact_origin/precursor, + /datum/artifact_origin/martian, + ) //narnar doesnt need power + activation_message = "begins emitting a faint, droning hum." + deactivation_message = "shortcircuits!" + xray_result = "COMPLEX" + COOLDOWN_DECLARE(sideeffect_cooldown) + + var/power_gen = 0 + ///does the power output fluctuate + var/unstable_generation = FALSE + +/datum/component/artifact/generator/setup() //TODO: Make this use some weird scaling math to have it pick higher numbers at lower odds + if(prob(65)) + power_gen = rand(1 KW, MAX_POSSIBLE_GEN / 2) + else + power_gen = rand(1 KW, MAX_POSSIBLE_GEN) + unstable_generation = prob(40) + potency = power_gen / (6 KW) // 100 potency at 600kw generation + +/datum/component/artifact/generator/effect_touched(mob/living/user) + var/obj/machinery/power/generator_artifact/powerholder = holder + //if on cable and not setup, connect and setup + if(!powerholder.anchored && locate(/obj/structure/cable) in get_turf(powerholder)) + powerholder.visible_message(span_warning("[holder] seems to snap to the cable!")) + playsound(get_turf(powerholder), 'sound/items/deconstruct.ogg', 50, TRUE) + powerholder.anchored = TRUE + powerholder.connect_to_network() + return + + holder.Beam(user, icon_state = "lightning[rand(1,12)]", time = 0.5 SECONDS) + playsound(get_turf(powerholder), 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) + var/damage = user.electrocute_act(power_gen / 2 KW, powerholder, flags = SHOCK_NOSTUN) + to_chat(user, span_userdanger("You are hit by a burst of electricity from [holder]!")) + if(damage > 80) + var/turf/owner_turf = get_turf(holder) + var/throwtarget = get_edge_target_turf(get_turf(user), get_dir(owner_turf, get_step_away(user, owner_turf))) + user.safe_throw_at(throwtarget, power_gen / 38 KW, 1, force = MOVE_FORCE_EXTREMELY_STRONG) + if(damage > 400 && prob(50)) + user.dust(just_ash = TRUE, drop_items = TRUE) + artifact_deactivate() //shortcircuit + + if(prob(20)) //try to get yourself shocked with insuls many times to shortcircuit it (in retrospect this sucks) + artifact_deactivate() + +/datum/component/artifact/generator/effect_process() //todo add more + if(!holder.anchored) + return + var/obj/machinery/power/generator_artifact/powerholder = holder + powerholder.add_avail(power_gen * (unstable_generation ? rand(0.1, 1) : 1)) + if(power_gen < SIDEEFFECT_THRESHOLD || !COOLDOWN_FINISHED(src,sideeffect_cooldown)) //sorry boss no can do + return + COOLDOWN_START(src,sideeffect_cooldown,rand(4,8) SECONDS) + //minor to medium side effects + if(power_gen >= (SHITFUCK_THRESHOLD / 3)) + powerholder.visible_message(span_danger("\The [holder] lets out a shower of thunder!"), span_hear("You hear a loud electrical crack!")) + playsound(get_turf(powerholder), 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) + tesla_zap(powerholder, rand(2,3), power_gen / 3500) + + //SHIT IS FUCK + + if(power_gen < SHITFUCK_THRESHOLD) + return + + if(prob(50)) + explosion(powerholder, flame_range = rand(1,2), adminlog = FALSE) //doesnt log to not spam + else + var/datum/gas_mixture/merger = new + merger.assert_gas(/datum/gas/carbon_dioxide) + merger.gases[/datum/gas/carbon_dioxide][MOLES] = rand(10,120) + merger.temperature = rand(200,1000) + var/turf/holder_turf = get_turf(holder) + holder_turf.assume_air(merger) + + +/datum/component/artifact/generator/effect_deactivate() + var/obj/machinery/power/generator_artifact/powerholder = holder + powerholder.disconnect_from_network() + powerholder.anchored = FALSE + playsound(get_turf(powerholder), 'sound/items/deconstruct.ogg', 50, TRUE) + +#undef SHITFUCK_THRESHOLD +#undef SIDEEFFECT_THRESHOLD +#undef MAX_POSSIBLE_GEN diff --git a/monkestation/code/modules/art_sci_overrides/artifact_origins.dm b/monkestation/code/modules/art_sci_overrides/artifact_origins.dm new file mode 100644 index 000000000000..3348ff58510d --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_origins.dm @@ -0,0 +1,288 @@ +/datum/artifact_origin + ///the path of our icon file used for overwrites + var/icon_file_large = 'goon/icons/obj/artifacts/artifacts.dmi' + var/icon_file_medium = 'goon/icons/obj/artifacts/artifactsitem.dmi' + var/icon_file_small = 'goon/icons/obj/artifacts/artifactsitemS.dmi' + ///the amount of small items we got + var/max_item_icons_small = 1 + /// amount of sprites we have for this origin + var/max_icons = 1 + /// amount of sprites we have for this origins items + var/max_item_icons = 1 + + ///the base name of the sprite + var/sprite_name = "generic-sprite" + var/type_name = "Generic Origin" + var/name = "unknown" + + //sounds + var/list/activation_sounds = list() + var/list/deactivation_sounds = list() + + ///stored array of all naming vars for this origin prevents making new vars for new naming storage. And allows us to access without making a new var inside procs + var/list/name_vars = list( + "adjectives" = list(), + "small-nouns" = list(), + "large-nouns" = list(), + ) + var/touch_descriptors = list() + var/destroy_message = "" + + //visual lists + var/list/overlays_reds = list(225, 255) + var/list/overlays_greens = list(225, 255) + var/list/overlays_blues = list(225, 255) + var/list/overlays_alpha = list(225, 255) + +/datum/artifact_origin/proc/generate_name() + return FALSE + +/datum/artifact_origin/wizard + max_icons = 7 + max_item_icons = 7 + max_item_icons_small = 7 + sprite_name = "wizard" + activation_sounds = list( + 'goon/sounds/machines/ArtifactWiz1.ogg' + ) + type_name = ORIGIN_WIZARD + name = "Wizard" + + name_vars = list( + "adjectives" = list( + "imposing", + "regal", + "majestic", + "beautiful", + "shiny", + ), + "large-nouns" = list( + "jewel", + "crystal", + "sculpture", + "statue", + "ornament", + ), + "small-nouns" = list( + "staff", + "pearl", + "rod", + "cane", + "wand", + "trophy", + ), + "jewels" = list( + "diamond", + "pearl", + "topaz", + "ruby", + "sapphire", + "opal", + ), + "object" = list( + "crown", + "trophy", + "staff", + "boon", + "token", + "amulet", + ), + "aspect" = list( + "Yendor", + "wonder", + "eminence", + "grace", + "plenty", + "mystery", + ), + ) + touch_descriptors = list("It feels warm.", "Its pleasant to touch.", "It feels smooth.") + destroy_message = "shatters, and disintegrates!" + + overlays_reds = list(40, 130) + overlays_greens = list(130, 255) + overlays_blues = list(130, 255) + overlays_alpha = list(130, 255) + +/datum/artifact_origin/wizard/generate_name() + return "[pick(name_vars["jewels"])] [pick(name_vars["object"])] of [pick(name_vars["aspect"])]" + +/datum/artifact_origin/narsie + max_icons = 7 + max_item_icons = 7 + max_item_icons_small = 7 + sprite_name = "eldritch" + activation_sounds = list( + 'goon/sounds/machines/ArtifactEld1.ogg', + 'goon/sounds/machines/ArtifactEld2.ogg' + ) + type_name = ORIGIN_NARSIE + name = "Eldritch" + name_vars = list( + "adjectives" = list( + "imposing", + "sharp-edged", + "terrifying", + "jagged", + "dark", + ), + "large-nouns" = list( + "obelisk", + "altar", + "sculpture", + "statue", + "ornament", + ), + "small-nouns" = list( + "staff", + "pearl", + "rod", + "cane", + "wand", + "trophy", + ), + ) + touch_descriptors = list("It feels cold.", "Its rough to the touch.", "You prick yourself on its rough surface!") + destroy_message = "warps on itself, vanishing from sight!" + overlays_reds = list(40, 255) + overlays_greens = list(40, 255) + overlays_blues = list(40, 255) + +/datum/artifact_origin/silicon + max_icons = 7 + max_item_icons = 7 + max_item_icons_small = 7 + sprite_name = "ancient" + type_name = ORIGIN_SILICON + name = "Ancient" + activation_sounds = list( + 'goon/sounds/machines/ArtifactAnc1.ogg' + ) + name_vars = list( + "adjectives" = list( + "cold", + "smooth", + "humming", + "droning", + ), + "large-nouns" = list( + "monolith", + "slab", + "obelisk", + "pylon", + ), + "small-nouns" = list( + "mechanism", + "apparatus", + "device", + "implement", + "doohickey", + ), + ) + touch_descriptors = list("It feels cold.","Touching it makes you feel uneasy..","It feels smooth.") + destroy_message = "sputters violently, falling apart!" + +/datum/artifact_origin/silicon/generate_name() + return "Unit-[pick(GLOB.phonetic_alphabet)] [pick(GLOB.phonetic_alphabet)] [rand(0,9000)]" + +/datum/artifact_origin/precursor + type_name = ORIGIN_PRECURSOR + name = "Precursor" + sprite_name = "precursor" + activation_sounds = list( + 'goon/sounds/machines/ArtifactPre1.ogg' + ) + name_vars = list( + "adjectives" = list( + "quirky", + "janky", + "bulky", + "chunky", + "cumbersome", + ), + "large-nouns" = list( + "contraption", + "mechanism", + "structure", + "machinery", + ), + "small-nouns" = list( + "gizmo", + "appliance", + "device", + "widget", + "thingy", + ), + ) + + touch_descriptors = list("It feels warm.","It feels cold.","It is suprisingly pleasant to touch.", + "You can feel a faint pulsing.") + destroy_message = "sputters violently, falling apart!" + max_icons = 7 + max_item_icons = 7 + max_item_icons_small = 7 + +/datum/artifact_origin/martian + type_name = ORIGIN_MARTIAN + sprite_name = "martian" + name = "Martian" + activation_sounds = list( + 'goon/sounds/machines/ArtifactMar1.ogg', + 'goon/sounds/machines/ArtifactMar2.ogg' + ) + name_vars = list( + "adjectives" = list( + "squishy", + "gooey", + "quivering", + "fleshy", + "twitching", + ), + "large-nouns" = list( + "organ", + "pile", + "heap", + "glob", + ), + "small-nouns" = list( + "lump", + "nugget", + "cluster", + "clod", + "organiod", + ), + "doctor-prefix" = list( + "cardio", + "neuro", + "physio", + "brachio", + "bronchi", + "dermo" + ), + "medical-lingo" = list( + "genetic", + "metabolic", + "vascular", + "muscular", + ), + "erators" = list( + "suppressor", + "regenerator", + "depressor", + "compressor", + ), + ) + touch_descriptors = list( + "It feels warm.", + "It feels gross.", + "It feels incredibly slimy", + "You can feel it pulsating" + ) + max_icons = 7 + max_item_icons = 7 + max_item_icons_small = 7 + // for name generation + + +/datum/artifact_origin/martian/generate_name() + return "[pick(name_vars["doctor-prefix"])][pick(name_vars["medical-lingo"])] [pick(name_vars["erators"])]" diff --git a/monkestation/code/modules/art_sci_overrides/artifact_testers/analysis_form.dm b/monkestation/code/modules/art_sci_overrides/artifact_testers/analysis_form.dm new file mode 100644 index 000000000000..264e543a203a --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_testers/analysis_form.dm @@ -0,0 +1,238 @@ +/datum/export/analyzed_artifact + cost = -CARGO_CRATE_VALUE + k_elasticity = 0 + unit_name = "artifact" + allow_negative_cost = TRUE + export_types = list(/obj) + +/datum/export/analyzed_artifact/applies_to(obj/object, apply_elastic = TRUE) + if(object.GetComponent(/datum/component/artifact)) + return TRUE + return ..() + +/datum/export/analyzed_artifact/get_cost(obj/object) + var/datum/component/artifact/art = object.GetComponent(/datum/component/artifact) + if(!art) + return 0 + if(!art.analysis) + return -CARGO_CRATE_VALUE + return art.analysis.get_export_value(art) + +/obj/item/sticker/analysis_form + name = "analysis form" + desc = "An analysis form for artifacts, has adhesive on the back." + gender = NEUTER + icon = 'icons/obj/service/bureaucracy.dmi' + icon_state = "analysisform" + inhand_icon_state = "paper" + throwforce = 0 + throw_range = 1 + throw_speed = 1 + max_integrity = 50 + drop_sound = 'sound/items/handling/paper_drop.ogg' + pickup_sound = 'sound/items/handling/paper_pickup.ogg' + contraband = STICKER_NOSPAWN + var/chosen_origin = "" + var/list/chosentriggers = list() + var/chosentype = "" + +/obj/item/sticker/analysis_form/attackby(obj/item/item, mob/living/user, params) + if(istype(item, /obj/item/pen)) + ui_interact(user) + else + return ..() + +/obj/item/sticker/analysis_form/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ArtifactForm", name) + ui.open() + +/obj/item/sticker/analysis_form/ui_act(action, params) + . = ..() + if(.) + return + if(!istype(usr.get_active_held_item(), /obj/item/pen)) + to_chat(usr, span_notice("You need a pen to write on [src]!")) + return + switch(action) + if("origin") + chosen_origin = params["origin"] + if("type") + chosentype = params["type"] + if("trigger") + var/trig = params["trigger"] + if(trig in chosentriggers) + chosentriggers -= trig + else + chosentriggers += trig + if(attached) + analyze_attached() + +/obj/item/sticker/analysis_form/ui_static_data(mob/user) + . = ..() + var/list/origins_names = list() + for(var/datum/artifact_origin/subtype as anything in subtypesof(/datum/artifact_origin)) + origins_names += initial(subtype.name) + + var/list/trigger_names = list() + for(var/datum/artifact_activator/subtype as anything in subtypesof(/datum/artifact_activator)) + trigger_names += initial(subtype.name) + + var/list/artifact_names = list() + for(var/datum/component/artifact/subtype as anything in subtypesof(/datum/component/artifact)) + artifact_names += initial(subtype.type_name) + + .["allorigins"] = origins_names + .["alltypes"] = artifact_names + .["alltriggers"] = trigger_names + return + +/obj/item/sticker/analysis_form/ui_data(mob/user) + . = ..() + .["chosenorigin"] = chosen_origin + .["chosentype"] = chosentype + .["chosentriggers"] = chosentriggers + return . + +/obj/item/sticker/analysis_form/can_interact(mob/user) + if(attached && user.Adjacent(attached)) + return TRUE + return ..() + +/obj/item/sticker/analysis_form/register_signals(mob/living/user) + . = ..() + RegisterSignal(attached, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) + +/obj/item/sticker/analysis_form/unregister_signals(datum/source) + . = ..() + UnregisterSignal(attached, list(COMSIG_PARENT_EXAMINE)) + +/obj/item/sticker/analysis_form/examine(mob/user) + . = ..() + if(!in_range(user, (attached ? attached : src)) && !isobserver(user)) + return + ui_interact(user) + +/obj/item/sticker/analysis_form/proc/on_examine(atom/source, mob/user, list/examine_list) + SIGNAL_HANDLER + examine_list += span_notice("It has an artifact analysis form attached to it...") + INVOKE_ASYNC(src, TYPE_PROC_REF(/datum/, ui_interact), user) + +/obj/item/sticker/analysis_form/examine(mob/user) + . = ..() + if(!in_range(user, (attached ? attached : src)) && !isobserver(user)) + return + ui_interact(user) + +/obj/item/sticker/analysis_form/ui_status(mob/user,/datum/ui_state/ui_state) + if(!in_range(user, (attached ? attached : src)) && !isobserver(user)) + return UI_CLOSE + if(user.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB) || (isobserver(user) && !isAdminGhostAI(user))) + return UI_UPDATE + if(user.is_blind()) + to_chat(user, span_warning("You are blind!")) + return UI_CLOSE + if(!user.can_read(src)) + return UI_CLOSE + if(attached && in_range(user, attached)) + return UI_INTERACTIVE + return ..() +//analysis + +/obj/item/sticker/analysis_form/stick(atom/target, mob/living/user, px,py) + ..() + analyze_attached() + +/obj/item/sticker/analysis_form/peel(atom/source) + INVOKE_ASYNC(src, PROC_REF(deanalyze_attached)) + ..() + +/obj/item/sticker/analysis_form/proc/analyze_attached() + var/datum/component/artifact/to_analyze = attached.GetComponent(/datum/component/artifact) + if(!to_analyze) + return + if(chosen_origin) + to_analyze.holder.name = to_analyze.generated_name + if(chosentype) + to_analyze.holder.name += " ([chosentype])" + +/obj/item/sticker/analysis_form/proc/deanalyze_attached() + var/datum/component/artifact/to_analyze = attached.GetComponent(/datum/component/artifact) + if(!to_analyze) + return + to_analyze.holder.name = to_analyze.fake_name + +/obj/item/sticker/analysis_form/proc/get_export_value(datum/component/artifact/art) + var/correct = 0 + var/total_guesses = 0 + + if(art.artifact_origin.type_name == chosen_origin) + correct ++ + if(chosen_origin) + total_guesses ++ + if(chosentype) + total_guesses ++ + if(art.type_name == chosentype) + correct ++ + for(var/name in chosentriggers) + total_guesses++ + + for(var/datum/artifact_activator/listed in art.activators) + if(listed.name != name) + continue + correct++ + + var/incorrect = total_guesses - correct + return round((CARGO_CRATE_VALUE/4) * art.potency * (max((ARTIFACT_COMMON - art.weight) * 0.01, 0.01) * max(correct - incorrect, 0.01))) + +/obj/item/analysis_bin + name = "analysis bin" + desc = "A bin made out of material to resist adhesion, for artifact analysis forms." + icon = 'icons/obj/service/bureaucracy.dmi' + icon_state = "analysisbin1" + base_icon_state = "analysisbin" + inhand_icon_state = "sheet-metal" + lefthand_file = 'icons/mob/inhands/items/sheets_lefthand.dmi' + righthand_file = 'icons/mob/inhands/items/sheets_righthand.dmi' + w_class = WEIGHT_CLASS_NORMAL + var/forms = 15 + var/form_type = /obj/item/sticker/analysis_form + +/obj/item/analysis_bin/Initialize(mapload) + . = ..() + interaction_flags_item &= ~INTERACT_ITEM_ATTACK_HAND_PICKUP + AddElement(/datum/element/drag_pickup) + +/obj/item/analysis_bin/update_icon_state() + icon_state = "[base_icon_state][forms > 0]" + return ..() + +/obj/item/analysis_bin/attack_hand(mob/user, list/modifiers) + if(isliving(user)) + var/mob/living/living_mob = user + if(!(living_mob.mobility_flags & MOBILITY_PICKUP)) + return + if(forms) + forms-- + var/obj/item/form = new form_type + form.add_fingerprint(user) + form.forceMove(user.loc) + user.put_in_hands(form) + balloon_alert(user, "took form") + update_appearance() + else + balloon_alert(user, "empty!") + add_fingerprint(user) + return ..() + +/obj/item/analysis_bin/attackby(obj/item/item, mob/user, params) + if(istype(item, form_type)) + if(!user.transferItemToLoc(item, src)) + return + qdel(item) + balloon_alert(user, "form returned") + forms++ + update_appearance() + else + return ..() diff --git a/monkestation/code/modules/art_sci_overrides/artifact_testers/heater.dm b/monkestation/code/modules/art_sci_overrides/artifact_testers/heater.dm new file mode 100644 index 000000000000..398b7df1080a --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_testers/heater.dm @@ -0,0 +1,125 @@ +/obj/machinery/atmospherics/components/unary/artifact_heatingpad + icon = 'goon/icons/obj/networked.dmi' + icon_state = "pad_norm" + + name = "Heating Pad" + desc = "Through some science bullcrap, this machine heats artifacts and people on top of it, without heating air, to the temperature of the gas contained. It will, in addition, heat its contents to 20C." + density = FALSE + max_integrity = 300 + armor_type = /datum/armor/unary_thermomachine + layer = LOW_OBJ_LAYER + circuit = /obj/item/circuitboard/machine/artifactheater + hide = TRUE + move_resist = MOVE_RESIST_DEFAULT + vent_movement = NONE + pipe_flags = PIPING_ONE_PER_TURF + set_dir_on_move = FALSE + + var/heat_capacity = 0 + +/obj/machinery/atmospherics/components/unary/artifact_heatingpad/Initialize(mapload) + . = ..() + RefreshParts() + update_appearance() + +/obj/machinery/atmospherics/components/unary/artifact_heatingpad/update_icon_state() + var/datum/gas_mixture/port = airs[1] + if(!port?.total_moles()) + icon_state = "pad_norm" + return ..() + var/state_to_use = "" + switch(port.temperature) + if(BODYTEMP_HEAT_WARNING_1 to INFINITY) + state_to_use = "pad_on" // MONKESTATION EDIT ART_SCI_OVERRIDE + if(-INFINITY to BODYTEMP_COLD_WARNING_1) + state_to_use = "pad_on" // MONKESTATION EDIT ART_SCI_OVERRIDE + else + state_to_use = "pad_norm" + + if(panel_open) + icon_state = "pad_open" + return ..() + icon_state = state_to_use + return ..() + +/obj/machinery/atmospherics/components/unary/artifact_heatingpad/update_overlays() + . = ..() + if(!initial(icon)) + return + var/mutable_appearance/pipe = new('icons/obj/machines/atmospherics/heatingpad.dmi') + . += get_pipe_image(pipe, "pipe", dir, COLOR_LIME, piping_layer) + + // MONKESTATION EDIT START ART_SCI_OVERRIDE + var/datum/gas_mixture/port = airs[1] + if(!port?.total_moles()) + return + switch(port.temperature) + if(BODYTEMP_HEAT_WARNING_1 to INFINITY) + . += emissive_appearance(icon, "heat+3", src) + . += mutable_appearance(icon, "heat+3", src) + if(-INFINITY to BODYTEMP_COLD_WARNING_1) + . += emissive_appearance(icon, "heat-3", src) + . += mutable_appearance(icon, "heat-3", src) + + // MONKESTATION EDIT END ART_SCI_OVERRIDE + +/obj/machinery/atmospherics/components/unary/artifact_heatingpad/RefreshParts() + . = ..() + var/calculated_bin_rating = 0 + for(var/datum/stock_part/matter_bin/bin in component_parts) + calculated_bin_rating += bin.tier + heat_capacity = 5000 * ((calculated_bin_rating - 1) ** 2) //pointless but uhh yeah + +/obj/machinery/atmospherics/components/unary/artifact_heatingpad/process_atmos() + if(panel_open) + return + var/turf/turf = get_turf(src) + var/datum/gas_mixture/port = airs[1] + if(!is_operational || !turf) + return + if(!port.total_moles()) + return + + var/port_capacity = port.heat_capacity() + var/delta = T20C - port.temperature //i dont think objs have temperature so + var/heat_amount = CALCULATE_CONDUCTION_ENERGY(delta, port_capacity, heat_capacity) + port.temperature = max(((port.temperature * port_capacity) + heat_amount) / port_capacity, TCMB) + + for(var/atom/movable/content in turf.contents) + if(isliving(content)) // this so so will backfire but they can just walk off + var/mob/living/victim = content + if(victim.bodytemperature < port.temperature) + victim.adjust_bodytemperature(port.temperature * TEMPERATURE_DAMAGE_COEFFICIENT) + continue + else if(content in GLOB.running_artifact_list) //this is an artifact, probably! + var/datum/component/artifact/pulled_artifact = GLOB.running_artifact_list[content] + if(!istype(pulled_artifact)) + return + pulled_artifact.process_stimuli(STIMULUS_HEAT, port.temperature) //if its in the artifacts list it should have the component and if it doesnt shit is fuck + update_appearance() + +/obj/machinery/atmospherics/components/unary/artifact_heatingpad/screwdriver_act(mob/living/user, obj/item/tool) + if(default_deconstruction_screwdriver(user, "pad_open", "pad_norm", tool)) + change_pipe_connection(panel_open) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/machinery/atmospherics/components/unary/artifact_heatingpad/wrench_act(mob/living/user, obj/item/tool) + return default_change_direction_wrench(user, tool) + +/obj/machinery/atmospherics/components/unary/artifact_heatingpad/crowbar_act(mob/living/user, obj/item/tool) + return default_deconstruction_crowbar(tool) + +/obj/machinery/atmospherics/components/unary/artifact_heatingpad/multitool_act(mob/living/user, obj/item/multitool/tool) + . = TOOL_ACT_TOOLTYPE_SUCCESS + if(!panel_open) + balloon_alert(user, "open panel!") + return + piping_layer = (piping_layer >= PIPING_LAYER_MAX) ? PIPING_LAYER_MIN : (piping_layer + 1) + update_appearance() + +/obj/machinery/atmospherics/components/unary/artifact_heatingpad/default_change_direction_wrench(mob/user, obj/item/item) + if(!..()) + return FALSE + set_init_directions() + update_appearance() + return TRUE diff --git a/monkestation/code/modules/art_sci_overrides/artifact_testers/xray.dm b/monkestation/code/modules/art_sci_overrides/artifact_testers/xray.dm new file mode 100644 index 000000000000..70d25ee3243d --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_testers/xray.dm @@ -0,0 +1,155 @@ +/obj/machinery/artifact_xray + name = "artifact x-ray machine" + desc = "An x-ray machine, used to scan artifacts." + icon = 'icons/obj/machines/artifact_machines.dmi' + icon_state = "xray-0" + base_icon_state = "xray" + density = TRUE + circuit = /obj/item/circuitboard/machine/artifactxray + use_power = IDLE_POWER_USE + ///max radiation level + var/max_radiation = 3 + ///chosen radiation level + var/chosen_level = 1 + var/pulse_time = 4 SECONDS + var/pulse_cooldown_time = 3 SECONDS + var/list/last_results = list("NO DATA") + var/pulsing = FALSE + COOLDOWN_DECLARE(message_cooldown) + COOLDOWN_DECLARE(pulse_cooldown) + +/obj/machinery/artifact_xray/Initialize(mapload) + . = ..() + RefreshParts() + +/obj/machinery/artifact_xray/RefreshParts() + . = ..() + var/power_usage = 250 + for(var/obj/item/stock_parts/micro_laser/laser in component_parts) + max_radiation = round(2.5 * laser.rating) + for(var/datum/stock_part/capacitor/capac in component_parts) + power_usage -= 30 * capac.tier + update_mode_power_usage(ACTIVE_POWER_USE, power_usage) + +/obj/machinery/artifact_xray/update_icon_state() + icon_state = "[base_icon_state]-[state_open]" + return ..() + +/obj/machinery/artifact_xray/AltClick(mob/user) + . = ..() + if(!can_interact(user)) + return + toggle_open() +/obj/machinery/artifact_xray/proc/toggle_open() + if(!COOLDOWN_FINISHED(src,pulse_cooldown)) + return + if(state_open) + flick("xray-closing", src) + close_machine() + else + flick("xray-opening", src) + open_machine() + +/obj/machinery/artifact_xray/attackby(obj/item/item, mob/living/user, params) + if(HAS_TRAIT(item, TRAIT_NODROP)) + to_chat(user, span_warning("[item] is stuck to your hand, you can't put it inside [src]!")) + return + if(state_open && COOLDOWN_FINISHED(src,pulse_cooldown)) + close_machine(item) + return + ..() +/obj/machinery/artifact_xray/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ArtifactXray", name) + ui.open() + +/obj/machinery/artifact_xray/ui_act(action, params) + . = ..() + if(.) + return + switch(action) + if("toggleopen") + toggle_open() + . = TRUE + return + if("change_rate") + chosen_level = clamp(params["target"], 0, max_radiation) + . = TRUE + return + if("pulse") + pulse() + return + update_appearance() + +/obj/machinery/artifact_xray/proc/pulse() + if(!COOLDOWN_FINISHED(src,pulse_cooldown) || pulsing || !occupant) + return + if(state_open) + return + if(isliving(occupant)) + if(!(obj_flags & EMAGGED)) + say("Cannot pulse with a living being inside!") + return + var/datum/component/artifact/component = occupant.GetComponent(/datum/component/artifact) + if(component) + component.process_stimuli(STIMULUS_RADIATION, chosen_level) + else + if(!HAS_TRAIT(occupant, TRAIT_IRRADIATED) && SSradiation.can_irradiate_basic(occupant)) + occupant.AddComponent(/datum/component/irradiated) + pulsing = TRUE + update_use_power(ACTIVE_POWER_USE) + addtimer(CALLBACK(src, PROC_REF(post_pulse), component), pulse_time) + +/obj/machinery/artifact_xray/proc/post_pulse(datum/component/artifact/artifact) + update_use_power(IDLE_POWER_USE) + playsound(loc, 'sound/machines/chime.ogg', 30, FALSE) + COOLDOWN_START(src,pulse_cooldown,pulse_cooldown_time) + pulsing = FALSE + if(artifact) + last_results = list("STRUCTURAL ABNORMALITY ANALYSIS: [artifact.xray_result]", "SIZE: [artifact.artifact_size < ARTIFACT_SIZE_LARGE ? "SMALL" : "LARGE" ]") + else + last_results = list("INCONCLUSIVE;", "NO SPECIAL PROPERTIES DETECTED") + + +/obj/machinery/artifact_xray/ui_data(mob/user) + . = ..() + .["is_open"] = state_open + if(occupant) + .["artifact_name"] = occupant.name + .["pulsing"] = pulsing + .["current_strength"] = chosen_level + .["max_strength"] = max_radiation + .["results"] = last_results + return . + +/obj/machinery/artifact_xray/emag_act(mob/user) + if(obj_flags & EMAGGED) + return + obj_flags |= EMAGGED + to_chat(user,span_notice("You short out the safety sensors on the [src].")) + playsound(src, SFX_SPARKS, 75, TRUE, SILENCED_SOUND_EXTRARANGE) + +/obj/machinery/artifact_xray/relaymove(mob/living/user, direction) + if(user.stat) + if(COOLDOWN_FINISHED(src, message_cooldown)) + COOLDOWN_START(src, message_cooldown, 4 SECONDS) + to_chat(user, span_warning("[src]'s door won't budge while it's processing!")) + return + open_machine() + +/obj/machinery/artifact_xray/can_be_occupant(atom/movable/occupant_atom) + . = ..() + if(isitem(occupant_atom)) + return TRUE + else if(!occupant_atom.anchored) + return TRUE + +/obj/machinery/artifact_xray/screwdriver_act(mob/living/user, obj/item/tool) + if(pulsing) + return TOOL_ACT_SIGNAL_BLOCKING + . = default_deconstruction_screwdriver(user, base_icon_state, base_icon_state, tool) + + +/obj/machinery/artifact_xray/crowbar_act(mob/living/user, obj/item/tool) + return pulsing ? TOOL_ACT_SIGNAL_BLOCKING : default_deconstruction_crowbar(tool) diff --git a/monkestation/code/modules/art_sci_overrides/artifact_testers/zapper.dm b/monkestation/code/modules/art_sci_overrides/artifact_testers/zapper.dm new file mode 100644 index 000000000000..b877d2b4fe91 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/artifact_testers/zapper.dm @@ -0,0 +1,94 @@ +/obj/machinery/artifact_zapper + name = "artifact zapper" + desc = "A directed tesla coil, zaps the artifact that it is facing. VERY power-consuming." + icon = 'icons/obj/machines/artifact_machines.dmi' + icon_state = "zapper" + base_icon_state = "zapper" + density = TRUE + use_power = IDLE_POWER_USE + circuit = /obj/item/circuitboard/machine/artifactzapper + ///max shock level + var/max_shock = 100 + ///chosen level + var/chosen_level = 100 + var/pulse_cooldown_time = 4 SECONDS + COOLDOWN_DECLARE(pulse_cooldown) + +/obj/machinery/artifact_zapper/Initialize(mapload) + . = ..() + AddComponent(/datum/component/simple_rotation, ROTATION_REQUIRE_WRENCH) + RefreshParts() + +/obj/machinery/artifact_zapper/RefreshParts() + . = ..() + var/shock = 0 + for(var/datum/stock_part/capacitor/capac in component_parts) + shock += round(1250 * capac.tier) + max_shock = shock + + for(var/datum/stock_part/scanning_module/scan in component_parts) + pulse_cooldown_time = 4 SECONDS / scan.tier + +/obj/machinery/artifact_zapper/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ArtifactZapper", name) + ui.open() + +/obj/machinery/artifact_zapper/ui_act(action, params) + . = ..() + if(.) + return + switch(action) + if("strength") + chosen_level = clamp(params["target"], 0, max_shock) + . = TRUE + active_power_usage = chosen_level * 5 + return + if("shock") + shock() + return + update_appearance() + +/obj/machinery/artifact_zapper/proc/shock() + if(!COOLDOWN_FINISHED(src,pulse_cooldown)) + return + var/turf/target_turf = get_step(src,dir) + var/datum/component/artifact/component + for(var/obj/object in target_turf) + component = object.GetComponent(/datum/component/artifact) + if(component) + break + + if(!component) + return + + Beam(component.parent, icon_state="lightning[rand(1,12)]", time = pulse_cooldown_time) + playsound(get_turf(src), 'sound/magic/lightningshock.ogg', 60, TRUE, extrarange = 2) + use_power(chosen_level) + component.process_stimuli(STIMULUS_SHOCK, chosen_level) + COOLDOWN_START(src,pulse_cooldown, pulse_cooldown_time) + + +/obj/machinery/artifact_zapper/ui_data(mob/user) + . = ..() + .["pulsing"] = !COOLDOWN_FINISHED(src,pulse_cooldown) + .["current_strength"] = chosen_level + .["max_strength"] = max_shock + return . + +/obj/machinery/artifact_zapper/emag_act(mob/user) + if(obj_flags & EMAGGED) + return + obj_flags |= EMAGGED + to_chat(user,span_notice("You short out the safety sensors on the [src].")) + playsound(src, SFX_SPARKS, 75, TRUE, SILENCED_SOUND_EXTRARANGE) + +/obj/machinery/artifact_zapper/screwdriver_act(mob/living/user, obj/item/tool) + if(!COOLDOWN_FINISHED(src,pulse_cooldown)) + return TOOL_ACT_SIGNAL_BLOCKING + . = default_deconstruction_screwdriver(user, base_icon_state, base_icon_state, tool) + + +/obj/machinery/artifact_zapper/crowbar_act(mob/living/user, obj/item/tool) + return !COOLDOWN_FINISHED(src,pulse_cooldown) ? TOOL_ACT_SIGNAL_BLOCKING : default_deconstruction_crowbar(tool) diff --git a/monkestation/code/modules/art_sci_overrides/asteroids/areas.dm b/monkestation/code/modules/art_sci_overrides/asteroids/areas.dm new file mode 100644 index 000000000000..43998483f5e5 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/asteroids/areas.dm @@ -0,0 +1,17 @@ +/area/station/cargo/mining/asteroid_magnet + name = "\improper Asteroid Magnet" + icon_state = "mining" + requires_power = TRUE + always_unpowered = TRUE + + static_lighting = FALSE + base_lighting_alpha = 255 + base_lighting_color = "#FFFFFF" + + power_light = FALSE + power_equip = FALSE + power_environ = FALSE + outdoors = TRUE + ambience_index = AMBIENCE_SPACE + flags_1 = CAN_BE_DIRTY_1 + sound_environment = SOUND_AREA_SPACE diff --git a/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_generation.dm b/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_generation.dm new file mode 100644 index 000000000000..d1769261d410 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_generation.dm @@ -0,0 +1,148 @@ +/turf/open/misc/asteroid/airless/tospace + explodable = TRUE + baseturfs = /turf/baseturf_bottom + turf_type = /turf/open/misc/asteroid/airless/tospace + + +/obj/effect/forcefield/asteroid_magnet + name = "magnetic field" + desc = "This looks dangerous." + icon = 'goon/icons/obj/effects.dmi' + icon_state = "forcefield" + + initial_duration = 0 + opacity = TRUE + + +/proc/button_element(trg, text, action, class, style) + return "[text]" + +/proc/color_button_element(trg, color, action) + return "" + +/// Inline script for an animated ellipsis +/proc/ellipsis(number_of_dots = 3, millisecond_delay = 500) + var/static/unique_id = 0 + unique_id++ + return {" + + "} + +/// Breaks down to an asteroid floor that breaks down to space +/turf/closed/mineral/random/asteroid/tospace + baseturfs = /turf/open/misc/asteroid/airless/tospace + +/turf/closed/mineral/random/asteroid/tospace/mineral_chances() + return list( + /obj/item/stack/ore/diamond = 1, + /obj/item/stack/ore/gold = 2, + /obj/item/stack/ore/iron = 10, + /obj/item/stack/ore/plasma = 5, + /obj/item/stack/ore/silver = 1, + /obj/item/stack/ore/titanium = 1, + /obj/item/stack/ore/uranium = 1, + /turf/closed/mineral/artifact = 15, + ) + +/datum/controller/subsystem/mapping/proc/generate_asteroid(datum/mining_template/template, datum/callback/asteroid_generator) + Master.StartLoadingMap() + + SSatoms.map_loader_begin(REF(template)) + var/list/turfs = asteroid_generator.Invoke() + template.Populate(turfs.Copy()) + SSatoms.map_loader_stop(REF(template)) + + var/list/atoms = list() + // Initialize all of the atoms in the asteroid + for(var/turf/T as anything in turfs) + atoms += T + atoms += T.contents + + SSatoms.InitializeAtoms(atoms) + for(var/turf/T as turf in turfs) + T.AfterChange(CHANGETURF_IGNORE_AIR) + Master.StopLoadingMap() + + template.AfterInitialize(atoms) + +/// Cleanup our currently loaded mining template +/proc/CleanupAsteroidMagnet(turf/center, size) + var/list/turfs_to_destroy = ReserveTurfsForAsteroidGeneration(center, size, space_only = FALSE) + for(var/turf/T as anything in turfs_to_destroy) + CHECK_TICK + + for(var/atom/movable/AM as anything in T) + CHECK_TICK + if(isdead(AM) || iscameramob(AM) || iseffect(AM) || iseminence(AM) || ismob(AM)) + continue + qdel(AM) + + T.ChangeTurf(/turf/baseturf_bottom) + +/// Sanitizes a block of turfs to prevent writing over undesired locations +/proc/ReserveTurfsForAsteroidGeneration(turf/center, size, space_only = TRUE) + . = list() + + var/list/turfs = RANGE_TURFS(size, center) + for(var/turf/T as anything in turfs) + if(space_only && !isspaceturf(T)) + continue + if(!(istype(T.loc, /area/station/cargo/mining/asteroid_magnet))) + continue + . += T + CHECK_TICK + +/// Generates a circular asteroid. +/proc/GenerateRoundAsteroid(datum/mining_template/template, turf/center = template.center, initial_turf_path = /turf/closed/mineral/random/asteroid/tospace, size = template.size || 6, list/turfs, hollow = FALSE) + . = list() + if(!length(turfs)) + return list() + + if(template) + center = template.center + size = template.size + + size = size + 2 //This is just for generating "smoother" asteroids, it will not go out of reservation space. + + if (hollow) + center = center.ChangeTurf(/turf/open/misc/asteroid/airless/tospace, flags = (CHANGETURF_DEFER_CHANGE|CHANGETURF_DEFAULT_BASETURF)) + else + center = center.ChangeTurf(initial_turf_path, flags = (CHANGETURF_DEFER_CHANGE|CHANGETURF_DEFAULT_BASETURF)) + GENERATOR_CHECK_TICK + + . += center + + var/corner_range = round(size * 1.5) + var/total_distance = 0 + var/current_dist_from_center = 0 + + for (var/turf/current_turf in turfs) + GENERATOR_CHECK_TICK + + current_dist_from_center = get_dist(center, current_turf) + + total_distance = abs(center.x - current_turf.x) + abs(center.y - current_turf.y) + (current_dist_from_center / 2) + // Keep us round + if (total_distance > corner_range) + continue + + if (hollow && total_distance < size / 2) + var/turf/T = locate(current_turf.x, current_turf.y, current_turf.z) + T = T.ChangeTurf(/turf/open/misc/asteroid/airless/tospace, flags = (CHANGETURF_DEFER_CHANGE|CHANGETURF_DEFAULT_BASETURF)) + . += T + + else + var/turf/T = locate(current_turf.x, current_turf.y, current_turf.z) + T = T.ChangeTurf(initial_turf_path, flags = (CHANGETURF_DEFER_CHANGE|CHANGETURF_DEFAULT_BASETURF)) + GENERATOR_CHECK_TICK + . += T + + return . diff --git a/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_magnet.dm b/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_magnet.dm new file mode 100644 index 000000000000..dfc3e33c5f42 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_magnet.dm @@ -0,0 +1,388 @@ +#define STATUS_OKAY "OK" +#define MAX_COLLISIONS_BEFORE_ABORT 10 + +/obj/machinery/asteroid_magnet + name = "asteroid magnet computer" + icon_state = "blackbox" + resistance_flags = INDESTRUCTIBLE + use_power = NO_POWER_USE + + /// Templates available to succ in + var/list/datum/mining_template/available_templates + /// All templates in the "map". + var/list/datum/mining_template/templates_on_map + /// The map that stores asteroids + var/datum/cartesian_plane/map + /// The currently selected template + var/datum/mining_template/selected_template + + /// Center turf X, set in mapping + VAR_PRIVATE/center_x = 0 + /// Center turf Y, set in mapping + VAR_PRIVATE/center_y = 0 + /// The center turf + VAR_PRIVATE/turf/center_turf + /// The size (chebyshev) of the available area, set in mapping + var/area_size = 0 + + var/coords_x = 0 + var/coords_y = 0 + + var/ping_result = "N/A
...
" + + /// Status of the user interface + var/status = STATUS_OKAY + +/obj/machinery/asteroid_magnet/Initialize(mapload) + . = ..() + if(mapload) + SSmaterials.InitializeTemplates() + if(!center_x || !center_y) + stack_trace("Asteroid magnet does not have X or Y coordinates, deleting.") + return INITIALIZE_HINT_QDEL + + if(!area_size) + stack_trace("Asteroid magnet does not have a valid size, deleting.") + return INITIALIZE_HINT_QDEL + + center_turf = locate(center_x, center_y, z) + available_templates = list() + templates_on_map = list() + + GenerateMap() + +/obj/machinery/asteroid_magnet/Topic(href, href_list) + . = ..() + if(.) + return + + var/list/map_offsets = map.return_offsets() + var/list/map_bounds = map.return_bounds() + var/value = text2num(href_list["x"] || href_list["y"]) + if(!isnull(value)) // round(null) = 0 + value = round(value, 1) + if("x" in href_list) + coords_x = WRAP(coords_x + map_offsets[1] + value, map_bounds[1] + map_offsets[1], map_bounds[2] + map_offsets[1]) + coords_x -= map_offsets[1] + updateUsrDialog() + + else if("y" in href_list) + coords_y = WRAP(coords_y + map_offsets[2] + value, map_bounds[3] + map_offsets[2], map_bounds[4] + map_offsets[2]) + coords_y -= map_offsets[2] + updateUsrDialog() + return + + if(href_list["ping"]) + ping(coords_x, coords_y) + updateUsrDialog() + return + + if(href_list["select"]) + var/datum/mining_template/T = locate(href_list["select"]) in available_templates + if(!T) + return + selected_template = T + updateUsrDialog() + return + + if(href_list["summon_selected"]) + summon_sequence() + return + +/obj/machinery/asteroid_magnet/ui_interact(mob/user, datum/tgui/ui) + var/content = list() + + content += {" +
+
+ + Magnet Controls + + "} + + // X selector + content += {" +
+ + X-Axis + +
+
[button_element(src, "-100", "x=-100")]
+
[button_element(src, "-10", "x=-10")]
+
[button_element(src, "-1", "x=-1")]
+
+ [coords_x] +
+
[button_element(src, "1", "x=1")]
+
[button_element(src, "10", "x=10")]
+
[button_element(src, "100", "x=100")]
+ --- +
+
+ "} + + // Y selector + content += {" +
+ + Y-Axis + +
+
[button_element(src, "-100", "y=-100")]
+
[button_element(src, "-10", "y=-10")]
+
[button_element(src, "-1", "y=-1")]
+
+ [coords_y] +
+
[button_element(src, "1", "y=1")]
+
[button_element(src, "10", "y=10")]
+
[button_element(src, "100", "y=100")]
+ --- +
+
+ "} + + // Ping button + content += {" +
+ + Ping + +
+ [ping_result] +
+
+ [button_element(src, "PING", "ping=1")] +
+
+ "} + + // Summoner + content += {" +
+ + Summon + +
+ [status] +
+
+ [button_element(src, "SUMMON", "summon_selected=1")] +
+
+ "} + + // Close coordinates fieldset + content += "
" + + // Asteroids list fieldset + content += {" +
+ + Celestial Bodies + + "} + // Selected asteroid container + var/asteroid_name + var/asteroid_desc + if(selected_template) + asteroid_name = selected_template.name + asteroid_desc = jointext(selected_template.get_description(), "") + + content += {" +
+
+ [asteroid_name || "N/A"] +
+ [asteroid_desc ? "
[asteroid_desc]
" : "
N/A
"] +
+ "} + + // Asteroid list container + content += {" +
+ "} + + var/i = 0 + for(var/datum/mining_template/template as anything in available_templates) + i++ + var/bg_color = i % 2 == 0 ? "#7c5500" : "#533200" + if(selected_template == template) + bg_color = "#e67300 !important" + content += {" +
+ [template.name] ([template.x],[template.y]) +
+ "} + + content += "
" + + content += {" + + "} + + + var/datum/browser/popup = new(user, "asteroidmagnet", name, 920, 475) + popup.set_content(jointext(content,"")) + popup.set_window_options("can_close=1;can_minimize=1;can_maximize=0;can_resize=1;titlebar=1;") + popup.open() + +/obj/machinery/asteroid_magnet/proc/ping(coords_x, coords_y) + var/datum/mining_template/T = map.return_coordinate(coords_x, coords_y) + if(T && !T.found) + T.found = TRUE + available_templates |= T + templates_on_map -= T + ping_result = "LOCATED" + return + + var/datum/mining_template/closest + var/lowest_dist = INFINITY + for(var/datum/mining_template/asteroid as anything in templates_on_map) + // Get the euclidean distance between the ping and the asteroid. + var/dist = sqrt(((asteroid.x - coords_x) ** 2) + ((asteroid.y - coords_y) ** 2)) + if(dist < lowest_dist) + closest = asteroid + lowest_dist = dist + + if(closest) + var/dx = closest.x - coords_x + var/dy = closest.y - coords_y + // Get the angle as 0 - 180 degrees + var/angle = arccos(dy / sqrt((dx ** 2) + (dy ** 2))) + if(dx < 0) // If the X-axis distance is negative, put it between 181 and 359. 180 and 360/0 are impossible, as that requires X == 0. + angle = 360 - angle + + ping_result = "AZIMUTH
[round(angle, 0.01)]" + else + ping_result = "ERR" + +/// Test to see if we should clear the magnet area. +/// Returns FALSE if it can clear, returns a string error message if it can't. +/obj/machinery/asteroid_magnet/proc/check_for_magnet_errors() + . = FALSE + if(isnull(selected_template)) + return "ERROR N1" + + for(var/mob/M as mob in range(area_size + 1, center_turf)) + if(isliving(M)) + return "ERROR C3" + +/// Performs a full summoning sequence, including putting up boundaries, clearing out the area, and bringing in the new asteroid. +/obj/machinery/asteroid_magnet/proc/summon_sequence(datum/mining_template/template) + var/magnet_error = check_for_magnet_errors() + if(magnet_error) + status = magnet_error + updateUsrDialog() + return + + var/area/station/cargo/mining/asteroid_magnet/A = get_area(center_turf) + A.area_flags |= NOTELEPORT // We dont want people getting nuked during the generation sequence + status = "Summoning[ellipsis()]" + available_templates -= template + updateUsrDialog() + + var/time = world.timeofday + var/list/forcefields = PlaceForcefield() + CleanupTemplate() + PlaceTemplate(selected_template) + + /// This process should take ATLEAST 20 seconds + time = (world.timeofday + 20 SECONDS) - time + if(time > 0) + addtimer(CALLBACK(src, PROC_REF(_FinishSummonSequence), forcefields), time) + else + _FinishSummonSequence(forcefields) + return + +/obj/machinery/asteroid_magnet/proc/_FinishSummonSequence(list/forcefields) + QDEL_LIST(forcefields) + + var/area/station/cargo/mining/asteroid_magnet/A = get_area(center_turf) + A.area_flags &= ~NOTELEPORT // Annnnd done + + status = STATUS_OKAY + updateUsrDialog() + +/// Summoning part of summon_sequence() +/obj/machinery/asteroid_magnet/proc/PlaceTemplate(datum/mining_template/template) + PRIVATE_PROC(TRUE) + template.Generate() + +/// Places the forcefield boundary during summon_sequence +/obj/machinery/asteroid_magnet/proc/PlaceForcefield() + PRIVATE_PROC(TRUE) + . = list() + var/list/turfs = RANGE_TURFS(area_size, center_turf) ^ RANGE_TURFS(area_size + 1, center_turf) + for(var/turf/T as anything in turfs) + . += new /obj/effect/forcefield/asteroid_magnet(T) + + +/// Cleanup our currently loaded mining template +/obj/machinery/asteroid_magnet/proc/CleanupTemplate() + PRIVATE_PROC(TRUE) + + var/list/turfs_to_destroy = ReserveTurfsForAsteroidGeneration(center_turf, area_size, space_only = FALSE) + for(var/turf/T as anything in turfs_to_destroy) + CHECK_TICK + + for(var/atom/movable/AM as anything in T) + CHECK_TICK + if(isdead(AM) || iscameramob(AM) || iseffect(AM) || !(ismob(AM) || isobj(AM))) + continue + qdel(AM) + + T.ChangeTurf(/turf/baseturf_bottom) + + +/// Generates the random map for the magnet. +/obj/machinery/asteroid_magnet/proc/GenerateMap() + PRIVATE_PROC(TRUE) + map = new(-100, 100, -100, 100) + + // Generate common templates + if(length(SSmaterials.template_paths_by_rarity["[MINING_COMMON]"])) + for(var/i in 1 to 12) + InsertTemplateToMap(pick(SSmaterials.template_paths_by_rarity["[MINING_COMMON]"])) + + /* + // Generate uncommon templates + for(var/i in 1 to 4) + InsertTemplateToMap(pick(SSmaterials.template_paths_by_rarity["[MINING_UNCOMMON]"])) + // Generate rare templates + for(var/i in 1 to 2) + InsertTemplateToMap(pick(SSmaterials.template_paths_by_rarity["[MINING_RARE]"])) + */ + +/obj/machinery/asteroid_magnet/proc/InsertTemplateToMap(path) + PRIVATE_PROC(TRUE) + + var/collisions = 0 + var/datum/mining_template/template + var/x + var/y + + template = new path(center_turf, area_size) + template.randomize() + templates_on_map += template + + do + x = rand(-100, 100) + y = rand(-100, 100) + + if(map.return_coordinate(x, y)) + collisions++ + else + map.set_coordinate(x, y, template) + template.x = x + template.y = y + break + + while (collisions <= MAX_COLLISIONS_BEFORE_ABORT) + +#undef MAX_COLLISIONS_BEFORE_ABORT +#undef STATUS_OKAY diff --git a/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_template.dm b/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_template.dm new file mode 100644 index 000000000000..3b184047d5d5 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/asteroids/asteroid_template.dm @@ -0,0 +1,44 @@ + +/datum/mining_template + var/name = "PLACEHOLDER NAME" + var/rarity = MINING_NO_RANDOM_SPAWN + var/randomly_appear = FALSE + /// The size (radius, chebyshev distance). Will be clamped to the size of the asteroid magnet in New(). + var/size = 7 + /// The center turf. + var/turf/center + + // Asteroid Map location + var/x + var/y + var/found = FALSE + + + +/datum/mining_template/New(center, max_size) + . = ..() + src.center = center + if(size) + size = max(size, max_size) + + +/// Randomize the data of this template. Does not change size, center, or location. +/datum/mining_template/proc/randomize() + return + +/// The proc to call to completely generate an asteroid +/datum/mining_template/proc/Generate() + return + +/// Called during SSmapping.generate_asteroid(). Here is where you mangle the geometry provided by the asteroid generator function. +/// Atoms at this stage are NOT initialized +/datum/mining_template/proc/Populate(list/turfs) + return + +/// Called during SSmapping.generate_asteroid() after all atoms have been initialized. +/datum/mining_template/proc/AfterInitialize(list/atoms) + return + +/// Called by an asteroid magnet to return a description as a list of bullets +/datum/mining_template/proc/get_description() + return list() diff --git a/monkestation/code/modules/art_sci_overrides/asteroids/cartesian_plane.dm b/monkestation/code/modules/art_sci_overrides/asteroids/cartesian_plane.dm new file mode 100644 index 000000000000..56030039bb4e --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/asteroids/cartesian_plane.dm @@ -0,0 +1,94 @@ +/* + * For a new plane of (x,x'),(y,y') : offset_x,offset_y,x_size,y_size + * + * //Sign changes must account for 0-crossing + * (-100,100),(0,0) : 101,1,201,1 + * //Otherwise, it does not + * (-100,-50),(0,0) : 101,1,50,1 + * (50,100) , (0,0) : -49,1,50,1 + */ + +/datum/cartesian_plane + /// Lower bound of the X axis + VAR_PRIVATE/x1 + /// Upper bound of the X axis + VAR_PRIVATE/x2 + /// Lower bound of the Y axis + VAR_PRIVATE/y1 + /// Upper bound of the Y axis + VAR_PRIVATE/y2 + + /// Data Storage Hellscape:tm: + VAR_PRIVATE/list/plane + + /// Added to any accesses to the first array + VAR_PRIVATE/offset_x + /// Added to any accesses of a nested array + VAR_PRIVATE/offset_y + + /// The logical size of the X axis + var/x_size + /// The logical size of the Y axis + var/y_size + +/datum/cartesian_plane/New(x1, x2, y1, y2) + src.x1 = x1 + src.x2 = x2 + src.y1 = y1 + src.y2 = y2 + + // Calculate the offsets to push the lower bound within a usable range. + offset_x = 1 - x1 + offset_y = 1 - y1 + + x_size = (x1 < 0 && x2 > 0) ? abs(x1 - x2) + 1 : abs(x1 - x2) + y_size = (y1 < 0 && y2 > 0) ? abs(y1 - y2) + 1 : abs(y1 - y2) + + plane = new/list(x_size, y_size) + +/// Pass in a logical coordinate and see if it's in the map. This does not take array coordinates! +/datum/cartesian_plane/proc/SanitizeCoordinate(x, y) + PRIVATE_PROC(TRUE) + if(x > x2 || x < x1 || y < y1 || y > y2) + return FALSE + return TRUE + +/// Returns the bounds of the map as a list +/datum/cartesian_plane/proc/return_bounds() + return list(x1, x2, y1, y2) + +/// Returns the offsets of the map as a list +/datum/cartesian_plane/proc/return_offsets() + return list(offset_x, offset_y) + +/// Get the content at a given coordinate +/datum/cartesian_plane/proc/return_coordinate(x, y) + if(!SanitizeCoordinate(x,y)) + CRASH("Received invalid coordinate for cartesian plane.") + + return plane[x + offset_x][y + offset_y] + +/// Set the content at a given coordinate +/datum/cartesian_plane/proc/set_coordinate(x, y, content) + if(!SanitizeCoordinate(x,y)) + CRASH("Received invalid coordinate for cartesian plane.") + + plane[x + offset_x][y + offset_y] = content + +/// Return the contents of a block given logical coordinates +/datum/cartesian_plane/proc/return_block(x1, x2, y1, y2) + . = list() + + for(var/_x in (x1 + offset_x) to (x2 + offset_x)) + for(var/_y in (y1 + offset_y) to (y2 + offset_y)) + var/foo = plane[_x][_y] + if(foo) + . += foo + +/// Returns the contents of a block of coordinates in chebyshev range from the given coordinate +/datum/cartesian_plane/proc/return_range(x, y, range) + var/x1 = clamp(x-range, src.x1, src.x2) + var/x2 = clamp(x+range, src.x1, src.x2) + var/y1 = clamp(y-range, src.y1, src.y2) + var/y2 = clamp(y+range, src.y1, src.y2) + return return_block(x1, x2, y1, y2) diff --git a/monkestation/code/modules/art_sci_overrides/asteroids/simple_asteroid.dm b/monkestation/code/modules/art_sci_overrides/asteroids/simple_asteroid.dm new file mode 100644 index 000000000000..26a7381872d1 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/asteroids/simple_asteroid.dm @@ -0,0 +1,15 @@ +/datum/mining_template/simple_asteroid + name = "Asteroid" + rarity = MINING_COMMON + size = 3 + + +/datum/mining_template/simple_asteroid/get_description() + . = ..() + . += "
> STANDARD
" + +/datum/mining_template/simple_asteroid/Generate() + var/is_hollow = rand(15) + var/list/turfs = ReserveTurfsForAsteroidGeneration(center, size, FALSE) + var/datum/callback/asteroid_cb = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(GenerateRoundAsteroid), src, center, /turf/closed/mineral/random/asteroid/tospace, null, turfs, is_hollow) + SSmapping.generate_asteroid(src, asteroid_cb) diff --git a/monkestation/code/modules/art_sci_overrides/faults/_fault.dm b/monkestation/code/modules/art_sci_overrides/faults/_fault.dm new file mode 100644 index 000000000000..5848ba4104e5 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/faults/_fault.dm @@ -0,0 +1,17 @@ +/datum/artifact_fault + var/name = "Generic Fault" + ///the visible message sent when triggered + var/visible_message + ///the chance of us triggering on bad info + var/trigger_chance = 0 + +/datum/artifact_fault/proc/on_trigger(datum/component/artifact/component) + return + +/datum/artifact_fault/shutdown + name = "Generic Shutdown Fault" + +/datum/artifact_fault/on_trigger(datum/component/artifact/component) + if(component.active) + component.artifact_deactivate() + diff --git a/monkestation/code/modules/art_sci_overrides/faults/explosion.dm b/monkestation/code/modules/art_sci_overrides/faults/explosion.dm new file mode 100644 index 000000000000..819b66fa76b7 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/faults/explosion.dm @@ -0,0 +1,15 @@ +/datum/artifact_fault/explosion + name = "Explode" + trigger_chance = 3 + visible_message = "reaches a catastrophic overload, cracks forming at its surface!" + + +/datum/artifact_fault/explosion/on_trigger(datum/component/artifact/component) + component.holder.Shake(duration = 5 SECONDS, shake_interval = 0.08 SECONDS) + addtimer(CALLBACK(src, PROC_REF(payload), component), 5 SECONDS) + + +/datum/artifact_fault/explosion/proc/payload(datum/component/artifact/component) + explosion(component.holder, light_impact_range = 2, explosion_cause = src) + qdel(component.holder) + \ No newline at end of file diff --git a/monkestation/code/modules/art_sci_overrides/faults/ignite.dm b/monkestation/code/modules/art_sci_overrides/faults/ignite.dm new file mode 100644 index 000000000000..ca4e5a61d6bc --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/faults/ignite.dm @@ -0,0 +1,9 @@ +/datum/artifact_fault/ignite + name = "Combust" + trigger_chance = 9 + visible_message = "starts rapidly heating up while covering everything around it in something that seems to be oil." + +/datum/artifact_fault/ignite/on_trigger(datum/component/artifact/component) + for(var/mob/living/living in range(rand(3, 5), component.parent)) + living.adjust_fire_stacks(10) + living.ignite_mob() diff --git a/monkestation/code/modules/art_sci_overrides/faults/just_death.dm b/monkestation/code/modules/art_sci_overrides/faults/just_death.dm new file mode 100644 index 000000000000..066b64cf5f28 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/faults/just_death.dm @@ -0,0 +1,16 @@ +/datum/artifact_fault/death + name = "Instant Death" + trigger_chance = 1 + visible_message = "blows someone up with mind." + + +/datum/artifact_fault/death/on_trigger(datum/component/artifact/component) + var/list/mobs = list() + var/mob/living/carbon/human + for(var/mob/living/carbon/mob in range(rand(3, 4), component.holder)) + mobs += mob + human = pick(mobs) + if(!human) + return + component.holder.Beam(human, icon_state = "lightning[rand(1,12)]", time = 0.5 SECONDS) + human.death(FALSE) diff --git a/monkestation/code/modules/art_sci_overrides/faults/reagents.dm b/monkestation/code/modules/art_sci_overrides/faults/reagents.dm new file mode 100644 index 000000000000..886d3fc97398 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/faults/reagents.dm @@ -0,0 +1,23 @@ +/datum/artifact_fault/reagent + name = "Generic Reagent Injector" + trigger_chance = 15 + visible_message = "shoots a syringe out." + var/list/reagents = list() + +/datum/artifact_fault/reagent/on_trigger(datum/component/artifact/component) + . = ..() + if(!length(reagents)) + return + for(var/mob/living/carbon/living in range(rand(3, 5), component.parent)) + living.reagents.add_reagent(pick(reagents), rand(1, 5)) + to_chat(living, span_warning("You feel a soft prick.")) + +/datum/artifact_fault/reagent/poison + name = "Poison" + +/datum/artifact_fault/reagent/poison/on_trigger(datum/component/artifact/component) + if(!reagents.len) //mostly copied from reagents.dm but oh well + for(var/datum/reagent/reagent as anything in subtypesof(/datum/reagent/toxin)) + if(initial(reagent.chemical_flags) & REAGENT_CAN_BE_SYNTHESIZED) + reagents += reagent + . = ..() diff --git a/monkestation/code/modules/art_sci_overrides/faults/say.dm b/monkestation/code/modules/art_sci_overrides/faults/say.dm new file mode 100644 index 000000000000..a032caf8a630 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/faults/say.dm @@ -0,0 +1,14 @@ +/datum/artifact_fault/speech + name = "Generic Speech" + trigger_chance = 30 + var/list/speech = list() + +/datum/artifact_fault/speech/on_trigger(datum/component/artifact/component) + if(!length(speech)) + return + + for(var/mob/living/living in range(rand(7, 10), component.parent)) + if(prob(50)) + living.say("; [pick(speech)]") + else + living.say("[pick(speech)]") diff --git a/monkestation/code/modules/art_sci_overrides/faults/size_change.dm b/monkestation/code/modules/art_sci_overrides/faults/size_change.dm new file mode 100644 index 000000000000..8ca7e62c6bd8 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/faults/size_change.dm @@ -0,0 +1,29 @@ +/datum/artifact_fault/shrink + name = "Shrink" + trigger_chance = 13 + visible_message = "starts to shrink." + +/datum/artifact_fault/shrink/on_trigger(datum/component/artifact/component) + component.holder.transform = matrix(component.holder.transform, 0.9, 0.9, MATRIX_SCALE) + if(!isstructure(component.holder)) + return + var/obj/structure/structure = component.holder + structure.w_class-- + if(structure.w_class < WEIGHT_CLASS_TINY) + component.holder.visible_message("[component.holder] vanishes into thin air!") + qdel(component.holder) + +/datum/artifact_fault/grow + name = "Grow" + trigger_chance = 13 + visible_message = "starts to grow." + +/datum/artifact_fault/grow/on_trigger(datum/component/artifact/component) + component.holder.transform = matrix(component.holder.transform, 1.1, 1.1, MATRIX_SCALE) + if(!isitem(component.holder)) + return + var/obj/item/item = component.holder + item.w_class++ + if(item.w_class > WEIGHT_CLASS_HUGE) + component.holder.visible_message("[component.holder] becomes to cumbersome to carry!") + component.holder.anchored = TRUE diff --git a/monkestation/code/modules/art_sci_overrides/faults/warps.dm b/monkestation/code/modules/art_sci_overrides/faults/warps.dm new file mode 100644 index 000000000000..54b298d59f99 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/faults/warps.dm @@ -0,0 +1,14 @@ +/datum/artifact_fault/warp + name = "Generic Warp Artifact" + trigger_chance = 12 + visible_message = "warps space sending everyone away." + var/list/warp_areas = list() + +/datum/artifact_fault/warp/on_trigger(datum/component/artifact/component) + if(!length(warp_areas)) + warp_areas = GLOB.the_station_areas + var/turf/safe_turf = get_safe_random_station_turf(warp_areas) + + for(var/mob/living/living in range(rand(3, 5), component.parent)) + living.forceMove(safe_turf) + to_chat(living, span_warning("You feel woozy after being warped around.")) diff --git a/monkestation/code/modules/art_sci_overrides/faults/whispers.dm b/monkestation/code/modules/art_sci_overrides/faults/whispers.dm new file mode 100644 index 000000000000..abd09bad75f2 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/faults/whispers.dm @@ -0,0 +1,11 @@ +/datum/artifact_fault/whisper + name = "Generic Whisper" + trigger_chance = 30 + var/list/whispers = list() + +/datum/artifact_fault/whisper/on_trigger(datum/component/artifact/component) + if(!length(whispers)) + return + + for(var/mob/living/living in range(rand(7, 10), component.parent)) + to_chat(living, span_hear("[pick(whispers)]")) diff --git a/monkestation/code/modules/art_sci_overrides/faults/zap.dm b/monkestation/code/modules/art_sci_overrides/faults/zap.dm new file mode 100644 index 000000000000..303bb44c248c --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/faults/zap.dm @@ -0,0 +1,8 @@ +/datum/artifact_fault/tesla_zap + name = "Tesla Zap" + trigger_chance = 12 + visible_message = "discharges a large amount of electricity." + +/datum/artifact_fault/tesla_zap/on_trigger(datum/component/artifact/component) + . = ..() + tesla_zap(component.holder, rand(4, 7), ZAP_MOB_DAMAGE) diff --git a/monkestation/code/modules/art_sci_overrides/generic_artifact_objects.dm b/monkestation/code/modules/art_sci_overrides/generic_artifact_objects.dm new file mode 100644 index 000000000000..2229bf96bd2f --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/generic_artifact_objects.dm @@ -0,0 +1,57 @@ +/obj/structure/artifact + name = "Artifact" + desc = "Yell at coderbus." + icon = 'icons/obj/artifacts.dmi' + icon_state = "narnar-1" //for when something shits itself or a map editor + resistance_flags = LAVA_PROOF | ACID_PROOF | INDESTRUCTIBLE + anchored = FALSE + density = TRUE + var/datum/component/artifact/assoc_comp + var/mutable_appearance/extra_effect + +ARTIFACT_SETUP(/obj/structure/artifact, SSobj) + +/obj/effect/artifact_spawner + name = "Random Artifact Spawner" + icon = 'icons/obj/artifacts.dmi' + icon_state = "wiznerd-1" + +/obj/effect/artifact_spawner/Initialize(mapload) + . = ..() + spawn_artifact(loc) + qdel(src) + +/obj/structure/artifact/bonk + assoc_comp = /datum/component/artifact/bonk + +/obj/structure/artifact/bomb + assoc_comp = /datum/component/artifact/bomb/explosive + +/obj/structure/artifact/bomb/devastating + assoc_comp = /datum/component/artifact/bomb/explosive/devastating + +/obj/structure/artifact/bomb/gas + assoc_comp = /datum/component/artifact/bomb/gas + +/obj/structure/artifact/forcegen + assoc_comp = /datum/component/artifact/forcegen + +/obj/structure/artifact/heal + assoc_comp = /datum/component/artifact/heal + +/obj/structure/artifact/injector + assoc_comp = /datum/component/artifact/injector + +/obj/structure/artifact/lamp + assoc_comp = /datum/component/artifact/lamp + light_system = MOVABLE_LIGHT + light_on = FALSE + +/obj/structure/artifact/repulsor + assoc_comp = /datum/component/artifact/repulsor + +/obj/structure/artifact/vomit + assoc_comp = /datum/component/artifact/vomit + +/obj/structure/artifact/borger + assoc_comp = /datum/component/artifact/borger diff --git a/monkestation/code/modules/art_sci_overrides/globals.dm b/monkestation/code/modules/art_sci_overrides/globals.dm new file mode 100644 index 000000000000..25627d3e71a6 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/globals.dm @@ -0,0 +1,2 @@ +GLOBAL_LIST_INIT(artifact_rarity, list()) +GLOBAL_LIST_INIT(running_artifact_list, list()) diff --git a/monkestation/code/modules/art_sci_overrides/item_stimuli.dm b/monkestation/code/modules/art_sci_overrides/item_stimuli.dm new file mode 100644 index 000000000000..5bb23cedf0ce --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/item_stimuli.dm @@ -0,0 +1,43 @@ +/obj/item/proc/on_artifact_interact(datum/component/artifact/interacted, mob/user) + if(force) + interacted.process_stimuli(STIMULUS_FORCE, force) + + +/obj/item/weldingtool/on_artifact_interact(datum/component/artifact/interacted, mob/user) + interacted.holder.visible_message(span_warning("[user] burns the artifact with the [src]!")) + interacted.process_stimuli(STIMULUS_HEAT, 1000) + +/obj/item/assembly/igniter/on_artifact_interact(datum/component/artifact/interacted, mob/user) + interacted.holder.visible_message(span_warning("[user] zaps the artifact with the [src]!")) + interacted.process_stimuli(STIMULUS_HEAT, 700) + interacted.process_stimuli(STIMULUS_SHOCK, 1200) + +/obj/item/lighter/on_artifact_interact(datum/component/artifact/interacted, mob/user) + interacted.holder.visible_message(span_warning("[user] burns the artifact with the [src]!")) + interacted.process_stimuli(STIMULUS_HEAT, heat) + + +/obj/item/multitool/on_artifact_interact(datum/component/artifact/interacted, mob/user) + interacted.holder.visible_message(span_warning("[user] zaps the artifact with the [src]!")) + interacted.process_stimuli(STIMULUS_SHOCK, 1000) + +/obj/item/shockpaddles/on_artifact_interact(datum/component/artifact/interacted, mob/user) + if(defib.deductcharge(2000)) + interacted.holder.visible_message(span_warning("[user] zaps the artifact with the [src]!")) + interacted.process_stimuli(STIMULUS_SHOCK, 2000) + playsound(user,'sound/machines/defib_zap.ogg', 50, TRUE, -1) + +/obj/item/circuitboard/on_artifact_interact(datum/component/artifact/interacted, mob/user) + interacted.holder.visible_message(span_notice("[user] presses the [src] against the artifact.")) + interacted.process_stimuli(STIMULUS_DATA) + +/obj/item/disk/data/on_artifact_interact(datum/component/artifact/interacted, mob/user) + interacted.holder.visible_message(span_notice("[user] presses the [src] against the artifact.")) + interacted.process_stimuli(STIMULUS_DATA) + +/obj/item/bodypart/arm/on_artifact_interact(datum/component/artifact/interacted, mob/user) + interacted.holder.visible_message(span_notice("[user] presses the [src] against the artifact.")) + if(bodytype & BODYTYPE_ROBOTIC) + interacted.process_stimuli(STIMULUS_SILICON_TOUCH) + else + interacted.process_stimuli(STIMULUS_CARBON_TOUCH) diff --git a/monkestation/code/modules/art_sci_overrides/new_procs.dm b/monkestation/code/modules/art_sci_overrides/new_procs.dm new file mode 100644 index 000000000000..18826afdf0db --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/new_procs.dm @@ -0,0 +1,52 @@ +/proc/random_rgb_pairlists(list/red_pairs, list/green_pairs, list/blue_pairs, list/alpha_pairs) + if(!length(red_pairs) || !length(blue_pairs) || !length(green_pairs) || !length(alpha_pairs)) + return COLOR_CULT_RED + + if(!length(red_pairs) >= 2) + red_pairs[2] = 255 + if(!length(blue_pairs) >= 2) + blue_pairs[2] = 255 + if(!length(green_pairs) >= 2) + green_pairs[2] = 255 + if(!length(alpha_pairs) >= 2) + alpha_pairs[2] = 255 + + var/red = rand(red_pairs[1], red_pairs[2]) + var/green = rand(green_pairs[1], green_pairs[2]) + var/blue = rand(blue_pairs[1], blue_pairs[2]) + var/alpha = rand(alpha_pairs[1], alpha_pairs[2]) + + return rgb(red, green, blue, alpha) + + +/proc/spawn_artifact(turf/loc, forced_origin) + if (!loc) + return + if(!length(GLOB.artifact_rarity)) + build_weighted_rarities() + + var/list/weighted_list + + if(forced_origin) + weighted_list = GLOB.artifact_rarity[forced_origin] + else + weighted_list = GLOB.artifact_rarity["all"] + + var/datum/component/artifact/picked = pick_weight(weighted_list) + var/type = initial(picked.associated_object) + return new type(loc) + + +/proc/build_weighted_rarities() + GLOB.artifact_rarity["all"] = list() ///this needs to be created first for indexing sake + for(var/datum/artifact_origin/origin as anything in subtypesof(/datum/artifact_origin)) + GLOB.artifact_rarity[initial(origin.type_name)] = list() + + for(var/datum/component/artifact/artifact_type as anything in subtypesof(/datum/component/artifact)) + var/weight = initial(artifact_type.weight) + if(!weight) + continue + GLOB.artifact_rarity["all"][artifact_type] = weight + for(var/origin in GLOB.artifact_rarity) + if(origin in initial(artifact_type.valid_origins)) + GLOB.artifact_rarity[origin][artifact_type] = weight diff --git a/monkestation/code/modules/art_sci_overrides/readme.md b/monkestation/code/modules/art_sci_overrides/readme.md new file mode 100644 index 000000000000..9aa46b887bb5 --- /dev/null +++ b/monkestation/code/modules/art_sci_overrides/readme.md @@ -0,0 +1,35 @@ +## Title: + + +MODULE ID: ART_SCI_OVERRIDES + +### Description: + +This redoes art sci to be code compliant + + + +### TG Proc/File Changes: + - code\modules\artsci\artifact_datum.dm + - code\modules\artsci\testing_machines\heater.dm + + +### Defines: + - code\__DEFINES\artifact.dm + +### Master file additions + +- N/A + + +### Included files that are not contained in this module: + +- N/A + + +### Credits: + + + +Made by Dwasint +Most of Sprites from Goon in Goon Folder diff --git a/monkestation/code/modules/ballpit/ballbit_sink.dm b/monkestation/code/modules/ballpit/ballbit_sink.dm index c8d693f2ab06..db553a9dcd88 100644 --- a/monkestation/code/modules/ballpit/ballbit_sink.dm +++ b/monkestation/code/modules/ballpit/ballbit_sink.dm @@ -5,12 +5,24 @@ ///the filters name path for locating var/filter_name = "sinkable" var/current_size = 0 + ///Static list of turf types that are sinkable + var/static/list/sinking_turf_types -/datum/component/player_sink/Initialize(...) +//type_to_add is a type to try and add to sinking_turf_types +/datum/component/player_sink/Initialize(max_sinkage, type_to_add) RegisterSignal(parent, COMSIG_MOVABLE_PRE_MOVE, TYPE_PROC_REF(/datum/component/player_sink, recheck_state)) RegisterSignal(parent, COMSIG_ITEM_PICKUP, TYPE_PROC_REF(/datum/component/player_sink,remove_state)) START_PROCESSING(SSobj, src) - max_sinkage = rand(16,20) + if(max_sinkage) + src.max_sinkage = max_sinkage + else + max_sinkage = rand(16,20) + + if(!sinking_turf_types) + sinking_turf_types = list() + + if(!locate(type_to_add) in sinking_turf_types) + sinking_turf_types |= type_to_add /datum/component/player_sink/UnregisterFromParent() . = ..() @@ -19,7 +31,7 @@ UnregisterSignal(parent, COMSIG_ITEM_PICKUP) /datum/component/player_sink/proc/recheck_state(atom/movable/moved, atom/new_location) - if(!isopenturf(new_location) || !istype(new_location, /turf/open/ballpit)) + if(!isopenturf(new_location) || !is_type_in_list(new_location, sinking_turf_types)) var/datum/component/meh = parent.GetComponent(/datum/component/player_sink) if(meh) var/filter = parent.get_filter("sinkable") diff --git a/monkestation/code/modules/ballpit/ballpit.dm b/monkestation/code/modules/ballpit/ballpit.dm index 5205db1b8b3f..24946e35209d 100644 --- a/monkestation/code/modules/ballpit/ballpit.dm +++ b/monkestation/code/modules/ballpit/ballpit.dm @@ -27,4 +27,4 @@ return if(arrived.GetComponent(/datum/component/player_sink)) return - arrived.AddComponent(/datum/component/player_sink) + arrived.AddComponent(/datum/component/player_sink, type_to_add = src.type) diff --git a/monkestation/code/modules/bitrunners/code/ability_disks.dm b/monkestation/code/modules/bitrunners/code/ability_disks.dm new file mode 100644 index 000000000000..08cd31f52fb6 --- /dev/null +++ b/monkestation/code/modules/bitrunners/code/ability_disks.dm @@ -0,0 +1,98 @@ +/datum/orderable_item/bitrunning_abilities + category_index = CATEGORY_BITRUNNING_ABILITIES + +/obj/item/bitrunning_disk/ability/monkestation_override + name = "bitrunning program: someone forgot to give me a name, please help" + icon = 'monkestation/code/modules/bitrunners/icons/ability_disks.dmi' + icon_state = "i_am_error" + monkeystation_override = TRUE + +/obj/item/bitrunning_disk/ability/monkestation_override/Initialize(mapload) + granted_action = selectable_actions + RegisterSignal(src, COMSIG_PARENT_EXAMINE, PROC_REF(on_examined)) + return ..() + +/** + * Tier 1 abilities + */ + +/datum/orderable_item/bitrunning_abilities/conjure_cheese + cost_per_order = 1000 + item_path = /obj/item/bitrunning_disk/ability/monkestation_override/conjure_cheese + +/obj/item/bitrunning_disk/ability/monkestation_override/conjure_cheese + name = "bitrunning program: conjure cheese" + icon_state = "cheese" + selectable_actions = /datum/action/cooldown/spell/conjure/cheese + + + +/datum/orderable_item/bitrunning_abilities/basic_heal + cost_per_order = 1000 + item_path = /obj/item/bitrunning_disk/ability/monkestation_override/basic_heal + +/obj/item/bitrunning_disk/ability/monkestation_override/basic_heal + name = "bitrunning program: basic heal" + icon_state = "heal" + selectable_actions = /datum/action/cooldown/spell/basic_heal + +/** + * Tier 2 abilities + */ + +/datum/orderable_item/bitrunning_abilities/fireball + cost_per_order = 1500 + item_path = /obj/item/bitrunning_disk/ability/monkestation_override/fireball + +/obj/item/bitrunning_disk/ability/monkestation_override/fireball + name = "bitrunning program: fireball" + icon_state = "fireball" + selectable_actions = /datum/action/cooldown/spell/pointed/projectile/fireball + + + +/datum/orderable_item/bitrunning_abilities/lightningbolt + cost_per_order = 1500 + item_path = /obj/item/bitrunning_disk/ability/monkestation_override/lightningbolt + +/obj/item/bitrunning_disk/ability/monkestation_override/lightningbolt + name = "bitrunning program: lightning bolt" + icon_state = "lightning" + selectable_actions = /datum/action/cooldown/spell/pointed/projectile/lightningbolt + + + +/datum/orderable_item/bitrunning_abilities/forcewall + cost_per_order = 1500 + item_path = /obj/item/bitrunning_disk/ability/monkestation_override/forcewall + +/obj/item/bitrunning_disk/ability/monkestation_override/forcewall + name = "bitrunning program: forcewall" + icon_state = "forcewall" + selectable_actions = /datum/action/cooldown/spell/forcewall + + + +/** + * Tier 3 abilities + */ + +/datum/orderable_item/bitrunning_abilities/dragon + cost_per_order = 2500 + item_path = /obj/item/bitrunning_disk/ability/monkestation_override/dragon + +/obj/item/bitrunning_disk/ability/monkestation_override/dragon + name = "bitrunning program: shapeshift, dragon" + icon_state = "dragon" + selectable_actions = /datum/action/cooldown/spell/shapeshift/dragon + + + +/datum/orderable_item/bitrunning_abilities/polar_bear + cost_per_order = 2500 + item_path = /obj/item/bitrunning_disk/ability/monkestation_override/polar_bear + +/obj/item/bitrunning_disk/ability/monkestation_override/polar_bear + name = "bitrunning program: shapeshift, polar bear" + icon_state = "bear" + selectable_actions = /datum/action/cooldown/spell/shapeshift/polar_bear diff --git a/monkestation/code/modules/bitrunners/code/combat_gear_disks.dm b/monkestation/code/modules/bitrunners/code/combat_gear_disks.dm new file mode 100644 index 000000000000..58e78d8bf326 --- /dev/null +++ b/monkestation/code/modules/bitrunners/code/combat_gear_disks.dm @@ -0,0 +1,119 @@ +/datum/orderable_item/bitrunning_combat_gear + category_index = CATEGORY_BITRUNNING_COMBAT_GEAR + + +/obj/item/bitrunning_disk/item/monkestation_override + name = "bitrunning gear: someone forgot to give me a name, please help" + icon = 'monkestation/code/modules/bitrunners/icons/item_disks.dmi' + icon_state = "i_am_error" + monkeystation_override = TRUE + +/obj/item/bitrunning_disk/item/monkestation_override/Initialize(mapload) + granted_item = selectable_items + RegisterSignal(src, COMSIG_PARENT_EXAMINE, PROC_REF(on_examined)) + return ..() + +/** + * Tier 1 combat gear + */ + +/datum/orderable_item/bitrunning_combat_gear/pizza + cost_per_order = 1000 + item_path = /obj/item/bitrunning_disk/item/monkestation_override/pizza + +/obj/item/bitrunning_disk/item/monkestation_override/pizza + name = "bitrunning gear: infinite pizzabox" + icon_state = "pizza" + selectable_items = /obj/item/pizzabox/infinite + + + +/datum/orderable_item/bitrunning_combat_gear/medbeam + cost_per_order = 1000 + item_path = /obj/item/bitrunning_disk/item/monkestation_override/medbeam + +/obj/item/bitrunning_disk/item/monkestation_override/medbeam + name = "bitrunning gear: Medical Beamgun" + icon_state = "beamgun" + selectable_items = /obj/item/gun/medbeam + + + +/datum/orderable_item/bitrunning_combat_gear/c4 + cost_per_order = 1000 + item_path = /obj/item/bitrunning_disk/item/monkestation_override/c4 + +/obj/item/bitrunning_disk/item/monkestation_override/c4 + name = "bitrunning gear: C4 explosive charge" + icon_state = "c4" + selectable_items = /obj/item/grenade/c4 + +/** + * Tier 2 combat gear + */ + +/datum/orderable_item/bitrunning_combat_gear/chainsaw + cost_per_order = 1800 + item_path = /obj/item/bitrunning_disk/item/monkestation_override/chainsaw + +/obj/item/bitrunning_disk/item/monkestation_override/chainsaw + name = "bitrunning gear: chainsaw" + icon_state = "chainsaw" + selectable_items = /obj/item/chainsaw + + + +/datum/orderable_item/bitrunning_combat_gear/pistol + cost_per_order = 1800 + item_path = /obj/item/bitrunning_disk/item/monkestation_override/pistol + +/obj/item/bitrunning_disk/item/monkestation_override/pistol + name = "bitrunning gear: makarov pistol" + icon_state = "pistol" + selectable_items = /obj/item/gun/ballistic/automatic/pistol + + + +/datum/orderable_item/bitrunning_combat_gear/hardlight_blade + cost_per_order = 1800 + item_path = /obj/item/bitrunning_disk/item/monkestation_override/hardlight_blade + +/obj/item/bitrunning_disk/item/monkestation_override/hardlight_blade + name = "bitrunning gear: hardlight blade" + icon_state = "hardlight_blade" + selectable_items = /obj/item/melee/energy/blade/hardlight + +/** + * Tier 3 combat gear + */ + +/datum/orderable_item/bitrunning_combat_gear/tesla_cannon + cost_per_order = 3200 + item_path = /obj/item/bitrunning_disk/item/monkestation_override/tesla_cannon + +/obj/item/bitrunning_disk/item/monkestation_override/tesla_cannon + name = "bitrunning gear: tesla cannon" + icon_state = "tesla" + selectable_items = /obj/item/gun/energy/tesla_cannon + + + +/datum/orderable_item/bitrunning_combat_gear/dualsaber + cost_per_order = 3200 + item_path = /obj/item/bitrunning_disk/item/monkestation_override/dualsaber + +/obj/item/bitrunning_disk/item/monkestation_override/dualsaber + name = "bitrunning gear: double-bladed energy sword" + icon_state = "energy_blade" + selectable_items = /obj/item/dualsaber/green + + + +/datum/orderable_item/bitrunning_combat_gear/beesword + cost_per_order = 3200 + item_path = /obj/item/bitrunning_disk/item/monkestation_override/beesword + +/obj/item/bitrunning_disk/item/monkestation_override/beesword + name = "bitrunning gear: the stinger blade" + icon_state = "bee" + selectable_items = /obj/item/melee/beesword diff --git a/monkestation/code/modules/bitrunners/icons/ability_disks.dmi b/monkestation/code/modules/bitrunners/icons/ability_disks.dmi new file mode 100644 index 000000000000..b02e9b77bd4b Binary files /dev/null and b/monkestation/code/modules/bitrunners/icons/ability_disks.dmi differ diff --git a/monkestation/code/modules/bitrunners/icons/item_disks.dmi b/monkestation/code/modules/bitrunners/icons/item_disks.dmi new file mode 100644 index 000000000000..a5f1b7fa284b Binary files /dev/null and b/monkestation/code/modules/bitrunners/icons/item_disks.dmi differ diff --git a/monkestation/code/modules/bitrunners/readme.md b/monkestation/code/modules/bitrunners/readme.md new file mode 100644 index 000000000000..f56bf5faa0f7 --- /dev/null +++ b/monkestation/code/modules/bitrunners/readme.md @@ -0,0 +1,33 @@ + +https://github.com/Monkestation/Monkestation2.0/pull/429 + +## \ + +- Module ID: ID: BIT_RUNNERS + +### Description: + +- This modular file is for all things related to bitrunners, the PR that it started with is the title + +### TG Proc/File Changes: + + +- code/modules/bitrunning/objects/bit_vendor.dm + +### Modular Overrides: + +- N/A + +### Defines: + + +- computers.dm +- #define CATEGORY_BITRUNNING_COMBAT_GEAR +- #define CATEGORY_BITRUNNING_ABILITIES +### Included files that are not contained in this module: + +- N/A + +### Credits: + +- Gboster-0 - Splitting the tech disks into their individual parts, Most of the disk icons diff --git a/monkestation/code/modules/bloodsuckers/bloodsucker/bloodsucker_guardian.dm b/monkestation/code/modules/bloodsuckers/bloodsucker/bloodsucker_guardian.dm index 299b5a5e780d..97953c5a1d26 100644 --- a/monkestation/code/modules/bloodsuckers/bloodsucker/bloodsucker_guardian.dm +++ b/monkestation/code/modules/bloodsuckers/bloodsucker/bloodsucker_guardian.dm @@ -1,18 +1,17 @@ ///Bloodsuckers spawning a Guardian will get the Bloodsucker one instead. -/obj/item/guardiancreator/spawn_guardian(mob/living/user, mob/dead/candidate) +/obj/item/guardian_creator/spawn_guardian(mob/living/user, mob/dead/candidate) var/list/guardians = user.get_all_linked_holoparasites() - if(length(guardians) && !allowmultiple) + if(length(guardians)) to_chat(user, span_holoparasite("You already have a [mob_name]!")) used = FALSE return if(IS_BLOODSUCKER(user)) - var/mob/living/simple_animal/hostile/guardian/standard/timestop/bloodsucker_guardian = new(user, GUARDIAN_THEME_MAGIC) + var/mob/living/basic/guardian/standard/bloodsucker_guardian = new(user, GUARDIAN_THEME_MAGIC) bloodsucker_guardian.set_summoner(user, different_person = TRUE) bloodsucker_guardian.key = candidate.key user.log_message("has summoned [key_name(bloodsucker_guardian)], a [bloodsucker_guardian.creator_name] holoparasite.", LOG_GAME) bloodsucker_guardian.log_message("was summoned as a [bloodsucker_guardian.creator_name] holoparasite.", LOG_GAME) - to_chat(user, bloodsucker_guardian.magic_fluff_string) to_chat(user, replacetext(success_message, "%GUARDIAN", mob_name)) bloodsucker_guardian.client?.init_verbs() return @@ -23,7 +22,7 @@ /** * The Guardian itself */ -/mob/living/simple_animal/hostile/guardian/standard/timestop +/mob/living/basic/guardian/standard // Like Bloodsuckers do, you will take more damage to Burn and less to Brute damage_coeff = list(BRUTE = 0.5, BURN = 2.5, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) @@ -31,16 +30,9 @@ creator_desc = "Devastating close combat attacks and high damage resistance. Can smash through weak walls and stop time." creator_icon = "standard" - //None of these shouldn't appear in game outside of admin intervention - playstyle_string = span_holoparasite("As a time manipulation type you can stop time and you have a damage multiplier instead of armor as-well as powerful melee attacks capable of smashing through walls.") - magic_fluff_string = span_holoparasite("...And draw... The World, through sheer luck or perhaps destiny, maybe even your own physiology. Manipulator of time, a guardian powerful enough to control THE WORLD!") - tech_fluff_string = span_holoparasite("ERROR... T$M3 M4N!PULA%I0N modules loaded. Holoparasite swarm online.") - carp_fluff_string = span_holoparasite("CARP CARP CARP! You caught one! It's imbued with the power of Carp'Sie herself. Time to rule THE WORLD!.") - miner_fluff_string = span_holoparasite("You encounter... The World, the controller of time and space.") - -/mob/living/simple_animal/hostile/guardian/standard/timestop/Initialize(mapload, theme) +/mob/living/basic/guardian/standard/Initialize(mapload, theme) //Wizard Holoparasite theme, just to be more visibly stronger than regular ones - theme = GUARDIAN_THEME_MAGIC + theme = GLOB.guardian_themes[GUARDIAN_THEME_TECH] . = ..() var/datum/action/cooldown/spell/timestop/guardian/timestop_ability = new() timestop_ability.Grant(src) @@ -56,12 +48,12 @@ /datum/action/cooldown/spell/timestop/guardian/Grant(mob/grant_to) . = ..() - var/mob/living/simple_animal/hostile/guardian/standard/timestop/bloodsucker_guardian = owner + var/mob/living/basic/guardian/standard/bloodsucker_guardian = owner if(bloodsucker_guardian && istype(bloodsucker_guardian) && bloodsucker_guardian.summoner) ADD_TRAIT(bloodsucker_guardian.summoner, TRAIT_TIME_STOP_IMMUNE, REF(src)) /datum/action/cooldown/spell/timestop/guardian/Remove(mob/remove_from) - var/mob/living/simple_animal/hostile/guardian/standard/timestop/bloodsucker_guardian = owner + var/mob/living/basic/guardian/standard/bloodsucker_guardian = owner if(bloodsucker_guardian && istype(bloodsucker_guardian) && bloodsucker_guardian.summoner) REMOVE_TRAIT(bloodsucker_guardian.summoner, TRAIT_TIME_STOP_IMMUNE, REF(src)) return ..() diff --git a/monkestation/code/modules/bloodsuckers/monster_hunters/hunter_weapons.dm b/monkestation/code/modules/bloodsuckers/monster_hunters/hunter_weapons.dm index 29b28aab183d..463cf9d9d9ec 100644 --- a/monkestation/code/modules/bloodsuckers/monster_hunters/hunter_weapons.dm +++ b/monkestation/code/modules/bloodsuckers/monster_hunters/hunter_weapons.dm @@ -276,7 +276,7 @@ damage = 3 ricochets_max = 4 -/obj/projectile/bullet/bloodsilver/on_hit(atom/target, blocked = FALSE) +/obj/projectile/bullet/bloodsilver/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(!iscarbon(target)) return diff --git a/monkestation/code/modules/bloodsuckers/monster_hunters/monsters/monster_controllers/killer_rabbit.dm b/monkestation/code/modules/bloodsuckers/monster_hunters/monsters/monster_controllers/killer_rabbit.dm index 9aac3a6402b9..ba5a2d86937f 100644 --- a/monkestation/code/modules/bloodsuckers/monster_hunters/monsters/monster_controllers/killer_rabbit.dm +++ b/monkestation/code/modules/bloodsuckers/monster_hunters/monsters/monster_controllers/killer_rabbit.dm @@ -3,7 +3,7 @@ */ /datum/ai_controller/basic_controller/killer_rabbit blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance diff --git a/monkestation/code/modules/bloodsuckers/monster_hunters/monsters/monster_controllers/red_rabbit.dm b/monkestation/code/modules/bloodsuckers/monster_hunters/monsters/monster_controllers/red_rabbit.dm index bd4f3d4bfcec..2adbe7403318 100644 --- a/monkestation/code/modules/bloodsuckers/monster_hunters/monsters/monster_controllers/red_rabbit.dm +++ b/monkestation/code/modules/bloodsuckers/monster_hunters/monsters/monster_controllers/red_rabbit.dm @@ -3,7 +3,7 @@ */ /datum/ai_controller/basic_controller/red_rabbit blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, ) ai_movement = /datum/ai_movement/basic_avoidance diff --git a/monkestation/code/modules/bloodsuckers/powers/targeted/lunge.dm b/monkestation/code/modules/bloodsuckers/powers/targeted/lunge.dm index f86f9e25d373..d43420807c48 100644 --- a/monkestation/code/modules/bloodsuckers/powers/targeted/lunge.dm +++ b/monkestation/code/modules/bloodsuckers/powers/targeted/lunge.dm @@ -146,7 +146,7 @@ owner.balloon_alert(owner, "you lunge at [target]!") if(target.stat == DEAD) var/obj/item/bodypart/chest = target.get_bodypart(BODY_ZONE_CHEST) - var/datum/wound/slash/moderate/crit_wound = new + var/datum/wound/slash/flesh/moderate/crit_wound = new crit_wound.apply_wound(chest) owner.visible_message( span_warning("[owner] tears into [target]'s chest!"), diff --git a/monkestation/code/modules/bloodsuckers/powers/targeted/mesmerize.dm b/monkestation/code/modules/bloodsuckers/powers/targeted/mesmerize.dm index a2ef6ab31e91..2c3f038bdf85 100644 --- a/monkestation/code/modules/bloodsuckers/powers/targeted/mesmerize.dm +++ b/monkestation/code/modules/bloodsuckers/powers/targeted/mesmerize.dm @@ -123,7 +123,7 @@ mesmerized_target.adjust_silence(power_time) //mesmerized_target.silent += power_time / 10 // Silent isn't based on ticks. mesmerized_target.next_move = world.time + power_time // <--- Use direct change instead. We want an unmodified delay to their next move // mesmerized_target.changeNext_move(power_time) // check click.dm - mesmerized_target.notransform = TRUE // <--- Fuck it. We tried using next_move, but they could STILL resist. We're just doing a hard freeze. + ADD_TRAIT(mesmerized_target, TRAIT_NO_TRANSFORM, BLOODSUCKER_TRAIT)// <--- Fuck it. We tried using next_move, but they could STILL resist. We're just doing a hard freeze. addtimer(CALLBACK(src, PROC_REF(end_mesmerize), user, mesmerized_target), power_time) power_activated_sucessfully() // PAY COST! BEGIN COOLDOWN! @@ -132,7 +132,7 @@ . = ..() /datum/action/cooldown/bloodsucker/targeted/mesmerize/proc/end_mesmerize(mob/living/user, mob/living/target) - target.notransform = FALSE + REMOVE_TRAIT(target, TRAIT_NO_TRANSFORM, BLOODSUCKER_TRAIT) REMOVE_TRAIT(target, TRAIT_MUTE, BLOODSUCKER_TRAIT) // They Woke Up! (Notice if within view) if(istype(user) && target.stat == CONSCIOUS && (target in view(6, get_turf(user)))) diff --git a/monkestation/code/modules/bloodsuckers/powers/targeted/trespass.dm b/monkestation/code/modules/bloodsuckers/powers/targeted/trespass.dm index 243e2b229b44..2671c281a987 100644 --- a/monkestation/code/modules/bloodsuckers/powers/targeted/trespass.dm +++ b/monkestation/code/modules/bloodsuckers/powers/targeted/trespass.dm @@ -19,7 +19,7 @@ . = ..() if(!.) return FALSE - if(user.notransform || !get_turf(user)) + if(HAS_TRAIT(user, TRAIT_NO_TRANSFORM) || !get_turf(user)) return FALSE return TRUE diff --git a/monkestation/code/modules/bloodsuckers/powers/tremere/auspex.dm b/monkestation/code/modules/bloodsuckers/powers/tremere/auspex.dm index 12a49f8890a7..f3c53394d27a 100644 --- a/monkestation/code/modules/bloodsuckers/powers/tremere/auspex.dm +++ b/monkestation/code/modules/bloodsuckers/powers/tremere/auspex.dm @@ -110,7 +110,7 @@ continue if(level_current >= 4) var/obj/item/bodypart/bodypart = pick(living_mob.bodyparts) - bodypart.force_wound_upwards(/datum/wound/slash/critical) + living_mob.cause_wound_of_type_and_severity(WOUND_SLASH, bodypart, WOUND_SEVERITY_MODERATE, WOUND_SEVERITY_CRITICAL) living_mob.adjustBruteLoss(15) if(level_current >= 5) living_mob.Knockdown(10 SECONDS, ignore_canstun = TRUE) diff --git a/monkestation/code/modules/bloodsuckers/powers/tremere/dominate.dm b/monkestation/code/modules/bloodsuckers/powers/tremere/dominate.dm index 516ea3fa5da6..f51d8e6d21b9 100644 --- a/monkestation/code/modules/bloodsuckers/powers/tremere/dominate.dm +++ b/monkestation/code/modules/bloodsuckers/powers/tremere/dominate.dm @@ -140,7 +140,7 @@ target.become_blind(BLOODSUCKER_TRAIT) mesmerized.Immobilize(power_time) mesmerized.next_move = world.time + power_time - mesmerized.notransform = TRUE + ADD_TRAIT(mesmerized, TRAIT_NO_TRANSFORM, BLOODSUCKER_TRAIT) addtimer(CALLBACK(src, PROC_REF(end_mesmerize), user, target), power_time) if(issilicon(target)) var/mob/living/silicon/mesmerized = target @@ -148,7 +148,7 @@ owner.balloon_alert(owner, "temporarily shut [mesmerized] down.") /datum/action/cooldown/bloodsucker/targeted/tremere/proc/end_mesmerize(mob/living/user, mob/living/target) - target.notransform = FALSE + REMOVE_TRAIT(target, TRAIT_NO_TRANSFORM, BLOODSUCKER_TRAIT) target.cure_blind(BLOODSUCKER_TRAIT) REMOVE_TRAIT(target, TRAIT_MUTE, BLOODSUCKER_TRAIT) if(istype(user) && target.stat == CONSCIOUS && (target in view(6, get_turf(user)))) diff --git a/monkestation/code/modules/bloodsuckers/powers/tremere/thaumaturgey.dm b/monkestation/code/modules/bloodsuckers/powers/tremere/thaumaturgey.dm index c589922895b5..a00621387f97 100644 --- a/monkestation/code/modules/bloodsuckers/powers/tremere/thaumaturgey.dm +++ b/monkestation/code/modules/bloodsuckers/powers/tremere/thaumaturgey.dm @@ -132,7 +132,7 @@ damage = 20 var/datum/action/cooldown/bloodsucker/targeted/tremere/thaumaturgy/bloodsucker_power -/obj/projectile/magic/arcane_barrage/bloodsucker/on_hit(target) +/obj/projectile/magic/arcane_barrage/bloodsucker/on_hit(target, blocked, pierce_hit) if(istype(target, /obj/structure/closet) && bloodsucker_power.level_current >= 3) var/obj/structure/closet/hit_closet = target if(hit_closet) diff --git a/monkestation/code/modules/cargo/crates/imports.dm b/monkestation/code/modules/cargo/crates/imports.dm index e18d5dc47355..3ff490e2b347 100644 --- a/monkestation/code/modules/cargo/crates/imports.dm +++ b/monkestation/code/modules/cargo/crates/imports.dm @@ -14,3 +14,43 @@ cost = CARGO_CRATE_VALUE * 4 contains = list(/obj/item/ammo_box/n762 = 6) crate_name = "Emergency Crate" + +/datum/supply_pack/imports/wt550 + name = "WT-550 Autorifle Crate" + desc = "A proper ballistic option for a proper ballistic officer." + cost = CARGO_CRATE_VALUE * 30 + contains = list( + /obj/item/gun/ballistic/automatic/wt550/no_mag = 2, + /obj/item/ammo_box/magazine/wt550m9/wtrub = 4, + ) + crate_name = "Autorifle Crate" + access = ACCESS_ARMORY + access_view = ACCESS_ARMORY + crate_type = /obj/structure/closet/crate/secure/weapon + +/datum/supply_pack/imports/wt550ammo/nonlethal + name = "WT-550 Non-Lethal Ammo Crate" + desc = "A supply of non-lethal ammunition for the WT-550 autorifle." + cost = CARGO_CRATE_VALUE * 5 + contains = list( + /obj/item/ammo_box/magazine/wt550m9/wtrub = 3, + /obj/item/ammo_box/magazine/wt550m9/wtsalt = 3, + ) + crate_name = "wt-550 non-lethal ammo crate" + access = ACCESS_ARMORY + access_view = ACCESS_ARMORY + crate_type = /obj/structure/closet/crate/secure/weapon + +/datum/supply_pack/imports/wt550ammo + name = "WT-550 Ammo Crate" + desc = "A supply of spare and exotic lethal ammunition for the WT-550 autorifle." + cost = CARGO_CRATE_VALUE * 6 + contains = list( + /obj/item/ammo_box/magazine/wt550m9 = 2, + /obj/item/ammo_box/magazine/wt550m9/wtap = 2, + /obj/item/ammo_box/magazine/wt550m9/wtic = 2, + ) + crate_name = "wt-550 ammo crate" + access = ACCESS_ARMORY + access_view = ACCESS_ARMORY + crate_type = /obj/structure/closet/crate/secure/weapon diff --git a/monkestation/code/modules/cargo/crates/science.dm b/monkestation/code/modules/cargo/crates/science.dm index 9a8847f7db1a..3d9705b86d1e 100644 --- a/monkestation/code/modules/cargo/crates/science.dm +++ b/monkestation/code/modules/cargo/crates/science.dm @@ -10,10 +10,3 @@ /obj/item/circuitboard/machine/processor/slime) crate_name = "xenobiology starter crate" crate_type = /obj/structure/closet/crate/secure/science - -/datum/supply_pack/science/strange_objects - name = "Strange Object Crate" - desc = "We aren't quite sure what these are, but you're dumb enough to buy them anyway!" - cost = CARGO_CRATE_VALUE * 6 - contains = list(/obj/item/relic = 5) - crate_name = "strange object crate" diff --git a/monkestation/code/modules/cargo/crates/security.dm b/monkestation/code/modules/cargo/crates/security.dm index 57e2a2fbeb8c..e6e5fc99bb39 100644 --- a/monkestation/code/modules/cargo/crates/security.dm +++ b/monkestation/code/modules/cargo/crates/security.dm @@ -8,27 +8,6 @@ crate_name = "secway crate" crate_type = /obj/structure/closet/crate/large -/datum/supply_pack/security/armory/wt550 - name = "WT-550 Autorifle Crate" - desc = "A proper ballistic option for a proper ballistic officer." - cost = CARGO_CRATE_VALUE * 7 - contains = list( - /obj/item/gun/ballistic/automatic/wt550 = 2, - /obj/item/ammo_box/magazine/wt550m9 = 2, - ) - crate_name = "Autorifle Crate" - -/datum/supply_pack/security/armory/wt550ammo - name = "WT-550 Ammo Crate" - desc = "A supply of spare and exotic ammunition for the WT-550 autorifle." - cost = CARGO_CRATE_VALUE * 4 - contains = list( - /obj/item/ammo_box/magazine/wt550m9 = 2, - /obj/item/ammo_box/magazine/wt550m9/wtap = 2, - /obj/item/ammo_box/magazine/wt550m9/wtic = 2, - ) - crate_name = "wt-550 ammo crate" - /datum/supply_pack/security/armory/combatknives name = "Combat Knives Crate" desc = "Three combat knives guaranteed to fit snugly inide any Nanotrasen standard boot. Warranty void if you stab your own ankle." diff --git a/monkestation/code/modules/cargo/markets/market_items.dm b/monkestation/code/modules/cargo/markets/market_items.dm new file mode 100644 index 000000000000..d744ef932ae1 --- /dev/null +++ b/monkestation/code/modules/cargo/markets/market_items.dm @@ -0,0 +1,39 @@ +/datum/market_item/weapon/smoothbore_disabler_prime + name = "Elite Smoothbore Disabler" + desc = "A rare and sought after disabler often used by Nanotrasen's high command, and historical LARPers." + item = /obj/item/gun/energy/disabler/smoothbore/prime + + price_min = CARGO_CRATE_VALUE * 3 + price_max = CARGO_CRATE_VALUE * 5 + stock_max = 2 + availability_prob = 40 + +/datum/market_item/weapon/pipegun_recipe + name = "Diary of a Dead Assistant" + desc = "Found this book in my Archives, had some barely legible scrabblings about making 'The perfect pipegun'. Figured someone here would buy this." + item = /obj/item/book/granter/crafting_recipe/maint_gun/pipegun_prime + + price_min = CARGO_CRATE_VALUE * 4 + price_max = CARGO_CRATE_VALUE * 5 + stock_max = 1 + availability_prob = 40 + +/datum/market_item/weapon/musket_recipe + name = "Journal of a Space Ranger" + desc = "An old banned book written by an eccentric space ranger, notable for its detailed description of how to make powerful improvised lasers." + item = /obj/item/book/granter/crafting_recipe/maint_gun/laser_musket_prime + + price_min = CARGO_CRATE_VALUE * 4 + price_max = CARGO_CRATE_VALUE * 5 + stock_max = 2 + availability_prob = 40 + +/datum/market_item/weapon/smoothbore_recipe + name = "Old Tome" + desc = "Ahoy Maties, I, Captain Whitebeard, have plundered the ol' Nanotrasen station, among the booty retreived was this here tome about smoothbores. Alas, I have no use for its knowlege, so I am droppin it off here." + item = /obj/item/book/granter/crafting_recipe/maint_gun/smoothbore_disabler_prime + + price_min = CARGO_CRATE_VALUE * 6 + price_max = CARGO_CRATE_VALUE * 8 + stock_max = 1 + availability_prob = 20 diff --git a/monkestation/code/modules/cassettes/machines/media/media_manager.dm b/monkestation/code/modules/cassettes/machines/media/media_manager.dm index a9cd5565b9d8..3b03bbb1d155 100644 --- a/monkestation/code/modules/cassettes/machines/media/media_manager.dm +++ b/monkestation/code/modules/cassettes/machines/media/media_manager.dm @@ -111,7 +111,7 @@ var/client/owner // Client this is actually running in var/forced=0 // If true, current url overrides area media sources var/playerstyle // Choice of which player plugin to use - var/const/WINDOW_ID = "infowindow.mediapanel" // Which elem in skin.dmf to use + var/const/WINDOW_ID = "statwindow.mediapanel" // Which elem in skin.dmf to use var/balance=0 // do you know what insanity is? Value from -100 to 100 where -100 is left and 100 is right var/signal_synced = 0 //used to check if we have our signal created @@ -178,7 +178,7 @@ targetURL = M.media_url targetStartTime = M.media_start_time - targetVolume = max(0, M.volume - (dist * 0.1)) + targetVolume = max(0, M.volume * (1 - (dist * 0.1))) targetBalance = x_dist //MP_DEBUG("Found audio source: [M.media_url] @ [(world.time - start_time) / 10]s.") @@ -212,7 +212,7 @@ var/dist = get_dist(new_loc, M) var/x_dist = -(new_loc.x - M.x) * 10 - targetVolume = max(0, M.volume - (dist * 0.1)) + targetVolume = max(0, M.volume * (1 - (dist * 0.1))) targetBalance = x_dist push_volume_recalc(targetVolume, targetBalance) diff --git a/monkestation/code/modules/cassettes/track_folder/base_tracks.json b/monkestation/code/modules/cassettes/track_folder/base_tracks.json index b494bf48763d..8e583fbe1b30 100644 --- a/monkestation/code/modules/cassettes/track_folder/base_tracks.json +++ b/monkestation/code/modules/cassettes/track_folder/base_tracks.json @@ -515,7 +515,7 @@ "duration": 1340, "artist": "Leslie Fish", "secret": false, - "lobby": true, + "lobby": false, "jukebox": true, "genre": "Folk and Indie" }, @@ -525,7 +525,7 @@ "duration": 2660, "artist": "Duane Elms", "secret": false, - "lobby": true, + "lobby": false, "jukebox": true, "genre": "Folk and Indie" }, @@ -535,7 +535,7 @@ "duration": 1700, "artist": "Leslie Fish", "secret": false, - "lobby": true, + "lobby": false, "jukebox": true, "genre": "Folk and Indie" }, @@ -2255,7 +2255,7 @@ "duration": 3180, "artist": "David Bowie", "secret": false, - "lobby": true, + "lobby": false, "jukebox": true, "genre": "Rock" }, @@ -2285,7 +2285,7 @@ "duration": 3330, "artist": "Chris Hadfield", "secret": false, - "lobby": true, + "lobby": false, "jukebox": true, "genre": "Pop" }, @@ -2895,7 +2895,7 @@ "duration": 2730, "artist": "Hall & Oates", "secret": false, - "lobby": true, + "lobby": false, "jukebox": true, "genre": "Pop" }, @@ -4363,7 +4363,7 @@ "artist": "Network Music Ensemble", "genre": "Rock", "secret": false, - "lobby": true, + "lobby": false, "jukebox": true }, { @@ -4423,7 +4423,7 @@ "artist": "Fiona Apple", "genre": "Electronic", "secret": false, - "lobby": true, + "lobby": false, "jukebox": true }, { @@ -4433,7 +4433,7 @@ "artist": "Kamil Hala, Slovak Philharmonic Orchestra, Libor Pešek", "genre": "Classical and Orchestral", "secret": false, - "lobby": true, + "lobby": false, "jukebox": true }, { @@ -4573,7 +4573,7 @@ "artist": "Julia Ecklar & Anne Prather", "genre": "Folk and Indie", "secret": false, - "lobby": true, + "lobby": false, "jukebox": true }, { @@ -4623,7 +4623,7 @@ "artist": "Free Fall & Other Delights", "genre": "Folk and Indie", "secret": false, - "lobby": true, + "lobby": false, "jukebox": true }, { @@ -4643,7 +4643,7 @@ "artist": "Duane Elms", "genre": "Folk and Indie", "secret": false, - "lobby": true, + "lobby": false, "jukebox": true }, { @@ -4653,7 +4653,7 @@ "artist": "Duane Elms", "genre": "Folk and Indie", "secret": false, - "lobby": true, + "lobby": false, "jukebox": true }, { @@ -4663,7 +4663,7 @@ "artist": "Duane Elms", "genre": "Folk and Indie", "secret": false, - "lobby": true, + "lobby": false, "jukebox": true }, { @@ -4764,5 +4764,95 @@ "secret": true, "lobby": false, "jukebox": true + }, + { + "url" : "https://files.catbox.moe/mvdhbk.mp3", + "title": "HoverGoat", + "duration": 1810, + "artist": "Madducks", + "genre": "Electronic", + "secret": false, + "lobby": true, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/cul20c.mp3", + "title": "Flowing Uphill", + "duration": 3050, + "artist": "Chronoquest", + "genre": "Electronic", + "secret": false, + "lobby": true, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/cdf7ab.mp3", + "title": "Future Imperfect", + "duration": 1820, + "artist": "Chronoquest", + "genre": "Electronic", + "secret": false, + "lobby": true, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/aude0k.mp3", + "title": "Space Station 3", + "duration": 1960, + "artist": "Chronoquest", + "genre": "Electronic", + "secret": false, + "lobby": true, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/cjx1lj.mp3", + "title": "Sitar Warriors", + "duration": 1400, + "artist": "Chronoquest", + "genre": "Electronic", + "secret": false, + "lobby": true, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/ebcxxz.mp3", + "title": "Rare Brotherman Bill", + "duration": 1870, + "artist": "Terrible Tim", + "genre": "Folk and Indie", + "secret": false, + "lobby": true, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/b9i0yh.mp3", + "title": "Paleorock", + "duration": 930, + "artist": "Bizaonacci", + "genre": "Folk and Indie", + "secret": false, + "lobby": true, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/a6osd4.mp3", + "title": "Modern Day Ouroborus", + "duration": 3050, + "artist": "LISA:The Pointless", + "genre": "Electronic", + "secret": false, + "lobby": true, + "jukebox": true + }, + { + "url" : "https://files.catbox.moe/oe3r2f.mp3", + "title": "Look Forward", + "duration": 2470, + "artist": "Skyline", + "genre": "Electronic", + "secret": false, + "lobby": true, + "jukebox": true } ] diff --git a/monkestation/code/modules/client/preference_savefile.dm b/monkestation/code/modules/client/preference_savefile.dm index 935f289a778c..fcb1b1694154 100644 --- a/monkestation/code/modules/client/preference_savefile.dm +++ b/monkestation/code/modules/client/preference_savefile.dm @@ -22,8 +22,17 @@ loadout = _text2path(loadout) save_loadout[loadout] = entry + var/list/special_save_loadout = SANITIZE_LIST(save_data["special_loadout_list"]) + for(var/loadout in special_save_loadout["unusual"]) + special_save_loadout["unusual"] -= loadout + + if(istext(loadout)) + loadout = _text2num(loadout) + special_save_loadout["unusual"] += loadout + alt_job_titles = save_data["alt_job_titles"] loadout_list = sanitize_loadout_list(save_loadout) + special_loadout_list = special_save_loadout if(needs_update >= 0) update_character_monkestation(needs_update, save_data) // needs_update == savefile_version if we need an update (positive integer) @@ -37,6 +46,7 @@ /// Saves the modular customizations of a character on the savefile /datum/preferences/proc/save_character_monkestation(list/save_data) save_data["loadout_list"] = loadout_list + save_data["special_loadout_list"] = special_loadout_list save_data["modular_version"] = MODULAR_SAVEFILE_VERSION_MAX save_data["alt_job_titles"] = alt_job_titles @@ -44,8 +54,10 @@ write_jobxp_preferences() savefile.set_entry("channel_volume", channel_volume) savefile.set_entry("saved_tokens", saved_tokens) + savefile.set_entry("extra_stat_inventory", extra_stat_inventory) if(token_month) savefile.set_entry("token_month", token_month) + savefile.set_entry("lootboxes_owned", lootboxes_owned) /datum/preferences/proc/load_preferences_monkestation() load_jobxp_preferences() @@ -55,5 +67,9 @@ saved_tokens = savefile.get_entry("saved_tokens", saved_tokens) saved_tokens = SANITIZE_LIST(saved_tokens) + extra_stat_inventory = savefile.get_entry("extra_stat_inventory", extra_stat_inventory) + extra_stat_inventory = SANITIZE_LIST(extra_stat_inventory) + token_month = savefile.get_entry("token_month", token_month) + lootboxes_owned = savefile.get_entry("lootboxes_owned", lootboxes_owned) diff --git a/monkestation/code/modules/client/preferences.dm b/monkestation/code/modules/client/preferences.dm index a266c0a24036..3bdc1c40ee18 100644 --- a/monkestation/code/modules/client/preferences.dm +++ b/monkestation/code/modules/client/preferences.dm @@ -1,7 +1,12 @@ /datum/preferences /// Loadout prefs. Assoc list of [typepaths] to [associated list of item info]. var/list/loadout_list - + ///list of specially handled loadout items as array indexes for the extra_stat_inventory + var/list/special_loadout_list = list( + "unusual" = list(), + "single-use" = list(), + "generic" = list(), + ) var/needs_update = TRUE ///list of all items in inventory @@ -30,3 +35,11 @@ var/list/alt_job_titles = list() /// the month we used our last donator token on var/token_month = 0 + /// these are inventory items that require external data to load correctly + var/list/extra_stat_inventory = list( + "unusual" = list(), + "single-use" = list(), + "generic" = list(), + ) + ///amount of lootboxes owned + var/lootboxes_owned = 0 diff --git a/monkestation/code/modules/client/preferences/alt_jobs/titles.dm b/monkestation/code/modules/client/preferences/alt_jobs/titles.dm index 010ffd9a90f7..81ad7e2d9f7d 100644 --- a/monkestation/code/modules/client/preferences/alt_jobs/titles.dm +++ b/monkestation/code/modules/client/preferences/alt_jobs/titles.dm @@ -47,6 +47,16 @@ "Barista", ) +/datum/job/bitrunner + alt_titles = list( + "Bitrunner", + "Bitdomain Technician", + "Data Retrieval Specialist", + "Netdiver", + "Pod Jockey", + "Union Bitrunner", + ) + /datum/job/botanist alt_titles = list( "Botanist", diff --git a/monkestation/code/modules/client/preferences/inventory.dm b/monkestation/code/modules/client/preferences/inventory.dm index 351bd8fd747a..e88372730e55 100644 --- a/monkestation/code/modules/client/preferences/inventory.dm +++ b/monkestation/code/modules/client/preferences/inventory.dm @@ -1,3 +1,5 @@ +#define DONATOR_ROUNDEND_BONUS 25 //25 monkecoin for donators + /datum/preferences/proc/load_inventory(ckey) if(!ckey || !SSdbcore.IsConnected()) return @@ -32,30 +34,42 @@ if(!ckey || !SSdbcore.IsConnected()) return FALSE + //RoundCap Checks if(!max_round_coins && respects_roundcap) to_chat(parent, "You've hit the Monkecoin limit for this shift, please try again next shift.") return + if(respects_roundcap) + if(max_round_coins <= amount) + amount = max_round_coins + max_round_coins -= amount - var/datum/db_query/query_inc_metacoins = SSdbcore.NewQuery("UPDATE [format_table_name("player")] SET metacoins = metacoins + '[amount]' WHERE ckey = '[ckey]'") - query_inc_metacoins.warn_execute() + //Patreon Flat Roundend Bonus + if((parent.patreon?.has_access(2)) && donator_multipler) + amount += DONATOR_ROUNDEND_BONUS + //Twitch Flat Roundend Bonus + if((parent.twitch?.has_access(1)) && donator_multipler) + amount += DONATOR_ROUNDEND_BONUS + + //Donator Multiplier if(amount > 0 && donator_multipler) switch(parent.patreon.access_rank) if(ACCESS_COMMAND_RANK) amount *= 1.5 if(ACCESS_TRAITOR_RANK) - amount *= 1.75 - if(ACCESS_NUKIE_RANK) amount *= 2 + if(ACCESS_NUKIE_RANK) + amount *= 3 - if(respects_roundcap) - if(max_round_coins <= amount) - amount = max_round_coins - max_round_coins -= amount + amount = round(amount, 1) //make sure whole number + metacoins += amount //store the updated metacoins in a variable, but not the actual game-to-game storage mechanism (load_metacoins() pulls from database) - amount = round(amount, 1) - metacoins += amount + //SQL query - updates the metacoins in the database (this is where the storage actually happens) + var/datum/db_query/query_inc_metacoins = SSdbcore.NewQuery("UPDATE [format_table_name("player")] SET metacoins = metacoins + '[amount]' WHERE ckey = '[ckey]'") + query_inc_metacoins.warn_execute() qdel(query_inc_metacoins) + + //Output to chat if(announces) if(reason) to_chat(parent, "[abs(amount)] Monkecoins have been [amount >= 0 ? "deposited to" : "withdrawn from"] your account! Reason: [reason]") diff --git a/monkestation/code/modules/client/preferences/species_features/floran.dm b/monkestation/code/modules/client/preferences/species_features/floran.dm new file mode 100644 index 000000000000..41f85e09b18e --- /dev/null +++ b/monkestation/code/modules/client/preferences/species_features/floran.dm @@ -0,0 +1,16 @@ +/datum/preference/choiced/floran_leaves + savefile_key = "feature_floran_leaves" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_FEATURES + main_feature_name = "Floran Leaves" + should_generate_icons = TRUE + +/datum/preference/choiced/floran_leaves/init_possible_values() + return possible_values_for_sprite_accessory_list_for_body_part( + GLOB.floran_leaves_list, + "floran_leaves", + list("ADJ"), + ) + +/datum/preference/choiced/floran_leaves/apply_to_human(mob/living/carbon/human/target, value) + target.dna.features["floran_leaves"] = value diff --git a/monkestation/code/modules/client/preferences/species_features/simians.dm b/monkestation/code/modules/client/preferences/species_features/simians.dm index 2c131cd44835..a4f27e181827 100644 --- a/monkestation/code/modules/client/preferences/species_features/simians.dm +++ b/monkestation/code/modules/client/preferences/species_features/simians.dm @@ -1,39 +1,14 @@ -/datum/preference/choiced/fur_color +/datum/preference/color/fur_color category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "fur" + relevant_species_trait = SPECIES_FUR -/datum/preference/choiced/fur_color/init_possible_values() - return GLOB.fur_tones - -/datum/preference/choiced/fur_color/compile_constant_data() - var/list/data = ..() - - data[CHOICED_PREFERENCE_DISPLAY_NAMES] = GLOB.fur_tone_names - - var/list/to_hex = list() - for (var/choice in get_choices()) - var/list/hsl = rgb2num("#[choice]", COLORSPACE_HSL) - - to_hex[choice] = list( - "lightness" = hsl[3], - "value" = "#[choice]", - ) - - data["to_hex"] = to_hex - - return data - -/datum/preference/choiced/fur_color/apply_to_human(mob/living/carbon/human/target, value) - if(target.dna.species.use_fur) - target.skin_tone = value - -/datum/preference/choiced/fur_color/is_accessible(datum/preferences/preferences) - if (!..(preferences)) - return FALSE - - var/datum/species/species_type = preferences.read_preference(/datum/preference/choiced/species) - return initial(species_type.use_fur) +/datum/preference/color/fur_color/apply_to_human(mob/living/carbon/human/target, value) + var/mob/user = usr + var/datum/species/species_type = user?.client.prefs.read_preference(/datum/preference/choiced/species) + if(initial(species_type.uses_fur)) + target.dna.features["mcolor"] = value /datum/preference/choiced/simian_tail savefile_key = "feature_tail_monkey" diff --git a/monkestation/code/modules/clothing/head/costume.dm b/monkestation/code/modules/clothing/head/costume.dm index 2f045c3ffae1..74bc8674fbea 100644 --- a/monkestation/code/modules/clothing/head/costume.dm +++ b/monkestation/code/modules/clothing/head/costume.dm @@ -15,10 +15,33 @@ flags_inv = HIDEHAIR worn_y_offset = 2 +/obj/item/clothing/head/lizard + name = "novelty lizard head" + desc = "A giant sculpted foam lizard head. It doesn't quite look like the lizards from this sector..." + icon = 'monkestation/icons/obj/clothing/hats.dmi' + worn_icon = 'monkestation/icons/mob/clothing/head.dmi' + icon_state = "lizardhead" + flags_inv = HIDEHAIR + worn_y_offset = 1 + +/obj/item/clothing/head/wonka + name = "wonky hat" + desc = "Come with me, and you'll be, in a world of OSHA violations!" + icon = 'monkestation/icons/obj/clothing/hats.dmi' + worn_icon = 'monkestation/icons/mob/clothing/head.dmi' + icon_state = "wonka" + /obj/item/clothing/head/knowingclown name = "Small but Knowing Clown hat" desc = "The Cap of a Small but All Knowing Clown" icon = 'monkestation/icons/obj/clothing/hats.dmi' worn_icon = 'monkestation/icons/mob/clothing/head.dmi' icon_state = "knowingclownhat" - worn_y_offset = 6 \ No newline at end of file + worn_y_offset = 6 + +/obj/item/clothing/head/guardmanhelmet + name = "guardman's helmet" + desc = "Keeps your brain intact when fighting heretics" + icon = 'monkestation/icons/obj/clothing/hats.dmi' + worn_icon = 'monkestation/icons/mob/clothing/head.dmi' + icon_state = "guardman_helmet" \ No newline at end of file diff --git a/monkestation/code/modules/clothing/masks/gasmask.dm b/monkestation/code/modules/clothing/masks/gasmask.dm new file mode 100644 index 000000000000..651ffb2d6454 --- /dev/null +++ b/monkestation/code/modules/clothing/masks/gasmask.dm @@ -0,0 +1,7 @@ +/obj/item/clothing/mask/gas/clown_hat/yellow + name = "yellow clown wig and mask" + desc = "A true prankster's facial attire. But yellow! A clown is incomplete without his wig and mask." + icon = 'monkestation/icons/obj/clothing/masks.dmi' + icon_state = "clown_yellow" + worn_icon = 'monkestation/icons/mob/clothing/mask.dmi' + worn_icon_state = "clown_yellow" diff --git a/monkestation/code/modules/clothing/neck/cloaks.dm b/monkestation/code/modules/clothing/neck/cloaks.dm index e6192b163ca0..f72585adf4af 100644 --- a/monkestation/code/modules/clothing/neck/cloaks.dm +++ b/monkestation/code/modules/clothing/neck/cloaks.dm @@ -41,3 +41,19 @@ worn_icon = 'monkestation/icons/mob/clothing/neck.dmi' icon_state = "beecloak" worn_icon_state = "beecloak" + +/obj/item/clothing/neck/ascot + name = "Ascot" + desc = "A fancy scarf to keep your neck warm and ward off sharp objects" + icon = 'monkestation/icons/obj/clothing/necks.dmi' + worn_icon = 'monkestation/icons/mob/clothing/neck.dmi' + icon_state = "ascot" + worn_icon_state = "ascot" + +/obj/item/clothing/neck/worldchampioncape + name = "World Champion's Cape" + desc = "I'll give him one last chance to back out. He might think he's a champ, but he's just a chump!." + icon = 'monkestation/icons/obj/clothing/necks.dmi' + worn_icon = 'monkestation/icons/mob/clothing/neck.dmi' + icon_state = "worldchampion_cape" + worn_icon_state = "worldchampion_cape" \ No newline at end of file diff --git a/monkestation/code/modules/clothing/shoes/clown.dm b/monkestation/code/modules/clothing/shoes/clown.dm new file mode 100644 index 000000000000..e9a2f8582632 --- /dev/null +++ b/monkestation/code/modules/clothing/shoes/clown.dm @@ -0,0 +1,7 @@ +/obj/item/clothing/shoes/clown_shoes/yellow + desc = "The prankster's standard-issue clowning shoes. But Yellow! Ctrl-click to toggle waddle dampeners." + name = "yellow clown shoes" + icon = 'monkestation/icons/obj/clothing/shoes.dmi' + icon_state = "clown_yellow" + worn_icon = 'monkestation/icons/mob/clothing/feet.dmi' + worn_icon_state = "clown_yellow" diff --git a/monkestation/code/modules/clothing/spacesuits/hardsuits/_hardsuit.dm b/monkestation/code/modules/clothing/spacesuits/hardsuits/_hardsuit.dm index 719f959446f1..4d8352baab4c 100644 --- a/monkestation/code/modules/clothing/spacesuits/hardsuits/_hardsuit.dm +++ b/monkestation/code/modules/clothing/spacesuits/hardsuits/_hardsuit.dm @@ -13,7 +13,6 @@ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser) siemens_coefficient = 0 actions_types = list(/datum/action/item_action/toggle_helmet) - supports_variations_flags = NONE var/obj/item/clothing/head/helmet/space/hardsuit/helmet var/helmettype = /obj/item/clothing/head/helmet/space/hardsuit diff --git a/monkestation/code/modules/clothing/suits/coats.dm b/monkestation/code/modules/clothing/suits/coats.dm index 32bbb248acfb..5b5eaef23c23 100644 --- a/monkestation/code/modules/clothing/suits/coats.dm +++ b/monkestation/code/modules/clothing/suits/coats.dm @@ -96,6 +96,14 @@ 'monkestation/sound/voice/screams/misc/HL1 Scientist/scream_sci1.ogg', 'monkestation/sound/voice/screams/misc/HL1 Scientist/scream_sci2.ogg') +/obj/item/clothing/suit/armor/guardmanvest + name = "guardman's vest" + desc = "It keeps your guts intact, thats really all that matters" + icon = 'monkestation/icons/obj/clothing/suits.dmi' + worn_icon = 'monkestation/icons/mob/clothing/suit.dmi' + icon_state = "guardman_vest" + + //Only basic and scientist labcoats get to STAPH /obj/item/clothing/suit/toggle/labcoat/cmo @@ -181,4 +189,4 @@ /obj/item/clothing/suit/armor/secduster/science name = "science security duster" icon_state = "cowboy_sec_science" - masktype = /obj/item/clothing/mask/breath/sec_bandana/science + masktype = /obj/item/clothing/mask/breath/sec_bandana/science \ No newline at end of file diff --git a/monkestation/code/modules/clothing/suits/costume.dm b/monkestation/code/modules/clothing/suits/costume.dm new file mode 100644 index 000000000000..d6367480d871 --- /dev/null +++ b/monkestation/code/modules/clothing/suits/costume.dm @@ -0,0 +1,34 @@ +/obj/item/clothing/suit/hooded/dinojammies + name = "dinosaur pajamas" + desc = "The ultimate in reptile-pajama-costume fusion." + icon = 'monkestation/icons/obj/clothing/suits.dmi' + worn_icon = 'monkestation/icons/mob/clothing/suit.dmi' + icon_state = "dinojammies" + worn_icon_state = "dinojammies" + hoodtype = /obj/item/clothing/head/hooded/dinojammies + +/obj/item/clothing/head/hooded/dinojammies + desc = "A dinosaur head hood." + icon = 'monkestation/icons/obj/clothing/hats.dmi' + worn_icon = 'monkestation/icons/mob/clothing/head.dmi' + icon_state = "dinojammies_hood" + worn_icon_state = "dinojammies_hood" + flags_inv = HIDEHAIR + +/obj/item/clothing/suit/hooded/gorilla + name = "gorilla costume" + desc = "Ooga!" + icon = 'monkestation/icons/obj/clothing/suits.dmi' + worn_icon = 'monkestation/icons/mob/clothing/suit.dmi' + icon_state = "gorilla" + worn_icon_state = "gorilla" + hoodtype = /obj/item/clothing/head/hooded/gorilla + alternative_screams = list('sound/creatures/gorilla.ogg') + +/obj/item/clothing/head/hooded/gorilla + desc = "A gorilla costume hood." + icon = 'monkestation/icons/obj/clothing/hats.dmi' + worn_icon = 'monkestation/icons/mob/clothing/head.dmi' + icon_state = "gorilla" + worn_icon_state = "gorilla" + flags_inv = HIDEHAIR|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT diff --git a/monkestation/code/modules/clothing/under/costume.dm b/monkestation/code/modules/clothing/under/costume.dm index 971bf62384bb..f67ab36b5b9a 100644 --- a/monkestation/code/modules/clothing/under/costume.dm +++ b/monkestation/code/modules/clothing/under/costume.dm @@ -38,6 +38,14 @@ icon_state = "decking_jumpsuit" can_adjust = FALSE +/obj/item/clothing/under/costume/worldchampiongi + name = "World Champion Gi" + desc = "Only the strongest wears this Gi, everyone else are just using tricks." + icon = 'monkestation/icons/obj/clothing/uniforms.dmi' + worn_icon = 'monkestation/icons/mob/clothing/uniform.dmi' + icon_state = "worldchampion_gi" + can_adjust = FALSE + /obj/item/clothing/under/costume/tragic name = "tragic mime suit" desc = "A skin-tight black suit for theatre actors. You feel the need to remind a doctor to eat food and sleep." diff --git a/monkestation/code/modules/clothing/under/undersuit.dm b/monkestation/code/modules/clothing/under/undersuit.dm index cb4304d6856d..9cc681910a3f 100644 --- a/monkestation/code/modules/clothing/under/undersuit.dm +++ b/monkestation/code/modules/clothing/under/undersuit.dm @@ -67,3 +67,18 @@ /obj/item/clothing/under/rank/civilian/janitor/maid //heckin subtypes icon = 'icons/obj/clothing/under/civilian.dmi' worn_icon = 'icons/mob/clothing/under/civilian.dmi' + +/obj/item/clothing/under/wonka + name = "wonky suit" + desc = "Come with me, and you'll be, in a world of OSHA violations!" + icon = 'monkestation/icons/obj/clothing/uniforms.dmi' + icon_state = "wonka" + worn_icon = 'monkestation/icons/mob/clothing/uniform.dmi' + worn_icon_state = "wonka" + +/obj/item/clothing/under/guardmanuniform + name = "guardman's uniform" + desc = "The red color is meant to hide either your blood or the xeno's blood, do xenos even have red blood?" + icon = 'monkestation/icons/obj/clothing/uniforms.dmi' + icon_state = "guardman_uniform" + worn_icon = 'monkestation/icons/mob/clothing/uniform.dmi' \ No newline at end of file diff --git a/monkestation/code/modules/donator/code/datum/loadout.dm b/monkestation/code/modules/donator/code/datum/loadout.dm index 0622a8c615fa..b784fca20318 100644 --- a/monkestation/code/modules/donator/code/datum/loadout.dm +++ b/monkestation/code/modules/donator/code/datum/loadout.dm @@ -19,8 +19,13 @@ requires_purchase = FALSE ckeywhitelist = list("bidlink2") -//ttnt +/datum/loadout_item/effects/cirno + ckeywhitelist = list("bidlink2") + name = "Cirno Transformation" + item_path = /obj/item/effect_granter/donator/cirno + requires_purchase = FALSE +//ttnt /datum/loadout_item/head/pot name = "Dented Pot" item_path = /obj/item/clothing/head/costume/pot @@ -30,7 +35,25 @@ item_path = /obj/item/choice_beacon/pet/donator/spycrab donator_only = TRUE requires_purchase = FALSE - ckeywhitelist = list("unknown") + ckeywhitelist = list("TTNT789") + +/datum/loadout_item/effects/spycrab + ckeywhitelist = list("TTNT789") + name = "Spycrab Transformation" + item_path = /obj/item/effect_granter/donator/spycrab + requires_purchase = FALSE + +/datum/loadout_item/mask/krieg + name = "Krieg's Mask" + item_path = /obj/item/clothing/mask/krieg + donator_only = TRUE + requires_purchase = FALSE + +/datum/loadout_item/under/miscellaneous/krieg + name = "Krieg's attire" + item_path = /obj/item/clothing/under/costume/krieg + donator_only = TRUE + requires_purchase = FALSE //spinnermaster @@ -41,12 +64,25 @@ requires_purchase = FALSE ckeywhitelist = list("spinnermaster") +/datum/loadout_item/effects/void_mothroach + ckeywhitelist = list("spinnermaster") + name = "Void Mothroach Transformation" + item_path = /obj/item/effect_granter/donator/void_mothroach + requires_purchase = FALSE + + /datum/loadout_item/suit/shark_costume name = "Blahaj Costume" item_path = /obj/item/clothing/suit/hooded/shark_costume donator_only = TRUE requires_purchase = FALSE +/datum/loadout_item/toys/hotdog_plush + name = "Hotdog Plush" + item_path = /obj/item/toy/plush/hotdog + donator_only = TRUE + requires_purchase = FALSE + //ruby_flamewing /datum/loadout_item/pocket_items/donator/blahaj @@ -56,12 +92,18 @@ requires_purchase = FALSE ckeywhitelist = list("ruby_flamewing") -/datum/loadout_item/under/syndie_pajamas +/datum/loadout_item/under/miscellaneous/syndie_pajamas name = "Syndicate Pajamas" item_path = /obj/item/clothing/under/costume/syndie_pajamas donator_only = TRUE requires_purchase = FALSE +/datum/loadout_item/effects/blahaj + ckeywhitelist = list("ruby_flamewing") + name = "Blahaj Transformation" + item_path = /obj/item/effect_granter/donator/blahaj + requires_purchase = FALSE + //happiestplane /datum/loadout_item/mask/zoro name = "Zoro Mask" @@ -70,7 +112,7 @@ requires_purchase = FALSE -/datum/loadout_item/under/navy_uniform +/datum/loadout_item/under/miscellaneous/navy_uniform name = "Naval Officer Uniform" item_path = /obj/item/clothing/under/costume/navy_uniform_gold donator_only = TRUE @@ -83,18 +125,32 @@ donator_only = TRUE requires_purchase = FALSE -/datum/loadout_item/head/cirno +/datum/loadout_item/head/dark_hos name = "Dark HoS Hat" item_path = /obj/item/clothing/head/costume/dark_hos donator_only = TRUE requires_purchase = FALSE /datum/loadout_item/toys/seam_plush - name = "Puck Plush" + name = "Seam Plush" item_path = /obj/item/toy/plush/seam donator_only = TRUE requires_purchase = FALSE +/datum/loadout_item/pocket_items/donator/germanshepherd + name = "Pet Delivery Beacon - German Shepherd" + item_path = /obj/item/choice_beacon/pet/donator/germanshepherd + donator_only = TRUE + requires_purchase = FALSE + ckeywhitelist = list("mjolnir2") + + +/datum/loadout_item/effects/germanshepherd + ckeywhitelist = list("mjolnir2") + name = "German Shepherd Transformation" + item_path = /obj/item/effect_granter/donator/germanshepherd + requires_purchase = FALSE + //sammi /datum/loadout_item/toys/puck_plush name = "Puck Plush" @@ -118,3 +174,75 @@ item_path = /obj/item/toy/plush/spider donator_only = TRUE requires_purchase = FALSE + +/datum/loadout_item/pocket_items/donator/spider + name = "Pet Delivery Beacon - Dancing Spider" + item_path = /obj/item/choice_beacon/pet/donator/spider + donator_only = TRUE + requires_purchase = FALSE + ckeywhitelist = list("Random516") + +/datum/loadout_item/neck/whitebeard + name = "Whitebeard's cloak" + item_path = /obj/item/clothing/neck/whitebeard + donator_only = TRUE + requires_purchase = FALSE + +/datum/loadout_item/under/miscellaneous/whitebeard + name = "Whitebeard's attire" + item_path = /obj/item/clothing/under/costume/whitebeard + donator_only = TRUE + requires_purchase = FALSE + +/datum/loadout_item/effects/spider + ckeywhitelist = list("Random516") + name = "Spider Transformation" + item_path = /obj/item/effect_granter/donator/spider + requires_purchase = FALSE + +//senri +/datum/loadout_item/pocket_items/donator/slime + name = "Pet Delivery Beacon - Slime" + item_path = /obj/item/choice_beacon/pet/donator/slime + donator_only = TRUE + requires_purchase = FALSE + ckeywhitelist = list("Senri08") + +/datum/loadout_item/suit/beegirl + name = "Bee's Outfit" + item_path = /obj/item/clothing/suit/costume/beegirl + donator_only = TRUE + requires_purchase = FALSE + +/datum/loadout_item/toys/puppycat + name = "Puppycat Plush" + item_path = /obj/item/toy/plush/puppycat + donator_only = TRUE + requires_purchase = FALSE + +/datum/loadout_item/effects/slime + ckeywhitelist = list("Senri08") + name = "Slime Transformation" + item_path = /obj/item/effect_granter/donator/slime + requires_purchase = FALSE + +//odie +/datum/loadout_item/head/space_marine + name = "Space Marine Helmet" + item_path = /obj/item/clothing/head/costume/space_marine + donator_only = TRUE + requires_purchase = FALSE + +//rickdude +/datum/loadout_item/suit/aotcloak + name = "Survey Corps Cloak" + item_path = /obj/item/clothing/suit/hooded/aotcloak + donator_only = TRUE + requires_purchase = FALSE + +//kon chieko +/datum/loadout_item/head/bells + name = "Hair ribbons with bells" + item_path = /obj/item/clothing/head/costume/bells + donator_only = TRUE + requires_purchase = FALSE diff --git a/monkestation/code/modules/donator/code/item/choice_beacon.dm b/monkestation/code/modules/donator/code/item/choice_beacon.dm index 2cb436d538f2..30a159738eaf 100644 --- a/monkestation/code/modules/donator/code/item/choice_beacon.dm +++ b/monkestation/code/modules/donator/code/item/choice_beacon.dm @@ -32,14 +32,7 @@ /obj/item/choice_beacon/pet/donator/void_mothroach name = "Secret Beacon of the Stars" default_name = "Moffles" - company_source = "*UNINTELLIGBLE BUZZING*" - company_message = "*LOUD MOFF NOISES*" - donator_pet = /mob/living/basic/mothroach/void - -/obj/item/choice_beacon/pet/donator/void_mothroach - name = "Secret Beacon of the Stars" - default_name = "Moffles" - company_source = "*UNINTELLIGBLE BUZZING*" + company_source = "*UNINTELLIGIBLE BUZZING*" company_message = "*LOUD MOFF NOISES*" donator_pet = /mob/living/basic/mothroach/void @@ -48,11 +41,28 @@ default_name = "Blahaj" company_source = "IKEA" company_message = "Please enjoy your new pet -- some assembly required." - donator_pet = /mob/living/basic/lizard/blahaj + donator_pet = /mob/living/basic/pet/blahaj /obj/item/choice_beacon/pet/donator/cirno name = "Cirno" default_name = "Cirno?" company_source = "Touhou" company_message = "Please handle with care!" - donator_pet = /mob/living/basic/lizard/cirno + donator_pet = /mob/living/basic/pet/cirno + +/obj/item/choice_beacon/pet/donator/slime + name = "Slime" + default_name = "Slime" + company_source = "*blorbling*" + donator_pet = /mob/living/basic/pet/slime/talkative + +/obj/item/choice_beacon/pet/donator/spider + name = "Spider" + default_name = "Spider" + donator_pet = /mob/living/basic/pet/spider/dancing + +/obj/item/choice_beacon/pet/donator/germanshepherd + name = "German Shepherd" + default_name = "German Shepherd" + donator_pet = /mob/living/basic/pet/dog/germanshepherd + diff --git a/monkestation/code/modules/donator/code/item/clothing.dm b/monkestation/code/modules/donator/code/item/clothing.dm index 78afaab3b3c5..0836ba7c8f56 100644 --- a/monkestation/code/modules/donator/code/item/clothing.dm +++ b/monkestation/code/modules/donator/code/item/clothing.dm @@ -84,6 +84,7 @@ icon_state = "dark_hos" inhand_icon_state = null body_parts_covered = CHEST|ARMS + /obj/item/clothing/head/costume/dark_hos name = "\improper Dark Head of Security Cap" desc = "Slip this on and you're gonna be cutting people with that edge." @@ -100,3 +101,107 @@ icon_state = "lemon_bandolier" body_parts_covered = CHEST inhand_icon_state = null + +/obj/item/clothing/under/costume/whitebeard + name = "\improper Whitebeard's Attire" + desc = "The garb of a world renowned pirate." + icon = 'monkestation/code/modules/donator/icons/obj/clothing.dmi' + worn_icon = 'monkestation/code/modules/donator/icons/mob/clothing.dmi' + icon_state = "wbunder" + worn_icon_state = "wbunder" + inhand_icon_state = null + body_parts_covered = LEGS + +/obj/item/clothing/neck/whitebeard + name = "Whitebeard's Jacket" + desc = "The jacket of a world renowned pirate." + icon = 'monkestation/code/modules/donator/icons/obj/clothing.dmi' + worn_icon = 'monkestation/code/modules/donator/icons/mob/clothing.dmi' + icon_state = "wbcloak" + worn_icon_state = "wbcloak" + +/obj/item/clothing/suit/costume/beegirl + name = "Bee's Costume" + icon = 'monkestation/code/modules/donator/icons/obj/clothing.dmi' + worn_icon = 'monkestation/code/modules/donator/icons/mob/clothing.dmi' + icon_state = "beegirl" + body_parts_covered = CHEST|ARMS + inhand_icon_state = null + + +/obj/item/clothing/head/costume/space_marine + name = "Space Marine Helmet" + desc = "A replica helmet of a Space Marine. Can be used as a gas mask, but cannot utilize filters." + icon = 'monkestation/code/modules/donator/icons/obj/clothing.dmi' + worn_icon = 'monkestation/code/modules/donator/icons/mob/clothing.dmi' + icon_state = "space_marine" + inhand_icon_state = null + clothing_flags = BLOCK_GAS_SMOKE_EFFECT | HEADINTERNALS + flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT|HIDEHAIR + w_class = WEIGHT_CLASS_NORMAL + armor_type = /datum/armor/mask_gas + flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH | PEPPERPROOF + +/obj/item/clothing/under/costume/krieg + name = "\improper Krieg's Attire" + desc = "The garb of a malicious psycho from the Pandora sector." + icon = 'monkestation/code/modules/donator/icons/obj/clothing.dmi' + worn_icon = 'monkestation/code/modules/donator/icons/mob/clothing.dmi' + icon_state = "kriegunder" + worn_icon_state = "kriegunder" + inhand_icon_state = null + body_parts_covered = LEGS|ARMS + +/obj/item/clothing/mask/krieg + name = "\improper Krieg's Mask" + desc = "The mask of a malicious psycho from the Pandora sector." + icon = 'monkestation/code/modules/donator/icons/obj/clothing.dmi' + worn_icon = 'monkestation/code/modules/donator/icons/mob/clothing.dmi' + icon_state = "kriegmask" + inhand_icon_state = null + flags_inv = HIDEFACE + +/obj/item/clothing/suit/hooded/aotcloak + name = "survey corps cloak" + desc = "A lightweight but durable cloak with an emblem emblazoned on the back." + icon = 'monkestation/code/modules/donator/icons/obj/clothing.dmi' + worn_icon = 'monkestation/code/modules/donator/icons/mob/clothing.dmi' + icon_state = "aotcloak" + body_parts_covered = CHEST|ARMS + cold_protection = CHEST|ARMS + allowed = list() + armor_type = /datum/armor/hooded_wintercoat + hoodtype = /obj/item/clothing/head/hooded/aotcloak + layer = NECK_LAYER + +/obj/item/clothing/suit/hooded/aotcloak/Initialize(mapload) + . = ..() + allowed += list( + /obj/item/flashlight, + /obj/item/lighter, + /obj/item/modular_computer/pda, + /obj/item/radio, + /obj/item/storage/bag/books, + /obj/item/storage/fancy/cigarettes, + /obj/item/tank/internals/emergency_oxygen, + /obj/item/tank/internals/plasmaman, + /obj/item/toy, + ) + +/obj/item/clothing/head/hooded/aotcloak + name = "survey corps cloak hood" + desc = "A cozy winter hood attached to a heavy winter jacket." + icon = 'monkestation/code/modules/donator/icons/obj/clothing.dmi' + worn_icon = 'monkestation/code/modules/donator/icons/mob/clothing.dmi' + icon_state = "aotcloak_hood" + body_parts_covered = HEAD + cold_protection = HEAD + flags_inv = HIDEHAIR|HIDEEARS + armor_type = /datum/armor/hooded_winterhood + +/obj/item/clothing/head/costume/bells + name = "Hair ribbons with bells" + desc = "A cute hair accessory adorned with red ribbons and small bells." + icon = 'monkestation/code/modules/donator/icons/obj/clothing.dmi' + worn_icon = 'monkestation/code/modules/donator/icons/mob/clothing.dmi' + icon_state = "bells" diff --git a/monkestation/code/modules/donator/code/item/effects.dm b/monkestation/code/modules/donator/code/item/effects.dm new file mode 100644 index 000000000000..f6912f12edf8 --- /dev/null +++ b/monkestation/code/modules/donator/code/item/effects.dm @@ -0,0 +1,59 @@ +/obj/item/effect_granter/donator + name = "Donator Transformation" + icon = 'monkestation/code/modules/donator/icons/mob/pets.dmi' + icon_state = "void_mothroach" + var/mob/living/basic/animal_transformation = null + +/obj/item/effect_granter/donator/grant_effect(mob/living/carbon/granter) + var/mob/living/basic/animal = src.animal_transformation + animal = new animal(granter.loc) + animal.mind_initialize() + var/datum/mind/granters_mind = granter.mind + granters_mind.transfer_to(animal) + animal.adjust_hand_count(2) + qdel(granter) + . = ..() + +//Senri08 +/obj/item/effect_granter/donator/slime + name = "Slime transformation" + icon_state = "slime" + animal_transformation = /mob/living/basic/pet/slime/talkative + +//Random +/obj/item/effect_granter/donator/spider + name = "Spider transformation" + icon_state = "spider" + animal_transformation = /mob/living/basic/pet/spider/dancing + +//mjolnir +/obj/item/effect_granter/donator/germanshepherd + name = "German Shepherd transformation" + icon_state = "germanshepherd" + animal_transformation = /mob/living/basic/pet/dog/germanshepherd + +//bidlink2 +/obj/item/effect_granter/donator/cirno + name = "Cirno transformation" + icon = 'monkestation/icons/obj/plushes.dmi' + icon_state = "cirno-happy" + animal_transformation = /mob/living/basic/pet/cirno + +//Random +/obj/item/effect_granter/donator/void_mothroach + name = "Mothroach transformation" + icon_state = "void_mothroach" + animal_transformation = /mob/living/basic/mothroach/void + + +//ruby +/obj/item/effect_granter/donator/blahaj + name = "Blahaj transformation" + icon_state = "blahaj" + animal_transformation = /mob/living/basic/pet/blahaj + +//ttnt +/obj/item/effect_granter/donator/spycrab + name = "Spycrab transformation" + icon_state = "crab_red" + animal_transformation = /mob/living/basic/crab/spycrab diff --git a/monkestation/code/modules/donator/code/item/plush.dm b/monkestation/code/modules/donator/code/item/plush.dm index 566c2062c1bc..20ac7dd4b2c7 100644 --- a/monkestation/code/modules/donator/code/item/plush.dm +++ b/monkestation/code/modules/donator/code/item/plush.dm @@ -37,3 +37,15 @@ icon = 'monkestation/code/modules/donator/icons/obj/plushes.dmi' squeak_override = list('goon/sounds/babynoise.ogg'=1) icon_state = "spider" + +/obj/item/toy/plush/puppycat + name = "puppycat plush" + desc = "A plush of Puppycat. ~Handcrafted lovingly for Senri." + icon = 'monkestation/code/modules/donator/icons/obj/plushes.dmi' + icon_state = "puppycat" + +/obj/item/toy/plush/hotdog + name = "hotdog plush" + desc = "A plush of a hotdog. ~Handcrafted lovingly for Spinnermaster." + icon = 'monkestation/code/modules/donator/icons/obj/plushes.dmi' + icon_state = "hotdog" diff --git a/monkestation/code/modules/donator/code/mob/pets.dm b/monkestation/code/modules/donator/code/mob/pets.dm index 1e673bbfc3a7..7258a23342b5 100644 --- a/monkestation/code/modules/donator/code/mob/pets.dm +++ b/monkestation/code/modules/donator/code/mob/pets.dm @@ -24,10 +24,11 @@ . = ..() var/random_icon = pick("crab_red","crab_blue") icon_state = random_icon + icon_living = random_icon icon_dead = "[random_icon]_dead" gold_core_spawnable = NO_SPAWN -/mob/living/basic/lizard/blahaj +/mob/living/basic/pet/blahaj name = "\improper Blåhaj" desc = "The blue shark can swim very far, dive really deep and hear noises from almost 250 meters away." icon = 'monkestation/code/modules/donator/icons/mob/pets.dmi' @@ -36,21 +37,78 @@ icon_dead = "blahaj_dead" icon_gib = null gold_core_spawnable = NO_SPAWN + ai_controller = /datum/ai_controller/basic_controller/ -/mob/living/basic/lizard/cirno //nobody needs to know she's a lizard +/mob/living/basic/pet/cirno //nobody needs to know she's a lizard name = "Cirno" desc = "She is the greatest." icon = 'monkestation/icons/obj/plushes.dmi' icon_state = "cirno-happy" icon_living = "cirno-happy" - icon_dead = "" + icon_dead = "cirno-happy" icon_gib = null gold_core_spawnable = NO_SPAWN + ai_controller = /datum/ai_controller/basic_controller/ + basic_mob_flags = FLIP_ON_DEATH /mob/living/basic/lizard/snake name = "Three Headed Snake" desc = "This little fella looks familiar..." icon = 'monkestation/code/modules/donator/icons/mob/pets.dmi' icon_state = "triple_snake" - icon_dead = "" + icon_living = "triple_snake" gold_core_spawnable = NO_SPAWN + +/mob/living/basic/pet/dog/germanshepherd + name = "German Shepherd" + desc = "He's so cool, he's got sunglasses!!" + icon = 'monkestation/code/modules/donator/icons/mob/pets.dmi' + icon_state = "germanshepherd" + icon_living = "germanshepherd" + icon_dead = "germanshepherd_dead" + icon_gib = null + can_be_held = FALSE // as funny as this would be, a german shepherd is way too big to carry with one hand + gold_core_spawnable = NO_SPAWN + +/mob/living/basic/pet/slime/talkative + name = "Extroverted Slime" + desc = "He's got a lot to say!" + icon = 'monkestation/code/modules/donator/icons/mob/pets.dmi' + icon_state = "slime" + icon_living = "slime" + icon_dead = "slime_dead" + gold_core_spawnable = NO_SPAWN + initial_language_holder = /datum/language_holder/slime + ai_controller = /datum/ai_controller/basic_controller/ + var/quips = list("Your fingers taste like Donk Pockets, get out more.", + "I've seen salad that dresses better than you.", + "I smell smoke, are you thinking too hard again?", + "This one's gene pool needs more chlorine...", + "I expected nothing and yet I'm still disappointed.", + "Why is this walking participation trophy touching me?", + "If I throw a stick, will you leave?",) + var/positive_quips = list("Hey there, slime pal!", + "Aw thanks buddy!",) + +/mob/living/basic/pet/slime/talkative/attack_hand(mob/living/carbon/human/user, list/modifiers) + . = ..() + if(user == src || src.stat != CONSCIOUS || (user.istate & ISTATE_HARM) || LAZYACCESS(modifiers, RIGHT_CLICK)) + return + + new /obj/effect/temp_visual/heart(src.loc) + if(prob(33)) + if(isslimeperson(user) || isoozeling(user)) + src.say(pick(positive_quips)) + else + src.say(pick(quips)) + + +/mob/living/basic/pet/spider/dancing + name = "Dancin' Spider" + desc = "Look at him go!" + icon = 'monkestation/code/modules/donator/icons/mob/pets.dmi' + icon_state = "spider" + icon_living = "spider" + icon_dead = "spider_dead" + gold_core_spawnable = NO_SPAWN + ai_controller = /datum/ai_controller/basic_controller/ diff --git a/monkestation/code/modules/donator/icons/mob/clothing.dmi b/monkestation/code/modules/donator/icons/mob/clothing.dmi index 690bc5cc1595..e37c921b7faf 100644 Binary files a/monkestation/code/modules/donator/icons/mob/clothing.dmi and b/monkestation/code/modules/donator/icons/mob/clothing.dmi differ diff --git a/monkestation/code/modules/donator/icons/mob/pets.dmi b/monkestation/code/modules/donator/icons/mob/pets.dmi index 68659aa72bb5..e564da2b2688 100644 Binary files a/monkestation/code/modules/donator/icons/mob/pets.dmi and b/monkestation/code/modules/donator/icons/mob/pets.dmi differ diff --git a/monkestation/code/modules/donator/icons/obj/clothing.dmi b/monkestation/code/modules/donator/icons/obj/clothing.dmi index ec835c12a509..5eefacb51ea5 100644 Binary files a/monkestation/code/modules/donator/icons/obj/clothing.dmi and b/monkestation/code/modules/donator/icons/obj/clothing.dmi differ diff --git a/monkestation/code/modules/donator/icons/obj/plushes.dmi b/monkestation/code/modules/donator/icons/obj/plushes.dmi index 19920cb71405..423b5af4c6c2 100644 Binary files a/monkestation/code/modules/donator/icons/obj/plushes.dmi and b/monkestation/code/modules/donator/icons/obj/plushes.dmi differ diff --git a/monkestation/code/modules/food_and_drinks/recipes/boiling.dm b/monkestation/code/modules/food_and_drinks/recipes/boiling.dm index fc9a1d6035bd..29f0ac91f126 100644 --- a/monkestation/code/modules/food_and_drinks/recipes/boiling.dm +++ b/monkestation/code/modules/food_and_drinks/recipes/boiling.dm @@ -4,3 +4,4 @@ outputted_ingredients = list(/obj/item/food/spaghetti/boiledspaghetti = 1) results = list(/datum/reagent/water = 5) max_outputs = 10 + Nonsouprecipe = TRUE diff --git a/monkestation/code/modules/ghost_players/area_changes.dm b/monkestation/code/modules/ghost_players/area_changes.dm index ec88ec02448b..cd4be4ef0685 100644 --- a/monkestation/code/modules/ghost_players/area_changes.dm +++ b/monkestation/code/modules/ghost_players/area_changes.dm @@ -11,9 +11,63 @@ name = "Centcom Ghost Spawn" area_flags = UNIQUE_AREA | NOTELEPORT | GHOST_AREA | PASSIVE_AREA | NO_EXPLOSIONS_DURING + +/area/centcom/central_command_areas/supply + area_flags = UNIQUE_AREA | NOTELEPORT | NO_EXPLOSIONS_DURING + +/area/centcom/central_command_areas/pre_shuttle + name = "Centcomm Pre Shuttle" + area_flags = UNIQUE_AREA | NOTELEPORT | NO_EXPLOSIONS_DURING + +/area/centcom/central_command_areas/supply + area_flags = UNIQUE_AREA | NOTELEPORT | GHOST_AREA | PASSIVE_AREA | NO_EXPLOSIONS_DURING | NO_GHOSTS_DURING_ROUND +/area/centcom/central_command_areas/borbop + name = "Borbop's Bar" + area_flags = UNIQUE_AREA | NOTELEPORT | GHOST_AREA | PASSIVE_AREA | NO_EXPLOSIONS_DURING + +/area/centcom/central_command_areas/kitchen + name = "Papa's Pizzeria" + area_flags = UNIQUE_AREA | NOTELEPORT | GHOST_AREA | PASSIVE_AREA | NO_EXPLOSIONS_DURING + +/area/centcom/central_command_areas/medical + name = "Centcom Medical" + area_flags = UNIQUE_AREA | NOTELEPORT | GHOST_AREA | PASSIVE_AREA | NO_EXPLOSIONS_DURING + +/area/centcom/central_command_areas/botany + name = "Centcom Botany" + area_flags = UNIQUE_AREA | NOTELEPORT | GHOST_AREA | NO_EXPLOSIONS_DURING + +/area/centcom/central_command_areas/hall + name = "Centcom Hall" + area_flags = UNIQUE_AREA | NOTELEPORT | GHOST_AREA | PASSIVE_AREA | NO_EXPLOSIONS_DURING + +/area/centcom/central_command_areas/admin_hangout + name = "Admin Hangout" + area_flags = UNIQUE_AREA | NOTELEPORT | GHOST_AREA | PASSIVE_AREA | NO_EXPLOSIONS_DURING | NO_GHOSTS_DURING_ROUND + +/area/centcom/central_command_areas/ghost_blocker + name = "During Round Ghost Blocker" + area_flags = NOTELEPORT | GHOST_AREA | PASSIVE_AREA | NO_EXPLOSIONS_DURING | NO_GHOSTS_DURING_ROUND + +/area/centcom/central_command_areas/evacuation + area_flags = NOTELEPORT | GHOST_AREA | NO_EXPLOSIONS_DURING | NO_GHOSTS_DURING_ROUND + +/area/centcom/central_command_areas/admin + area_flags = NOTELEPORT | GHOST_AREA | NO_EXPLOSIONS_DURING | NO_GHOSTS_DURING_ROUND + +/area/centcom/central_command_areas/firing_range + name = "Centcom Firing Range" + area_flags = UNIQUE_AREA | NOTELEPORT | GHOST_AREA | NO_EXPLOSIONS_DURING + +/area/centcom/central_command_areas/firing_range_checkpoint_control + area_flags = UNIQUE_AREA | NOTELEPORT | NO_EXPLOSIONS_DURING + /area/Entered(mob/M) . = ..() if(!(area_flags & GHOST_AREA) && istype(M, /mob/living/carbon/human/ghost)) var/mob/living/carbon/human/ghost/mob = M mob.move_to_ghostspawn() + if((area_flags & NO_GHOSTS_DURING_ROUND) && istype(M, /mob/living/carbon/human/ghost) && SSticker.current_state != GAME_STATE_FINISHED) + var/mob/living/carbon/human/ghost/mob = M + mob.move_to_ghostspawn() diff --git a/monkestation/code/modules/ghost_players/arena/arena_cleanser.dm b/monkestation/code/modules/ghost_players/arena/arena_cleanser.dm index b7749c762cf0..a4f9ff4d0ab8 100644 --- a/monkestation/code/modules/ghost_players/arena/arena_cleanser.dm +++ b/monkestation/code/modules/ghost_players/arena/arena_cleanser.dm @@ -11,7 +11,7 @@ continue qdel(listed_atom) listed_turf.baseturfs = list(/turf/open/indestructible/event/plating) - var/turf/located = locate(161, 44, SSmapping.levels_by_trait(ZTRAIT_CENTCOM)[1]) // this grabs the bottom corner turf + var/turf/located = locate(148, 29, SSmapping.levels_by_trait(ZTRAIT_CENTCOM)[1]) // this grabs the bottom corner turf new /obj/effect/spawner/random_arena_spawner(located) /obj/effect/spawner/random_arena_spawner diff --git a/monkestation/code/modules/ghost_players/arena/arena_items.dm b/monkestation/code/modules/ghost_players/arena/arena_items.dm new file mode 100644 index 000000000000..7f8b85f43425 --- /dev/null +++ b/monkestation/code/modules/ghost_players/arena/arena_items.dm @@ -0,0 +1,5 @@ +//variant that grants CQC as soon as it is used +/obj/item/book/granter/martial/cqc/fast_read/attack_self(mob/living/user) + uses-- + on_reading_finished(user) + . = ..() diff --git a/monkestation/code/modules/ghost_players/arena/fight_button.dm b/monkestation/code/modules/ghost_players/arena/fight_button.dm index 4aa53e84e0cf..fc4e063bac70 100644 --- a/monkestation/code/modules/ghost_players/arena/fight_button.dm +++ b/monkestation/code/modules/ghost_players/arena/fight_button.dm @@ -15,12 +15,23 @@ var/obj/item/weapon_of_choice = /obj/item/storage/toolbox ///the wager in monkecoins thats paid out to the winner var/payout = 0 + ///list of weakrefs to spawned weapons for deletion on duel end + var/list/spawned_weapons = list() + ///what weapons can players choose to duel with var/list/weapon_choices = list( /obj/item/storage/toolbox, /obj/item/knife/shiv, /obj/item/grenade/clusterbuster, /obj/item/spear/bamboospear, + /obj/item/reagent_containers/spray/chemsprayer/magical, //unsure if this would cause issues but they do already have access to a full chem lab so it should be fine + /obj/item/gun/energy/laser/instakill, //first to hit the other wins, very fast matches + /obj/item/melee/baton/security/loaded, + /obj/item/chainsaw, + /obj/item/melee/energy/sword/saber, + /obj/item/book/granter/martial/cqc/fast_read, + /obj/item/gun/ballistic/revolver, + /obj/item/melee/energy/axe, ) /obj/structure/fight_button/Initialize(mapload) @@ -138,14 +149,16 @@ player_two.fully_heal() var/obj/item/one_weapon = new weapon_of_choice(src) - var/turf/one_spot = locate(161, 49, SSmapping.levels_by_trait(ZTRAIT_CENTCOM)[1]) + spawned_weapons += WEAKREF(one_weapon) + var/turf/one_spot = locate(148, 34, SSmapping.levels_by_trait(ZTRAIT_CENTCOM)[1]) player_one.forceMove(one_spot) player_one.equipOutfit(/datum/outfit/job/assistant) player_one.put_in_active_hand(one_weapon, TRUE) player_one.dueling = TRUE var/obj/item/two_weapon = new weapon_of_choice(src) - var/turf/two_spot = locate(177, 49, SSmapping.levels_by_trait(ZTRAIT_CENTCOM)[1]) + spawned_weapons += WEAKREF(two_weapon) + var/turf/two_spot = locate(164, 34, SSmapping.levels_by_trait(ZTRAIT_CENTCOM)[1]) player_two.forceMove(two_spot) player_two.equipOutfit(/datum/outfit/job/assistant) player_two.put_in_active_hand(two_weapon, TRUE) @@ -168,3 +181,7 @@ payout = 0 update_maptext() + for(var/datum/weakref/weapon in spawned_weapons) + var/obj/item/spawned_weapon = weapon?.resolve() + if(spawned_weapon) + qdel(spawned_weapon) diff --git a/monkestation/code/modules/ghost_players/centcom_teleporter.dm b/monkestation/code/modules/ghost_players/centcom_teleporter.dm new file mode 100644 index 000000000000..8f69b7cf7016 --- /dev/null +++ b/monkestation/code/modules/ghost_players/centcom_teleporter.dm @@ -0,0 +1,63 @@ +#define RIGHTS_NONE "none" +//can be used to teleport to any other centcom_teleporter(admin teleporters can only be used by people with R_ADMIN) +/obj/structure/centcom_teleporter + name = "centcom teleporter" + desc = "Can teleport you to any other centcom teleporter you have access to." + + resistance_flags = INDESTRUCTIBLE + anchored = TRUE + + icon = 'icons/obj/money_machine.dmi' + icon_state = "bogdanoff" + ///static assoc list of lists of centcom teleporters, keyed to strings of what rights they require to use + var/static/list/all_teleporters = list() + ///what rights do we need to be used + var/needed_rights = RIGHTS_NONE + +/obj/structure/centcom_teleporter/Initialize(mapload) + . = ..() + if(!all_teleporters["[needed_rights]"]) + all_teleporters["[needed_rights]"] = list(src) + else + all_teleporters["[needed_rights]"] += src + +/obj/structure/centcom_teleporter/Destroy() + all_teleporters["[needed_rights]"] -= src + return ..() + +/obj/structure/centcom_teleporter/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(!user.client || (needed_rights != RIGHTS_NONE && !check_rights_for(user.client, needed_rights))) + return + + var/list/choice_list = list() + for(var/teleporter_list in all_teleporters) + if((teleporter_list == RIGHTS_NONE) || check_rights_for(user.client, text2num(teleporter_list))) + choice_list += all_teleporters[teleporter_list] + + var/obj/structure/centcom_teleporter/choice = tgui_input_list(user, "Where do you want to teleport to?", "Teleporter", choice_list) + if(!istype(choice)) + return + + if((choice.needed_rights != RIGHTS_NONE) && !check_rights_for(user.client, choice.needed_rights)) + to_chat(user, span_warning("You dont have the admin rights to teleport here.")) + message_admins("[user][ADMIN_LOOKUPFLW(user)] is trying to use a centcom teleporter they dont have access to.") //these should not be visible to them so tell admins + return + + do_teleport(user, get_turf(choice), no_effects = TRUE, forced = TRUE) + +/obj/structure/centcom_teleporter/spawn_area + name = "spawn area teleporter" + +/obj/structure/centcom_teleporter/arena + name = "arena teleporter" + +/obj/structure/centcom_teleporter/cargo + name = "centcom cargo teleporter" + needed_rights = R_ADMIN + +/obj/structure/centcom_teleporter/admin_offices + name = "admin offices teleporter" + needed_rights = R_ADMIN + +#undef RIGHTS_NONE diff --git a/monkestation/code/modules/ghost_players/ghost_player.dm b/monkestation/code/modules/ghost_players/ghost_player.dm index fd7d5fc46b7c..2fd6f1449087 100644 --- a/monkestation/code/modules/ghost_players/ghost_player.dm +++ b/monkestation/code/modules/ghost_players/ghost_player.dm @@ -48,7 +48,7 @@ GLOBAL_VAR_INIT(disable_ghost_spawning, FALSE) linked_button = null /mob/living/carbon/human/ghost/Life(seconds_per_tick, times_fired) - if(CAN_SUCCUMB(src)) + if(stat > SOFT_CRIT) if(dueling) linked_button?.end_duel(src) move_to_ghostspawn() diff --git a/monkestation/code/modules/ghost_players/job_helpers/_centcom_item_spawner.dm b/monkestation/code/modules/ghost_players/job_helpers/_centcom_item_spawner.dm new file mode 100644 index 000000000000..2ddfe10c0dad --- /dev/null +++ b/monkestation/code/modules/ghost_players/job_helpers/_centcom_item_spawner.dm @@ -0,0 +1,54 @@ +/obj/structure/centcom_item_spawner + name = "centcom item spawner" + desc = "This is the abstract type of an object, you should not see this." + resistance_flags = INDESTRUCTIBLE + anchored = TRUE + icon = 'icons/obj/money_machine.dmi' + icon_state = "bogdanoff" + ///what do we say() when we fabricate something + var/fabrication_phrase = "fabrication complete" + ///list of exact types this spawner will not be able to spawn + var/list/blacklisted_items = list() + ///typesof() these types will not be able to be spawned + var/list/blacklisted_types = list() + /** + * assoc list of category name stings as keys with lists of what types they can spawn as values. + * category is always required, even if you only have 1. however, if there is only 1 category then it will be removed and category selection for the player will be skipped + **/ + var/list/items_to_spawn = list() + +/obj/structure/centcom_item_spawner/Initialize(mapload) + . = ..() + build_items_to_spawn() + +/obj/structure/centcom_item_spawner/attack_hand(mob/living/user, list/modifiers) + . = ..() + var/choice + if(length(items_to_spawn == 1)) + choice = 1 //this will act as an access key + else + choice = tgui_input_list(user, "What do you wish to fabricate?", "[src.name]", items_to_spawn) + + if(!choice) + return + + var/atom/second_choice = tgui_input_list(user, "Choose what to fabricate", "[choice]", items_to_spawn[choice]) + if(type in blacklisted_items) //should not be visible but just be extra sure we cant print these + return + + new second_choice(get_turf(src)) + say("[fabrication_phrase]") + playsound(src, 'sound/machines/ding.ogg', 50, TRUE) + +///build our items to spawn, override this to generate items_to_spawn, call parent at the END of your override +/obj/structure/centcom_item_spawner/proc/build_items_to_spawn() + for(var/type as anything in blacklisted_types) + blacklisted_items += typesof(type) + + for(var/category in items_to_spawn) + if(length(items_to_spawn) == 1) //if our length is 1 then turn us into a normal list that just contains our single category list + items_to_spawn = list(items_to_spawn[category]) + break + for(var/type in items_to_spawn[category]) + if(type in blacklisted_items) + items_to_spawn[category] -= type diff --git a/monkestation/code/modules/ghost_players/job_helpers/firing_range_helper.dm b/monkestation/code/modules/ghost_players/job_helpers/firing_range_helper.dm new file mode 100644 index 000000000000..1973d381578a --- /dev/null +++ b/monkestation/code/modules/ghost_players/job_helpers/firing_range_helper.dm @@ -0,0 +1,84 @@ +/obj/structure/centcom_item_spawner/gun_and_ammo_creator + name = "firing range fabrication device" + desc = "Able to print most guns and ammo your heart could ever desire.(not liable for any damages)" + resistance_flags = INDESTRUCTIBLE + anchored = TRUE + icon = 'icons/obj/money_machine.dmi' + icon_state = "bogdanoff" + blacklisted_items = list( + /obj/item/gun/ballistic, + /obj/item/gun/ballistic/automatic, + /obj/item/gun/blastcannon, + /obj/item/gun/energy, + /obj/item/gun/energy/minigun, //might runtime + /obj/item/gun/energy/pulse/prize, //dont spam ghosts + /obj/item/gun/energy/shrink_ray, + /obj/item/gun/energy/mindflayer, + /obj/item/gun/energy/recharge, + /obj/item/gun/energy/wiremod_gun, + /obj/item/gun/energy/xray, + /obj/item/gun/magic, + /obj/item/gun/magic/bloodchill, + /obj/item/gun/magic/staff, + /obj/item/gun/magic/staff/animate, + /obj/item/gun/magic/staff/change, + /obj/item/gun/magic/staff/chaos, + /obj/item/gun/magic/staff/door, + /obj/item/gun/magic/staff/flying, + /obj/item/gun/magic/staff/honk, + /obj/item/gun/magic/staff/necropotence, + /obj/item/gun/magic/staff/wipe, + /obj/item/gun/magic/tentacle, + /obj/item/gun/magic/wand, + /obj/item/gun/magic/wand/door, + /obj/item/gun/magic/wand/polymorph, + /obj/item/gun/magic/wand/teleport, + /obj/item/ammo_box/c38/trac, + /obj/item/ammo_box/magazine/m556/phasic, + /obj/item/ammo_box/magazine/sniper_rounds/penetrator, + /obj/item/ammo_box/magazine, + /obj/item/ammo_box/magazine/toy, + ) + blacklisted_types = list( + /obj/item/ammo_box/magazine/internal, + /obj/item/gun/energy/e_gun/dragnet, + /obj/item/gun/energy/ionrifle, + /obj/item/gun/energy/laser/instakill, + /obj/item/gun/energy/meteorgun, + /obj/item/gun/energy/wormhole_projector, + /obj/item/gun/magic/staff/chaos, + /obj/item/gun/magic/wand/death, + /obj/item/gun/magic/wand/safety, + /obj/item/gun/medbeam, + ) + +/obj/structure/centcom_item_spawner/gun_and_ammo_creator/build_items_to_spawn() + items_to_spawn["Ballistic"] = subtypesof(/obj/item/gun/ballistic) + items_to_spawn["Energy"] = subtypesof(/obj/item/gun/energy) + items_to_spawn["Magic"] = subtypesof(/obj/item/gun/magic) + items_to_spawn["Ammo"] = subtypesof(/obj/item/ammo_box) + items_to_spawn["Other"] = list( + /obj/item/gun/chem, + /obj/item/gun/grenadelauncher, + /obj/structure/training_machine, + /mob/living/carbon/human) + typesof(/obj/item/gun/syringe, /obj/item/target) + . = ..() + +//blocks passage if you have a gun +/obj/effect/gun_check_blocker + name = "anti gun barrier" + desc = "\"No guns outside the designated area\" is printed below it." + icon = 'goon/icons/obj/meteor_shield.dmi' + icon_state = "shieldw" + color = COLOR_RED + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + anchored = TRUE + +/obj/effect/gun_check_blocker/CanPass(atom/movable/mover, border_dir) + if(istype(mover, /obj/item/gun)) + return FALSE + for(var/object in mover.get_all_contents()) + if(istype(object, /obj/item/gun)) + return FALSE + return ..() + diff --git a/monkestation/code/modules/ghost_players/job_helpers/injured_spawner.dm b/monkestation/code/modules/ghost_players/job_helpers/injured_spawner.dm index 7eaf15b53924..41e938a6f523 100644 --- a/monkestation/code/modules/ghost_players/job_helpers/injured_spawner.dm +++ b/monkestation/code/modules/ghost_players/job_helpers/injured_spawner.dm @@ -61,20 +61,23 @@ runs-- tested_part = victim.get_bodypart(pick(zones)) i = 1 - for(iter_test_wound_list in list(list(/datum/wound/blunt/moderate, /datum/wound/blunt/severe, /datum/wound/blunt/critical),\ - list(/datum/wound/slash/moderate, /datum/wound/slash/severe, /datum/wound/slash/critical),\ - list(/datum/wound/pierce/moderate, /datum/wound/pierce/severe, /datum/wound/pierce/critical),\ - list(/datum/wound/burn/moderate, /datum/wound/burn/severe, /datum/wound/burn/critical))) + for(iter_test_wound_list in list(list(/datum/wound/blunt/bone/moderate, /datum/wound/blunt/bone/severe, /datum/wound/blunt/bone/critical),\ + list(/datum/wound/slash/flesh/moderate, /datum/wound/slash/flesh/severe, /datum/wound/slash/flesh/critical),\ + list(/datum/wound/pierce/bleed/moderate, /datum/wound/pierce/bleed/severe, /datum/wound/pierce/bleed/critical),\ + list(/datum/wound/burn/flesh/moderate, /datum/wound/burn/flesh/severe, /datum/wound/burn/flesh/critical))) if(prob(20)) continue - var/datum/wound/iter_test_wound - for(iter_test_wound as anything in iter_test_wound_list) - var/threshold = initial(iter_test_wound.threshold_minimum) + rand(40, 60) // just enough to guarantee the next tier of wound, given the existing wound threshold penalty - if(dam_types[i] == BRUTE) - tested_part.receive_damage(WOUND_MINIMUM_DAMAGE + 15, 0, wound_bonus = threshold, sharpness=sharps[i]) - else if(dam_types[i] == BURN) - tested_part.receive_damage(0, WOUND_MINIMUM_DAMAGE + 15, wound_bonus = threshold, sharpness=sharps[i]) + var/datum/wound/iter_test_wound + var/datum/wound_pregen_data/iter_pregen_data = GLOB.all_wound_pregen_data[iter_test_wound] + var/threshold_penalty = 0 + + for(iter_test_wound in iter_test_wound_list) + var/threshold = iter_pregen_data.threshold_minimum - threshold_penalty // just enough to guarantee the next tier of wound, given the existing wound threshold penalty + if(dam_types[i] == BRUTE) + tested_part.receive_damage(WOUND_MINIMUM_DAMAGE, 0, wound_bonus = threshold, sharpness=sharps[i]) + else if(dam_types[i] == BURN) + tested_part.receive_damage(0, WOUND_MINIMUM_DAMAGE, wound_bonus = threshold, sharpness=sharps[i]) i++ /obj/structure/injured_spawner/proc/rot_organs(mob/living/carbon/human/victim) diff --git a/monkestation/code/modules/ghost_players/job_helpers/organ_printer.dm b/monkestation/code/modules/ghost_players/job_helpers/organ_printer.dm index 593d58c16bdf..53eeed7843e9 100644 --- a/monkestation/code/modules/ghost_players/job_helpers/organ_printer.dm +++ b/monkestation/code/modules/ghost_players/job_helpers/organ_printer.dm @@ -13,7 +13,7 @@ /obj/structure/organ_creator/attack_hand(mob/living/user, list/modifiers) . = ..() - var/list/all_internals = subtypesof(/obj/item/organ/internal) - typesof(/obj/item/organ/internal/zombie_infection) - typesof(/obj/item/organ/internal/alien) - typesof(/obj/item/organ/internal/body_egg) - typesof(/obj/item/organ/internal/heart/gland) - typesof(/obj/item/organ/internal/alien) + var/list/all_internals = subtypesof(/obj/item/organ/internal) - typesof(/obj/item/organ/internal/zombie_infection) - typesof(/obj/item/organ/internal/alien) - typesof(/obj/item/organ/internal/body_egg) - typesof(/obj/item/organ/internal/heart/gland) - /obj/item/organ/internal/butt/atomic - typesof(/obj/item/organ/internal/alien) var/list/all_externals = subtypesof(/obj/item/organ/external) var/list/all_bodyparts = subtypesof(/obj/item/bodypart) diff --git a/monkestation/code/modules/goonimizations/goon_keybinds.dm b/monkestation/code/modules/goonimizations/goon_keybinds.dm new file mode 100644 index 000000000000..1c344ec188c6 --- /dev/null +++ b/monkestation/code/modules/goonimizations/goon_keybinds.dm @@ -0,0 +1,20 @@ +/datum/keybinding + var/list/goon_keys + +/datum/keybinding/carbon/toggle_throw_mode + goon_keys = list("Unbound") + +/datum/keybinding/human/quick_equip + goon_keys = list("V") + +/datum/keybinding/living/resist + goon_keys = list("Z") + +/datum/keybinding/living/rest + goon_keys = list("=") + +/datum/keybinding/mob/swap_hands + goon_keys = list("E") + +/datum/keybinding/mob/activate_inhand + goon_keys = list("C") diff --git a/monkestation/code/modules/goonimizations/readme.md b/monkestation/code/modules/goonimizations/readme.md new file mode 100644 index 000000000000..096b36fd1d7b --- /dev/null +++ b/monkestation/code/modules/goonimizations/readme.md @@ -0,0 +1,37 @@ +## Title: + + +MODULE ID: GOONIMIZATIONS + +### Description: + +This module adds changes i saw requested in the gooncord. + + + +### TG Proc/File Changes: + code\datums\keybinding\_keybindings.dm + + +### Defines: + + + + +### Master file additions + +- N/A + + +### Included files that are not contained in this module: + +- N/A + + +### Credits: + + + +Code by Dwasint + + diff --git a/monkestation/code/modules/goonimizations/shuttle_votes.dm b/monkestation/code/modules/goonimizations/shuttle_votes.dm new file mode 100644 index 000000000000..b3460298346c --- /dev/null +++ b/monkestation/code/modules/goonimizations/shuttle_votes.dm @@ -0,0 +1,62 @@ + +SUBSYSTEM_DEF(autotransfer) + name = "Autotransfer Vote" + flags = SS_KEEP_TIMING | SS_BACKGROUND + wait = 1 MINUTES + + var/starttime + var/targettime + var/called = FALSE + +/datum/controller/subsystem/autotransfer/Initialize(timeofday) + starttime = world.time + targettime = starttime + 60 MINUTES + + return SS_INIT_SUCCESS + +/datum/controller/subsystem/autotransfer/fire() + if(length(GLOB.player_list) < 25) + return + if(world.time > targettime) + if(called) + return + SSvote.initiate_vote(/datum/vote/shuttle_call, "automatic shuttle vote") + targettime = targettime + 20 MINUTES + +/datum/vote/shuttle_call + name = "Call Shuttle" + message = "Should we go home?!" + +/datum/vote/shuttle_call/can_be_initiated(mob/by_who, forced = FALSE) + . = ..() + if(!.) + return FALSE + + if(!SSticker.HasRoundStarted() || SSautotransfer.called) + return FALSE + if(length(GLOB.player_list) < 25) + return FALSE + if(started_time) + var/next_allowed_time = SSautotransfer.targettime + if(next_allowed_time > world.time && !forced) + message = "A vote was initiated recently. You must wait [DisplayTimeText(next_allowed_time - world.time)] before a shuttle vote can happen!" + return FALSE + + message = initial(message) + +/datum/vote/shuttle_call/New() + . = ..() + default_choices = list("Yes", "No") + + +/datum/vote/shuttle_call/finalize_vote(winning_option) + if(SSautotransfer.called) + return + if(winning_option == "No") + return + if(SSshuttle.emergency.mode == SHUTTLE_CALL) + return + SSshuttle.admin_emergency_no_recall = TRUE + SSshuttle.emergency.mode = SHUTTLE_IDLE + SSshuttle.emergency.request() + SSautotransfer.called = TRUE diff --git a/monkestation/code/modules/hydroponics/machines/infuser.dm b/monkestation/code/modules/hydroponics/machines/infuser.dm deleted file mode 100644 index 02ecde6a389c..000000000000 --- a/monkestation/code/modules/hydroponics/machines/infuser.dm +++ /dev/null @@ -1,140 +0,0 @@ -/obj/machinery/infuser - name = "Infuser" - desc = "Infuses chemicals into seeds, potentially opening access to new mutations." - - icon_state = "splicer" - icon = 'monkestation/icons/obj/machines/hydroponics.dmi' - var/obj/item/seeds/seed - - var/obj/item/reagent_containers/cup/beaker/held_beaker - - var/working = FALSE - - var/work_timer = null - - var/potential_damage = 0 - - var/list/stats = list() - - -/obj/machinery/infuser/ui_interact(mob/user, datum/tgui/ui) - . = ..() - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "BotanyInfuser", name) - ui.open() - ui.set_autoupdate(TRUE) - -/obj/machinery/infuser/ui_data(mob/user) - . = ..() - if(!stats.len) - calculate_stats_for_infusion() - var/list/data = list() - if(seed) - data["seed"] = list(seed.return_all_data() + stats) - data["has_seed"] = TRUE - if(held_beaker) - data["has_beaker"] = TRUE - - data["working"] = working - - data["potential_damage"] = potential_damage - data["damage_taken"] = seed.infusion_damage - data["combined_damage"] = (potential_damage + seed.infusion_damage) - - return data - -/obj/machinery/infuser/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("eject_beaker") - eject_beaker() - return TRUE - if("eject_seed") - eject_seed() - return TRUE - if("infuse") - infuse() - return TRUE - -/obj/machinery/infuser/proc/calculate_stats_for_infusion() - if(!held_beaker) - return - var/list/total_stats = list( - "potency_change" = 0, - "yield_change" = 0, - "endurance_change" = 0, - "lifespan_change" = 0, - "weed_chance_change" = 0, - "weed_rate_change" = 0, - "production_change" = 0, - "maturation_change" = 0, - "damage" = 0, - ) - for(var/reagent in held_beaker.reagents.reagent_list) - var/datum/reagent/listed_reagent = reagent - total_stats += listed_reagent.generate_infusion_values(held_beaker.reagents) - stats = total_stats - potential_damage = stats["damage"] - -/obj/machinery/infuser/proc/eject_seed() - if (seed) - if(Adjacent(usr) && !issiliconoradminghost(usr)) - if (!usr.put_in_hands(seed)) - seed.forceMove(drop_location()) - else - seed.forceMove(drop_location()) - seed = null - . = TRUE - -/obj/machinery/infuser/proc/eject_beaker() - if (held_beaker) - if(Adjacent(usr) && !issiliconoradminghost(usr)) - if (!usr.put_in_hands(held_beaker)) - held_beaker.forceMove(drop_location()) - else - held_beaker.forceMove(drop_location()) - held_beaker = null - stats = list() - potential_damage = 0 - . = TRUE - -/obj/machinery/infuser/attacked_by(obj/item/I, mob/living/user) - . = ..() - if(istype(I, /obj/item/seeds)) - if(!seed) - if(!user.transferItemToLoc(I, src)) - return - seed = I - return - if(istype(I, /obj/item/reagent_containers/cup/beaker)) - if(!held_beaker) - if(!user.transferItemToLoc(I, src)) - return - held_beaker = I - return - -/obj/machinery/infuser/proc/infuse() - if(!held_beaker) - return - seed.infusion_damage += potential_damage - if(seed.infusion_damage >= 100) - qdel(seed) - seed = null - return - - seed.adjust_potency(stats["potency_change"]) - seed.adjust_yield(stats["yield_change"]) - seed.adjust_endurance(stats["endurance_change"]) - seed.adjust_lifespan(stats["lifespan_change"]) - seed.adjust_production(stats["production_change"]) - seed.adjust_weed_chance(stats["weed_chance_change"]) - seed.adjust_weed_rate(stats["weed_rate_change"]) - seed.adjust_maturation(stats["maturation_change"]) - - seed.check_infusions(held_beaker.reagents.reagent_list) - held_beaker.reagents.remove_any(held_beaker.reagents.total_volume) - stats = list() - potential_damage = 0 diff --git a/monkestation/code/modules/hydroponics/machines/splicer.dm b/monkestation/code/modules/hydroponics/machines/splicer.dm index ca0800d05e8a..6c0879d60a5a 100644 --- a/monkestation/code/modules/hydroponics/machines/splicer.dm +++ b/monkestation/code/modules/hydroponics/machines/splicer.dm @@ -6,11 +6,16 @@ icon = 'monkestation/icons/obj/machines/hydroponics.dmi' var/obj/item/seeds/seed_1 var/obj/item/seeds/seed_2 + var/obj/item/reagent_containers/cup/beaker/held_beaker var/working = FALSE var/work_timer = null + var/potential_damage = 0 + + var/list/stats = list() + /obj/machinery/splicer/attacked_by(obj/item/I, mob/living/user) . = ..() @@ -24,22 +29,40 @@ if(!user.transferItemToLoc(I, src)) return seed_2 = I + if(istype(I, /obj/item/reagent_containers/cup/beaker)) + if(!held_beaker) + if(!user.transferItemToLoc(I, src)) + return + held_beaker = I + return /obj/machinery/splicer/ui_data(mob/user) . = ..() + if(!stats.len) + calculate_stats_for_infusion() + var/has_seed_one = FALSE var/has_seed_two = FALSE + var/has_beaker = FALSE var/list/data = list() + if(seed_1) - data["seed_1"] = list(seed_1.return_all_data()) + data["seed_1"] = list(seed_1.return_all_data() + stats) has_seed_one = TRUE + data["damage_taken"] = seed_1.infusion_damage + data["potential_damage"] = potential_damage + data["combined_damage"] = (potential_damage + seed_1.infusion_damage) if(seed_2) data["seed_2"] = list(seed_2.return_all_data()) has_seed_two = TRUE + if(held_beaker) + data["held_beaker"] = held_beaker.reagents + has_beaker = TRUE data["seedone"] = has_seed_one data["seedtwo"] = has_seed_two + data["held_beaker"] = has_beaker data["working"] = working @@ -69,9 +92,15 @@ eject_seed(seed_2) seed_2 = null return TRUE + if("eject_beaker") + eject_beaker(held_beaker) + return TRUE if("splice") splice(seed_1, seed_2) return TRUE + if("infuse") + infuse() + return TRUE /obj/machinery/splicer/proc/eject_seed(obj/item/seeds/ejected_seed) if (ejected_seed) @@ -82,6 +111,18 @@ ejected_seed.forceMove(drop_location()) . = TRUE +/obj/machinery/splicer/proc/eject_beaker() + if (held_beaker) + if(Adjacent(usr) && !issiliconoradminghost(usr)) + if (!usr.put_in_hands(held_beaker)) + held_beaker.forceMove(drop_location()) + else + held_beaker.forceMove(drop_location()) + held_beaker = null + stats = list() + potential_damage = 0 + . = TRUE + /obj/machinery/splicer/proc/splice(obj/item/seeds/first_seed, obj/item/seeds/second_seed) if(!first_seed || !second_seed) @@ -158,3 +199,46 @@ qdel(first_seed) qdel(second_seed) + +/obj/machinery/splicer/proc/calculate_stats_for_infusion() + if(!held_beaker) + return + var/list/total_stats = list( + "potency_change" = 0, + "yield_change" = 0, + "endurance_change" = 0, + "lifespan_change" = 0, + "weed_chance_change" = 0, + "weed_rate_change" = 0, + "production_change" = 0, + "maturation_change" = 0, + "damage" = 0, + ) + for(var/reagent in held_beaker.reagents.reagent_list) + var/datum/reagent/listed_reagent = reagent + total_stats += listed_reagent.generate_infusion_values(held_beaker.reagents) + stats = total_stats + potential_damage = stats["damage"] + +/obj/machinery/splicer/proc/infuse() + if(!held_beaker) + return + seed_1.infusion_damage += potential_damage + if(seed_1.infusion_damage >= 100) + qdel(seed_1) + seed_1 = null + return + + seed_1.adjust_potency(stats["potency_change"]) + seed_1.adjust_yield(stats["yield_change"]) + seed_1.adjust_endurance(stats["endurance_change"]) + seed_1.adjust_lifespan(stats["lifespan_change"]) + seed_1.adjust_production(stats["production_change"]) + seed_1.adjust_weed_chance(stats["weed_chance_change"]) + seed_1.adjust_weed_rate(stats["weed_rate_change"]) + seed_1.adjust_maturation(stats["maturation_change"]) + + seed_1.check_infusions(held_beaker.reagents.reagent_list) + held_beaker.reagents.remove_any(held_beaker.reagents.total_volume) + stats = list() + potential_damage = 0 diff --git a/monkestation/code/modules/jobs/job_types/candysalesman.dm b/monkestation/code/modules/jobs/job_types/candysalesman.dm new file mode 100644 index 000000000000..a4c508c93bab --- /dev/null +++ b/monkestation/code/modules/jobs/job_types/candysalesman.dm @@ -0,0 +1,46 @@ +/datum/job/candysalesman + title = JOB_SPOOKTOBER_CANDYSALESMAN + description = "Sell candy to the crew. Get high on your own supply. Subject people to unsafe working conditions." + faction = FACTION_STATION + total_positions = 1 + spawn_positions = 0 + supervisors = JOB_HEAD_OF_PERSONNEL + exp_granted_type = EXP_TYPE_CREW + + outfit = /datum/outfit/job/candysalesman + plasmaman_outfit = /datum/outfit/plasmaman + + paycheck = PAYCHECK_LOWER + paycheck_department = ACCOUNT_CIV + + display_order = JOB_DISPLAY_ORDER_ASSISTANT + + departments_list = list( + /datum/job_department/spooktober, + ) + + family_heirlooms = list(/obj/item/cane) + + mail_goodies = list( + /obj/item/storage/spooky + ) + + rpg_title = "Purveyor of Sweets" + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN | JOB_SPOOKTOBER + +/datum/outfit/job/candysalesman + name = "Candy Salesman" + jobtype = /datum/job/candysalesman + + head = /obj/item/clothing/head/wonka + uniform = /obj/item/clothing/under/wonka + id_trim = /datum/id_trim/job/assistant + belt = /obj/item/modular_computer/pda/assistant + + backpack_contents = list( + /obj/item/cane, + /obj/item/storage/pill_bottle/maintenance_pill/full, + /obj/item/storage/spooky, + /obj/item/storage/spooky, + /obj/item/storage/spooky + ) diff --git a/monkestation/code/modules/jobs/job_types/dietwizard.dm b/monkestation/code/modules/jobs/job_types/dietwizard.dm new file mode 100644 index 000000000000..34b290e7e644 --- /dev/null +++ b/monkestation/code/modules/jobs/job_types/dietwizard.dm @@ -0,0 +1,44 @@ +/datum/job/dietwizard + title = JOB_SPOOKTOBER_WIZARD + description = "Amaze the crew! Get murdered because there are actual wizards out there. Have your costume confiscated as contraband." + faction = FACTION_STATION + total_positions = 1 + spawn_positions = 0 + supervisors = JOB_HEAD_OF_PERSONNEL + exp_granted_type = EXP_TYPE_CREW + + outfit = /datum/outfit/job/dietwizard + plasmaman_outfit = /datum/outfit/plasmaman + + paycheck = PAYCHECK_LOWER + paycheck_department = ACCOUNT_CIV + + display_order = JOB_DISPLAY_ORDER_ASSISTANT + + departments_list = list( + /datum/job_department/spooktober, + ) + + family_heirlooms = list(/obj/item/staff, /obj/item/clothing/head/wizard/fake) + + mail_goodies = list( + /obj/item/staff, + /obj/item/storage/box/snappops, + /obj/item/grenade/smokebomb + ) + + rpg_title = "Hedge Mage" + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN | JOB_SPOOKTOBER + +/datum/outfit/job/dietwizard + name = "Diet Wizard" + jobtype = /datum/job/dietwizard + + head = /obj/item/clothing/head/wizard/fake + suit = /obj/item/clothing/suit/wizrobe/fake + id_trim = /datum/id_trim/job/assistant + belt = /obj/item/modular_computer/pda/assistant + shoes = /obj/item/clothing/shoes/sandal + l_hand = /obj/item/staff + + backpack_contents = list(/obj/item/storage/box/snappops, /obj/item/storage/box/snappops, /obj/item/grenade/smokebomb, /obj/item/grenade/smokebomb) diff --git a/monkestation/code/modules/jobs/job_types/ghost.dm b/monkestation/code/modules/jobs/job_types/ghost.dm new file mode 100644 index 000000000000..01984cd6e4d1 --- /dev/null +++ b/monkestation/code/modules/jobs/job_types/ghost.dm @@ -0,0 +1,40 @@ +/datum/job/ghost + title = JOB_SPOOKTOBER_GHOST + description = "Spook the crew. Get your bedsheet stolen and run around the station naked." + faction = FACTION_STATION + total_positions = 1 + spawn_positions = 0 + supervisors = JOB_CHAPLAIN + exp_granted_type = EXP_TYPE_CREW + + outfit = /datum/outfit/job/ghost + plasmaman_outfit = /datum/outfit/plasmaman + + paycheck = PAYCHECK_LOWER + paycheck_department = ACCOUNT_CIV + + display_order = JOB_DISPLAY_ORDER_ASSISTANT + + departments_list = list( + /datum/job_department/spooktober, + ) + + family_heirlooms = list(/obj/item/clothing/suit/costume/ghost_sheet) + + mail_goodies = list( + /obj/item/clothing/suit/costume/ghost_sheet + ) + + rpg_title = "Spectre" + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN | JOB_SPOOKTOBER + +/datum/outfit/job/ghost + name = "Ghost" + jobtype = /datum/job/ghost + + suit = /obj/item/clothing/suit/costume/ghost_sheet + shoes = null + id_trim = /datum/id_trim/job/assistant + belt = /obj/item/modular_computer/pda/assistant + + backpack_contents = list() diff --git a/monkestation/code/modules/jobs/job_types/godzilla.dm b/monkestation/code/modules/jobs/job_types/godzilla.dm new file mode 100644 index 000000000000..b63599fbbbb1 --- /dev/null +++ b/monkestation/code/modules/jobs/job_types/godzilla.dm @@ -0,0 +1,44 @@ +/datum/job/godzilla + title = JOB_SPOOKTOBER_GODZILLA + description = "Film a monster movie. Blend in with the lizards. Get arrested for roaring at the crew." + faction = FACTION_STATION + total_positions = 1 + spawn_positions = 0 + supervisors = JOB_HEAD_OF_PERSONNEL + exp_granted_type = EXP_TYPE_CREW + + outfit = /datum/outfit/job/godzilla + plasmaman_outfit = /datum/outfit/plasmaman + + paycheck = PAYCHECK_LOWER + paycheck_department = ACCOUNT_CIV + + display_order = JOB_DISPLAY_ORDER_ASSISTANT + + departments_list = list( + /datum/job_department/spooktober, + ) + + family_heirlooms = list(/obj/item/megaphone, /obj/item/clothing/head/lizard, /obj/item/clothing/suit/hooded/dinojammies) + + mail_goodies = list( + /obj/item/megaphone, + /obj/item/food/fried_blood_sausage, + /obj/item/food/bread/root, + /obj/item/food/lizard_fries + ) + + rpg_title = "Lizardman" + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN | JOB_SPOOKTOBER + +/datum/outfit/job/godzilla + name = "Discount Godzilla" + jobtype = /datum/job/godzilla + + head = /obj/item/clothing/head/lizard + r_pocket = /obj/item/megaphone + id_trim = /datum/id_trim/job/assistant + belt = /obj/item/modular_computer/pda/assistant + +/datum/outfit/job/godzilla/post_equip(mob/living/carbon/human/H, visualsOnly) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/hooded/dinojammies(H), ITEM_SLOT_OCLOTHING) diff --git a/monkestation/code/modules/jobs/job_types/gorilla.dm b/monkestation/code/modules/jobs/job_types/gorilla.dm new file mode 100644 index 000000000000..07ee74f5c0b1 --- /dev/null +++ b/monkestation/code/modules/jobs/job_types/gorilla.dm @@ -0,0 +1,44 @@ +/datum/job/gorilla + title = JOB_SPOOKTOBER_GORILLA + description = "Film a monster movie. Battle godzilla. Get arrested for roaring at lizards." + faction = FACTION_STATION + total_positions = 1 + spawn_positions = 0 + supervisors = JOB_HEAD_OF_PERSONNEL + exp_granted_type = EXP_TYPE_CREW + + outfit = /datum/outfit/job/gorilla + plasmaman_outfit = /datum/outfit/plasmaman + + paycheck = PAYCHECK_LOWER + paycheck_department = ACCOUNT_CIV + + display_order = JOB_DISPLAY_ORDER_ASSISTANT + + departments_list = list( + /datum/job_department/spooktober, + ) + + family_heirlooms = list(/obj/item/clothing/suit/hooded/gorilla) + + mail_goodies = list( + /obj/item/food/grown/banana + ) + + rpg_title = "Dire Ape" + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN | JOB_SPOOKTOBER + +/datum/outfit/job/gorilla + name = "Gorilla" + jobtype = /datum/job/gorilla + + suit = /obj/item/clothing/suit/hooded/gorilla + id_trim = /datum/id_trim/job/assistant + belt = /obj/item/modular_computer/pda/assistant + r_pocket = /obj/item/megaphone + + backpack_contents = list( + /obj/item/food/grown/banana, + /obj/item/food/grown/banana, + /obj/item/food/grown/banana + ) diff --git a/monkestation/code/modules/jobs/job_types/skeleton.dm b/monkestation/code/modules/jobs/job_types/skeleton.dm new file mode 100644 index 000000000000..96e7cc4dca6f --- /dev/null +++ b/monkestation/code/modules/jobs/job_types/skeleton.dm @@ -0,0 +1,39 @@ +/datum/job/skeleton + title = JOB_SPOOKTOBER_SKELETON + description = "Rattle your bones! Rattle the crew! Encourage the skeletons deep within us all to awaken and join the skeleton war." + faction = FACTION_STATION + total_positions = 1 + spawn_positions = 0 + supervisors = JOB_HEAD_OF_PERSONNEL + exp_granted_type = EXP_TYPE_CREW + + outfit = /datum/outfit/job/skeleton + plasmaman_outfit = /datum/outfit/plasmaman + + paycheck = PAYCHECK_LOWER + paycheck_department = ACCOUNT_CIV + + display_order = JOB_DISPLAY_ORDER_ASSISTANT + + departments_list = list( + /datum/job_department/spooktober, + ) + + family_heirlooms = list(/obj/item/instrument/trombone) + + mail_goodies = list( + /obj/item/food/cookie/sugar/spookyskull + ) + + rpg_title = "Animated Bones" + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN | JOB_SPOOKTOBER + +/datum/outfit/job/skeleton + name = "Skeleton" + jobtype = /datum/job/skeleton + + uniform = /obj/item/clothing/under/costume/skeleton + head = /obj/item/clothing/head/helmet/skull + id_trim = /datum/id_trim/job/assistant + belt = /obj/item/modular_computer/pda/assistant + backpack_contents = list(/obj/item/instrument/trombone, /obj/item/food/cookie/sugar/spookyskull, /obj/item/food/cookie/sugar/spookyskull, /obj/item/food/cookie/sugar/spookyskull) diff --git a/monkestation/code/modules/jobs/job_types/yellowclown.dm b/monkestation/code/modules/jobs/job_types/yellowclown.dm new file mode 100644 index 000000000000..94d50b5856e2 --- /dev/null +++ b/monkestation/code/modules/jobs/job_types/yellowclown.dm @@ -0,0 +1,115 @@ +/datum/job/yellowclown + title = JOB_SPOOKTOBER_YELLOWCLOWN + description = "Team up with the regular clown, or start a rivalry! Search for ways to become EVEN MORE YELLOW." + department_head = list(JOB_HEAD_OF_PERSONNEL) + faction = FACTION_STATION + total_positions = 1 + spawn_positions = 1 + supervisors = SUPERVISOR_HOP + exp_granted_type = EXP_TYPE_CREW + + outfit = /datum/outfit/job/yellowclown + plasmaman_outfit = /datum/outfit/plasmaman/clown + + paycheck = PAYCHECK_CREW + paycheck_department = ACCOUNT_SRV + + mind_traits = list(TRAIT_NAIVE) + liver_traits = list(TRAIT_COMEDY_METABOLISM) + + display_order = JOB_DISPLAY_ORDER_ASSISTANT + departments_list = list( + /datum/job_department/spooktober, + ) + + mail_goodies = list( + /obj/item/food/grown/banana = 100, + /obj/item/food/pie/cream = 50, + /obj/item/clothing/shoes/clown_shoes/combat = 10, + /obj/item/reagent_containers/spray/waterflower/lube = 20, // lube + /obj/item/reagent_containers/spray/waterflower/superlube = 1 // Superlube, good lord. + ) + + family_heirlooms = list(/obj/item/bikehorn/golden) + rpg_title = "Tow-Colored Jester" + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN | JOB_SPOOKTOBER + + job_tone = "honk" + + +/datum/job/yellowclown/after_spawn(mob/living/spawned, client/player_client) + . = ..() + if(!ishuman(spawned)) + return + spawned.apply_pref_name(/datum/preference/name/clown, player_client) + var/obj/item/organ/internal/butt/butt = spawned.get_organ_slot(ORGAN_SLOT_BUTT) + if(butt) + butt.Remove(spawned, 1) + QDEL_NULL(butt) + butt = new/obj/item/organ/internal/butt/clown + butt.Insert(spawned) + + var/obj/item/organ/internal/bladder/bladder = spawned.get_organ_slot(ORGAN_SLOT_BLADDER) + if(bladder) + bladder.Remove(spawned, 1) + QDEL_NULL(bladder) + bladder = new/obj/item/organ/internal/bladder/clown + bladder.Insert(spawned) + +/datum/outfit/job/yellowclown + name = "Yellow Clown" + jobtype = /datum/job/yellowclown + + id = /obj/item/card/id/advanced/rainbow + id_trim = /datum/id_trim/job/clown + uniform = /obj/item/clothing/under/rank/civilian/clown/yellow + backpack_contents = list( + /obj/item/stamp/clown = 1, + /obj/item/reagent_containers/spray/waterflower = 1, + /obj/item/food/grown/banana = 1, + /obj/item/instrument/bikehorn = 1, + ) + belt = /obj/item/modular_computer/pda/clown + ears = /obj/item/radio/headset/headset_srv + shoes = /obj/item/clothing/shoes/clown_shoes/yellow + mask = /obj/item/clothing/mask/gas/clown_hat/yellow + l_pocket = /obj/item/bikehorn + + backpack = /obj/item/storage/backpack/clown + satchel = /obj/item/storage/backpack/clown + duffelbag = /obj/item/storage/backpack/duffelbag/clown + + box = /obj/item/storage/box/survival/hug + chameleon_extras = /obj/item/stamp/clown + implants = list(/obj/item/implant/sad_trombone) + +/datum/outfit/job/yellowclown/mod + name = "Clown (MODsuit)" + + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/cosmohonk + internals_slot = ITEM_SLOT_SUITSTORE + +/datum/outfit/job/yellowclown/pre_equip(mob/living/carbon/human/H, visualsOnly) + . = ..() + if(HAS_TRAIT(SSstation, STATION_TRAIT_BANANIUM_SHIPMENTS)) + backpack_contents[/obj/item/stack/sheet/mineral/bananium/five] = 1 + +/datum/outfit/job/yellowclown/get_types_to_preload() + . = ..() + if(HAS_TRAIT(SSstation, STATION_TRAIT_BANANIUM_SHIPMENTS)) + . += /obj/item/stack/sheet/mineral/bananium/five + +/datum/outfit/job/yellowclown/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + if(visualsOnly) + return + + H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names)) //rename the mob AFTER they're equipped so their ID gets updated properly. + H.dna.add_mutation(/datum/mutation/human/clumsy) + for(var/datum/mutation/human/clumsy/M in H.dna.mutations) + M.mutadone_proof = TRUE + var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN] + fan.show_to(H) + H.faction |= FACTION_CLOWN + diff --git a/monkestation/code/modules/liquids/ocean_generator.dm b/monkestation/code/modules/liquids/ocean_generator.dm index 609ff41d2523..46db1b9f09c1 100644 --- a/monkestation/code/modules/liquids/ocean_generator.dm +++ b/monkestation/code/modules/liquids/ocean_generator.dm @@ -96,7 +96,7 @@ /obj/effect/spawner/random/lavaland_mob/watcher = 40, /mob/living/basic/mining/bileworm = 20, /mob/living/basic/mining/lobstrosity/lava = 20, - /mob/living/simple_animal/hostile/asteroid/brimdemon = 20, + /mob/living/basic/mining/brimdemon = 20, /mob/living/basic/mining/goldgrub = 10, /obj/structure/spawner/lavaland/ocean = 2, /obj/structure/spawner/lavaland/ocean/goliath = 3, diff --git a/monkestation/code/modules/loadouts/items/effects.dm b/monkestation/code/modules/loadouts/items/effects.dm index 10136fff2f2c..70f5293dab85 100644 --- a/monkestation/code/modules/loadouts/items/effects.dm +++ b/monkestation/code/modules/loadouts/items/effects.dm @@ -6,6 +6,7 @@ GLOBAL_LIST_INIT(loadout_effects, generate_loadout_items(/datum/loadout_item/eff /datum/loadout_item/effects/post_equip_item(datum/preferences/preference_source, mob/living/carbon/human/equipper, visuals_only) var/obj/item/effect_granter/new_item = new item_path(equipper.loc) addtimer(CALLBACK(new_item, TYPE_PROC_REF(/obj/item/effect_granter, grant_effect), equipper), 3 SECONDS) + /datum/loadout_item/effects/honk_platinum ckeywhitelist = list("madducks") name = "Honk Platinum Transformation" diff --git a/monkestation/code/modules/loadouts/items/heads.dm b/monkestation/code/modules/loadouts/items/heads.dm index 3875733ada03..0d14aa467748 100644 --- a/monkestation/code/modules/loadouts/items/heads.dm +++ b/monkestation/code/modules/loadouts/items/heads.dm @@ -187,6 +187,14 @@ GLOBAL_LIST_INIT(loadout_helmets, generate_loadout_items(/datum/loadout_item/hea name = "Tragic Mime Headpiece" item_path = /obj/item/clothing/head/tragic +/datum/loadout_item/head/pharaoh + name = "Pharaoh's Hat" + item_path = /obj/item/clothing/head/costume/pharaoh + +/datum/loadout_item/head/nemes + name = "Headdress of Nemes" + item_path = /obj/item/clothing/head/costume/nemes + /* * CHRISTMAS */ diff --git a/monkestation/code/modules/loadouts/items/neck.dm b/monkestation/code/modules/loadouts/items/neck.dm index eb86bf4fc417..c12588cea1e9 100644 --- a/monkestation/code/modules/loadouts/items/neck.dm +++ b/monkestation/code/modules/loadouts/items/neck.dm @@ -90,6 +90,11 @@ GLOBAL_LIST_INIT(loadout_necks, generate_loadout_items(/datum/loadout_item/neck) name = "Infinity Scarf" item_path = /obj/item/clothing/neck/infinity_scarf +/datum/loadout_item/neck/ascot + name = "Ascot" + item_path = /obj/item/clothing/neck/ascot + requires_purchase = FALSE + /* * NECKTIES */ diff --git a/monkestation/code/modules/loadouts/items/suits.dm b/monkestation/code/modules/loadouts/items/suits.dm index 6647d99e2991..e8b57022eba9 100644 --- a/monkestation/code/modules/loadouts/items/suits.dm +++ b/monkestation/code/modules/loadouts/items/suits.dm @@ -331,6 +331,10 @@ GLOBAL_LIST_INIT(loadout_exosuits, generate_loadout_items(/datum/loadout_item/su name = "driscoll poncho" item_path = /obj/item/clothing/suit/driscoll +/datum/loadout_item/suit/dinojammies + name = "Dinosaur Pajamas" + item_path = /obj/item/clothing/suit/hooded/dinojammies + /* * DONATOR */ diff --git a/monkestation/code/modules/loadouts/items/under/under.dm b/monkestation/code/modules/loadouts/items/under/under.dm index e3cc7646ab7a..a8b52d2c1f44 100644 --- a/monkestation/code/modules/loadouts/items/under/under.dm +++ b/monkestation/code/modules/loadouts/items/under/under.dm @@ -477,3 +477,7 @@ GLOBAL_LIST_INIT(loadout_miscunders, generate_loadout_items(/datum/loadout_item/ /datum/loadout_item/under/donator donator_only = TRUE requires_purchase = FALSE + +/datum/loadout_item/under/miscellaneous/shrine + name = "Shrine Priestess Kimono" + item_path = /obj/item/clothing/under/dress/shrine_priestess diff --git a/monkestation/code/modules/loadouts/loadout_middleware.dm b/monkestation/code/modules/loadouts/loadout_middleware.dm index 6869478d9e61..fabf1b47239c 100644 --- a/monkestation/code/modules/loadouts/loadout_middleware.dm +++ b/monkestation/code/modules/loadouts/loadout_middleware.dm @@ -39,6 +39,7 @@ loadout_tabs += list(list("name" = "Toys", "title" = "Toys! ([MAX_ALLOWED_MISC_ITEMS] max)", "contents" = list_to_data(GLOB.loadout_toys))) loadout_tabs += list(list("name" = "Other", "title" = "Backpack Items ([MAX_ALLOWED_MISC_ITEMS] max)", "contents" = list_to_data(GLOB.loadout_pocket_items))) loadout_tabs += list(list("name" = "Effects", "title" = "Unique Effects", "contents" = list_to_data(GLOB.loadout_effects))) + loadout_tabs += list(list("name" = "Unusuals", "title" = "Unusual Hats", "contents" = convert_stored_unusuals_to_data())) return list("loadout_tabs" = loadout_tabs) @@ -49,12 +50,16 @@ var/list/all_selected_paths = list() for(var/path in preferences.loadout_list) all_selected_paths += path + + var/list/all_selected_unusuals = list() + if(length(preferences.special_loadout_list["unusual"])) + all_selected_unusuals = preferences.special_loadout_list["unusual"] + data["selected_loadout"] = all_selected_paths - data["user_is_donator"] = !!(preferences.parent.patreon?.is_donator() || is_admin(preferences.parent)) + data["selected_unusuals"] = all_selected_unusuals + data["user_is_donator"] = !!(preferences.parent.patreon?.is_donator() || preferences.parent.twitch?.is_donator() || is_admin(preferences.parent)) data["mob_name"] = preferences.read_preference(/datum/preference/name/real_name) data["ismoth"] = istype(preferences.parent.prefs.read_preference(/datum/preference/choiced/species), /datum/species/moth) // Moth's humanflaticcon isn't the same dimensions for some reason - data["preivew_options"] = list(PREVIEW_PREF_JOB, PREVIEW_PREF_LOADOUT, PREVIEW_PREF_NAKED) - data["preview_selection"] = PREVIEW_PREF_JOB data["total_coins"] = preferences.metacoins return data @@ -68,7 +73,7 @@ return null //Here we will perform basic checks to ensure there are no exploits happening - if(interacted_item.donator_only && !preferences.parent.patreon?.is_donator() && !is_admin(preferences.parent)) + if(interacted_item.donator_only && (!preferences.parent.patreon?.is_donator() && !preferences.parent.twitch?.is_donator()) && !is_admin(preferences.parent)) message_admins("LOADOUT SYSTEM: Possible exploit detected, non-donator [preferences.parent.ckey] tried loading [interacted_item.item_path], but this is donator only.") return null @@ -83,6 +88,10 @@ return interacted_item /datum/preference_middleware/loadout/proc/select_item(list/params, mob/user) + if(params["unusual_spawning_requirements"]) + unusual_selection(params, user) + return + var/datum/loadout_item/interacted_item = return_item(params) if(!interacted_item) return @@ -108,6 +117,20 @@ ui.send_update() preferences.character_preview_view?.update_body() +/datum/preference_middleware/proc/unusual_selection(list/params, mob/user) + if("[params["unusual_placement"]]" in preferences.special_loadout_list["unusual"]) + preferences.special_loadout_list["unusual"] -= params["unusual_placement"] + preferences.save_preferences() + return + + if(!islist(preferences.special_loadout_list["unusual"])) + preferences.special_loadout_list["unusual"] = list() + + preferences.special_loadout_list["unusual"] += "[params["unusual_placement"]]" + var/datum/tgui/ui = SStgui.get_open_ui(user, preferences) + ui.send_update() + preferences.character_preview_view?.update_body() + /// Deselect [deselected_item]. /datum/preference_middleware/proc/deselect_item(datum/loadout_item/deselected_item, mob/user) LAZYREMOVE(preferences.loadout_list, deselected_item.item_path) @@ -128,7 +151,7 @@ formatted_list.len-- continue if(item.donator_only) //These checks are also performed in the backend. - if(!preferences.parent.patreon?.is_donator() && !is_admin(preferences.parent)) + if((!preferences.parent.patreon?.is_donator() || !preferences.parent.twitch?.is_donator())&& !is_admin(preferences.parent)) formatted_list.len-- continue @@ -157,6 +180,30 @@ return formatted_list +/datum/preference_middleware/proc/convert_stored_unusuals_to_data() + var/list/data = preferences.extra_stat_inventory["unusual"] + if(!length(data)) + return + + var/list/formatted_list = new(length(data)) + + var/array_index = 1 + for(var/iter as anything in data) + var/list/formatted_item = list() + formatted_item["name"] = data[array_index]["name"] + formatted_item["path"] = data[array_index]["unusual_type"] + formatted_item["unusual_placement"] = "[array_index]" + formatted_item["is_greyscale"] = FALSE + formatted_item["is_renamable"] = FALSE + formatted_item["is_job_restricted"] = FALSE + formatted_item["is_donator_only"] = FALSE + formatted_item["is_ckey_whitelisted"] = FALSE + formatted_item["unusual_spawning_requirements"] = TRUE + + formatted_list[array_index++] = formatted_item + + return formatted_list + /datum/preference_middleware/loadout/proc/set_name(list/params, mob/user) var/datum/loadout_item/item = return_item(params) if(!item) @@ -251,13 +298,14 @@ /datum/preference_middleware/loadout/proc/clear_all_items() LAZYNULL(preferences.loadout_list) + preferences.special_loadout_list["unusual"] = list() preferences.character_preview_view.update_body() /datum/preference_middleware/loadout/proc/ckey_explain(list/params, mob/user) to_chat(preferences.parent, examine_block(span_green("This item is restricted to your ckey only. Thank you!"))) /datum/preference_middleware/loadout/proc/donator_explain(list/params, mob/user) - if(preferences.parent.patreon?.is_donator()) + if(preferences.parent.patreon?.is_donator() || preferences.parent.twitch?.is_donator()) to_chat(preferences.parent, examine_block("Thank you for donating, this item is for you <3!")) else to_chat(preferences.parent, examine_block(span_boldnotice("This item is restricted to donators only, for more information, please check the discord(#server-info) for more information!"))) diff --git a/monkestation/code/modules/loadouts/loadout_outfit_helper.dm b/monkestation/code/modules/loadouts/loadout_outfit_helper.dm index dc5eecad5abc..703955cd8e23 100644 --- a/monkestation/code/modules/loadouts/loadout_outfit_helper.dm +++ b/monkestation/code/modules/loadouts/loadout_outfit_helper.dm @@ -38,6 +38,7 @@ var/list/loadout_datums = loadout_list_to_datums(preference_source?.loadout_list) + if(override_preference == LOADOUT_OVERRIDE_CASE && !visuals_only) var/obj/item/storage/briefcase/empty/briefcase = new(loc) @@ -48,6 +49,15 @@ continue new item.item_path(briefcase) + var/list/numbers = list() + for(var/num as anything in preference_source?.special_loadout_list["unusual"]) + if(num in numbers) + continue + numbers += text2num(num) + var/list/data = preference_source?.extra_stat_inventory["unusual"][num] + var/item_path = text2path(data["unusual_type"]) + var/obj/item/new_item = new item_path(briefcase) + new_item.AddComponent(/datum/component/unusual_handler, data) briefcase.name = "[preference_source.read_preference(/datum/preference/name/real_name)]'s travel suitcase" equipOutfit(equipped_outfit, visuals_only) @@ -66,6 +76,16 @@ equipOutfit(equipped_outfit, visuals_only) + + for(var/num as anything in preference_source?.special_loadout_list["unusual"]) + var/list/data = preference_source?.extra_stat_inventory["unusual"][text2num(num)] + var/item_path = text2path(data["unusual_type"]) + var/obj/item/new_item = new item_path + new_item.AddComponent(/datum/component/unusual_handler, data) + if(!new_item.equip_to_best_slot(src)) + if(!put_in_hands(new_item)) + new_item.forceMove(get_turf(src)) + for(var/datum/loadout_item/item as anything in loadout_datums) if(istype(item, /datum/loadout_item/effects)) continue diff --git a/monkestation/code/modules/loafing/README.txt b/monkestation/code/modules/loafing/README.txt new file mode 100644 index 000000000000..cd5b1e842aae --- /dev/null +++ b/monkestation/code/modules/loafing/README.txt @@ -0,0 +1,41 @@ +## Title: + + +MODULE ID: LOAFING + +### Description: + +This module adds a loafing mechanic. + + + +### TG Proc/File Changes: + +changed /datum/component/edible/proc/TryToEat(mob/living/eater, mob/living/feeder) in edible.dm +changed _food.dm + + + + +### Defines: + + + + +### Master file additions + +- N/A + + +### Included files that are not contained in this module: + +- N/A + + +### Credits: + + + +Code and sprites done by Lmenvs. Concept from Goon. + + diff --git a/monkestation/code/modules/loafing/code/loaf.dm b/monkestation/code/modules/loafing/code/loaf.dm new file mode 100644 index 000000000000..fa6526876aaa --- /dev/null +++ b/monkestation/code/modules/loafing/code/loaf.dm @@ -0,0 +1,266 @@ +/obj/item/food/prison_loaf + name = "prison loaf" + desc = "A barely edible brick of nutrients, designed as a low-cost solution to malnourishment." + icon = 'monkestation/code/modules/loafing/icons/obj.dmi' + icon_state = "loaf" + food_reagents = list(/datum/reagent/consumable/nutraslop = 10) + var/loaf_density = 1 //base loaf density + var/can_condense = TRUE //for special loaves, make false + force_feed_on_aggression = TRUE + //vars for high level loafs + + var/critical = FALSE + var/atom/movable/warp_effect/warp + + + var/lifespan = ANOMALY_COUNTDOWN_TIMER //works similar to grav anomaly when hits critical + var/death_time + var/countdown_colour = COLOR_ASSEMBLY_LBLUE + var/obj/effect/countdown/loaf/countdown + var/boing = 0 + var/obj/singularity/singuloaf + +/obj/item/food/prison_loaf/process(seconds_per_tick) + anomalyEffect(seconds_per_tick) + if(death_time < world.time) + if(loc) + detonate() + qdel(src) + +/obj/item/food/prison_loaf/Destroy() + STOP_PROCESSING(SSobj, src) + QDEL_NULL(countdown) + vis_contents -= warp + warp = null + return ..() + +/obj/item/food/prison_loaf/proc/anomalyEffect(seconds_per_tick) + if(SPT_PROB(ANOMALY_MOVECHANCE, seconds_per_tick)) + step(src,pick(GLOB.alldirs)) + boing = 1 + for(var/obj/object in orange(4, src)) + if(!object.anchored) + step_towards(object,src) + for(var/mob/living/M in range(0, src)) + gravShock(M) + for(var/mob/living/M in orange(4, src)) + if(!M.mob_negates_gravity()) + step_towards(M,src) + for(var/obj/object in range(0,src)) + if(!object.anchored) + if(isturf(object.loc)) + var/turf/T = object.loc + if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE && HAS_TRAIT(object, TRAIT_T_RAY_VISIBLE)) + continue + var/mob/living/target = locate() in view(4,src) + if(target && !target.stat) + object.throw_at(target, 5, 10) + animate(warp, time = seconds_per_tick*3, transform = matrix().Scale(0.5,0.5)) + animate(time = seconds_per_tick*7, transform = matrix()) + +/obj/item/food/prison_loaf/proc/detonate() + var/turf/T = get_turf(src) + log_game("\A [src] critical loaf has ended its lifespan, turning into a singularity at [AREACOORD(T)].") + message_admins("A [src.name] critical loaf has ended its lifespan, turning into a singularity at [ADMIN_VERBOSEJMP(T)].") + + singuloaf = new /obj/singularity/(src) + singuloaf.loc = src.loc + return + +/obj/item/food/prison_loaf/on_changed_z_level(turf/old_turf, turf/new_turf, same_z_layer, notify_contents) + . = ..() + if(same_z_layer) + return + if(warp) + SET_PLANE(warp, PLANE_TO_TRUE(warp.plane), new_turf) + +/obj/item/food/prison_loaf/proc/on_entered(datum/source, atom/movable/AM) + SIGNAL_HANDLER + gravShock(AM) + +/obj/item/food/prison_loaf/Bump(atom/A) + if(critical) + gravShock(A) + else + return ..() + +/obj/item/food/prison_loaf/Bumped(atom/movable/AM) + if(critical) + gravShock(AM) + else + return ..() + +/obj/item/food/prison_loaf/proc/gravShock(mob/living/A) + if(boing && isliving(A) && !A.stat) + A.Paralyze(40) + var/atom/target = get_edge_target_turf(A, get_dir(src, get_step_away(A, src))) + A.throw_at(target, 5, 1) + boing = 0 + +/obj/item/food/prison_loaf/proc/critical() + src.critical = TRUE + var/turf/T = get_turf(src) + notify_ghosts("A [src] has been condensed to the point of criticality!", source=src, action=NOTIFY_ORBIT, header="Loaf Criticality!!") + log_game("\A [src] has been condensed to the point of criticality at [AREACOORD(T)].") + message_admins("A [src.name] has been condensed to the point of criticality at [ADMIN_VERBOSEJMP(T)].") + death_time = world.time + lifespan + warp = new(src) + vis_contents += warp + countdown = new(src) + if(countdown_colour) + countdown.color = countdown_colour + countdown.start() + can_condense = FALSE + START_PROCESSING(SSobj, src) + +/obj/effect/countdown/loaf + name = "singuloaf countdown" + +/obj/effect/countdown/loaf/get_value() + var/obj/item/food/prison_loaf/loaf = attached_to + if(!istype(loaf)) + return + else + var/time_left = max(0, (loaf.death_time - world.time) / 10) + return round(time_left) + +/obj/item/food/prison_loaf/rod + name = "rod loaf" + desc = "If you loaf something, set it free. If it comes back, it's yours." + icon_state = "rod_loaf" + can_condense = FALSE + +/obj/item/food/prison_loaf/rod/after_throw(datum/callback/callback) + . = ..() + var/startside = pick(GLOB.cardinals) + var/turf/end_turf = get_edge_target_turf(get_random_station_turf(), turn(startside, 180)) + var/turf/start_turf = get_turf(usr) + var/atom/rod = new /obj/effect/immovablerod/loaf(start_turf, end_turf) + notify_ghosts("[usr.name] has an object of interest: [rod]!", source=rod, action=NOTIFY_ORBIT, header="Something's Interesting!") + qdel(src) + +/obj/effect/immovablerod/loaf + name = "immovable loaf" + desc = "Oh no, the flavor is coming right for us!" + icon = 'monkestation/code/modules/loafing/icons/obj.dmi' + icon_state = "rod_loaf" + +/obj/machinery/power/supermatter_crystal/loaf + name = "suppermatter loaf" //you can't kill me for my bad puns. they make me immortal. + desc = "A prison loaf that has condensed and crystalized to the point where it can be used as a standard power source." + icon = 'monkestation/code/modules/loafing/icons/obj.dmi' + icon_state = "sm" + + + +/obj/item/food/prison_loaf/proc/condense() + if(!src.can_condense) + return + switch(src.loaf_density) + if(0 to 10) + src.name = initial(src.name) + src.desc = "A barely edible brick of nutrients, designed as a low-cost solution to malnourishment." + src.icon_state = initial(src.icon_state) + "0" + src.force = 0 + src.throwforce = 0 + src.reagents.add_reagent(/datum/reagent/consumable/salt, 1) + src.reagents.add_reagent(/datum/reagent/consumable/nutraslop, 1) + if(11 to 100) + src.name = "dense " + initial(src.name) + src.desc = initial(src.desc) + "\n This loaf is noticeably heavier than usual." + src.icon_state = initial(src.icon_state) + "0" + src.force = 2 + src.throwforce = 2 + src.reagents.add_reagent(/datum/reagent/consumable/salt, 3) + src.reagents.add_reagent(/datum/reagent/consumable/nutraslop, 3) + if(101 to 250) + src.name = "compacted " + initial(src.name) + src.desc = initial(src.desc) + "\n Hooh, this thing packs a punch. What are they putting into these?" + src.icon_state = initial(src.icon_state) + "0" + src.force = 4 + src.throwforce = 4 + src.throw_range = 6 + src.reagents.add_reagent(/datum/reagent/consumable/salt, 5) + src.reagents.add_reagent(/datum/reagent/consumable/nutraslop, 5) + if(251 to 500) + src.name = "super-compressed " + initial(src.name) + src.desc = initial(src.desc) + "\n Hard enough to scratch a diamond, yet still somehow edible,\n this loaf seems to be emitting decay heat. Dear god." + src.icon_state = initial(src.icon_state) + "1" + src.force = 5 + src.throwforce = 5 + src.throw_range = 6 + src.reagents.add_reagent(/datum/reagent/consumable/salt, 8) + src.reagents.add_reagent(/datum/reagent/consumable/nutraslop, 8) + if(501 to 2500) + src.name = "molecular " + initial(src.name) + src.desc = initial(src.desc) + "\n The loaf has become so dense that no food particulates are visible to the naked eye." + src.icon_state = initial(src.icon_state) + "2" + src.force = 10 + src.throwforce = 10 + src.throw_range = 5 + src.reagents.add_reagent(/datum/reagent/consumable/salt, 10) + src.reagents.add_reagent(/datum/reagent/consumable/nutraslop, 10) + src.reagents.add_reagent(/datum/reagent/consumable/corn_syrup, 5) + if(2501 to 10000) + src.name = "atomic " + initial(src.name) + src.desc = initial(src.desc) + "\n Forget food particulates, the loaf is now comprised of flavor atoms." + src.icon_state = initial(src.icon_state) + "3" + src.force = 20 + src.throwforce = 20 + src.throw_range = 4 + src.reagents.add_reagent(/datum/reagent/consumable/salt, 10) + src.reagents.add_reagent(/datum/reagent/consumable/nutraslop, 10) + src.reagents.add_reagent(/datum/reagent/growthserum, 5) + if(10001 to 25000) + src.name = "sub atomic " + initial(src.name) + src.desc = initial(src.desc) + "\n Oh good, the flavor atoms in this prison loaf have collapsed down to a a solid lump of neutrons. Eating this could prove dangerous." + src.icon_state = initial(src.icon_state) + "4" + src.force = 30 + src.throwforce = 30 + src.throw_range = 3 + src.reagents.add_reagent(/datum/reagent/consumable/salt, 10) + src.reagents.add_reagent(/datum/reagent/consumable/nutraslop, 10) + src.reagents.add_reagent(/datum/reagent/consumable/vitfro, 25) + if(25001 to 50000) + src.name = "quark " + initial(src.name) + src.desc = initial(src.desc) + "\n This nutritional loaf is collapsing into subatomic flavor particles. Consuption could convert your DNA into synthetic sludge." + src.icon_state = initial(src.icon_state) + "5" + src.force = 50 + src.throwforce = 50 + src.throw_range = 2 + src.reagents.add_reagent(/datum/reagent/consumable/salt, 10) + src.reagents.add_reagent(/datum/reagent/consumable/nutraslop, 10) + src.reagents.add_reagent(/datum/reagent/mulligan, 25) + if(50001 to 100000) + src.name = "strangelet " + initial(src.name) + src.desc = initial(src.desc) + "\n At this point you may be considering: has man gone too far? Are we meant to have food this powerful?" + src.icon_state = initial(src.icon_state) + "6" + src.force = 75 + src.throwforce = 75 + src.throw_range = 1 + src.reagents.add_reagent(/datum/reagent/consumable/salt, 10) + src.reagents.add_reagent(/datum/reagent/consumable/nutraslop, 10) + src.reagents.add_reagent(/datum/reagent/cyborg_mutation_nanomachines, 50) + if(100001 to 1000000) + src.name = "quantum " + initial(src.name) + src.desc = initial(src.desc) + "\n The mere existence of this nutritional masterpiece is causing reality to distort!" + src.icon_state = initial(src.icon_state) + "7" + src.force = 100 + src.throwforce = 100 + src.throw_range = 0 + src.reagents.add_reagent(/datum/reagent/consumable/salt, 10) + src.reagents.add_reagent(/datum/reagent/consumable/nutraslop, 10) + src.reagents.add_reagent(/datum/reagent/gravitum, 100) + critical() + + +/datum/export/food/loaf + cost = 10 + unit_name = "loaf" + message = "of Nutraloaf" + export_types = list(/obj/item/food/prison_loaf) + +/datum/export/food/loaf/get_cost(obj/O) + var/obj/item/food/prison_loaf/loaf = O + cost = max(10, loaf.loaf_density / 5) + return ..() diff --git a/monkestation/code/modules/loafing/code/loafer.dm b/monkestation/code/modules/loafing/code/loafer.dm new file mode 100644 index 000000000000..b74221e3dc5e --- /dev/null +++ b/monkestation/code/modules/loafing/code/loafer.dm @@ -0,0 +1,114 @@ +/obj/structure/disposalpipe/loafer + name = "loafing device" + desc = "A prisoner feeding device that condenses matter into an Ultra Delicious(tm) nutrition bar!" + icon = 'monkestation/code/modules/loafing/icons/obj.dmi' + icon_state = "loafer" + var/is_loafing = FALSE + var/list/loaf_blacklist = list(/obj/item/organ/internal/brain, /obj/item/bodypart/head) + +/obj/structure/disposalpipe/loafer/transfer(obj/structure/disposalholder/holder) + if(is_loafing) + return src + //check if there's anything in there + if (holder.contents.len) + //start playing sound + is_loafing = TRUE + src.icon_state = "loafer-on" + src.update_appearance() + playsound(src, 'monkestation/code/modules/loafing/sound/loafer.ogg', 100, 1, mixer_channel = CHANNEL_MACHINERY) + + //create new loaf + var/obj/item/food/prison_loaf/loaf = new /obj/item/food/prison_loaf(src) + + //add all the garbage to the loaf's contents + for (var/atom/movable/debris in holder) + if(debris.resistance_flags & INDESTRUCTIBLE || (debris.type in loaf_blacklist)) + if(holder.contents.len > 1) + continue + else + loaf = null + src.icon_state = "loafer" + is_loafing = FALSE + return transfer_to_dir(holder, nextdir(holder)) + if(debris.reagents)//the object has reagents + debris.reagents.trans_to(loaf, 1000) + if(istype(debris, /obj/item/food/prison_loaf))//the object is a loaf, compress somehow + var/obj/item/food/prison_loaf/loaf_to_grind = debris + loaf.loaf_density += loaf_to_grind.loaf_density * 1.05 + loaf_to_grind = null + else if(isliving(debris)) + var/mob/living/victim = debris + //different mobs add different reagents + if(issilicon(victim)) + loaf.reagents.add_reagent(/datum/reagent/fuel, 10) + loaf.reagents.add_reagent(/datum/reagent/iron, 10) + else + loaf.reagents.add_reagent(/datum/reagent/bone_dust, 3) + loaf.reagents.add_reagent(/datum/reagent/ammonia/urine, 2) + loaf.reagents.add_reagent(/datum/reagent/consumable/liquidgibs, 2) + loaf.reagents.add_reagent(/datum/reagent/consumable/nutriment/organ_tissue, 2) + //then we give the loaf more power + if(ishuman(victim)) + loaf.loaf_density += 25 + else + loaf.loaf_density += 10 + if(!isdead(victim)) + victim.emote("scream") + victim.gib() + if(victim.mind || victim.client) + victim.ghostize(FALSE) + else if (istype(debris, /obj/item))//everything else + var/obj/item/kitchen_sink = debris + var/weight = kitchen_sink.w_class + loaf.loaf_density += weight * 3 + holder.contents -= debris + qdel(debris) + + sleep(3 SECONDS) + + //condense the loaf + loaf.condense() + //place the loaf + loaf.forceMove(holder) + holder.contents += loaf + is_loafing = FALSE + src.icon_state = "loafer" + return transfer_to_dir(holder, nextdir(holder)) + +/obj/structure/disposalpipe/loafer/deconstruct(disassembled = TRUE) + if(!(flags_1 & NODECONSTRUCT_1)) + if(disassembled) + if(stored) + stored.forceMove(loc) + transfer_fingerprints_to(stored) + stored.setDir(dir) + stored = null + else + var/turf/T = get_turf(src) + for(var/D in GLOB.cardinals) + if(D & dpdir) + var/obj/structure/disposalpipe/broken/P = new(T) + P.setDir(D) + spew_forth() + qdel(src) + +/obj/structure/disposalconstruct/loafer + name = "loafing device" + desc = "A prisoner feeding device that condenses matter into an Ultra Delicious(tm) nutrition bar!" + icon = 'monkestation/code/modules/loafing/icons/obj.dmi' + icon_state = "conloafer" + pipe_type = /obj/structure/disposalpipe/loafer + + +//spawning + +/obj/effect/spawner/random/loafer + name = "loafer spawner" + spawn_scatter_radius = 5 + spawn_loot_chance = 20 + layer = DISPOSAL_PIPE_LAYER + +/obj/effect/spawner/random/loafer/Initialize(mapload) + loot = list( + /obj/structure/disposalpipe/loafer/) + return ..() diff --git a/monkestation/code/modules/loafing/icons/obj.dmi b/monkestation/code/modules/loafing/icons/obj.dmi new file mode 100644 index 000000000000..8fedcae132d5 Binary files /dev/null and b/monkestation/code/modules/loafing/icons/obj.dmi differ diff --git a/monkestation/code/modules/loafing/sound/loafer.ogg b/monkestation/code/modules/loafing/sound/loafer.ogg new file mode 100644 index 000000000000..4ce15e80e60b Binary files /dev/null and b/monkestation/code/modules/loafing/sound/loafer.ogg differ diff --git a/monkestation/code/modules/mapping/access_helpers.dm b/monkestation/code/modules/mapping/access_helpers.dm new file mode 100644 index 000000000000..e1f00e361b73 --- /dev/null +++ b/monkestation/code/modules/mapping/access_helpers.dm @@ -0,0 +1,14 @@ +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen/east_offset + offset_dir = EAST + +/obj/effect/mapping_helpers/airlock/access/all/service/theatre/east_offset + offset_dir = EAST + +/obj/effect/mapping_helpers/airlock/access/all/service/bar/west_offset + offset_dir = WEST + +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/east_offset + offset_dir = EAST + +/obj/effect/mapping_helpers/airlock/access/any/engineering/maintenance/west_offset + offset_dir = WEST diff --git a/monkestation/code/modules/mapping/mapping_helpers.dm b/monkestation/code/modules/mapping/mapping_helpers.dm new file mode 100644 index 000000000000..0b464f77a218 --- /dev/null +++ b/monkestation/code/modules/mapping/mapping_helpers.dm @@ -0,0 +1,52 @@ +/obj/effect/mapping_helpers + //used for modular maps, if you find this var not working check if its implimented for the helper type your trying to use + ///If set then what dir should we offset our effect by one tile to, effect must be set for each helper type + var/offset_dir + +//mapping helper to set the base_lighting_alpha and base_lighting_color of an area +/obj/effect/area_lighting_helper + name = "area lighting helper" + icon = 'icons/effects/mapping_helpers.dmi' + icon_state = "" + plane = POINT_PLANE + ///What do we want to set lighting level to + var/set_alpha = 200 + ///What do we want to set the color to + var/set_color = COLOR_WHITE + +/obj/effect/area_lighting_helper/Initialize(mapload) + . = ..() + return INITIALIZE_HINT_LATELOAD + +/obj/effect/area_lighting_helper/LateInitialize() + var/area/our_area = get_area(src) + our_area?.set_base_lighting(set_color, set_alpha) + qdel(src) + +/obj/effect/area_lighting_helper/max_alpha + set_alpha = 255 + +/obj/effect/area_lighting_helper/max_alpha_blue + set_color = COLOR_BLUE_LIGHT + set_alpha = 255 + +//mapping helper to set the requires_power var of an area +/obj/effect/area_power_helper + name = "area power helper" + icon = 'icons/mob/huds/hud.dmi' + icon_state = "electrified" + plane = POINT_PLANE + ///what we requires_power to + var/set_state = FALSE + +/obj/effect/area_power_helper/Initialize(mapload) + . = ..() + return INITIALIZE_HINT_LATELOAD + +/obj/effect/area_power_helper/LateInitialize() + var/area/our_area = get_area(src) + our_area?.requires_power = set_state + qdel(src) + +/obj/effect/area_power_helper/requires_power + set_state = TRUE diff --git a/monkestation/code/modules/mech_comp/vending_machine.dm b/monkestation/code/modules/mech_comp/vending_machine.dm index 82fdecef5f66..35293de5ff7b 100644 --- a/monkestation/code/modules/mech_comp/vending_machine.dm +++ b/monkestation/code/modules/mech_comp/vending_machine.dm @@ -40,6 +40,7 @@ /obj/item/mcobject/messaging/storage = STANDARD_COMPONENT_SUPPLY, /obj/item/mcobject/messaging/type_sensor = STANDARD_COMPONENT_SUPPLY, /obj/item/mcobject/messaging/clock = STANDARD_COMPONENT_SUPPLY, + /obj/item/mcobject/messaging/repeater = LOW_COMPONENT_SUPPLY ) diff --git a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/floran_leaves.dm b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/floran_leaves.dm new file mode 100644 index 000000000000..6f7e85ee8fe1 --- /dev/null +++ b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/floran_leaves.dm @@ -0,0 +1,24 @@ +/datum/sprite_accessory/floran_leaves + icon = 'monkestation/icons/mob/species/floran/floran_leaves.dmi' + color_src = MUTCOLORS_SECONDARY + //Should be MUTCOLORS_SECONDARY, but while its not working it will be the inverse of MUTCOLORS + +/datum/sprite_accessory/floran_leaves/furnivour + name = "Furnivour" + icon_state = "furnivour" + +/datum/sprite_accessory/floran_leaves/leaf + name = "Leaf" + icon_state = "leaf" + +/datum/sprite_accessory/floran_leaves/pelt + name = "Pelt" + icon_state = "pelt" + +/datum/sprite_accessory/floran_leaves/savage + name = "Savage" + icon_state = "savage" + +/datum/sprite_accessory/floran_leaves/survivalist + name = "Survivalist" + icon_state = "survivalist" diff --git a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/hair.dm b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/hair.dm index a1642c2f7ddf..be308550f137 100644 --- a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/hair.dm +++ b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/hair.dm @@ -85,7 +85,18 @@ icon = 'monkestation/icons/mob/sprite_accessories/hair.dmi' name = "Mullet" icon_state = "hair_mullet" + /datum/sprite_accessory/hair/long_messy icon = 'monkestation/icons/mob/sprite_accessories/hair.dmi' name = "Long and Messy" icon_state = "long_messy" + +/datum/sprite_accessory/hair/monkeyking + icon = 'monkestation/icons/mob/sprite_accessories/hair.dmi' + name = "Monkey king" + icon_state = "monkey_king" + +/datum/sprite_accessory/hair/edgerunner + icon = 'monkestation/icons/mob/sprite_accessories/hair.dmi' + name = "Edgerunner" + icon_state = "edgerunner" \ No newline at end of file diff --git a/monkestation/code/modules/mob/living/basic/animatronic.dm b/monkestation/code/modules/mob/living/basic/animatronic.dm index 25f72a165e24..daf153b2b5e2 100644 --- a/monkestation/code/modules/mob/living/basic/animatronic.dm +++ b/monkestation/code/modules/mob/living/basic/animatronic.dm @@ -116,7 +116,7 @@ carbon_pulled.adjustOrganLoss(ORGAN_SLOT_BRAIN, 150, 150) //large amount of brain damage but it will never give you brain death carbon_pulled.apply_damage(150, BRUTE, HEAD) else - pulled.apply_damage_type(150, BRUTE) + pulled.apply_damage(150, BRUTE) if(pulled.client && !killed_list[pulled]) killed_list[pulled] = TRUE @@ -130,7 +130,7 @@ if(blood_hunger) . += "It's glaring at you." -/mob/living/basic/monkey_animatronic/melee_attack(atom/target, list/modifiers) +/mob/living/basic/monkey_animatronic/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE) . = ..() var/mob/living/living_target = target if(!istype(living_target)) @@ -162,7 +162,7 @@ /datum/ai_controller/basic_controller/animatronic blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_LOW_PRIORITY_HUNTING_TARGET = null, ) diff --git a/monkestation/code/modules/mob/living/basic/ggg/glerm.dm b/monkestation/code/modules/mob/living/basic/ggg/glerm.dm new file mode 100644 index 000000000000..b01035299249 --- /dev/null +++ b/monkestation/code/modules/mob/living/basic/ggg/glerm.dm @@ -0,0 +1,76 @@ +/mob/living/basic/ggg/glerm + name = "\improper glerm" + desc = "A little guy. Seems to be glerming." + icon = 'monkestation/icons/mob/ggg/glerm.dmi' + icon_state = "glerm" + icon_living = "glerm" + icon_dead = "glerm_dead" + + gender = NEUTER + mob_biotypes = MOB_ORGANIC + pass_flags = PASSTABLE|PASSGRILLE|PASSMOB + mob_size = MOB_SIZE_SMALL + held_w_class = WEIGHT_CLASS_TINY + gold_core_spawnable = FRIENDLY_SPAWN + + response_help_continuous = "nuzzles" + response_help_simple = "nuzzle" + response_disarm_continuous = "bonks" + response_disarm_simple = "bonk" + attack_verb_continuous = "chomps" + attack_verb_simple = "chomp" + attack_vis_effect = ATTACK_EFFECT_BITE + + maxHealth = 25 + health = 25 + + speak_emote = list("glurps") + death_message = "stops glerming for good." + + melee_damage_lower = 1 + melee_damage_upper = 1 + + ai_controller = /datum/ai_controller/basic_controller/dog + +/mob/living/basic/ggg/glerm/cool + name = "\improper cool glerm" + desc = "A cool little guy. Seems to be glerming harder than the rest." + icon = 'monkestation/icons/mob/ggg/glerm.dmi' + icon_state = "glerm_cool" + icon_living = "glerm_cool" + icon_dead = "glerm_cool_dead" + gold_core_spawnable = NO_SPAWN + +/mob/living/basic/ggg/glerm/cool/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) + . = ..() + playsound(src, 'sound/vehicles/skateboard_roll.ogg', 50, TRUE) + +/mob/living/basic/ggg/glerm/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + +/obj/item/choice_beacon/pet/donator/glerm + name = "Glerm" + default_name = "Bingus" + company_source = "Glerm Industries LLC" + company_message = "Be sure to feed your glerm." + donator_pet = /mob/living/basic/ggg/glerm + +/obj/item/choice_beacon/pet/donator/coolglerm + name = "Cool Glerm" + default_name = "Cool Bingus" + company_source = "Glerm Industries LLC" + company_message = "Be sure to feed your cool glerm premium glerm food." + donator_pet = /mob/living/basic/ggg/glerm/cool + +/datum/loadout_item/pocket_items/donator/glerm + name = "Pet Delivery Beacon - Glerm" + item_path = /obj/item/choice_beacon/pet/donator/glerm + donator_only = FALSE + requires_purchase = TRUE + +/datum/loadout_item/pocket_items/donator/coolglerm + name = "Pet Delivery Beacon - Cool Glerm" + item_path = /obj/item/choice_beacon/pet/donator/coolglerm + donator_only = TRUE + requires_purchase = FALSE diff --git a/monkestation/code/modules/mob/living/basic/ggg/susflash.dm b/monkestation/code/modules/mob/living/basic/ggg/susflash.dm new file mode 100644 index 000000000000..2a0430f3d05a --- /dev/null +++ b/monkestation/code/modules/mob/living/basic/ggg/susflash.dm @@ -0,0 +1,61 @@ +/mob/living/basic/ggg/susflash + name = "suspicious flash" + desc = "A powerful and versatile flashbulb device, with applications ranging from disorienting attackers to acting as visual receptors in robot production. This one has legs for some reason..." + icon = 'monkestation/icons/mob/ggg/susflash.dmi' + icon_state = "flash_living" + icon_living = "flash_living" + icon_dead = "flash_dead" + gender = NEUTER + //istate = ISTATE_HARM|ISTATE_BLOCKING + mob_biotypes = MOB_ROBOTIC + density = FALSE + pass_flags = PASSTABLE|PASSGRILLE|PASSMOB + mob_size = MOB_SIZE_TINY + held_w_class = WEIGHT_CLASS_TINY + gold_core_spawnable = NO_SPAWN + can_be_held = FALSE //Will be changed when I make a sprite + // attacked_sound = "" + // death_sound = "" + + response_help_continuous = "nuzzles" + response_help_simple = "nuzzle" + response_disarm_continuous = "bonks" + response_disarm_simple = "bonk" + + maxHealth = 25 + health = 25 + melee_damage_lower = 1 + melee_damage_upper = 1 + // speed = 3 + attack_verb_continuous = "spooks" + attack_verb_simple = "spook" + attack_vis_effect = ATTACK_EFFECT_SLASH + + speak_emote = list("muffles") + death_message = "'s head falls off." + unsuitable_atmos_damage = 0 + unsuitable_cold_damage = 0 + unsuitable_heat_damage = 0 + + lighting_cutoff_red = 15 + lighting_cutoff_green = 10 + lighting_cutoff_blue = 25 + + ai_controller = /datum/ai_controller/basic_controller/mouse + +/mob/living/basic/ggg/susflash/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) + +/obj/item/choice_beacon/pet/donator/susflash + name = "Ordinary Flash Bulb" + default_name = "suspicious flash" + company_source = "Saturnian United Systems" + company_message = "Here is your completely ordinary flash bulb." + donator_pet = /mob/living/basic/ggg/susflash + +/datum/loadout_item/pocket_items/donator/susflash + name = "Pet Delivery Beacon - Ordinary Flash Bulb" + item_path = /obj/item/choice_beacon/pet/donator/susflash + donator_only = TRUE + requires_purchase = FALSE diff --git a/monkestation/code/modules/mob/living/carbon/human/lizard_gags.dm b/monkestation/code/modules/mob/living/carbon/human/lizard_gags.dm new file mode 100644 index 000000000000..d85a75940767 --- /dev/null +++ b/monkestation/code/modules/mob/living/carbon/human/lizard_gags.dm @@ -0,0 +1,10 @@ +/obj/item + var/datum/greyscale_config/greyscale_config_worn_lizard_fallback + +/obj/item/clothing/shoes + species_clothing_color_coords = list(list(UNDER_COLORPIXEL_X_1, UNDER_COLORPIXEL_Y_1), list(UNDER_COLORPIXEL_X_2, UNDER_COLORPIXEL_Y_2)) + greyscale_config_worn_lizard_fallback = /datum/greyscale_config/lizard/shoes + +/obj/item/clothing/under + species_clothing_color_coords = list(list(UNDER_COLORPIXEL_X_1, UNDER_COLORPIXEL_Y_1), list(UNDER_COLORPIXEL_X_2, UNDER_COLORPIXEL_Y_2)) + greyscale_config_worn_lizard_fallback = /datum/greyscale_config/lizard/under diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/arachnid.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/arachnid.dm index 2c3989352131..d6860598873e 100644 --- a/monkestation/code/modules/mob/living/carbon/human/species_type/arachnid.dm +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/arachnid.dm @@ -39,10 +39,19 @@ return TRUE return ..() -/datum/species/arachnid/check_species_weakness(obj/item/weapon, mob/living/attacker) - if(istype(weapon, /obj/item/melee/flyswatter)) - return 30 //flyswatters deal 30x damage to arachnids - return 1 +/datum/species/arachnid/on_species_gain(mob/living/carbon/human/human_who_gained_species, datum/species/old_species, pref_load) + . = ..() + RegisterSignal(human_who_gained_species, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, PROC_REF(damage_weakness)) + +/datum/species/arachnid/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) + . = ..() + UnregisterSignal(C, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS) + +/datum/species/arachnid/proc/damage_weakness(datum/source, list/damage_mods, damage_amount, damagetype, def_zone, sharpness, attack_direction, obj/item/attacking_item) + SIGNAL_HANDLER + + if(istype(attacking_item, /obj/item/melee/flyswatter)) + damage_mods += 30 // Yes, a 30x damage modifier /datum/species/arachnid/get_scream_sound(mob/living/carbon/human/human) return 'monkestation/sound/voice/screams/arachnid/arachnid_scream.ogg' diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/floran.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/floran.dm new file mode 100644 index 000000000000..529b5838cf5d --- /dev/null +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/floran.dm @@ -0,0 +1,149 @@ +/datum/species/floran + name = "\improper Floran" + plural_form = "Florans" + id = SPECIES_FLORAN + sexes = FALSE + species_traits = list( + MUTCOLORS, + MUTCOLORS_SECONDARY, + NO_UNDERWEAR, + ) + inherent_traits = list( + TRAIT_PLANT_SAFE, + TRAIT_NO_JUMPSUIT, + ) + external_organs = list( + /obj/item/organ/external/pod_hair = "None", + /obj/item/organ/external/floran_leaves = "Furnivour", + ) + inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_PLANT + inherent_factions = list(FACTION_PLANTS, FACTION_VINES) + burnmod = 1.8 + heatmod = 0.67 //Same as lizard people + coldmod = 1.5 //Same as lizard people + speedmod = -0.1 //Same as arachnids + payday_modifier = 0.75 + meat = /obj/item/food/meat/slab/human/mutant/plant + exotic_blood = /datum/reagent/water + // disliked_food = VEGETABLES | FRUIT | GRAIN + liked_food = MEAT | BUGS | GORE + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + species_language_holder = /datum/language_holder/plant + + bodypart_overrides = list( + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/floran, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/floran, + BODY_ZONE_HEAD = /obj/item/bodypart/head/floran, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/floran, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/floran, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/floran, + ) + mutanttongue = /obj/item/organ/internal/tongue/lizard + mutanteyes = /obj/item/organ/internal/eyes/floran + + ass_image = 'icons/ass/asspodperson.png' + +/datum/species/floran/spec_life(mob/living/carbon/human/H, seconds_per_tick, times_fired) + if(H.stat == DEAD) + return + + var/light_amount = 0 + if(isturf(H.loc)) + var/turf/T = H.loc + light_amount = min(1, T.get_lumcount()) - 0.5 + if(light_amount > 0.3) + H.heal_overall_damage(brute = 0.5 * seconds_per_tick, burn = 0.5 * seconds_per_tick, required_bodytype = BODYTYPE_ORGANIC) //Lowered to 0.25 + H.adjustToxLoss(-0.5 * seconds_per_tick) + H.adjustOxyLoss(-0.5 * seconds_per_tick) + +/datum/species/floran/on_species_gain(mob/living/carbon/new_floran, datum/species/old_species, pref_load) + . = ..() + if(ishuman(new_floran)) + update_mail_goodies(new_floran) + +/datum/species/floran/update_quirk_mail_goodies(mob/living/carbon/human/recipient, datum/quirk/quirk, list/mail_goodies = list()) + if(istype(quirk, /datum/quirk/blooddeficiency)) + mail_goodies += list( + /obj/item/reagent_containers/blood/podperson + ) + return ..() + +/datum/species/floran/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, seconds_per_tick, times_fired) + if(chem.type == /datum/reagent/toxin/plantbgone) + H.adjustToxLoss(3 * REM * seconds_per_tick) + H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * seconds_per_tick) + return TRUE + if(chem.type == /datum/reagent/potassium) //Floran "blood" is water, water does not like potassium + to_chat(H, span_danger("You feel your skin bubble and pop painfully!")) + H.adjustBruteLoss(10*REM, FALSE) + return TRUE + return ..() + +/datum/species/floran/randomize_features(mob/living/carbon/human_mob) + randomize_external_organs(human_mob) + +/datum/species/floran/get_scream_sound(mob/living/carbon/human/human) + return pick( + 'sound/voice/lizard/lizard_scream_1.ogg', + 'sound/voice/lizard/lizard_scream_2.ogg', + 'sound/voice/lizard/lizard_scream_3.ogg', + 'monkestation/sound/voice/screams/lizard/lizard_scream_5.ogg', + ) + +/datum/species/floran/get_laugh_sound(mob/living/carbon/human/human) + return 'monkestation/sound/voice/laugh/lizard/lizard_laugh.ogg' + +/datum/species/floran/get_species_description() + return "Plant-based humanoids, they are extremely violent carnivores with no central government or power structure, \ + split into numerous tribes spread across the universe, each led by a Greenfinger. \ + Though they are biologically a single-sex race, they may adapt sexually dimorphic physical traits and male/female identities if they so choose. \ + Their speech is often simplistic, and they tend to hisss their sibilantsss. \ + Their primary drives are hunting, acquiring trophies, fighting, eating meat, and more hunting. \ + It is speculated that their general casual view towards killing and consuming other intelligent species stems from not viewing \"meat\" as \"alive\" in \ + the same sense they are. However, as the Floran spread throughout the galaxy, more and more individuals are recognizing a need to integrate, \ + make friends, and maybe not stab anyone that slightly inconveniences them. (E.I. THIS IS NOT AN EXCUSE TO RDM)" + +/datum/species/floran/create_pref_unique_perks() + var/list/to_add = list() + + to_add += list( + list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = "", + SPECIES_PERK_NAME = "Carnivore", + SPECIES_PERK_DESC = "As a vicious carnivore, your claws do more damage to your prey.", + ), + list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = "", + SPECIES_PERK_NAME = "Photosynthesis", + SPECIES_PERK_DESC = "Your green skin slowly heals itself while it is illuminated.", + ), + list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = "", + SPECIES_PERK_NAME = "Flammable Skin", + SPECIES_PERK_DESC = "Your flammable skin is highly susceptible to burn damage.", + ), + ) + + return to_add + + +/obj/item/organ/external/floran_leaves + name = "floran leaves" + desc = "you shouldn't see this" + organ_flags = ORGAN_UNREMOVABLE + icon_state = "floran_leaves" + icon = 'monkestation/icons/obj/medical/organs/organs.dmi' + + preference = "feature_floran_leaves" + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_EXTERNAL_FLORAN_LEAVES + + use_mob_sprite_as_obj_sprite = TRUE + bodypart_overlay = /datum/bodypart_overlay/mutant/floran_leaves + +/datum/bodypart_overlay/mutant/floran_leaves + layers = EXTERNAL_ADJACENT + feature_key = "floran_leaves" diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/lizardpeople.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/lizardpeople.dm index 0ebbe6f6b119..f3efd0b7c62b 100644 --- a/monkestation/code/modules/mob/living/carbon/human/species_type/lizardpeople.dm +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/lizardpeople.dm @@ -18,3 +18,17 @@ if(prob(1)) return 'monkestation/sound/voice/weh.ogg' return 'monkestation/sound/voice/laugh/lizard/lizard_laugh.ogg' + +/datum/species/lizard/get_custom_worn_config_fallback(item_slot, obj/item/item) + + return item.greyscale_config_worn_lizard_fallback + +/datum/species/lizard/generate_custom_worn_icon(item_slot, obj/item/item) + . = ..() + if(.) + return + + // Use the fancy fallback sprites. + . = generate_custom_worn_icon_fallback(item_slot, item) + if(.) + return diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/oozeling.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/oozeling.dm index ba6cfcff9ff4..8fd7d2370bb0 100644 --- a/monkestation/code/modules/mob/living/carbon/human/species_type/oozeling.dm +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/oozeling.dm @@ -20,6 +20,7 @@ hair_color = "mutcolor" hair_alpha = 150 mutantlungs = /obj/item/organ/internal/lungs/oozeling + mutanttongue = /obj/item/organ/internal/tongue/oozeling meat = /obj/item/food/meat/slab/human/mutant/slime exotic_blood = /datum/reagent/toxin/slimeooze var/datum/action/innate/regenerate_limbs/regenerate_limbs diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/simian.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/simian.dm index 41a83238d5c8..5f4a06feda33 100644 --- a/monkestation/code/modules/mob/living/carbon/human/species_type/simian.dm +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/simian.dm @@ -8,7 +8,8 @@ species_traits = list( EYECOLOR, LIPS, - NO_UNDERWEAR + NO_UNDERWEAR, + SPECIES_FUR, ) inherent_traits = list( TRAIT_VAULTING, @@ -17,7 +18,6 @@ ) use_skintones = FALSE - use_fur = TRUE inherent_biotypes = list( MOB_ORGANIC, @@ -30,6 +30,7 @@ skinned_type = /obj/item/stack/sheet/animalhide/monkey disliked_food = GROSS liked_food = FRUIT | MEAT + uses_fur = TRUE //deathsound = 'monkestation/sound/voice/simian/deathsound.ogg' species_language_holder = /datum/language_holder/monkey maxhealthmod = 0.85 //small = weak diff --git a/monkestation/code/modules/mob/living/simple_animal/megafauna/wendigo.dm b/monkestation/code/modules/mob/living/simple_animal/megafauna/wendigo.dm new file mode 100644 index 000000000000..6cd736df4b14 --- /dev/null +++ b/monkestation/code/modules/mob/living/simple_animal/megafauna/wendigo.dm @@ -0,0 +1,56 @@ +#define WENDIGO_ENRAGED (health <= maxHealth*0.5) +#define WENDIGO_CIRCLE_SHOTCOUNT 24 +#define WENDIGO_CIRCLE_REPEATCOUNT 8 +#define WENDIGO_SPIRAL_SHOTCOUNT 40 + +/* + +Difficulty: Medium + +This is a monkestation override for wendigo + +*/ + +/mob/living/simple_animal/hostile/megafauna/wendigo/monkestation_override + name = "malnurished wendigo" + desc = "A mythological man-eating legendary creature, the sockets of it's eyes track you with an unsatiated hunger. \ + This one seems highly malnurished, it will probably be easier to fight" + + stomp_range = 0 + scream_cooldown_time = 5 SECONDS + +// Overriding this proc so we can remove the "wave" attack without touching any original code +/mob/living/simple_animal/hostile/megafauna/wendigo/monkestation_override/spiral_attack() + var/list/choices = list("Alternating Circle", "Spiral") + var/spiral_type = pick(choices) + switch(spiral_type) + if("Alternating Circle") + var/shots_per = WENDIGO_CIRCLE_SHOTCOUNT + for(var/shoot_times in 1 to WENDIGO_CIRCLE_REPEATCOUNT) + var/offset = shoot_times % 2 + for(var/shot in 1 to shots_per) + var/angle = shot * 360 / shots_per + (offset * 360 / shots_per) * 0.5 + var/obj/projectile/colossus/wendigo_shockwave/shockwave = new /obj/projectile/colossus/wendigo_shockwave(loc) + shockwave.firer = src + shockwave.speed = 3 - WENDIGO_ENRAGED + shockwave.fire(angle) + SLEEP_CHECK_DEATH(6 - WENDIGO_ENRAGED * 2, src) + if("Spiral") + var/shots_spiral = WENDIGO_SPIRAL_SHOTCOUNT + var/angle_to_target = get_angle(src, target) + var/spiral_direction = pick(-1, 1) + for(var/shot in 1 to shots_spiral) + var/shots_per_tick = 5 - WENDIGO_ENRAGED * 3 + var/angle_change = (5 + WENDIGO_ENRAGED * shot / 6) * spiral_direction + for(var/count in 1 to shots_per_tick) + var/angle = angle_to_target + shot * angle_change + count * 360 / shots_per_tick + var/obj/projectile/colossus/wendigo_shockwave/shockwave = new /obj/projectile/colossus/wendigo_shockwave(loc) + shockwave.firer = src + shockwave.damage = 15 + shockwave.fire(angle) + SLEEP_CHECK_DEATH(1, src) + +#undef WENDIGO_ENRAGED +#undef WENDIGO_CIRCLE_SHOTCOUNT +#undef WENDIGO_CIRCLE_REPEATCOUNT +#undef WENDIGO_SPIRAL_SHOTCOUNT diff --git a/monkestation/code/modules/mob/living/simple_animal/pets/honk_platinum.dm b/monkestation/code/modules/mob/living/simple_animal/pets/honk_platinum.dm index b1a2ee5c9770..7d6f144d642d 100644 --- a/monkestation/code/modules/mob/living/simple_animal/pets/honk_platinum.dm +++ b/monkestation/code/modules/mob/living/simple_animal/pets/honk_platinum.dm @@ -1,5 +1,5 @@ -/mob/living/simple_animal/parrot/honk_platinum +/mob/living/basic/parrot/honk_platinum name = "Honk Platinum" icon = 'monkestation/icons/mob/pets.dmi' desc = "The goodest birb." @@ -7,7 +7,6 @@ icon_living = "honk_fly" icon_sit = "honk_sit" icon_dead = "honk_dead" - speak = list("FUCK?","HONK!","Law?","Crime.") head_icon = 'monkestation/icons/mob/pets_held.dmi' held_lh = 'monkestation/icons/mob/pets_held_lh.dmi'//icons for holding mobs held_rh = 'monkestation/icons/mob/pets_held_rh.dmi' diff --git a/monkestation/code/modules/modular_bartending/garnishes/crafting_recipes.dm b/monkestation/code/modules/modular_bartending/garnishes/crafting_recipes.dm new file mode 100644 index 000000000000..9525955b59f3 --- /dev/null +++ b/monkestation/code/modules/modular_bartending/garnishes/crafting_recipes.dm @@ -0,0 +1,29 @@ +/datum/crafting_recipe/umbrellared + name = "Red Drink Umbrella" + result = /obj/item/garnish/umbrellared + time = 1 SECONDS + tool_paths = list(/obj/item/toy/crayon/spraycan) + reqs = list( + /obj/item/paper = 1, + /obj/item/stack/rods = 1) + category = CAT_DRINK + +/datum/crafting_recipe/umbrellablue + name = "Blue Drink Umbrella" + result = /obj/item/garnish/umbrellablue + time = 1 SECONDS + tool_paths = list(/obj/item/toy/crayon/spraycan) + reqs = list( + /obj/item/paper = 1, + /obj/item/stack/rods = 1) + category = CAT_DRINK + +/datum/crafting_recipe/umbrellagreen + name = "Green Drink Umbrella" + result = /obj/item/garnish/umbrellagreen + time = 1 SECONDS + tool_paths = list(/obj/item/toy/crayon/spraycan) + reqs = list( + /obj/item/paper = 1, + /obj/item/stack/rods = 1) + category = CAT_DRINK diff --git a/monkestation/code/modules/modular_bartending/garnishes/garnish_items.dm b/monkestation/code/modules/modular_bartending/garnishes/garnish_items.dm new file mode 100644 index 000000000000..bfe8accfb8ec --- /dev/null +++ b/monkestation/code/modules/modular_bartending/garnishes/garnish_items.dm @@ -0,0 +1,152 @@ +//garnishes, an item that if used on a modglass, will apply its garnish_state to it +/obj/item/garnish + name = "garnish" + desc = "you should not see this" + icon = 'monkestation/code/modules/modular_bartending/icons/modglass_garnishes_items.dmi' + icon_state = "rim" + w_class = WEIGHT_CLASS_SMALL + var/garnish_state = "rim" + var/garnish_layer = GARNISH_RIM + +/obj/item/garnish/Initialize(mapload, amount) + . = ..() + pixel_x = rand(-3, 3) + pixel_y = rand(-3, 3) //randomize a little + +//rim garnishes, these go on the bottom +//sprites for rim garnishes must be split into two halves, one with normal naming, the other with -top appended to it +//this will allow it to layer over things inside the glass +/obj/item/garnish/salt + name = "salt garnish" + desc = "Harvested from the tears of the saltiest assistant." + +/obj/item/garnish/ash + name = "ash garnish" + desc = "But why would you do this though." + icon_state = "drim" + garnish_state = "drim" + +/obj/item/garnish/puce + name = "puce garnish" + desc = "Get some puce in your drink." + icon_state = "puce" + garnish_state = "puce" + +/obj/item/garnish/crystal + name = "strange crystal garnish" + desc = "I'm sure nothing could possibly go wrong." + icon_state = "crystal" + garnish_state = "crystal" + +/obj/item/garnish/wire + name = "stripped wire" + desc = "This seems like a perfectly normal thing to put on your drinks." + icon_state = "wire" + garnish_state = "wire" + +/obj/item/garnish/gold + name = "gold trim" + desc = "Give your drinks that first-class flair!" + icon_state = "gold" + garnish_state = "gold" + +/obj/item/garnish/silver + name = "silver trim" + desc = "Give your drinks that second-class flair!" + icon_state = "silver" + garnish_state = "silver" + +//center garnishes, none of these exist yet, but when they do, put them here + +//right side garnishes, these go above the rim and center garnishes, but below all others +/obj/item/garnish/lime + name = "lime wedge" + desc = "A classic topping for your drink." + icon_state = "lime" + garnish_state = "lime" + garnish_layer = GARNISH_RIGHT + +/obj/item/garnish/lemon + name = "lemon wedge" + desc = "A classic topping for your drink." + icon_state = "lemon" + garnish_state = "lemon" + garnish_layer = GARNISH_RIGHT + +/obj/item/garnish/orange + name = "orange wedge" + desc = "A classic topping for your drink." + icon_state = "orange" + garnish_state = "orange" + garnish_layer = GARNISH_RIGHT + +/obj/item/garnish/cherry + name = "bunch of cherries" + desc = "A classic topping for your drink." + icon_state = "cherry" + garnish_state = "cherry" + garnish_layer = GARNISH_RIGHT + +//left side garnishes, these go above both the rim, center, and right side +/obj/item/garnish/olives + name = "skewered olives" + desc = "This would look good in a martini." + icon_state = "olives" + garnish_state = "olives" + garnish_layer = GARNISH_LEFT + force = 3 + attack_verb_continuous = list("pokes", "jabs") + attack_verb_simple = list("poke", "jab") + sharpness = SHARP_POINTY + throwforce = 3 + throw_speed = 1 + embedding = EMBED_HARMLESS + +/obj/item/garnish/umbrellared + name = "red drink umbrella" + desc = "A cute little umbrella to go in your drink. This one is light red, not pink." + icon_state = "umbrellared" + garnish_state = "umbrellared" + garnish_layer = GARNISH_LEFT + +/obj/item/garnish/umbrellablue + name = "blue drink umbrella" + desc = "A cute little umbrella to go in your drink. This one is blue." + icon_state = "umbrellablue" + garnish_state = "umbrellablue" + garnish_layer = GARNISH_LEFT + +/obj/item/garnish/umbrellagreen + name = "green drink umbrella" + desc = "A cute little umbrella to go in your drink. This one is green." + icon_state = "umbrellagreen" + garnish_state = "umbrellagreen" + garnish_layer = GARNISH_LEFT + +/obj/item/garnish/red_straw + name = "striped straw" + desc = "A cute straw for a drink." + icon_state = "straw-red" + garnish_state = "straw-red" + garnish_layer = GARNISH_LEFT + +/obj/item/garnish/straw + name = "straw" + desc = "A cute straw for a drink." + icon_state = "straw" + garnish_state = "straw" + garnish_layer = GARNISH_RIGHT + +/obj/item/garnish/foam + name = "decorative foam" + desc = "Some food safe fake foam to add to drinks to make them look nicer." + icon_state = "foam" + garnish_state = "foam" + garnish_layer = GARNISH_ABOVE_RIM + +/obj/item/garnish/cherrytopper + name = "cherry topper" + desc = "Some pierced cherries on a stick." + icon_state = "cherrytopper" + garnish_state = "cherrytopper" + garnish_layer = GARNISH_ABOVE_RIM diff --git a/monkestation/code/modules/modular_bartending/garnishes/grown_cuts.dm b/monkestation/code/modules/modular_bartending/garnishes/grown_cuts.dm new file mode 100644 index 000000000000..2e80289d0117 --- /dev/null +++ b/monkestation/code/modules/modular_bartending/garnishes/grown_cuts.dm @@ -0,0 +1,16 @@ +/obj/item/food/grown/cherries/Initialize(mapload, obj/item/seeds/new_seed) + . = ..() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/garnish/cherry, 3, 1 SECONDS, table_required = FALSE, screentip_verb = "Slice") + +/obj/item/food/grown/citrus/lime/Initialize(mapload, obj/item/seeds/new_seed) + . = ..() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/garnish/orange, 3, 1 SECONDS, table_required = FALSE, screentip_verb = "Slice") + + +/obj/item/food/grown/citrus/orange/Initialize(mapload, obj/item/seeds/new_seed) + . = ..() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/garnish/orange, 3, 1 SECONDS, table_required = FALSE, screentip_verb = "Slice") + +/obj/item/food/grown/citrus/lemon/Initialize(mapload, obj/item/seeds/new_seed) + . = ..() + AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/garnish/lemon, 3, 1 SECONDS, table_required = FALSE, screentip_verb = "Slice") diff --git a/monkestation/code/modules/modular_bartending/icons/foam.dmi b/monkestation/code/modules/modular_bartending/icons/foam.dmi new file mode 100644 index 000000000000..795553de1043 Binary files /dev/null and b/monkestation/code/modules/modular_bartending/icons/foam.dmi differ diff --git a/monkestation/code/modules/modular_bartending/icons/modglass.dmi b/monkestation/code/modules/modular_bartending/icons/modglass.dmi new file mode 100644 index 000000000000..156f3a7f72a0 Binary files /dev/null and b/monkestation/code/modules/modular_bartending/icons/modglass.dmi differ diff --git a/monkestation/code/modules/modular_bartending/icons/modglass_fillings.dmi b/monkestation/code/modules/modular_bartending/icons/modglass_fillings.dmi new file mode 100644 index 000000000000..fcbd32f8b695 Binary files /dev/null and b/monkestation/code/modules/modular_bartending/icons/modglass_fillings.dmi differ diff --git a/monkestation/code/modules/modular_bartending/icons/modglass_garnishes.dmi b/monkestation/code/modules/modular_bartending/icons/modglass_garnishes.dmi new file mode 100644 index 000000000000..caad7b2a44ad Binary files /dev/null and b/monkestation/code/modules/modular_bartending/icons/modglass_garnishes.dmi differ diff --git a/monkestation/code/modules/modular_bartending/icons/modglass_garnishes_items.dmi b/monkestation/code/modules/modular_bartending/icons/modglass_garnishes_items.dmi new file mode 100644 index 000000000000..d5672b43e294 Binary files /dev/null and b/monkestation/code/modules/modular_bartending/icons/modglass_garnishes_items.dmi differ diff --git a/monkestation/code/modules/modular_bartending/item_modifications/attack_additions.dm b/monkestation/code/modules/modular_bartending/item_modifications/attack_additions.dm new file mode 100644 index 000000000000..a42baea3234f --- /dev/null +++ b/monkestation/code/modules/modular_bartending/item_modifications/attack_additions.dm @@ -0,0 +1,44 @@ +/obj/item/stack/cable_coil/attackby(obj/item/item, mob/user, params) + . = ..() + if(item.tool_behaviour != TOOL_WIRECUTTER) + return + playsound(src, 'sound/weapons/slice.ogg', 50, TRUE, -1) + to_chat(user, "You start cutting the insulation off of [src]...") + if(!do_after(user, 1 SECONDS, src)) + return + var/obj/item/result = new /obj/item/garnish/wire(drop_location()) + var/give_to_user = user.is_holding(src) + use(1) + if(QDELETED(src) && give_to_user) + user.put_in_hands(result) + to_chat(user, "You finish cutting [src]") + +/obj/item/stack/sheet/mineral/silver/attackby(obj/item/item, mob/user, params) + . = ..() + if(item.tool_behaviour != TOOL_WIRECUTTER) + return + playsound(src, 'sound/weapons/slice.ogg', 50, TRUE, -1) + to_chat(user, "You start whittling away some of [src]...") + if(!do_after(user, 1 SECONDS, src)) + return + var/obj/item/result = new /obj/item/garnish/silver(drop_location()) + var/give_to_user = user.is_holding(src) + use(1) + if(QDELETED(src) && give_to_user) + user.put_in_hands(result) + to_chat(user, "You finish cutting [src]") + +/obj/item/stack/sheet/mineral/gold/attackby(obj/item/item, mob/user, params) + . = ..() + if(item.tool_behaviour != TOOL_WIRECUTTER) + return + playsound(src, 'sound/weapons/slice.ogg', 50, TRUE, -1) + to_chat(user, "You start whittling away some of [src]...") + if(!do_after(user, 1 SECONDS, src)) + return + var/obj/item/result = new /obj/item/garnish/gold(drop_location()) + var/give_to_user = user.is_holding(src) + use(1) + if(QDELETED(src) && give_to_user) + user.put_in_hands(result) + to_chat(user, "You finish cutting [src]") diff --git a/monkestation/code/modules/modular_bartending/item_modifications/reagent_modification.dm b/monkestation/code/modules/modular_bartending/item_modifications/reagent_modification.dm new file mode 100644 index 000000000000..026109003382 --- /dev/null +++ b/monkestation/code/modules/modular_bartending/item_modifications/reagent_modification.dm @@ -0,0 +1,5 @@ +/obj/item/stack/ore/glass + grind_results = list(/datum/reagent/silicon = 10) + +/obj/item/stack/ore/glass/basalt + grind_results = list(/datum/reagent/ash = 8.5, /datum/reagent/silicon = 8.5) diff --git a/monkestation/code/modules/modular_bartending/modglass.dm b/monkestation/code/modules/modular_bartending/modglass.dm new file mode 100644 index 000000000000..8ba32840d07d --- /dev/null +++ b/monkestation/code/modules/modular_bartending/modglass.dm @@ -0,0 +1,130 @@ +//rim size defines, this is passed into the string for the icon_state of both glasses and garnishes +#define RIM_SMALL "s" +#define RIM_MEDIUM "m" +#define RIM_LARGE "l" + +//glass variant defines, if you're adding new glasses make sure to update these +#define SMALL_VARIANTS 6 +#define MEDIUM_VARIANTS 13 +#define LARGE_VARIANTS 5 + +//garnish layer defines, higher numbers go above low ones, add more of these if you manage to get sprites that can fit in a new part of the glass +#define GARNISH_ABOVE_RIM 1 +#define GARNISH_RIM 2 +#define GARNISH_CENTER 3 +#define GARNISH_RIGHT 4 +#define GARNISH_LEFT 5 +#define GARNISH_MAX 6 + +//global list for reskinning +GLOBAL_LIST_EMPTY(glass_variants) + +//glass that can be reskinned via alt-click, and have garnishes added to its rim +/obj/item/reagent_containers/cup/glass/modglass + name = "malleable glass" + desc = "Not your standard drinking glass!" + icon = 'monkestation/code/modules/modular_bartending/icons/modglass.dmi' + icon_state = "mglass-1-" + fill_icon = 'monkestation/code/modules/modular_bartending/icons/modglass_fillings.dmi' + fill_icon_thresholds = list(50,90) + amount_per_transfer_from_this = 10 + volume = 50 + custom_materials = list(/datum/material/glass=500, /datum/material/silver=100) + max_integrity = 30 + spillable = TRUE + resistance_flags = ACID_PROOF + obj_flags = UNIQUE_RENAME + drop_sound = 'sound/items/handling/drinkglass_drop.ogg' + pickup_sound = 'sound/items/handling/drinkglass_pickup.ogg' + custom_price = 25 + //rim defines the size of rim the glass has, used to decide which skins are available, and which garnish sprites to use + var/rim = RIM_MEDIUM + //stores the number of variations this glass sprite has to select from + var/variants = MEDIUM_VARIANTS + //a list to be filled with the associative list containing possible skins + var/list/glass_skins = list() + //a list to be filled with the current garnishes placed on the glass + var/list/garnishes = list() + +/obj/item/reagent_containers/cup/glass/modglass/small + name = "small malleable glass" + icon_state = "sglass-1-" + custom_materials = list(/datum/material/glass=100, /datum/material/silver=100) + volume = 25 + rim = RIM_SMALL + variants = SMALL_VARIANTS + +/obj/item/reagent_containers/cup/glass/modglass/large + name = "large malleable glass" + icon_state = "lglass-1-" + rim = RIM_LARGE + variants = LARGE_VARIANTS + +/obj/item/reagent_containers/cup/glass/modglass/Initialize() + . = ..() + if(variants) + glass_skins = glass_variants_list() + +//steals code from tile_reskinning.dm to cache an associative list containing possible reskins of the glass +/obj/item/reagent_containers/cup/glass/modglass/proc/glass_variants_list() + . = GLOB.glass_variants[rim] + if(.) + return + for(var/variant in 1 to variants) + var/name_string = "[rim]glass-[variant]-" + glass_skins[name_string] = icon('monkestation/code/modules/modular_bartending/icons/modglass.dmi', "[name_string]") + return GLOB.glass_variants[rim] = glass_skins + +//if this glass can be reskinned, open a radial menu containing the skins, and change the icon_state to whatever is chosen +/obj/item/reagent_containers/cup/glass/modglass/AltClick(mob/user) + if(!glass_skins) + return + var/choice = show_radial_menu(user, src, glass_skins, radius = 48, require_near = TRUE) + if(!choice || choice == icon_state) + return + icon_state = choice + update_icon() + +//if the object is a garnish, with a valid garnish_state, and there isnt already a garnish of the same type, add it to the list at the index of its layer +/obj/item/reagent_containers/cup/glass/modglass/attackby(obj/item/garnish/garnish, mob/user, params) + if(!istype(garnish)) + return ..() + if(!garnish.garnish_state) + return ..() + if(garnishes["[garnish.garnish_layer]"]) + to_chat(user, "Theres already something on this part of the glass!") + return ..() + garnishes["[garnish.garnish_layer]"] = garnish.garnish_state + update_icon() + qdel(garnish) + +//clear garnishes on wash +/obj/item/reagent_containers/cup/glass/modglass/wash(clean_types) + . = ..() + garnishes = list() + update_icon() + +/** + * for each layer a garnish can be on, if there is a garnish in that layers index, apply a mutable appearance of its type and our rim size + * if the garnish is a "rim" garnish, it is instead split into two halves, one drawn below all others, + * and one above all others, allowing garnishes to be placed "inside" the glass + */ +/obj/item/reagent_containers/cup/glass/modglass/update_overlays() + . = ..() + var/rimtype = garnishes["2"] + if(rimtype) + var/mutable_appearance/rimbottom = mutable_appearance('monkestation/code/modules/modular_bartending/icons/modglass_garnishes.dmi', "[rimtype]-[rim]") + . += rimbottom + for(var/i in 3 to GARNISH_MAX) + var/type = garnishes["[i]"] + if(type) + var/mutable_appearance/garnish = mutable_appearance('monkestation/code/modules/modular_bartending/icons/modglass_garnishes.dmi', "[type]-[rim]") + . += garnish + if(rimtype) + var/mutable_appearance/rimtop = mutable_appearance('monkestation/code/modules/modular_bartending/icons/modglass_garnishes.dmi', "[rimtype]-[rim]-top") + . += rimtop + + var/above_rim = garnishes["1"] + if(above_rim) + var/mutable_appearance/above_rim_ma = mutable_appearance('monkestation/code/modules/modular_bartending/icons/modglass_garnishes.dmi', "[above_rim]-[rim]") + . += above_rim_ma diff --git a/monkestation/code/modules/modular_bartending/reactions/food_reactions.dm b/monkestation/code/modules/modular_bartending/reactions/food_reactions.dm new file mode 100644 index 000000000000..ed453e0a6bea --- /dev/null +++ b/monkestation/code/modules/modular_bartending/reactions/food_reactions.dm @@ -0,0 +1,17 @@ +/datum/chemical_reaction/saltsolidification + required_reagents = list(/datum/reagent/consumable/salt = 10) + required_temp = 600 + +/datum/chemical_reaction/saltsolidification/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in 1 to created_volume) + new /obj/item/garnish/salt(location) + +/datum/chemical_reaction/ashsolidification + required_reagents = list(/datum/reagent/ash = 10) + required_temp = 600 + +/datum/chemical_reaction/ashsolidification/on_reaction(datum/reagents/holder, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in 1 to created_volume) + new /obj/item/garnish/ash(location) diff --git a/monkestation/code/modules/modular_bartending/readme.md b/monkestation/code/modules/modular_bartending/readme.md new file mode 100644 index 000000000000..c69c4caea115 --- /dev/null +++ b/monkestation/code/modules/modular_bartending/readme.md @@ -0,0 +1,37 @@ +## Title: + + +MODULE ID: MODULAR_BARTENDING + +### Description: + +This adds a modular design to drinks, to add flair to bartending + + + +### TG Proc/File Changes: + - code\modules\vending\boozeomat.dm + + +### Defines: + + +### Master file additions + +- N/A + + +### Included files that are not contained in this module: + +- N/A + + +### Credits: + + + +Made by PrefabQuasar for Shiptest. + +Original glass and garnish sprites made by @zestybastard(any%#5784), and @terg-but-ius(terg#3843), filling states updated by @triplezeta(TetraZeta#8776) and umbrella and cherry garnishes done by @Arctaisia(Arctaisia#0042). + +Ported by Dwasint diff --git a/monkestation/code/modules/modular_bartending/science/designs.dm b/monkestation/code/modules/modular_bartending/science/designs.dm new file mode 100644 index 000000000000..814ff5154f94 --- /dev/null +++ b/monkestation/code/modules/modular_bartending/science/designs.dm @@ -0,0 +1,35 @@ +/datum/design/modglass + name = "Malleable Glass" + id = "mod_glass" + build_type = AUTOLATHE + materials = list(/datum/material/glass=500, /datum/material/silver=100) + build_path = /obj/item/reagent_containers/cup/glass/modglass + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_KITCHEN, + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE + +/datum/design/modglass_small + name = "Small Malleable Glass" + id = "mod_glass_small" + build_type = AUTOLATHE + materials = list(/datum/material/glass=100, /datum/material/silver=100) + build_path = /obj/item/reagent_containers/cup/glass/modglass/small + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_KITCHEN, + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE + +/datum/design/modglass_large + name = "Large Malleable Glass" + id = "mod_glass_large" + build_type = AUTOLATHE + materials = list(/datum/material/glass=500, /datum/material/silver=100) + build_path = /obj/item/reagent_containers/cup/glass/modglass/large + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_KITCHEN, + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE diff --git a/monkestation/code/modules/ocean_content/fluff/ocean_tendril.dm b/monkestation/code/modules/ocean_content/fluff/ocean_tendril.dm index 72887d5bff0f..72539a69d4df 100644 --- a/monkestation/code/modules/ocean_content/fluff/ocean_tendril.dm +++ b/monkestation/code/modules/ocean_content/fluff/ocean_tendril.dm @@ -32,7 +32,7 @@ mob_types = list(/mob/living/basic/mining/goliath) /obj/structure/spawner/lavaland/ocean/legion - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril) + mob_types = list(/mob/living/basic/mining/legion) /obj/structure/spawner/lavaland/ocean/fish max_mobs = 6 diff --git a/monkestation/code/modules/ocean_content/fluff/trench_ladder.dm b/monkestation/code/modules/ocean_content/fluff/trench_ladder.dm index bf255c6c3781..cf651b1daa7c 100644 --- a/monkestation/code/modules/ocean_content/fluff/trench_ladder.dm +++ b/monkestation/code/modules/ocean_content/fluff/trench_ladder.dm @@ -1,6 +1,6 @@ /obj/item/trench_ladder_kit name = "sea ladder" - desc = "A deployable sea ladder that will allow you to descend to and ascend from the trench." + desc = "A deployable sea ladder that will allow you to descend to and ascend from the trench. Needs to be placed over a catwalk covered trench hole." icon = 'goon/icons/obj/fluid.dmi' icon_state = "ladder_off" diff --git a/monkestation/code/modules/ocean_content/hotspot/hotspot_controller.dm b/monkestation/code/modules/ocean_content/hotspot/hotspot_controller.dm index 7812b8afb1db..838b511fca8a 100644 --- a/monkestation/code/modules/ocean_content/hotspot/hotspot_controller.dm +++ b/monkestation/code/modules/ocean_content/hotspot/hotspot_controller.dm @@ -27,7 +27,6 @@ SUBSYSTEM_DEF(hotspots) return SS_INIT_NO_NEED generate_hotspots() generate_map() - generate_finalized_map() return SS_INIT_SUCCESS /datum/controller/subsystem/hotspots/fire() @@ -38,7 +37,6 @@ SUBSYSTEM_DEF(hotspots) if(generated_hotspot.drift_count >= generated_hotspot.drift_speed) generated_hotspot.drift_count = 0 generated_hotspot.move_center(get_step(generated_hotspot.center.return_turf(), generated_hotspot.drift_direction)) - generate_finalized_map() /datum/controller/subsystem/hotspots/proc/generate_hotspots() var/datum/hotspot/new_hotspot diff --git a/monkestation/code/modules/ocean_content/hotspot/trench_map.dm b/monkestation/code/modules/ocean_content/hotspot/trench_map.dm index 0ab9e7a3beb9..143790362f37 100644 --- a/monkestation/code/modules/ocean_content/hotspot/trench_map.dm +++ b/monkestation/code/modules/ocean_content/hotspot/trench_map.dm @@ -22,100 +22,6 @@ ///draw the map with the color chosen map.DrawBox(colors[turf_color], x * 2, y * 2, x * 2 + 1, y * 2 + 1) - -/datum/controller/subsystem/hotspots/proc/generate_finalized_map() - if(!map) - return - - ///points on the map we than translate to colors and sqaures on the map - var/list/hotspots = list() - for (var/datum/hotspot/listed_spot in generated_hotspots) - if(listed_spot.can_drift) - hotspots += {"
"} - else - hotspots += {"
"} - ///using html because idk how to transport a generated icon into tgui. so this is the best i could come up with. - finished_map = {" - - - - Trench Map - - - - - - -
- - [hotspots.Join("")] -
-
- Trench Wall - Station - Unknown - Hotspot - Locked Hotspot -
- - - "} - -/datum/controller/subsystem/hotspots/proc/show_map(client/shower) - if (!shower) - return - if (!finished_map || !map) - return - shower << browse_rsc(map, "trenchmap.png") - shower << browse(finished_map, "window=trench_map;size=560x610;title=Trench Map") - /obj/item/sea_map name = "Trench Map" icon = 'icons/obj/contractor_tablet.dmi' @@ -125,4 +31,31 @@ . = ..() if(!user.client) return - SShotspots.show_map(user.client) + + if (!SShotspots.map) + return + ui_interact(user) + +/obj/item/sea_map/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "TrenchMap", name) + ui.open() + +/obj/item/sea_map/ui_data(mob/user) + var/list/data = list() + var/list/hotspot_list = list() + for (var/datum/hotspot/listed_spot in SShotspots.generated_hotspots) + var/list/details = list() + details["center_y"] = listed_spot.center.y + details["center_x"] = listed_spot.center.x + details["radius"] = listed_spot.radius + details["locked"] = listed_spot.can_drift + hotspot_list += list(details) + data["hotspots"] = hotspot_list + if(!SSassets.cache["trenchmap.png"]) + SSassets.transport.register_asset("trenchmap.png", SShotspots.map) + SSassets.transport.send_assets(user, list("trenchmap.png" = SShotspots.map)) + data["map_image"] = SSassets.transport.get_asset_url("trenchmap.png") + data["map"] = SShotspots.finished_map + return data diff --git a/monkestation/code/modules/ocean_content/hotspot_machines/stomper.dm b/monkestation/code/modules/ocean_content/hotspot_machines/stomper.dm index d79d66b9bba7..63b8212a954e 100644 --- a/monkestation/code/modules/ocean_content/hotspot_machines/stomper.dm +++ b/monkestation/code/modules/ocean_content/hotspot_machines/stomper.dm @@ -137,7 +137,11 @@ for(var/datum/hotspot/listed_hotspot as anything in SShotspots.retrieve_hotspot_list(source_turf)) if(BOUNDS_DIST(src, listed_hotspot.center.return_turf()) > 2)///giving a 1 tile leeway on stomps continue - say("Hotspot Pinned") + if(!listed_hotspot.can_drift) + say("Hotspot Pinned!") + else + say("Hotspot Released!") + playsound(src, 'goon/sounds/impact_sounds/Metal_Hit_Lowfi_1.ogg', 50, 1) for(var/mob/any_mob in viewers(src)) diff --git a/monkestation/code/modules/ocean_content/mobs/group_planning.dm b/monkestation/code/modules/ocean_content/mobs/group_planning.dm index b65c54d713ca..f07261ad13f6 100644 --- a/monkestation/code/modules/ocean_content/mobs/group_planning.dm +++ b/monkestation/code/modules/ocean_content/mobs/group_planning.dm @@ -18,7 +18,24 @@ ///our current_target var/atom/target +/datum/group_planning/Destroy(force, ...) + . = ..() + finished_mobs = null + in_progress_mobs = null + group_mobs = null + +/datum/group_planning/proc/check_mobs() + for(var/mob/living/mob as anything in group_mobs) + if(!QDELETED(mob)) + continue + group_mobs -= mob + in_progress_mobs -= mob + finished_mobs -= mob + if(!length(group_mobs)) + qdel(src) + /datum/group_planning/proc/bulk_queue() + check_mobs() for(var/mob/living/basic/listed as anything in group_mobs) if(!istype(listed) || !listed.ai_controller || listed.stat == DEAD) //cull dead members that shouldn't exist anymore if(isbasicmob(listed) && listed.ai_controller && (BB_GROUP_DATUM in listed.ai_controller.blackboard)) @@ -29,6 +46,7 @@ in_progress_mobs |= listed /datum/group_planning/proc/decide_next_action() + check_mobs() if(length(in_progress_mobs)) return /// we are still doing an action if(!length(usable_behaviours)) @@ -37,11 +55,13 @@ fetched_behaviour = TRUE /datum/group_planning/proc/add_to_current_action(datum/ai_controller/controller) + check_mobs() controller.queue_behavior(queued_behavior) in_progress_mobs |= controller.pawn /datum/group_planning/proc/finish_action(datum/ai_controller/controller) + check_mobs() if(controller.pawn in in_progress_mobs) in_progress_mobs -= controller.pawn finished_mobs += controller.pawn diff --git a/monkestation/code/modules/pissing/piss_virus.dm b/monkestation/code/modules/pissing/piss_virus.dm deleted file mode 100644 index a7f679becdac..000000000000 --- a/monkestation/code/modules/pissing/piss_virus.dm +++ /dev/null @@ -1,20 +0,0 @@ -/datum/symptom/piss - name = "Eternal Pisser" - desc = "The virus causes the host to frequently piss themselves." - stealth = 2 - resistance = -1 - stage_speed = -2 - transmittable = -1 - level = 6 - - -/datum/symptom/piss/Activate(datum/disease/advance/A) - . = ..() - if(!.) - return - - if(prob(10 * A.stage)) - var/obj/item/organ/internal/bladder/bladder = A.affected_mob.get_organ_slot(ORGAN_SLOT_BLADDER) - if(bladder) - bladder.stored_piss += 15 - bladder.urinate() diff --git a/monkestation/code/modules/possession/basic_additions.dm b/monkestation/code/modules/possession/basic_additions.dm index 50365f6ef8d7..9fa5040a6d43 100644 --- a/monkestation/code/modules/possession/basic_additions.dm +++ b/monkestation/code/modules/possession/basic_additions.dm @@ -22,6 +22,10 @@ /// the shifted x offset of the head var/list/head_x_shift +/mob/living/basic/proc/apply_overlay(cache_index) + if((. = possession_overlays[cache_index])) + add_overlay(.) + /mob/living/basic/proc/create_overlay_index() var/list/overlays[1] possession_overlays = overlays @@ -39,6 +43,7 @@ update_held_items() /mob/living/basic/update_held_items() + . = ..() remove_overlay(1) var/list/hands_overlays = list() @@ -84,10 +89,6 @@ possession_overlays[1] = hands_overlays apply_overlay(1) -/mob/living/basic/proc/apply_overlay(cache_index) - if((. = possession_overlays[cache_index])) - add_overlay(.) - /mob/living/basic/proc/remove_overlay(cache_index) var/I = possession_overlays[cache_index] if(I) diff --git a/monkestation/code/modules/possession/item_overrides.dm b/monkestation/code/modules/possession/item_overrides.dm index 38bee5150972..06c8dc1ec273 100644 --- a/monkestation/code/modules/possession/item_overrides.dm +++ b/monkestation/code/modules/possession/item_overrides.dm @@ -13,10 +13,7 @@ return ..() return else if(istype(user, /mob/living/simple_animal)) - if(!user.dextrous) - if (obj_flags & CAN_BE_HIT) - return ..() - return + return . = TRUE diff --git a/monkestation/code/modules/ranching/chickens/_chicken.dm b/monkestation/code/modules/ranching/chickens/_chicken.dm index 816eb788ddb6..de71f07d561d 100644 --- a/monkestation/code/modules/ranching/chickens/_chicken.dm +++ b/monkestation/code/modules/ranching/chickens/_chicken.dm @@ -4,7 +4,7 @@ /datum/ai_controller/basic_controller/chick blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, BB_FIND_MOM_TYPES = list(/mob/living/basic/chicken), BB_IGNORE_MOM_TYPES = list(/mob/living/basic/chick), ) diff --git a/monkestation/code/modules/ranching/chickens/_chicken_defines.dm b/monkestation/code/modules/ranching/chickens/_chicken_defines.dm index 2a5ff880400f..77b63a24b678 100644 --- a/monkestation/code/modules/ranching/chickens/_chicken_defines.dm +++ b/monkestation/code/modules/ranching/chickens/_chicken_defines.dm @@ -107,8 +107,8 @@ /datum/pet_command/idle, /datum/pet_command/free, /datum/pet_command/follow, - /datum/pet_command/point_targetting/attack/chicken, - /datum/pet_command/point_targetting/fetch, + /datum/pet_command/point_targeting/attack/chicken, + /datum/pet_command/point_targeting/fetch, /datum/pet_command/play_dead, ) ///how much extra fertile we are @@ -153,5 +153,5 @@ melee_cooldown_time = 1 // dumb var/datum/ai_behavior/targeted_mob_ability/min_range/chicken/what_range = /datum/ai_behavior/targeted_mob_ability/min_range/chicken/melee -/datum/pet_command/point_targetting/attack/chicken +/datum/pet_command/point_targeting/attack/chicken attack_behaviour = /datum/ai_behavior/basic_melee_attack/chicken diff --git a/monkestation/code/modules/ranching/chickens/ai/chicken_controller.dm b/monkestation/code/modules/ranching/chickens/ai/chicken_controller.dm index a3563adca331..573c858509ce 100644 --- a/monkestation/code/modules/ranching/chickens/ai/chicken_controller.dm +++ b/monkestation/code/modules/ranching/chickens/ai/chicken_controller.dm @@ -15,8 +15,8 @@ BB_CHICKEN_NESTING_BOX = null, BB_CHICKEN_FEED = null, - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_PET_TARGETTING_DATUM = /datum/targeting_strategy/basic/not_friends, ) var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered), @@ -49,8 +49,8 @@ BB_CHICKEN_NESTING_BOX = null, BB_CHICKEN_FEED = null, - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_PET_TARGETTING_DATUM = /datum/targeting_strategy/basic/not_friends, ) planning_subtrees = list( @@ -76,8 +76,8 @@ BB_CHICKEN_NESTING_BOX = null, BB_CHICKEN_FEED = null, - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + BB_PET_TARGETTING_DATUM = /datum/targeting_strategy/basic/not_friends, ) planning_subtrees = list( diff --git a/monkestation/code/modules/ranching/chickens/tier1/clown.dm b/monkestation/code/modules/ranching/chickens/tier1/clown.dm index 8b1043ce477b..835ce1e95f98 100644 --- a/monkestation/code/modules/ranching/chickens/tier1/clown.dm +++ b/monkestation/code/modules/ranching/chickens/tier1/clown.dm @@ -37,7 +37,7 @@ // generic water balloon impact handler, need to move to new file if i make other water balloons -/obj/item/reagent_containers/water_balloon/throw_at(atom/target, range, speed, mob/thrower, spin, diagonals_first, datum/callback/callback, force, quickstart) +/obj/item/reagent_containers/water_balloon/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE) . = ..() visible_message("The [src.name] bursts upon impact with \the [target.name]!") qdel(src) diff --git a/monkestation/code/modules/ranching/chickens/tier3/cockatrice.dm b/monkestation/code/modules/ranching/chickens/tier3/cockatrice.dm index 2de26da05192..d6a5ed5c3855 100644 --- a/monkestation/code/modules/ranching/chickens/tier3/cockatrice.dm +++ b/monkestation/code/modules/ranching/chickens/tier3/cockatrice.dm @@ -41,7 +41,8 @@ damage = 5 damage_type = BURN -/obj/projectile/magic/venomous_spit/on_hit(atom/target, blocked) +/obj/projectile/magic/venomous_spit/on_hit(atom/target, blocked, pierce_hit) + . = ..() if(iscarbon(target)) var/mob/living/carbon/user = target user.petrify(10) diff --git a/monkestation/code/modules/ranching/items.dm b/monkestation/code/modules/ranching/items.dm index 220dc5f6c3fa..69d78dbbaaba 100644 --- a/monkestation/code/modules/ranching/items.dm +++ b/monkestation/code/modules/ranching/items.dm @@ -236,13 +236,13 @@ /obj/item/chicken_feed/proc/try_place(atom/target) if(!isopenturf(target)) return FALSE - var/turf/open/targetted_turf = get_turf(target) + var/turf/open/targeted_turf = get_turf(target) var/list/compiled_reagents = list() for(var/datum/reagent/listed_reagent in reagents.reagent_list) compiled_reagents += new listed_reagent.type compiled_reagents[listed_reagent] = listed_reagent.volume - new /obj/effect/chicken_feed(targetted_turf, held_foods, compiled_reagents, mix_color_from_reagents(reagents.reagent_list), name) + new /obj/effect/chicken_feed(targeted_turf, held_foods, compiled_reagents, mix_color_from_reagents(reagents.reagent_list), name) placements_left-- if(placements_left <= 0) diff --git a/monkestation/code/modules/random_rooms/bars/tram_bar_modules.dm b/monkestation/code/modules/random_rooms/bars/tram_bar_modules.dm new file mode 100644 index 000000000000..e975f1c5f58f --- /dev/null +++ b/monkestation/code/modules/random_rooms/bars/tram_bar_modules.dm @@ -0,0 +1,152 @@ + +///////////// +//OCEAN BAR// +///////////// + +/obj/item/stack/tile/fake_seafloor + name = "fake ocean floor tiles" + singular_name = "fake ocean floor tile" + icon = 'monkestation/icons/obj/tiles.dmi' + icon_state = "tile_seafloor" + inhand_icon_state = "tile-space" + turf_type = /turf/open/floor/fake_seafloor + resistance_flags = FLAMMABLE + merge_type = /obj/item/stack/tile/fake_seafloor + +/turf/open/floor/fake_seafloor + name = "synthetic ocean floor" + icon = 'monkestation/icons/turf/seafloor.dmi' + icon_state = "seafloor" + base_icon_state = "seafloor" + +///////////////// +//BEACHSIDE BAR// +///////////////// + +/obj/item/paper/fluff/beachside_bar + name = "lighting system ad" + default_raw_text = {"With the new Nanotrasen(tm) Magilight System(tm) you too can have perfect lighting at all times of orbit!"} + +/obj/item/stack/tile/fakesand + name = "fake sand tiles" + singular_name = "fake sand tile" + icon = 'monkestation/icons/obj/tiles.dmi' + icon_state = "tile_sand" + inhand_icon_state = "tile-space" + turf_type = /turf/open/floor/fakesand + resistance_flags = FLAMMABLE + merge_type = /obj/item/stack/tile/fakesand + +/turf/open/floor/fakesand + name = "synthetic beach" + desc = "Plastic." + icon = 'icons/misc/beach.dmi' + icon_state = "sand" + base_icon_state = "sand" + + footstep = FOOTSTEP_SAND + barefootstep = FOOTSTEP_SAND + clawfootstep = FOOTSTEP_SAND + heavyfootstep = FOOTSTEP_GENERIC_HEAVY + floor_tile = /obj/item/stack/tile/fake_seafloor + +/turf/open/floor/fake_seafloor/medium + icon_state = "seafloor_med" + base_icon_state = "seafloor_med" + +/turf/open/floor/fake_seafloor/heavy + icon_state = "seafloor_heavy" + base_icon_state = "seafloor_heavy" + +/turf/open/floor/fake_seafloor/ironsand + icon = 'icons/turf/floors.dmi' + icon_state = "ironsand1" + base_icon_state = "ironsand" + +/turf/open/floor/fake_seafloor/spawning/Initialize(mapload) + . = ..() + if(prob(10)) + var/to_spawn = pick(list(/obj/structure/flora/ocean/glowweed, + /obj/structure/flora/ocean/longseaweed, + /obj/structure/flora/ocean/seaweed, + /obj/structure/flora/ocean/coral, + /obj/structure/flora/rock/style_random)) + new to_spawn(src) + +/turf/closed/mineral/random/fake_ocean + baseturfs = /turf/open/floor/fake_seafloor + turf_type = /turf/open/floor/fake_seafloor + color = "#58606b" + +//////////// +//CULT BAR// +//////////// + +/obj/effect/rune/beer + name = "rune of booze" + desc = "An odd collection of symbols drawn in what seems to be ethanol, it seems it has spots for 25 people. Curious." + cultist_name = "the ancient nar'sie alcoholism rune" + cultist_desc = "allows anyone to prepare greater amounts of ethanol magic and condense it into a puddle \ + Due to you being a cultist you give twice the summoning power normally required to invoke this" + invocation = "Let the world tremble as beer consumes it!" + req_cultists = 25 // you need a full 5x5 tile space of people for this + can_be_scribed = FALSE + + // icon handling + icon = 'icons/effects/96x96.dmi' + color = RUNE_COLOR_BURNTORANGE + icon_state = "rune_large" + pixel_x = -32 //So the big ol' 96x96 sprite shows up right + pixel_y = -32 + + /// non-cultists can also use this rune :) + cult_override = TRUE + /// Did we already summon a beer storm? + var/used = FALSE + /// Reagent that is produced once the rune is invoked. + var/flood_reagent = /datum/reagent/consumable/ethanol/beer + /// Round event control we might as well keep track of instead of locating every time + var/datum/round_event_control/scrubber_overflow/every_vent/overflow_control + +/obj/effect/rune/beer/Destroy(force) + if(!force) + return QDEL_HINT_LETMELIVE + if(src == GLOB.narsie_breaching_rune) + GLOB.narsie_breaching_rune = TRUE //we still want to summon even if destroyed + return ..() + +/obj/effect/rune/beer/Initialize(mapload) + . = ..() + overflow_control = locate(/datum/round_event_control/scrubber_overflow/every_vent) in SSevents.control + +/obj/effect/rune/beer/conceal() //you cant hide from destiny (stops cultists from fucking with it) + return + +/obj/effect/rune/beer/invoke(list/invokers) + if(used) + return + var/mob/living/user = invokers[1] + if(locate(/obj/narsie) in SSpoints_of_interest.narsies) // you cant summon booze if the god is already on this plane of existance + for(var/invoker in invokers) + to_chat(invoker, span_warning("Nar'Sie is already on this plane, you lost your opportunity to summon beer with her!")) + log_game("Beer rune activated by [user] at [COORD(src)] failed - Nar'sie is summoned.") + used = TRUE + if(GLOB.clock_ark) // Rat'var is against alcoholism + if(!GLOB.narsie_breaching_rune) + GLOB.narsie_breaching_rune = src + for(var/invoker in invokers) + to_chat(invoker, span_bigbrass("A horrible light is preventing Nar'sie from summoning beer to this realm! \ + It looks like you will have to destroy whatever is causing this before Nar'sie may summon beer.")) + return + ..() + sound_to_playing_players('sound/effects/dimensional_rend.ogg') + sleep(4 SECONDS) + if(src) + color = RUNE_COLOR_RED + RegisterSignal(overflow_control, COMSIG_CREATED_ROUND_EVENT, PROC_REF(on_created_round_event)) + overflow_control.runEvent() + +/obj/effect/rune/beer/proc/on_created_round_event(datum/round_event_control/source_event_control, datum/round_event/scrubber_overflow/every_vent/created_event) + SIGNAL_HANDLER + UnregisterSignal(overflow_control, COMSIG_CREATED_ROUND_EVENT) + created_event.forced_reagent_type = flood_reagent diff --git a/monkestation/code/modules/random_rooms/showcase_map_modules.dm b/monkestation/code/modules/random_rooms/showcase_map_modules.dm new file mode 100644 index 000000000000..129c4e921b24 --- /dev/null +++ b/monkestation/code/modules/random_rooms/showcase_map_modules.dm @@ -0,0 +1,11 @@ +/area/mapping_showcase + name = "Mapping Contest Showcase Area" + area_flags = UNIQUE_AREA + base_lighting_alpha = 225 + has_gravity = TRUE + requires_power = FALSE + +/turf/open/indestructible/bluespace + slowdown = -1 + icon_state = "bluespace" + desc = "Through a series of micro-teleports these tiles let people move at incredible speeds." diff --git a/monkestation/code/modules/research/designs/security_designs.dm b/monkestation/code/modules/research/designs/security_designs.dm index 644d1025e345..ee94804102bd 100644 --- a/monkestation/code/modules/research/designs/security_designs.dm +++ b/monkestation/code/modules/research/designs/security_designs.dm @@ -19,3 +19,59 @@ RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY + +/datum/design/mag_autorifle + name = "WT-550 Autorifle Magazine (4.6x30mm) (Lethal)" + desc = "A 20 round magazine for the out of date WT-550 Autorifle." + id = "mag_autorifle" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = 12000) + build_path = /obj/item/ammo_box/magazine/wt550m9 + category = list( + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + +/datum/design/mag_autorifle/ap_mag + name = "WT-550 Autorifle Armour Piercing Magazine (4.6x30mm AP) (Lethal)" + desc = "A 20 round armour piercing magazine for the out of date WT-550 Autorifle." + id = "mag_autorifle_ap" + materials = list(/datum/material/iron = 15000, /datum/material/silver = 600) + build_path = /obj/item/ammo_box/magazine/wt550m9/wtap + category = list( + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + +/datum/design/mag_autorifle/ic_mag + name = "WT-550 Autorifle Incendiary Magazine (4.6x30mm IC) (Lethal/Highly Destructive)" + desc = "A 20 round armour piercing magazine for the out of date WT-550 Autorifle." + id = "mag_autorifle_ic" + materials = list(/datum/material/iron = 15000, /datum/material/silver = 600, /datum/material/glass = 1000) + build_path = /obj/item/ammo_box/magazine/wt550m9/wtic + category = list( + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + +/datum/design/mag_autorifle/rub_mag + name = "WT-550 Autorifle Rubber Magazine (4.6x30mm R) (Lethal)" + desc = "A 20 round rubber magazine for the out of date WT-550 Autorifle." + id = "mag_autorifle_rub" + materials = list(/datum/material/iron = 6000) + build_path = /obj/item/ammo_box/magazine/wt550m9/wtrub + category = list( + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + +/datum/design/mag_autorifle/salt_mag + name = "WT-550 Autorifle Saltshot Magazine (4.6x30mm SALT) (Non-Lethal)" + desc = "A 20 round saltshot magazine for the out of date WT-550 Autorifle." + id = "mag_autorifle_salt" + materials = list(/datum/material/iron = 6000, /datum/material/plasma = 600) + build_path = /obj/item/ammo_box/magazine/wt550m9/wtsalt + category = list( + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY diff --git a/monkestation/code/modules/research/techweb/all_nodes.dm b/monkestation/code/modules/research/techweb/all_nodes.dm index fb910f3f7a6e..f8d664d8eb1c 100644 --- a/monkestation/code/modules/research/techweb/all_nodes.dm +++ b/monkestation/code/modules/research/techweb/all_nodes.dm @@ -187,3 +187,14 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000, TECHWEB_POINT_TYPE_NANITES = 2500) hidden = TRUE experimental = TRUE + +/datum/techweb_node/adv_ballistics + id = "adv_ballistics" + display_name = "Advanced Ballistics" + description = "The most sophisticated methods of shooting people." + prereq_ids = list("adv_weaponry") + design_ids = list( + "mag_autorifle_ap", + "mag_autorifle_ic", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/monkestation/code/modules/security/code/weapons/lawbringer.dm b/monkestation/code/modules/security/code/weapons/lawbringer.dm index b72dc41cbf59..8111290bc98f 100644 --- a/monkestation/code/modules/security/code/weapons/lawbringer.dm +++ b/monkestation/code/modules/security/code/weapons/lawbringer.dm @@ -412,7 +412,7 @@ damage = 5 damage_type = BURN -/obj/projectile/lawbringer/hotshot/on_hit(atom/target, blocked = FALSE) +/obj/projectile/lawbringer/hotshot/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(iscarbon(target)) var/mob/living/carbon/M = target @@ -437,7 +437,8 @@ damage_type = BRUTE can_hit_turfs = TRUE -/obj/projectile/lawbringer/smokeshot/on_hit(atom/target, blocked = FALSE) +/obj/projectile/lawbringer/smokeshot/on_hit(atom/target, blocked = 0, pierce_hit) + . = ..() var/datum/effect_system/fluid_spread/smoke/smoke = new smoke.set_up(3, holder = src, location = get_turf(target)) smoke.start() @@ -466,7 +467,8 @@ wound_bonus = -5 var/anti_material_damage = 75 -/obj/projectile/lawbringer/bigshot/on_hit(atom/target, blocked = FALSE) +/obj/projectile/lawbringer/bigshot/on_hit(atom/target, blocked = 0, pierce_hit) + . = ..() if(ismecha(target)) var/obj/vehicle/sealed/mecha/M = target M.take_damage(anti_material_damage) @@ -506,7 +508,7 @@ icon_state = "banana" weak_against_armour = TRUE -/obj/projectile/lawbringer/clownshot/on_hit(mob/living/target, blocked = FALSE) +/obj/projectile/lawbringer/clownshot/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(ishuman(target)) var/mob/living/carbon/human/M = target @@ -518,7 +520,7 @@ M.visible_message(span_warning("[M] is is sent rocketing off their shoes!")) playsound(src, 'sound/items/airhorn.ogg', 100, TRUE, -1) var/atom/throw_target = get_edge_target_turf(target, angle2dir(Angle)) - target.throw_at(throw_target, 200, 8) + M.throw_at(throw_target, 200, 8) /** * lawbringer pulse mode: @@ -538,11 +540,12 @@ damage_type = BRUTE range = 5 -/obj/projectile/lawbringer/pulse/on_hit(mob/living/target, blocked = FALSE) +/obj/projectile/lawbringer/pulse/on_hit(atom/target, blocked = 0, pierce_hit) . = ..() if(isliving(target)) + var/mob/living/new_target = target var/atom/throw_target = get_edge_target_turf(target, angle2dir(Angle)) - target.throw_at(throw_target, 4, 1) + new_target.throw_at(throw_target, 4, 1) /** * lawbringer tideshot mode: @@ -572,10 +575,12 @@ light_power = 1 light_color = LIGHT_COLOR_HALOGEN -/obj/projectile/lawbringer/tideshot/on_hit(mob/living/target, blocked = FALSE) +/obj/projectile/lawbringer/tideshot/on_hit(atom/target, blocked = 0, pierce_hit) + . = ..() if(ishuman(target)) - if(target.mind) - if(is_assistant_job(target.mind.assigned_role)) + var/mob/living/carbon/human/new_target = target + if(new_target.mind) + if(is_assistant_job(new_target.mind.assigned_role)) var/mob/living/carbon/C = target C.add_mood_event("tased", /datum/mood_event/tased) to_chat(target, span_warning("As the beam hits you, body seems to crumple under its uselessness.")) diff --git a/monkestation/code/modules/security/icons/paco_ammo.dmi b/monkestation/code/modules/security/icons/paco_ammo.dmi index 9ab5f9e7d866..1802db63be1e 100644 Binary files a/monkestation/code/modules/security/icons/paco_ammo.dmi and b/monkestation/code/modules/security/icons/paco_ammo.dmi differ diff --git a/monkestation/code/modules/spells/spell_types/aoe_spell/mind_swap.dm b/monkestation/code/modules/spells/spell_types/aoe_spell/mind_swap.dm index 777f196420fc..335a2e99b29c 100644 --- a/monkestation/code/modules/spells/spell_types/aoe_spell/mind_swap.dm +++ b/monkestation/code/modules/spells/spell_types/aoe_spell/mind_swap.dm @@ -27,7 +27,7 @@ /mob/living/brain, /mob/living/silicon/pai, /mob/living/simple_animal/hostile/megafauna, - /mob/living/simple_animal/hostile/guardian, + /mob/living/basic/guardian, )) //has the spell made a fake wizard yet var/made_false_wizard = FALSE diff --git a/monkestation/code/modules/store/store_items/__store.dm b/monkestation/code/modules/store/store_items/__store.dm index e9794982c5b7..92da7ef3e5d6 100644 --- a/monkestation/code/modules/store/store_items/__store.dm +++ b/monkestation/code/modules/store/store_items/__store.dm @@ -122,7 +122,7 @@ GLOBAL_LIST_EMPTY(all_store_datums) var/list/all_selected_paths = list() for(var/path in owner?.prefs?.loadout_list) all_selected_paths += path - data["user_is_donator"] = !!(owner.patreon?.is_donator() || is_admin(owner)) + data["user_is_donator"] = !!(owner.patreon?.is_donator() || owner.twitch?.is_donator() || is_admin(owner)) data["owned_items"] = user.client.prefs.inventory data["total_coins"] = user.client.prefs.metacoins diff --git a/monkestation/code/modules/store/store_items/head.dm b/monkestation/code/modules/store/store_items/head.dm index 14a725404faa..1b7a0926cc0b 100644 --- a/monkestation/code/modules/store/store_items/head.dm +++ b/monkestation/code/modules/store/store_items/head.dm @@ -262,6 +262,16 @@ GLOBAL_LIST_INIT(store_head, generate_store_items(/datum/store_item/head)) item_path = /obj/item/clothing/head/tragic item_cost = 1000 +/datum/store_item/head/pharaoh + name = "Pharaoh's Hat" + item_path = /obj/item/clothing/head/costume/pharaoh + item_cost = 2000 + +/datum/store_item/head/nemes + name = "Headdress of Nemes" + item_path = /obj/item/clothing/head/costume/nemes + item_cost = 2000 + /* * JOB-LOCKED */ diff --git a/monkestation/code/modules/store/store_items/suits.dm b/monkestation/code/modules/store/store_items/suits.dm index 41d67fc1a97d..799666dfe8dd 100644 --- a/monkestation/code/modules/store/store_items/suits.dm +++ b/monkestation/code/modules/store/store_items/suits.dm @@ -195,6 +195,11 @@ GLOBAL_LIST_INIT(store_suits, generate_store_items(/datum/store_item/suit)) item_path = /obj/item/clothing/suit/wizrobe/marisa/fake item_cost = 2000 +/datum/store_item/suit/dinojammies + name = "Dinosaur Pajamas" + item_path = /obj/item/clothing/suit/hooded/dinojammies + item_cost = 10000 + /* * MISC */ diff --git a/monkestation/code/modules/storytellers/config.dm b/monkestation/code/modules/storytellers/config.dm new file mode 100644 index 000000000000..121a512099d1 --- /dev/null +++ b/monkestation/code/modules/storytellers/config.dm @@ -0,0 +1,149 @@ +///Gamemode related configs below +// Point Gain Multipliers +/datum/config_entry/number/mundane_point_gain_multiplier + config_entry_value = 1 + min_val = 0 + +/datum/config_entry/number/moderate_point_gain_multiplier + config_entry_value = 1 + min_val = 0 + +/datum/config_entry/number/major_point_gain_multiplier + config_entry_value = 1 + min_val = 0 + +/datum/config_entry/number/roleset_point_gain_multiplier + config_entry_value = 1 + min_val = 0 + +/datum/config_entry/number/objectives_point_gain_multiplier + config_entry_value = 1 + min_val = 0 + +// Roundstart points Multipliers +/datum/config_entry/number/mundane_roundstart_point_multiplier + config_entry_value = 1 + min_val = 0 + +/datum/config_entry/number/moderate_roundstart_point_multiplier + config_entry_value = 1 + min_val = 0 + +/datum/config_entry/number/major_roundstart_point_multiplier + config_entry_value = 1 + min_val = 0 + +/datum/config_entry/number/roleset_roundstart_point_multiplier + config_entry_value = 1 + min_val = 0 + +/datum/config_entry/number/objectives_roundstart_point_multiplier + config_entry_value = 1 + min_val = 0 + +// Minimum population +/datum/config_entry/number/mundane_min_pop + config_entry_value = MUNDANE_MIN_POP + integer = TRUE + min_val = 0 + +/datum/config_entry/number/moderate_min_pop + config_entry_value = MODERATE_MIN_POP + integer = TRUE + min_val = 0 + +/datum/config_entry/number/major_min_pop + config_entry_value = MAJOR_MIN_POP + integer = TRUE + min_val = 0 + +/datum/config_entry/number/roleset_min_pop + config_entry_value = ROLESET_MIN_POP + integer = TRUE + min_val = 0 + +/datum/config_entry/number/objectives_min_pop + config_entry_value = OBJECTIVES_MIN_POP + integer = TRUE + min_val = 0 + +// Point Thresholds +/datum/config_entry/number/mundane_point_threshold + config_entry_value = MUNDANE_POINT_THRESHOLD + integer = TRUE + min_val = 0 + +/datum/config_entry/number/moderate_point_threshold + config_entry_value = MODERATE_POINT_THRESHOLD + integer = TRUE + min_val = 0 + +/datum/config_entry/number/major_point_threshold + config_entry_value = MAJOR_POINT_THRESHOLD + integer = TRUE + min_val = 0 + +/datum/config_entry/number/roleset_point_threshold + config_entry_value = ROLESET_POINT_THRESHOLD + integer = TRUE + min_val = 0 + +/datum/config_entry/number/objectives_point_threshold + config_entry_value = OBJECTIVES_POINT_THRESHOLD + integer = TRUE + min_val = 0 + + +/datum/config_entry/flag/allow_storyteller_pop_scaling // Allows storyteller to scale down the event frequency by population + +// Pop scalling thresholds +/datum/config_entry/number/mundane_pop_scale_threshold + config_entry_value = MUNDANE_POP_SCALE_THRESHOLD + integer = TRUE + min_val = 0 + +/datum/config_entry/number/moderate_pop_scale_threshold + config_entry_value = MODERATE_POP_SCALE_THRESHOLD + integer = TRUE + min_val = 0 + +/datum/config_entry/number/major_pop_scale_threshold + config_entry_value = MAJOR_POP_SCALE_THRESHOLD + integer = TRUE + min_val = 0 + +/datum/config_entry/number/roleset_pop_scale_threshold + config_entry_value = ROLESET_POP_SCALE_THRESHOLD + integer = TRUE + min_val = 0 + +/datum/config_entry/number/objectives_pop_scale_threshold + config_entry_value = OBJECTIVES_POP_SCALE_THRESHOLD + integer = TRUE + min_val = 0 + +// Pop scalling penalties +/datum/config_entry/number/mundane_pop_scale_penalty + config_entry_value = MUNDANE_POP_SCALE_PENALTY + integer = TRUE + min_val = 0 + +/datum/config_entry/number/moderate_pop_scale_penalty + config_entry_value = MODERATE_POP_SCALE_PENALTY + integer = TRUE + min_val = 0 + +/datum/config_entry/number/major_pop_scale_penalty + config_entry_value = MAJOR_POP_SCALE_PENALTY + integer = TRUE + min_val = 0 + +/datum/config_entry/number/roleset_pop_scale_penalty + config_entry_value = ROLESET_POP_SCALE_PENALTY + integer = TRUE + min_val = 0 + +/datum/config_entry/number/objectives_pop_scale_penalty + config_entry_value = OBJECTIVES_POP_SCALE_PENALTY + integer = TRUE + min_val = 0 diff --git a/monkestation/code/modules/storytellers/converted_events/_base_event.dm b/monkestation/code/modules/storytellers/converted_events/_base_event.dm new file mode 100644 index 000000000000..17157e44bf6a --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/_base_event.dm @@ -0,0 +1,249 @@ +/datum/round_event_control + ///do we check against the antag cap before attempting a spawn? + var/checks_antag_cap = FALSE + /// List of enemy roles, will check if x amount of these exist exist + var/list/enemy_roles + ///required number of enemies in roles to exist + var/required_enemies = 0 + +/datum/round_event_control/proc/return_failure_string(players_amt) + var/string + if(roundstart && (world.time-SSticker.round_start_time >= 2 MINUTES)) + string += "Roundstart" + if(occurrences >= max_occurrences) + if(string) + string += "," + string += "Cap Reached" + if(earliest_start >= world.time-SSticker.round_start_time) + if(string) + string += "," + string +="Too Soon" + if(players_amt < min_players) + if(string) + string += "," + string += "Lack of players" + if(holidayID && !check_holidays(holidayID)) + if(string) + string += "," + string += "Holiday Event" + if(EMERGENCY_ESCAPED_OR_ENDGAMED) + if(string) + string += "," + string += "Round End" + if(checks_antag_cap) + if(!roundstart && !SSgamemode.can_inject_antags()) + if(string) + string += "," + string += "Too Many Antags" + return string + +/datum/round_event_control/antagonist/return_failure_string(players_amt) + . =..() + if(!check_enemies()) + if(.) + . += ", " + . += "No Enemies" + if(!check_required()) + if(.) + . += ", " + . += "No Required" + return . + +/datum/round_event_control/antagonist/solo/return_failure_string(players_amt) + . =..() + + var/antag_amt = get_antag_amount() + var/list/candidates = get_candidates() + if(candidates.len < antag_amt) + if(.) + . += ", " + . += "Not Enough Candidates!" + + return . + +/datum/round_event_control/antagonist + checks_antag_cap = TRUE + track = EVENT_TRACK_ROLESET + ///list of required roles, needed for this to form + var/list/exclusive_roles + /// Protected roles from the antag roll. People will not get those roles if a config is enabled + var/list/protected_roles + /// Restricted roles from the antag roll + var/list/restricted_roles + +/datum/round_event_control/antagonist/proc/check_required() + if(!length(exclusive_roles)) + return TRUE + for (var/mob/M in GLOB.alive_player_list) + if (M.stat == DEAD) + continue // Dead players cannot count as passing requirements + if(M.mind && (M.mind.assigned_role.title in exclusive_roles)) + return TRUE + +/datum/round_event_control/antagonist/proc/trim_candidates(list/candidates) + return candidates + +/datum/round_event_control/proc/check_enemies() + if(!length(enemy_roles)) + return TRUE + var/job_check = 0 + for (var/mob/M in GLOB.alive_player_list) + if (M.stat == DEAD) + continue // Dead players cannot count as opponents + if (M.mind && (M.mind.assigned_role.title in enemy_roles)) + job_check++ // Checking for "enemies" (such as sec officers). To be counters, they must either not be candidates to that rule, or have a job that restricts them from it + + if(job_check >= required_enemies) + return TRUE + return FALSE + +/datum/round_event_control/antagonist/New() + . = ..() + if(CONFIG_GET(flag/protect_roles_from_antagonist)) + restricted_roles |= protected_roles + +/datum/round_event_control/antagonist/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) + . = ..() + if(!check_required()) + return FALSE + + if(!.) + return + +/datum/round_event_control/antagonist/solo + typepath = /datum/round_event/antagonist/solo + /// How many baseline antags do we spawn + var/base_antags = 1 + /// How many maximum antags can we spawn + var/maximum_antags = 3 + /// For this many players we'll add 1 up to the maximum antag amount + var/denominator = 20 + /// The antag flag to be used + var/antag_flag + /// The antag datum to be applied + var/antag_datum + /// Prompt players for consent to turn them into antags before doing so. Dont allow this for roundstart. + var/prompted_picking = FALSE + +/datum/round_event_control/antagonist/solo/from_ghosts/get_candidates() + var/round_started = SSticker.HasRoundStarted() + var/midround_antag_pref_arg = round_started ? FALSE : TRUE + + var/list/candidates = SSgamemode.get_candidates(antag_flag, antag_flag, observers = TRUE, midround_antag_pref = midround_antag_pref_arg, restricted_roles = restricted_roles) + candidates = trim_candidates(candidates) + return candidates + +/datum/round_event_control/antagonist/solo/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) + . = ..() + if(!.) + return + var/antag_amt = get_antag_amount() + var/list/candidates = get_candidates() + if(candidates.len < antag_amt) + return FALSE + +/datum/round_event_control/antagonist/solo/proc/get_antag_amount() + var/people = SSgamemode.get_correct_popcount() + var/amount = base_antags + FLOOR(people / denominator, 1) + return min(amount, maximum_antags) + +/datum/round_event_control/antagonist/solo/proc/get_candidates() + var/round_started = SSticker.HasRoundStarted() + var/new_players_arg = round_started ? FALSE : TRUE + var/living_players_arg = round_started ? TRUE : FALSE + var/midround_antag_pref_arg = round_started ? FALSE : TRUE + + var/list/candidates = SSgamemode.get_candidates(antag_flag, antag_flag, ready_newplayers = new_players_arg, living_players = living_players_arg, midround_antag_pref = midround_antag_pref_arg, restricted_roles = restricted_roles, required_roles = exclusive_roles) + candidates = trim_candidates(candidates) + return candidates + +/datum/round_event + var/excute_round_end_reports = FALSE + +/datum/round_event/proc/round_end_report() + return + +/datum/round_event/setup() + . = ..() + if(excute_round_end_reports) + SSgamemode.round_end_data |= src + +/datum/round_event/antagonist + fakeable = FALSE + end_when = 60 //This is so prompted picking events have time to run //TODO: refactor events so they can be the masters of themselves, instead of relying on some weirdly timed vars + +/datum/round_event/antagonist/solo + // ALL of those variables are internal. Check the control event to change them + /// The antag flag passed from control + var/antag_flag + /// The antag datum passed from control + var/antag_datum + /// The antag count passed from control + var/antag_count + /// The restricted roles (jobs) passed from control + var/list/restricted_roles + /// The minds we've setup in setup() and need to finalize in start() + var/list/setup_minds = list() + /// Whether we prompt the players before picking them. + var/prompted_picking = FALSE //TODO: Implement this + +/datum/round_event/antagonist/solo/setup() + var/datum/round_event_control/antagonist/solo/cast_control = control + antag_count = cast_control.get_antag_amount() + antag_flag = cast_control.antag_flag + antag_datum = cast_control.antag_datum + restricted_roles = cast_control.restricted_roles + prompted_picking = cast_control.prompted_picking + var/list/candidates = cast_control.get_candidates() + if(prompted_picking) + candidates = poll_candidates("Would you like to be a [cast_control.name]", antag_flag, antag_flag, 20 SECONDS, FALSE, FALSE, candidates) + + for(var/i in 1 to antag_count) + if(!candidates.len) + break + var/mob/candidate = pick_n_take(candidates) + if(!candidate.mind) + candidate.mind = new /datum/mind(candidate.key) + + setup_minds += candidate.mind + candidate.mind.special_role = antag_flag + candidate.mind.restricted_roles = restricted_roles + setup = TRUE + + +/datum/round_event/antagonist/solo/ghost/setup() + var/datum/round_event_control/antagonist/solo/cast_control = control + antag_count = cast_control.get_antag_amount() + antag_flag = cast_control.antag_flag + antag_datum = cast_control.antag_datum + restricted_roles = cast_control.restricted_roles + prompted_picking = cast_control.prompted_picking + var/list/candidates = cast_control.get_candidates() + if(prompted_picking) + candidates = poll_candidates("Would you like to be a [cast_control.name]", antag_flag, antag_flag, 20 SECONDS, FALSE, FALSE, candidates) + + for(var/i in 1 to antag_count) + if(!candidates.len) + break + var/mob/candidate = pick_n_take(candidates) + if(!candidate.mind) + candidate.mind = new /datum/mind(candidate.key) + + var/mob/living/carbon/human/new_human = make_body(candidate) + new_human.mind.special_role = antag_flag + new_human.mind.restricted_roles = restricted_roles + setup_minds += new_human.mind + setup = TRUE + + +/datum/round_event/antagonist/solo/start() + for(var/datum/mind/antag_mind as anything in setup_minds) + add_datum_to_mind(antag_mind, antag_mind.current) + +/datum/round_event/antagonist/solo/proc/add_datum_to_mind(datum/mind/antag_mind) + antag_mind.add_antag_datum(antag_datum) + +/datum/round_event/antagonist/solo/ghost/start() + for(var/datum/mind/antag_mind as anything in setup_minds) + add_datum_to_mind(antag_mind) + diff --git a/monkestation/code/modules/storytellers/converted_events/event_overrides.dm b/monkestation/code/modules/storytellers/converted_events/event_overrides.dm new file mode 100644 index 000000000000..0c74026d92e9 --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/event_overrides.dm @@ -0,0 +1,231 @@ +/datum/round_event_control/abductor + track = EVENT_TRACK_MAJOR + tags = list(TAG_TARGETED, TAG_SPOOKY, TAG_EXTERNAL) + checks_antag_cap = TRUE + +/datum/round_event_control/anomaly + track = EVENT_TRACK_MODERATE + tags = list(TAG_DESTRUCTIVE) + +/datum/round_event_control/alien_infestation + track = EVENT_TRACK_MAJOR + tags = list(TAG_COMBAT, TAG_DESTRUCTIVE, TAG_EXTERNAL) + checks_antag_cap = TRUE + +/datum/round_event_control/aurora_caelus + track = EVENT_TRACK_MUNDANE + tags = list(TAG_COMMUNAL, TAG_POSITIVE, TAG_SPACE) + +/datum/round_event_control/blob + track = EVENT_TRACK_MAJOR + tags = list(TAG_DESTRUCTIVE, TAG_COMBAT, TAG_EXTERNAL) + checks_antag_cap = TRUE + +/datum/round_event_control/brain_trauma + track = EVENT_TRACK_MUNDANE + tags = list(TAG_TARGETED) + +/datum/round_event_control/brand_intelligence + track = EVENT_TRACK_MODERATE + tags = list(TAG_DESTRUCTIVE, TAG_COMMUNAL) + +/datum/round_event_control/bureaucratic_error + track = EVENT_TRACK_MAJOR // if you've ever dealt with 10 mimes you understand why. + tags = list(TAG_COMMUNAL) + +/datum/round_event_control/camera_failure + track = EVENT_TRACK_MUNDANE + tags = list(TAG_COMMUNAL, TAG_SPOOKY) + +/datum/round_event_control/carp_migration + track = EVENT_TRACK_MODERATE + tags = list(TAG_DESTRUCTIVE, TAG_COMBAT, TAG_SPACE, TAG_EXTERNAL) + +/datum/round_event_control/changeling //THIS IS THE METEOR EVENT, IT NEEDS TO BE A METEOR, DO NOT SPAWN THIS ON PLANETARY MAPS + track = EVENT_TRACK_MAJOR + tags = list(TAG_COMBAT, TAG_SPACE, TAG_EXTERNAL) + checks_antag_cap = TRUE + +/datum/round_event_control/communications_blackout + max_occurrences = 2 + track = EVENT_TRACK_MODERATE + tags = list(TAG_COMMUNAL, TAG_SPOOKY) + +/datum/round_event_control/disease_outbreak + track = EVENT_TRACK_MAJOR + tags = list(TAG_TARGETED, TAG_COMMUNAL, TAG_EXTERNAL) + +/datum/round_event_control/electrical_storm + track = EVENT_TRACK_MUNDANE + tags = list(TAG_SPOOKY) + +/datum/round_event_control/fake_virus + track = EVENT_TRACK_MUNDANE + tags = list(TAG_TARGETED) + +/datum/round_event_control/falsealarm + track = EVENT_TRACK_MUNDANE + tags = list(TAG_COMMUNAL) + +/datum/round_event_control/fugitives + track = EVENT_TRACK_MAJOR + tags = list(TAG_COMBAT, TAG_EXTERNAL) + checks_antag_cap = TRUE + +/datum/round_event_control/gravity_generator_blackout + track = EVENT_TRACK_MODERATE + tags = list(TAG_COMMUNAL, TAG_SPACE) + +/datum/round_event_control/grey_tide + track = EVENT_TRACK_MODERATE + tags = list(TAG_DESTRUCTIVE, TAG_SPOOKY) + +/datum/round_event_control/grid_check + track = EVENT_TRACK_MODERATE + tags = list(TAG_COMMUNAL, TAG_SPOOKY) + +/datum/round_event_control/heart_attack + track = EVENT_TRACK_MODERATE + tags = list(TAG_TARGETED) + +/datum/round_event_control/immovable_rod + track = EVENT_TRACK_MODERATE + tags = list(TAG_DESTRUCTIVE, TAG_EXTERNAL) + +/datum/round_event_control/ion_storm + track = EVENT_TRACK_MODERATE + tags = list(TAG_TARGETED) + +/datum/round_event_control/mass_hallucination + track = EVENT_TRACK_MODERATE + tags = list(TAG_COMMUNAL) + +/datum/round_event_control/meteor_wave + track = EVENT_TRACK_MAJOR + tags = list(TAG_COMMUNAL, TAG_SPACE, TAG_DESTRUCTIVE, TAG_EXTERNAL) + +/datum/round_event_control/mice_migration + track = EVENT_TRACK_MUNDANE + tags = list(TAG_DESTRUCTIVE) + +/datum/round_event_control/morph + track = EVENT_TRACK_ROLESET + tags = list(TAG_COMBAT, TAG_SPOOKY, TAG_EXTERNAL) + checks_antag_cap = TRUE + +/datum/round_event_control/nightmare + track = EVENT_TRACK_ROLESET + tags = list(TAG_COMBAT, TAG_SPOOKY, TAG_EXTERNAL) + checks_antag_cap = TRUE + +/datum/round_event_control/obsessed + track = EVENT_TRACK_MODERATE + tags = list(TAG_CREW_ANTAG, TAG_TARGETED) + +/datum/round_event_control/operative + track = EVENT_TRACK_MAJOR + tags = list(TAG_DESTRUCTIVE, TAG_COMBAT, TAG_EXTERNAL) + checks_antag_cap = TRUE + +/datum/round_event_control/portal_storm_syndicate + track = EVENT_TRACK_MAJOR + tags = list(TAG_COMBAT, TAG_EXTERNAL) + +/datum/round_event_control/processor_overload + max_occurrences = 2 + track = EVENT_TRACK_MODERATE + tags = list(TAG_COMMUNAL) + +/datum/round_event_control/radiation_leak + track = EVENT_TRACK_MODERATE + tags = list(TAG_COMMUNAL) + +/datum/round_event_control/radiation_storm + track = EVENT_TRACK_MODERATE + tags = list(TAG_COMMUNAL) + +/datum/round_event_control/revenant + track = EVENT_TRACK_ROLESET + tags = list(TAG_DESTRUCTIVE, TAG_SPOOKY, TAG_EXTERNAL) + checks_antag_cap = TRUE + +/datum/round_event_control/sandstorm + track = EVENT_TRACK_MODERATE + tags = list(TAG_DESTRUCTIVE, TAG_EXTERNAL) + +/datum/round_event_control/scrubber_clog + track = EVENT_TRACK_MUNDANE + tags = list(TAG_COMMUNAL) + +/datum/round_event_control/scrubber_clog/critical + track = EVENT_TRACK_MAJOR + tags = list(TAG_COMMUNAL, TAG_COMBAT, TAG_EXTERNAL) + +/datum/round_event_control/scrubber_overflow + track = EVENT_TRACK_MUNDANE + tags = list(TAG_COMMUNAL) + +/datum/round_event_control/sentience + track = EVENT_TRACK_MODERATE + tags = list(TAG_COMMUNAL, TAG_SPOOKY) + +/datum/round_event_control/sentient_disease + track = EVENT_TRACK_MAJOR + tags = list(TAG_COMBAT, TAG_DESTRUCTIVE, TAG_EXTERNAL) + checks_antag_cap = TRUE + +/datum/round_event_control/shuttle_catastrophe + track = EVENT_TRACK_MODERATE + tags = list(TAG_COMMUNAL) + +/datum/round_event_control/shuttle_insurance + track = EVENT_TRACK_MODERATE + tags = list(TAG_COMMUNAL) + +/datum/round_event_control/slaughter + track = EVENT_TRACK_MAJOR + tags = list(TAG_COMBAT, TAG_SPOOKY, TAG_EXTERNAL) + checks_antag_cap = TRUE + +/datum/round_event_control/space_dust + track = EVENT_TRACK_MUNDANE + tags = list(TAG_DESTRUCTIVE, TAG_SPACE, TAG_EXTERNAL) + +/datum/round_event_control/space_dragon + track = EVENT_TRACK_ROLESET + tags = list(TAG_COMBAT, TAG_SPACE, TAG_EXTERNAL) + checks_antag_cap = TRUE + +/datum/round_event_control/space_ninja + track = EVENT_TRACK_ROLESET + tags = list(TAG_COMBAT, TAG_DESTRUCTIVE, TAG_EXTERNAL) + checks_antag_cap = TRUE + +/datum/round_event_control/spacevine + track = EVENT_TRACK_MAJOR + tags = list(TAG_COMBAT, TAG_DESTRUCTIVE) + checks_antag_cap = TRUE + +/datum/round_event_control/spider_infestation + track = EVENT_TRACK_ROLESET + tags = list(TAG_COMBAT, TAG_DESTRUCTIVE, TAG_EXTERNAL) + +/datum/round_event_control/stray_cargo + track = EVENT_TRACK_MUNDANE + tags = list(TAG_COMMUNAL) + +/datum/round_event_control/stray_meteor + track = EVENT_TRACK_MODERATE + tags = list(TAG_DESTRUCTIVE, TAG_SPACE, TAG_EXTERNAL) + +/datum/round_event_control/tram_malfunction + track = EVENT_TRACK_MUNDANE + tags = list(TAG_COMMUNAL) + +/datum/round_event_control/wisdomcow + track = EVENT_TRACK_MUNDANE + tags = list(TAG_COMMUNAL, TAG_POSITIVE) + +/datum/round_event_control/wormholes + track = EVENT_TRACK_MODERATE + tags = list(TAG_COMMUNAL) diff --git a/monkestation/code/modules/storytellers/converted_events/solo/bloodcult.dm b/monkestation/code/modules/storytellers/converted_events/solo/bloodcult.dm new file mode 100644 index 000000000000..f76463ae9e06 --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/solo/bloodcult.dm @@ -0,0 +1,75 @@ +/datum/round_event_control/antagonist/solo/bloodcult + name = "Blood Cult" + tags = list(TAG_SPOOKY, TAG_DESTRUCTIVE, TAG_COMBAT, TAG_TEAM_ANTAG) + antag_flag = ROLE_CULTIST + antag_datum = /datum/antagonist/cult + typepath = /datum/round_event/antagonist/solo/bloodcult + restricted_roles = list( + JOB_AI, + JOB_CAPTAIN, + JOB_CHAPLAIN, + JOB_CYBORG, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_PRISONER, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + maximum_antags = 3 + enemy_roles = list( + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + required_enemies = 5 + base_antags = 2 + // I give up, just there should be enough heads with 35 players... + min_players = 30 + roundstart = TRUE + earliest_start = 0 SECONDS + weight = 4 + max_occurrences = 3 + +/datum/round_event/antagonist/solo/bloodcult + excute_round_end_reports = TRUE + end_when = 60000 + var/static/datum/team/cult/main_cult + +/datum/round_event/antagonist/solo/bloodcult/setup() + . = ..() + if(!main_cult) + main_cult = new() + +/datum/round_event/antagonist/solo/bloodcult/start() + . = ..() + main_cult.setup_objectives() + +/datum/round_event/antagonist/solo/bloodcult/add_datum_to_mind(datum/mind/antag_mind) + var/datum/antagonist/cult/new_cultist = new antag_datum() + new_cultist.cult_team = main_cult + new_cultist.give_equipment = TRUE + antag_mind.add_antag_datum(new_cultist) + +/datum/round_event/antagonist/solo/bloodcult/round_end_report() + if(main_cult.check_cult_victory()) + SSticker.mode_result = "win - cult win" + SSticker.news_report = CULT_SUMMON + return + + SSticker.mode_result = "loss - staff stopped the cult" + + if(main_cult.size_at_maximum == 0) + CRASH("Cult team existed with a size_at_maximum of 0 at round end!") + + // If more than a certain ratio of our cultists have escaped, give the "cult escape" resport. + // Otherwise, give the "cult failure" report. + var/ratio_to_be_considered_escaped = 0.5 + var/escaped_cultists = 0 + for(var/datum/mind/escapee as anything in main_cult.members) + if(considered_escaped(escapee)) + escaped_cultists++ + + SSticker.news_report = (escaped_cultists / main_cult.size_at_maximum) >= ratio_to_be_considered_escaped ? CULT_ESCAPE : CULT_FAILURE diff --git a/monkestation/code/modules/storytellers/converted_events/solo/bloodsuckers.dm b/monkestation/code/modules/storytellers/converted_events/solo/bloodsuckers.dm new file mode 100644 index 000000000000..b1d19ed354f5 --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/solo/bloodsuckers.dm @@ -0,0 +1,39 @@ +/datum/round_event_control/antagonist/solo/bloodsucker + antag_flag = ROLE_BLOODSUCKER + tags = list(TAG_COMBAT) + antag_datum = /datum/antagonist/bloodsucker + protected_roles = list( + JOB_CAPTAIN, + JOB_HEAD_OF_PERSONNEL, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_RESEARCH_DIRECTOR, + JOB_DETECTIVE, + JOB_HEAD_OF_SECURITY, + JOB_PRISONER, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + restricted_roles = list( + JOB_AI, + JOB_CYBORG, + ) + min_players = 20 + weight = 5 + maximum_antags = 2 + +/datum/round_event_control/antagonist/solo/bloodsucker/roundstart + name = "Bloodsuckers" + roundstart = TRUE + earliest_start = 0 SECONDS + +/datum/round_event_control/antagonist/solo/bloodsucker/midround + typepath = /datum/round_event/antagonist/solo/bloodsucker + antag_flag = ROLE_VAMPIRICACCIDENT + name = "Vampiric Accident" + prompted_picking = TRUE + max_occurrences = 1 + +/datum/round_event/antagonist/solo/bloodsucker/add_datum_to_mind(datum/mind/antag_mind) + var/datum/antagonist/bloodsucker/bloodsuckerdatum = antag_mind.make_bloodsucker() + bloodsuckerdatum.bloodsucker_level_unspent = rand(2,3) diff --git a/monkestation/code/modules/storytellers/converted_events/solo/changeling.dm b/monkestation/code/modules/storytellers/converted_events/solo/changeling.dm new file mode 100644 index 000000000000..0171f36d42ae --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/solo/changeling.dm @@ -0,0 +1,30 @@ +/datum/round_event_control/antagonist/solo/changeling + antag_flag = ROLE_CHANGELING + tags = list(TAG_COMBAT) + antag_datum = /datum/antagonist/changeling + protected_roles = list( + JOB_CAPTAIN, + JOB_HEAD_OF_PERSONNEL, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_RESEARCH_DIRECTOR, + JOB_DETECTIVE, + JOB_HEAD_OF_SECURITY, + JOB_PRISONER, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + restricted_roles = list( + JOB_AI, + JOB_CYBORG, + ) + min_players = 20 + +/datum/round_event_control/antagonist/solo/changeling/roundstart + name = "Changelings" + roundstart = TRUE + earliest_start = 0 + +/datum/round_event_control/antagonist/solo/changeling/midround + name = "Genome Awakening (Changelings)" + prompted_picking = TRUE diff --git a/monkestation/code/modules/storytellers/converted_events/solo/clockwork_cult.dm b/monkestation/code/modules/storytellers/converted_events/solo/clockwork_cult.dm new file mode 100644 index 000000000000..d981c6eab709 --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/solo/clockwork_cult.dm @@ -0,0 +1,46 @@ +/datum/round_event_control/antagonist/solo/clockcult + name = "Clock Cult" + tags = list(TAG_SPOOKY, TAG_DESTRUCTIVE, TAG_COMBAT, TAG_TEAM_ANTAG, TAG_EXTERNAL) + antag_flag = ROLE_CLOCK_CULTIST + antag_datum = /datum/antagonist/clock_cultist + typepath = /datum/round_event/antagonist/solo/clockcult + restricted_roles = list( + JOB_AI, + JOB_CAPTAIN, + JOB_CHAPLAIN, + JOB_CYBORG, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_PRISONER, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + maximum_antags = 3 + enemy_roles = list( + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + required_enemies = 3 + base_antags = 4 + maximum_antags = 4 + // I give up, just there should be enough heads with 35 players... + min_players = 30 + roundstart = TRUE + earliest_start = 0 SECONDS + weight = 4 + max_occurrences = 3 + +/datum/round_event/antagonist/solo/clockcult + end_when = 60000 + +/datum/round_event/antagonist/solo/clockcult/setup() + . = ..() + INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(spawn_reebe)) + +/datum/round_event/antagonist/solo/clockcult/add_datum_to_mind(datum/mind/antag_mind) + antag_mind.special_role = ROLE_CLOCK_CULTIST + antag_mind.add_antag_datum(antag_datum) diff --git a/monkestation/code/modules/storytellers/converted_events/solo/clown_operative.dm b/monkestation/code/modules/storytellers/converted_events/solo/clown_operative.dm new file mode 100644 index 000000000000..fb2893a9d7c4 --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/solo/clown_operative.dm @@ -0,0 +1,118 @@ +/datum/round_event_control/antagonist/solo/clown_operative + name = "Roundstart Clown Operative" + tags = list(TAG_DESTRUCTIVE, TAG_COMBAT, TAG_TEAM_ANTAG, TAG_EXTERNAL) + antag_flag = ROLE_CLOWN_OPERATIVE + antag_datum = /datum/antagonist/nukeop/clownop + typepath = /datum/round_event/antagonist/solo/clown_operative + restricted_roles = list( + JOB_AI, + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_CYBORG, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_PRISONER, + JOB_RESEARCH_DIRECTOR, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + base_antags = 3 + maximum_antags = 5 + enemy_roles = list( + JOB_AI, + JOB_CYBORG, + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + required_enemies = 5 + // I give up, just there should be enough heads with 35 players... + min_players = 35 + roundstart = TRUE + earliest_start = 0 SECONDS + weight = 4 + max_occurrences = 1 + +/datum/round_event/antagonist/solo/clown_operative + excute_round_end_reports = TRUE + end_when = 60000 /// we will end on our own when revs win + var/static/datum/team/nuclear/nuke_team + var/set_leader = FALSE + var/required_role = ROLE_CLOWN_OPERATIVE + +/datum/round_event/antagonist/solo/clown_operative/setup() + . = ..() + var/obj/machinery/nuclearbomb/syndicate/syndicate_nuke = locate() in GLOB.nuke_list + if(syndicate_nuke) + var/turf/nuke_turf = get_turf(syndicate_nuke) + if(nuke_turf) + new /obj/machinery/nuclearbomb/syndicate/bananium(nuke_turf) + qdel(syndicate_nuke) + +/datum/round_event/antagonist/solo/clown_operative/add_datum_to_mind(datum/mind/antag_mind) + var/mob/living/current_mob = antag_mind.current + SSjob.FreeRole(antag_mind.assigned_role.title) + var/list/items = current_mob.get_equipped_items(TRUE) + current_mob.unequip_everything() + for(var/obj/item/item as anything in items) + qdel(item) + + antag_mind.set_assigned_role(SSjob.GetJobType(/datum/job/clown_operative)) + antag_mind.special_role = ROLE_CLOWN_OPERATIVE + + var/datum/mind/most_experienced = get_most_experienced(setup_minds, required_role) + if(!most_experienced) + most_experienced = antag_mind + + if(!set_leader) + set_leader = TRUE + var/datum/antagonist/nukeop/leader/leader_antag_datum = new() + nuke_team = leader_antag_datum.nuke_team + most_experienced.add_antag_datum(leader_antag_datum) + var/mob/living/carbon/human/leader = most_experienced.current + leader.equip_species_outfit(/datum/outfit/syndicate/clownop/leader) + + if(antag_mind == most_experienced) + return + + var/datum/antagonist/nukeop/new_op = new antag_datum() + antag_mind.add_antag_datum(new_op) + + +/datum/round_event/antagonist/solo/clown_operative/round_end_report() + var/result = nuke_team.get_result() + switch(result) + if(NUKE_RESULT_FLUKE) + SSticker.mode_result = "loss - syndicate nuked - disk secured" + SSticker.news_report = NUKE_SYNDICATE_BASE + if(NUKE_RESULT_NUKE_WIN) + SSticker.mode_result = "win - syndicate nuke" + SSticker.news_report = STATION_DESTROYED_NUKE + if(NUKE_RESULT_NOSURVIVORS) + SSticker.mode_result = "halfwin - syndicate nuke - did not evacuate in time" + SSticker.news_report = STATION_DESTROYED_NUKE + if(NUKE_RESULT_WRONG_STATION) + SSticker.mode_result = "halfwin - blew wrong station" + SSticker.news_report = NUKE_MISS + if(NUKE_RESULT_WRONG_STATION_DEAD) + SSticker.mode_result = "halfwin - blew wrong station - did not evacuate in time" + SSticker.news_report = NUKE_MISS + if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD) + SSticker.mode_result = "loss - evacuation - disk secured - syndi team dead" + SSticker.news_report = OPERATIVES_KILLED + if(NUKE_RESULT_CREW_WIN) + SSticker.mode_result = "loss - evacuation - disk secured" + SSticker.news_report = OPERATIVES_KILLED + if(NUKE_RESULT_DISK_LOST) + SSticker.mode_result = "halfwin - evacuation - disk not secured" + SSticker.news_report = OPERATIVE_SKIRMISH + if(NUKE_RESULT_DISK_STOLEN) + SSticker.mode_result = "halfwin - detonation averted" + SSticker.news_report = OPERATIVE_SKIRMISH + else + SSticker.mode_result = "halfwin - interrupted" + SSticker.news_report = OPERATIVE_SKIRMISH diff --git a/monkestation/code/modules/storytellers/converted_events/solo/ghosts/nuclear_operative_ghost.dm b/monkestation/code/modules/storytellers/converted_events/solo/ghosts/nuclear_operative_ghost.dm new file mode 100644 index 000000000000..797166c51d42 --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/solo/ghosts/nuclear_operative_ghost.dm @@ -0,0 +1,106 @@ +/datum/round_event_control/antagonist/solo/from_ghosts/nuclear_operative + name = "Nuclear Assault" + tags = list(TAG_DESTRUCTIVE, TAG_COMBAT, TAG_TEAM_ANTAG, TAG_EXTERNAL) + antag_flag = ROLE_OPERATIVE_MIDROUND + antag_datum = /datum/antagonist/nukeop + typepath = /datum/round_event/antagonist/solo/ghost/nuclear_operative + restricted_roles = list( + JOB_AI, + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_CYBORG, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_PRISONER, + JOB_RESEARCH_DIRECTOR, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + base_antags = 3 + maximum_antags = 4 + enemy_roles = list( + JOB_AI, + JOB_CYBORG, + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + required_enemies = 5 + // I give up, just there should be enough heads with 35 players... + min_players = 35 + roundstart = TRUE + earliest_start = 45 MINUTES + weight = 4 + max_occurrences = 1 + +/datum/round_event/antagonist/solo/ghost/nuclear_operative + excute_round_end_reports = TRUE + end_when = 60000 /// we will end on our own when revs win + var/static/datum/team/nuclear/nuke_team + var/set_leader = FALSE + var/required_role = ROLE_NUCLEAR_OPERATIVE + +/datum/round_event/antagonist/solo/ghost/nuclear_operative/add_datum_to_mind(datum/mind/antag_mind) + var/mob/living/current_mob = antag_mind.current + var/list/items = current_mob.get_equipped_items(TRUE) + current_mob.unequip_everything() + for(var/obj/item/item as anything in items) + qdel(item) + + var/datum/mind/most_experienced = get_most_experienced(setup_minds, required_role) + antag_mind.set_assigned_role(SSjob.GetJobType(/datum/job/nuclear_operative)) + antag_mind.special_role = ROLE_NUCLEAR_OPERATIVE + + if(!most_experienced) + most_experienced = antag_mind + + if(!set_leader) + set_leader = TRUE + var/datum/antagonist/nukeop/leader/leader_antag_datum = new() + nuke_team = leader_antag_datum.nuke_team + most_experienced.add_antag_datum(leader_antag_datum) + + if(antag_mind == most_experienced) + return + + var/datum/antagonist/nukeop/new_op = new antag_datum() + antag_mind.add_antag_datum(new_op) + + +/datum/round_event/antagonist/solo/ghost/nuclear_operative/round_end_report() + var/result = nuke_team.get_result() + switch(result) + if(NUKE_RESULT_FLUKE) + SSticker.mode_result = "loss - syndicate nuked - disk secured" + SSticker.news_report = NUKE_SYNDICATE_BASE + if(NUKE_RESULT_NUKE_WIN) + SSticker.mode_result = "win - syndicate nuke" + SSticker.news_report = STATION_DESTROYED_NUKE + if(NUKE_RESULT_NOSURVIVORS) + SSticker.mode_result = "halfwin - syndicate nuke - did not evacuate in time" + SSticker.news_report = STATION_DESTROYED_NUKE + if(NUKE_RESULT_WRONG_STATION) + SSticker.mode_result = "halfwin - blew wrong station" + SSticker.news_report = NUKE_MISS + if(NUKE_RESULT_WRONG_STATION_DEAD) + SSticker.mode_result = "halfwin - blew wrong station - did not evacuate in time" + SSticker.news_report = NUKE_MISS + if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD) + SSticker.mode_result = "loss - evacuation - disk secured - syndi team dead" + SSticker.news_report = OPERATIVES_KILLED + if(NUKE_RESULT_CREW_WIN) + SSticker.mode_result = "loss - evacuation - disk secured" + SSticker.news_report = OPERATIVES_KILLED + if(NUKE_RESULT_DISK_LOST) + SSticker.mode_result = "halfwin - evacuation - disk not secured" + SSticker.news_report = OPERATIVE_SKIRMISH + if(NUKE_RESULT_DISK_STOLEN) + SSticker.mode_result = "halfwin - detonation averted" + SSticker.news_report = OPERATIVE_SKIRMISH + else + SSticker.mode_result = "halfwin - interrupted" + SSticker.news_report = OPERATIVE_SKIRMISH diff --git a/monkestation/code/modules/storytellers/converted_events/solo/ghosts/wizard.dm b/monkestation/code/modules/storytellers/converted_events/solo/ghosts/wizard.dm new file mode 100644 index 000000000000..ca8147459457 --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/solo/ghosts/wizard.dm @@ -0,0 +1,28 @@ +/datum/round_event_control/antagonist/solo/from_ghosts/wizard + name = "Ghost Wizard" + tags = list(TAG_COMBAT, TAG_DESTRUCTIVE, TAG_EXTERNAL) + typepath = /datum/round_event/antagonist/solo/ghost/wizard + antag_flag = ROLE_WIZARD + antag_datum = /datum/antagonist/wizard + restricted_roles = list( + JOB_CAPTAIN, + JOB_HEAD_OF_SECURITY, + ) // Just to be sure that a wizard getting picked won't ever imply a Captain or HoS not getting drafted + maximum_antags = 1 + weight = 2 + min_players = 35 + max_occurrences = 1 + prompted_picking = TRUE + +/datum/round_event_control/antagonist/solo/ghost/wizard/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) + . = ..() + if(!.) + return + if(GLOB.wizardstart.len == 0) + return FALSE + +/datum/round_event/antagonist/solo/ghost/wizard + +/datum/round_event/antagonist/solo/ghost/wizard/add_datum_to_mind(datum/mind/antag_mind) + . = ..() + antag_mind.current.forceMove(pick(GLOB.wizardstart)) diff --git a/monkestation/code/modules/storytellers/converted_events/solo/heretic.dm b/monkestation/code/modules/storytellers/converted_events/solo/heretic.dm new file mode 100644 index 000000000000..cb0c244a83d7 --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/solo/heretic.dm @@ -0,0 +1,32 @@ +/datum/round_event_control/antagonist/solo/heretic + antag_flag = ROLE_HERETIC + tags = list(TAG_COMBAT, TAG_SPOOKY) + antag_datum = /datum/antagonist/heretic + protected_roles = list( + JOB_CAPTAIN, + JOB_HEAD_OF_PERSONNEL, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_RESEARCH_DIRECTOR, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_PRISONER, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + restricted_roles = list( + JOB_AI, + JOB_CYBORG, + ) + weight = 4 + min_players = 20 + +/datum/round_event_control/antagonist/solo/heretic/roundstart + name = "Heretics" + roundstart = TRUE + earliest_start = 0 + +/datum/round_event_control/antagonist/solo/heretic/midround + name = "Midround Heretics" + prompted_picking = TRUE diff --git a/monkestation/code/modules/storytellers/converted_events/solo/malf.dm b/monkestation/code/modules/storytellers/converted_events/solo/malf.dm new file mode 100644 index 000000000000..e6265aca5029 --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/solo/malf.dm @@ -0,0 +1,43 @@ +/datum/round_event_control/antagonist/solo/malf + antag_datum = /datum/antagonist/malf_ai + tags = list(TAG_COMBAT, TAG_DESTRUCTIVE) + antag_flag = ROLE_MALF + enemy_roles = list( + JOB_CHEMIST, + JOB_CHIEF_ENGINEER, + JOB_HEAD_OF_SECURITY, + JOB_RESEARCH_DIRECTOR, + JOB_SCIENTIST, + JOB_ROBOTICIST, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + maximum_antags = 1 + exclusive_roles = list(JOB_AI) + required_enemies = 4 + weight = 4 + max_occurrences = 1 + +/datum/round_event_control/antagonist/solo/malf/trim_candidates(list/candidates) + for(var/mob/living/player in candidates) + if(!isAI(player)) + candidates -= player + continue + + if(is_centcom_level(player.z)) + candidates -= player + continue + + if(player.mind && (player.mind.special_role || player.mind.antag_datums?.len > 0)) + candidates -= player + + return candidates + +/datum/round_event_control/antagonist/solo/malf/midround + name = "Malfunctioning AI Midround" + antag_flag = ROLE_MALF_MIDROUND + +/datum/round_event_control/antagonist/solo/malf/roundstart + name = "Roundstart Malf AI" + roundstart = TRUE + earliest_start = 0 diff --git a/monkestation/code/modules/storytellers/converted_events/solo/nuclear_operative.dm b/monkestation/code/modules/storytellers/converted_events/solo/nuclear_operative.dm new file mode 100644 index 000000000000..2debe9aac4a7 --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/solo/nuclear_operative.dm @@ -0,0 +1,109 @@ +/datum/round_event_control/antagonist/solo/nuclear_operative + name = "Roundstart Nuclear Operative" + tags = list(TAG_DESTRUCTIVE, TAG_COMBAT, TAG_TEAM_ANTAG, TAG_EXTERNAL) + antag_flag = ROLE_OPERATIVE + antag_datum = /datum/antagonist/nukeop + typepath = /datum/round_event/antagonist/solo/nuclear_operative + restricted_roles = list( + JOB_AI, + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_CYBORG, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_PRISONER, + JOB_RESEARCH_DIRECTOR, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + base_antags = 3 + maximum_antags = 5 + enemy_roles = list( + JOB_AI, + JOB_CYBORG, + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + required_enemies = 5 + // I give up, just there should be enough heads with 35 players... + min_players = 35 + roundstart = TRUE + earliest_start = 0 SECONDS + weight = 4 + max_occurrences = 3 + +/datum/round_event/antagonist/solo/nuclear_operative + excute_round_end_reports = TRUE + end_when = 60000 /// we will end on our own when revs win + var/static/datum/team/nuclear/nuke_team + var/set_leader = FALSE + var/required_role = ROLE_NUCLEAR_OPERATIVE + +/datum/round_event/antagonist/solo/nuclear_operative/add_datum_to_mind(datum/mind/antag_mind) + var/mob/living/current_mob = antag_mind.current + SSjob.FreeRole(antag_mind.assigned_role.title) + var/list/items = current_mob.get_equipped_items(TRUE) + current_mob.unequip_everything() + for(var/obj/item/item as anything in items) + qdel(item) + + var/datum/mind/most_experienced = get_most_experienced(setup_minds, required_role) + antag_mind.set_assigned_role(SSjob.GetJobType(/datum/job/nuclear_operative)) + antag_mind.special_role = ROLE_NUCLEAR_OPERATIVE + + if(!most_experienced) + most_experienced = antag_mind + + if(!set_leader) + set_leader = TRUE + var/datum/antagonist/nukeop/leader/leader_antag_datum = new() + nuke_team = leader_antag_datum.nuke_team + most_experienced.add_antag_datum(leader_antag_datum) + var/mob/living/carbon/human/leader = most_experienced.current + leader.equip_species_outfit(/datum/outfit/syndicate/leader) + + if(antag_mind == most_experienced) + return + + var/datum/antagonist/nukeop/new_op = new antag_datum() + antag_mind.add_antag_datum(new_op) + + +/datum/round_event/antagonist/solo/nuclear_operative/round_end_report() + var/result = nuke_team.get_result() + switch(result) + if(NUKE_RESULT_FLUKE) + SSticker.mode_result = "loss - syndicate nuked - disk secured" + SSticker.news_report = NUKE_SYNDICATE_BASE + if(NUKE_RESULT_NUKE_WIN) + SSticker.mode_result = "win - syndicate nuke" + SSticker.news_report = STATION_DESTROYED_NUKE + if(NUKE_RESULT_NOSURVIVORS) + SSticker.mode_result = "halfwin - syndicate nuke - did not evacuate in time" + SSticker.news_report = STATION_DESTROYED_NUKE + if(NUKE_RESULT_WRONG_STATION) + SSticker.mode_result = "halfwin - blew wrong station" + SSticker.news_report = NUKE_MISS + if(NUKE_RESULT_WRONG_STATION_DEAD) + SSticker.mode_result = "halfwin - blew wrong station - did not evacuate in time" + SSticker.news_report = NUKE_MISS + if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD) + SSticker.mode_result = "loss - evacuation - disk secured - syndi team dead" + SSticker.news_report = OPERATIVES_KILLED + if(NUKE_RESULT_CREW_WIN) + SSticker.mode_result = "loss - evacuation - disk secured" + SSticker.news_report = OPERATIVES_KILLED + if(NUKE_RESULT_DISK_LOST) + SSticker.mode_result = "halfwin - evacuation - disk not secured" + SSticker.news_report = OPERATIVE_SKIRMISH + if(NUKE_RESULT_DISK_STOLEN) + SSticker.mode_result = "halfwin - detonation averted" + SSticker.news_report = OPERATIVE_SKIRMISH + else + SSticker.mode_result = "halfwin - interrupted" + SSticker.news_report = OPERATIVE_SKIRMISH diff --git a/monkestation/code/modules/storytellers/converted_events/solo/obsessed.dm b/monkestation/code/modules/storytellers/converted_events/solo/obsessed.dm new file mode 100644 index 000000000000..f2f6498560eb --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/solo/obsessed.dm @@ -0,0 +1,24 @@ +/datum/round_event_control/antagonist/solo/obsessed + antag_flag = ROLE_TRAITOR + tags = list(TAG_COMBAT) + antag_datum = /datum/antagonist/obsessed + typepath = /datum/round_event/antagonist/solo/obsessed + restricted_roles = list( + JOB_AI, + JOB_CYBORG, + ROLE_POSITRONIC_BRAIN, + ) + weight = 4 + max_occurrences = 3 + +/datum/round_event_control/antagonist/solo/obsessed/midround + name = "Compulsive Obsession" + prompted_picking = TRUE + maximum_antags = 4 + +/datum/round_event/antagonist/solo/obsessed + +/datum/round_event/antagonist/solo/obsessed/add_datum_to_mind(datum/mind/antag_mind) + antag_mind.add_antag_datum(antag_datum) + var/mob/living/carbon/human/current = antag_mind.current + current.gain_trauma(/datum/brain_trauma/special/obsessed) diff --git a/monkestation/code/modules/storytellers/converted_events/solo/revolutionary.dm b/monkestation/code/modules/storytellers/converted_events/solo/revolutionary.dm new file mode 100644 index 000000000000..ade0fba5fd0c --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/solo/revolutionary.dm @@ -0,0 +1,73 @@ +/datum/round_event_control/antagonist/solo/revolutionary + name = "Roundstart Revolution" + tags = list(TAG_COMMUNAL, TAG_DESTRUCTIVE, TAG_COMBAT, TAG_TEAM_ANTAG) + antag_flag = ROLE_REV_HEAD + antag_datum = /datum/antagonist/rev/head/event_trigger + typepath = /datum/round_event/antagonist/solo/revolutionary + restricted_roles = list( + JOB_AI, + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_CYBORG, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_HEAD_OF_SECURITY, + JOB_PRISONER, + JOB_RESEARCH_DIRECTOR, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + base_antags = 2 + enemy_roles = list( + JOB_CAPTAIN, + JOB_DETECTIVE, + JOB_HEAD_OF_SECURITY, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + required_enemies = 6 + // I give up, just there should be enough heads with 35 players... + min_players = 35 + roundstart = TRUE + earliest_start = 0 SECONDS + weight = 4 + max_occurrences = 1 + +/datum/antagonist/rev/head/event_trigger + remove_clumsy = TRUE + give_flash = TRUE + +/datum/round_event/antagonist/solo/revolutionary + excute_round_end_reports = TRUE + end_when = 60000 /// we will end on our own when revs win + var/static/datum/team/revolution/revolution + var/static/finished = FALSE + +/datum/round_event/antagonist/solo/revolutionary/setup() + . = ..() + if(!revolution) + revolution = new() + +/datum/round_event/antagonist/solo/revolutionary/add_datum_to_mind(datum/mind/antag_mind) + antag_mind.add_antag_datum(antag_datum, revolution) + if(revolution.members.len) + revolution.update_objectives() + revolution.update_heads() + SSshuttle.registerHostileEnvironment(revolution) + + +/datum/round_event/antagonist/solo/revolutionary/round_end_report() + var/winner = revolution.process_victory() + if (isnull(winner)) + return + finished = TRUE + revolution.round_result(finished) + +/datum/round_event/antagonist/solo/revolutionary/tick() + var/winner = revolution.process_victory() + if (isnull(winner)) + return + + finished = winner + revolution.round_result(finished) diff --git a/monkestation/code/modules/storytellers/converted_events/solo/traitor.dm b/monkestation/code/modules/storytellers/converted_events/solo/traitor.dm new file mode 100644 index 000000000000..653e57269421 --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/solo/traitor.dm @@ -0,0 +1,33 @@ +/datum/round_event_control/antagonist/solo/traitor + antag_flag = ROLE_TRAITOR + tags = list(TAG_COMBAT) + antag_datum = /datum/antagonist/traitor/infiltrator + protected_roles = list( + JOB_CAPTAIN, + JOB_HEAD_OF_PERSONNEL, + JOB_CHIEF_ENGINEER, + JOB_CHIEF_MEDICAL_OFFICER, + JOB_RESEARCH_DIRECTOR, + JOB_DETECTIVE, + JOB_HEAD_OF_SECURITY, + JOB_PRISONER, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + restricted_roles = list( + JOB_AI, + JOB_CYBORG, + ) + +/datum/round_event_control/antagonist/solo/traitor/roundstart + name = "Traitors" + antag_flag = ROLE_SYNDICATE_INFILTRATOR + antag_datum = /datum/antagonist/traitor + roundstart = TRUE + earliest_start = 0 SECONDS + +/datum/round_event_control/antagonist/solo/traitor/midround + name = "Sleeper Agents (Traitors)" + antag_flag = ROLE_SLEEPER_AGENT + antag_datum = /datum/antagonist/traitor/infiltrator/sleeper_agent + prompted_picking = TRUE diff --git a/monkestation/code/modules/storytellers/converted_events/solo/wizard.dm b/monkestation/code/modules/storytellers/converted_events/solo/wizard.dm new file mode 100644 index 000000000000..717ac57e73e1 --- /dev/null +++ b/monkestation/code/modules/storytellers/converted_events/solo/wizard.dm @@ -0,0 +1,36 @@ +/datum/round_event_control/antagonist/solo/wizard + name = "Wizard" + tags = list(TAG_COMBAT, TAG_DESTRUCTIVE, TAG_EXTERNAL) + typepath = /datum/round_event/antagonist/solo/wizard + antag_flag = ROLE_WIZARD + antag_datum = /datum/antagonist/wizard + restricted_roles = list( + JOB_CAPTAIN, + JOB_HEAD_OF_SECURITY, + ) // Just to be sure that a wizard getting picked won't ever imply a Captain or HoS not getting drafted + maximum_antags = 1 + roundstart = TRUE + earliest_start = 0 SECONDS + weight = 2 + min_players = 35 + max_occurrences = 1 + +/datum/round_event_control/antagonist/solo/wizard/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) + . = ..() + if(!.) + return + if(GLOB.wizardstart.len == 0) + return FALSE + +/datum/round_event/antagonist/solo/wizard + +/datum/round_event/antagonist/solo/wizard/add_datum_to_mind(datum/mind/antag_mind) + . = ..() + var/mob/living/current_mob = antag_mind.current + SSjob.FreeRole(antag_mind.assigned_role.title) + var/list/items = current_mob.get_equipped_items(TRUE) + current_mob.unequip_everything() + for(var/obj/item/item as anything in items) + qdel(item) + + antag_mind.current.forceMove(pick(GLOB.wizardstart)) diff --git a/monkestation/code/modules/storytellers/gamemode_subsystem.dm b/monkestation/code/modules/storytellers/gamemode_subsystem.dm new file mode 100644 index 000000000000..d615c93dcbc3 --- /dev/null +++ b/monkestation/code/modules/storytellers/gamemode_subsystem.dm @@ -0,0 +1,1160 @@ +#define INIT_ORDER_GAMEMODE 70 + +SUBSYSTEM_DEF(gamemode) + name = "Gamemode" + init_order = INIT_ORDER_GAMEMODE + runlevels = RUNLEVEL_GAME + flags = SS_BACKGROUND | SS_KEEP_TIMING + wait = 2 SECONDS + + /// List of our event tracks for fast access during for loops. + var/list/event_tracks = EVENT_TRACKS + /// Our storyteller. He progresses our trackboards and picks out events + var/datum/storyteller/storyteller + /// Result of the storyteller vote. Defaults to the guide. + var/voted_storyteller = /datum/storyteller/guide + /// List of all the storytellers. Populated at init. Associative from type + var/list/storytellers = list() + /// Next process for our storyteller. The wait time is STORYTELLER_WAIT_TIME + var/next_storyteller_process = 0 + /// Associative list of even track points. + var/list/event_track_points = list( + EVENT_TRACK_MUNDANE = 0, + EVENT_TRACK_MODERATE = 0, + EVENT_TRACK_MAJOR = 0, + EVENT_TRACK_ROLESET = 0, + EVENT_TRACK_OBJECTIVES = 0 + ) + /// Last point amount gained of each track. Those are recorded for purposes of estimating how long until next event. + var/list/last_point_gains = list( + EVENT_TRACK_MUNDANE = 0, + EVENT_TRACK_MODERATE = 0, + EVENT_TRACK_MAJOR = 0, + EVENT_TRACK_ROLESET = 0, + EVENT_TRACK_OBJECTIVES = 0 + ) + /// Point thresholds at which the events are supposed to be rolled, it is also the base cost for events. + var/list/point_thresholds = list( + EVENT_TRACK_MUNDANE = MUNDANE_POINT_THRESHOLD, + EVENT_TRACK_MODERATE = MODERATE_POINT_THRESHOLD, + EVENT_TRACK_MAJOR = MAJOR_POINT_THRESHOLD, + EVENT_TRACK_ROLESET = ROLESET_POINT_THRESHOLD, + EVENT_TRACK_OBJECTIVES = OBJECTIVES_POINT_THRESHOLD + ) + + /// Minimum population thresholds for the tracks to fire off events. + var/list/min_pop_thresholds = list( + EVENT_TRACK_MUNDANE = MUNDANE_MIN_POP, + EVENT_TRACK_MODERATE = MODERATE_MIN_POP, + EVENT_TRACK_MAJOR = MAJOR_MIN_POP, + EVENT_TRACK_ROLESET = ROLESET_MIN_POP, + EVENT_TRACK_OBJECTIVES = OBJECTIVES_MIN_POP + ) + + /// Configurable multipliers for point gain over time. + var/list/point_gain_multipliers = list( + EVENT_TRACK_MUNDANE = 1, + EVENT_TRACK_MODERATE = 1, + EVENT_TRACK_MAJOR = 1, + EVENT_TRACK_ROLESET = 1, + EVENT_TRACK_OBJECTIVES = 1 + ) + /// Configurable multipliers for roundstart points. + var/list/roundstart_point_multipliers = list( + EVENT_TRACK_MUNDANE = 1, + EVENT_TRACK_MODERATE = 1, + EVENT_TRACK_MAJOR = 1, + EVENT_TRACK_ROLESET = 1, + EVENT_TRACK_OBJECTIVES = 1 + ) + /// Whether we allow pop scaling. This is configured by config, or the storyteller UI + var/allow_pop_scaling = TRUE + + /// Associative list of pop scale thresholds. + var/list/pop_scale_thresholds = list( + EVENT_TRACK_MUNDANE = MUNDANE_POP_SCALE_THRESHOLD, + EVENT_TRACK_MODERATE = MODERATE_POP_SCALE_THRESHOLD, + EVENT_TRACK_MAJOR = MAJOR_POP_SCALE_THRESHOLD, + EVENT_TRACK_ROLESET = ROLESET_POP_SCALE_THRESHOLD, + EVENT_TRACK_OBJECTIVES = OBJECTIVES_POP_SCALE_THRESHOLD + ) + + /// Associative list of pop scale penalties. + var/list/pop_scale_penalties = list( + EVENT_TRACK_MUNDANE = MUNDANE_POP_SCALE_PENALTY, + EVENT_TRACK_MODERATE = MODERATE_POP_SCALE_PENALTY, + EVENT_TRACK_MAJOR = MAJOR_POP_SCALE_PENALTY, + EVENT_TRACK_ROLESET = ROLESET_POP_SCALE_PENALTY, + EVENT_TRACK_OBJECTIVES = OBJECTIVES_POP_SCALE_PENALTY + ) + + /// Associative list of active multipliers from pop scale penalty. + var/list/current_pop_scale_multipliers = list( + EVENT_TRACK_MUNDANE = 1, + EVENT_TRACK_MODERATE = 1, + EVENT_TRACK_MAJOR = 1, + EVENT_TRACK_ROLESET = 1, + EVENT_TRACK_OBJECTIVES = 1, + ) + + + + /// Associative list of control events by their track category. Compiled in Init + var/list/event_pools = list() + + /// Events that we have scheduled to run in the nearby future + var/list/scheduled_events = list() + + /// Associative list of tracks to forced event controls. For admins to force events (though they can still invoke them freely outside of the track system) + var/list/forced_next_events = list() + + var/list/control = list() //list of all datum/round_event_control. Used for selecting events based on weight and occurrences. + var/list/running = list() //list of all existing /datum/round_event + var/list/round_end_data = list() //list of all reports that need to add round end reports + var/list/currentrun = list() + + /// List of all uncategorized events, because they were wizard or holiday events + var/list/uncategorized = list() + + var/list/holidays //List of all holidays occuring today or null if no holidays + + /// Event frequency multiplier, it exists because wizard, eugh. + var/event_frequency_multiplier = 1 + + /// Current preview page for the statistics UI. + var/statistics_track_page = EVENT_TRACK_MUNDANE + /// Page of the UI panel. + var/panel_page = GAMEMODE_PANEL_MAIN + /// Whether we are viewing the roundstart events or not + var/roundstart_event_view = TRUE + + /// Whether the storyteller has been halted + var/halted_storyteller = FALSE + + /// Ready players for roundstart events. + var/ready_players = 0 + var/active_players = 0 + var/head_crew = 0 + var/eng_crew = 0 + var/sec_crew = 0 + var/med_crew = 0 + + var/wizardmode = FALSE + + var/datum/round_event_control/current_roundstart_event + var/list/last_round_events = list() + var/ran_roundstart = FALSE + var/list/triggered_round_events = list() + + var/total_valid_antags = 0 + +/datum/controller/subsystem/gamemode/Initialize(time, zlevel) + // Populate event pools + for(var/track in event_tracks) + event_pools[track] = list() + + // Populate storytellers + for(var/type in subtypesof(/datum/storyteller)) + storytellers[type] = new type() + + for(var/type in typesof(/datum/round_event_control)) + var/datum/round_event_control/event = new type() + if(!event.typepath || !event.name) + continue //don't want this one! leave it for the garbage collector + if(!event.valid_for_map()) + continue // event isn't good for this map no point in trying to add it to the list + control += event //add it to the list of all events (controls) + getHoliday() + + load_config_vars() + load_event_config_vars() + + ///Seeding events into track event pools needs to happen after event config vars are loaded + for(var/datum/round_event_control/event as anything in control) + if(event.holidayID || event.wizardevent) + uncategorized += event + continue + event_pools[event.track] += event //Add it to the categorized event pools + + load_roundstart_data() + +// return ..() + + +/datum/controller/subsystem/gamemode/fire(resumed = FALSE) + if(!resumed) + src.currentrun = running.Copy() + + ///Handle scheduled events + for(var/datum/scheduled_event/sch_event in scheduled_events) + if(world.time >= sch_event.start_time) + sch_event.try_fire() + else if(!sch_event.alerted_admins && world.time >= sch_event.start_time - 1 MINUTES) + ///Alert admins 1 minute before running and allow them to cancel or refund the event, once again. + sch_event.alerted_admins = TRUE + message_admins("Scheduled Event: [sch_event.event] will run in [(sch_event.start_time - world.time) / 10] seconds. (CANCEL) (REFUND)") + + if(!halted_storyteller && next_storyteller_process <= world.time && storyteller) + // We update crew information here to adjust population scalling and event thresholds for the storyteller. + update_crew_infos() + next_storyteller_process = world.time + STORYTELLER_WAIT_TIME + storyteller.process(STORYTELLER_WAIT_TIME * 0.1) + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + + while(currentrun.len) + var/datum/thing = currentrun[currentrun.len] + currentrun.len-- + if(thing) + thing.process(wait * 0.1) + else + running.Remove(thing) + if (MC_TICK_CHECK) + return + +/// Gets the number of antagonists the antagonist injection events will stop rolling after. +/datum/controller/subsystem/gamemode/proc/get_antag_cap() + var/total_number = get_correct_popcount() + (sec_crew * 2) + var/cap = FLOOR((total_number / ANTAG_CAP_DENOMINATOR), 1) + ANTAG_CAP_FLAT + return cap + +/// Whether events can inject more antagonists into the round +/datum/controller/subsystem/gamemode/proc/can_inject_antags() + total_valid_antags = 0 + for(var/mob/checked_mob in GLOB.mob_list) + if(!checked_mob.mind) + continue + if(!checked_mob.mind.special_role) + continue + if(checked_mob.stat == DEAD) + continue + total_valid_antags++ + + + return (get_antag_cap() > total_valid_antags) + +/// Gets candidates for antagonist roles. +/datum/controller/subsystem/gamemode/proc/get_candidates(be_special, job_ban, observers, ready_newplayers, living_players, required_time, inherit_required_time = TRUE, midround_antag_pref, no_antags = TRUE, list/restricted_roles, list/required_roles) + var/list/candidates = list() + var/list/candidate_candidates = list() //lol + + for(var/mob/player as anything in GLOB.player_list) + if(ready_newplayers && isnewplayer(player)) + var/mob/dead/new_player/new_player = player + if(new_player.ready == PLAYER_READY_TO_PLAY && new_player.mind && new_player.check_preferences()) + candidate_candidates += player + else if (observers && isobserver(player)) + candidate_candidates += player + else if (living_players && isliving(player)) + if(!ishuman(player) && !isAI(player)) + continue + if(!(player.z in SSmapping.levels_by_trait(ZTRAIT_STATION))) + continue + candidate_candidates += player + + for(var/mob/candidate as anything in candidate_candidates) + if(QDELETED(candidate) || !candidate.key || !candidate.client || (!observers && !candidate.mind)) + continue + if(!observers) + if(!isliving(candidate)) + continue + if(no_antags && candidate.mind.special_role) + continue + if(restricted_roles && (candidate.mind.assigned_role.title in restricted_roles)) + continue + if(length(required_roles) && !(candidate.mind.assigned_role.title in required_roles)) + continue + + if(be_special) + if(!(candidate.client.prefs) || !(be_special in candidate.client.prefs.be_special)) + continue + + var/time_to_check + if(required_time) + time_to_check = required_time + else if (inherit_required_time) + time_to_check = GLOB.special_roles[be_special] + + if(time_to_check && candidate.client.get_remaining_days(time_to_check) > 0) + continue + + //if(midround_antag_pref) + //continue + + if(job_ban && is_banned_from(candidate.ckey, list(job_ban, ROLE_SYNDICATE))) + continue + candidates += candidate + return candidates + +/// Gets the correct popcount, returning READY people if roundstart, and active people if not. +/datum/controller/subsystem/gamemode/proc/get_correct_popcount() + if(SSticker.HasRoundStarted()) + update_crew_infos() + return active_players + else + calculate_ready_players() + return ready_players + +/// Refunds and removes a scheduled event. +/datum/controller/subsystem/gamemode/proc/refund_scheduled_event(datum/scheduled_event/refunded) + if(refunded.cost) + var/track_type = refunded.event.track + event_track_points[track_type] += refunded.cost + remove_scheduled_event(refunded) + +/// Removes a scheduled event. +/datum/controller/subsystem/gamemode/proc/remove_scheduled_event(datum/scheduled_event/removed) + scheduled_events -= removed + qdel(removed) + +/// We need to calculate ready players for the sake of roundstart events becoming eligible. +/datum/controller/subsystem/gamemode/proc/calculate_ready_players() + ready_players = 0 + for(var/mob/dead/new_player/player as anything in GLOB.new_player_list) + if(player.ready == PLAYER_READY_TO_PLAY) + ready_players++ + +/// We roll points to be spent for roundstart events, including antagonists. +/datum/controller/subsystem/gamemode/proc/roll_pre_setup_points() + if(storyteller.disable_distribution || halted_storyteller) + return + /// Distribute points + for(var/track in event_track_points) + var/base_amt + var/gain_amt + switch(track) + if(EVENT_TRACK_MUNDANE) + base_amt = ROUNDSTART_MUNDANE_BASE + gain_amt = ROUNDSTART_MUNDANE_GAIN + if(EVENT_TRACK_MODERATE) + base_amt = ROUNDSTART_MODERATE_BASE + gain_amt = ROUNDSTART_MODERATE_GAIN + if(EVENT_TRACK_MAJOR) + base_amt = ROUNDSTART_MAJOR_BASE + gain_amt = ROUNDSTART_MAJOR_GAIN + if(EVENT_TRACK_ROLESET) + base_amt = ROUNDSTART_ROLESET_BASE + gain_amt = ROUNDSTART_ROLESET_GAIN + if(EVENT_TRACK_OBJECTIVES) + base_amt = ROUNDSTART_OBJECTIVES_BASE + gain_amt = ROUNDSTART_OBJECTIVES_GAIN + var/calc_value = base_amt + (gain_amt * ready_players) + calc_value *= roundstart_point_multipliers[track] + calc_value *= storyteller.starting_point_multipliers[track] + calc_value *= (rand(100 - storyteller.roundstart_points_variance,100 + storyteller.roundstart_points_variance)/100) + event_track_points[track] = round(calc_value) + + /// If the storyteller guarantees an antagonist roll, add points to make it so. + if(storyteller.guarantees_roundstart_roleset && event_track_points[EVENT_TRACK_ROLESET] < point_thresholds[EVENT_TRACK_ROLESET]) + event_track_points[EVENT_TRACK_ROLESET] = point_thresholds[EVENT_TRACK_ROLESET] + + /// If we have any forced events, ensure we get enough points for them + for(var/track in event_tracks) + if(forced_next_events[track] && event_track_points[track] < point_thresholds[track]) + event_track_points[track] = point_thresholds[track] + +/// At this point we've rolled roundstart events and antags and we handle leftover points here. +/datum/controller/subsystem/gamemode/proc/handle_post_setup_points() + for(var/track in event_track_points) //Just halve the points for now. + event_track_points[track] *= 0.5 + +/// Because roundstart events need 2 steps of firing for purposes of antags, here is the first step handled, happening before occupation division. +/datum/controller/subsystem/gamemode/proc/handle_pre_setup_roundstart_events() + if(storyteller.disable_distribution) + return + if(halted_storyteller) + message_admins("WARNING: Didn't roll roundstart events (including antagonists) due to the storyteller being halted.") + return + while(TRUE) + if(!storyteller.handle_tracks()) + break + +/// Second step of handlind roundstart events, happening after people spawn. +/datum/controller/subsystem/gamemode/proc/handle_post_setup_roundstart_events() + /// Start all roundstart events on post_setup immediately + for(var/datum/round_event/event as anything in running) + if(!event.control.roundstart) + continue + ASYNC + event.try_start() +// INVOKE_ASYNC(event, /datum/round_event.proc/try_start) + +/// Schedules an event to run later. +/datum/controller/subsystem/gamemode/proc/schedule_event(datum/round_event_control/passed_event, passed_time, passed_cost, passed_ignore, passed_announce, _forced = FALSE) + if(_forced) + passed_ignore = TRUE + var/datum/scheduled_event/scheduled = new (passed_event, world.time + passed_time, passed_cost, passed_ignore, passed_announce) + var/round_started = SSticker.HasRoundStarted() + if(round_started) + message_admins("Event: [passed_event] has been scheduled to run in [passed_time / 10] seconds. (CANCEL) (REFUND)") + else //Only roundstart events can be scheduled before round start + message_admins("Event: [passed_event] has been scheduled to run on roundstart. (CANCEL)") + scheduled_events += scheduled + +/datum/controller/subsystem/gamemode/proc/update_crew_infos() + // Very similar logic to `get_active_player_count()` + active_players = 0 + head_crew = 0 + eng_crew = 0 + med_crew = 0 + sec_crew = 0 + for(var/mob/player_mob as anything in GLOB.player_list) + if(!player_mob.client) + continue + if(player_mob.stat) //If they're alive + continue + if(player_mob.client.is_afk()) //If afk + continue + if(!ishuman(player_mob)) + continue + active_players++ + if(player_mob.mind?.assigned_role) + var/datum/job/player_role = player_mob.mind.assigned_role + if(player_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + head_crew++ + if(player_role.departments_bitflags & DEPARTMENT_BITFLAG_ENGINEERING) + eng_crew++ + if(player_role.departments_bitflags & DEPARTMENT_BITFLAG_MEDICAL) + med_crew++ + if(player_role.departments_bitflags & DEPARTMENT_BITFLAG_SECURITY) + sec_crew++ + update_pop_scaling() + +/datum/controller/subsystem/gamemode/proc/update_pop_scaling() + for(var/track in event_tracks) + var/low_pop_bound = min_pop_thresholds[track] + var/high_pop_bound = pop_scale_thresholds[track] + var/scale_penalty = pop_scale_penalties[track] + + var/perceived_pop = max(low_pop_bound, active_players) // after max pop we start generating even more threat + + var/divisor = high_pop_bound - low_pop_bound + /// If the bounds are equal, we'd be dividing by zero or worse, if upper is smaller than lower, we'd be increasing the factor, just make it 1 and continue. + /// this is only a problem for bad configs + if(divisor <= 0) + current_pop_scale_multipliers[track] = 1 + continue + var/scalar = (perceived_pop - low_pop_bound) / divisor + var/penalty = scale_penalty - (scale_penalty * scalar) + var/calculated_multiplier = 1 - (penalty / 100) + + current_pop_scale_multipliers[track] = calculated_multiplier + +/datum/controller/subsystem/gamemode/proc/TriggerEvent(datum/round_event_control/event, forced = FALSE) + . = event.preRunEvent(forced) + if(. == EVENT_CANT_RUN)//we couldn't run this event for some reason, set its max_occurrences to 0 + event.max_occurrences = 0 + else if(. == EVENT_READY) + event.runEvent(random = TRUE, admin_forced = forced) // fallback to dynamic + +///Resets frequency multiplier. +/datum/controller/subsystem/gamemode/proc/resetFrequency() + event_frequency_multiplier = 1 + +/client/proc/forceEvent() + set name = "Trigger Event" + set category = "Admin.Events" + if(!holder ||!check_rights(R_FUN)) + return + holder.forceEvent(usr) + +/datum/admins/proc/forceEvent(mob/user) + SSgamemode.event_panel(user) + +/client/proc/forceGamemode() + set name = "Open Gamemode Panel" + set category = "Admin.Events" + if(!holder ||!check_rights(R_FUN)) + return + holder.forceGamemode(usr) + +/datum/admins/proc/forceGamemode(mob/user) + SSgamemode.admin_panel(user) + + +////////////// +// HOLIDAYS // +////////////// +//Uncommenting ALLOW_HOLIDAYS in config.txt will enable holidays + +//It's easy to add stuff. Just add a holiday datum in code/modules/holiday/holidays.dm +//You can then check if it's a special day in any code in the game by doing if(SSgamemode.holidays["Groundhog Day"]) + +//You can also make holiday random events easily thanks to Pete/Gia's system. +//simply make a random event normally, then assign it a holidayID string which matches the holiday's name. +//Anything with a holidayID, which isn't in the holidays list, will never occur. + +//Please, Don't spam stuff up with stupid stuff (key example being april-fools Pooh/ERP/etc), +//And don't forget: CHECK YOUR CODE!!!! We don't want any zero-day bugs which happen only on holidays and never get found/fixed! + +////////////////////////////////////////////////////////////////////////////////////////////////////////// +//ALSO, MOST IMPORTANTLY: Don't add stupid stuff! Discuss bonus content with Project-Heads first please!// +////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +//sets up the holidays and holidays list +/datum/controller/subsystem/gamemode/proc/getHoliday() + if(!CONFIG_GET(flag/allow_holidays)) + return // Holiday stuff was not enabled in the config! + for(var/H in subtypesof(/datum/holiday)) + var/datum/holiday/holiday = new H() + var/delete_holiday = TRUE + for(var/timezone in holiday.timezones) + var/time_in_timezone = world.realtime + timezone HOURS + + var/YYYY = text2num(time2text(time_in_timezone, "YYYY")) // get the current year + var/MM = text2num(time2text(time_in_timezone, "MM")) // get the current month + var/DD = text2num(time2text(time_in_timezone, "DD")) // get the current day + var/DDD = time2text(time_in_timezone, "DDD") // get the current weekday + + if(holiday.shouldCelebrate(DD, MM, YYYY, DDD)) + holiday.celebrate() + LAZYSET(holidays, holiday.name, holiday) + delete_holiday = FALSE + break + if(delete_holiday) + qdel(holiday) + + if(holidays) + holidays = shuffle(holidays) + // regenerate station name because holiday prefixes. + set_station_name(new_station_name()) + world.update_status() + +/datum/controller/subsystem/gamemode/proc/toggleWizardmode() + wizardmode = !wizardmode //TODO: decide what to do with wiz events + message_admins("Summon Events has been [wizardmode ? "enabled, events will occur [SSgamemode.event_frequency_multiplier] times as fast" : "disabled"]!") + log_game("Summon Events was [wizardmode ? "enabled" : "disabled"]!") + +///Attempts to select players for special roles the mode might have. +/datum/controller/subsystem/gamemode/proc/pre_setup() + calculate_ready_players() + roll_pre_setup_points() + //handle_pre_setup_roundstart_events() + return TRUE + +///Everyone should now be on the station and have their normal gear. This is the place to give the special roles extra things +/datum/controller/subsystem/gamemode/proc/post_setup(report) //Gamemodes can override the intercept report. Passing TRUE as the argument will force a report. + if(!report) + report = !CONFIG_GET(flag/no_intercept_report) + addtimer(CALLBACK(GLOBAL_PROC, .proc/display_roundstart_logout_report), ROUNDSTART_LOGOUT_REPORT_TIME) + + if(CONFIG_GET(flag/reopen_roundstart_suicide_roles)) + var/delay = CONFIG_GET(number/reopen_roundstart_suicide_roles_delay) + if(delay) + delay = (delay SECONDS) + else + delay = (4 MINUTES) //default to 4 minutes if the delay isn't defined. + addtimer(CALLBACK(GLOBAL_PROC, .proc/reopen_roundstart_suicide_roles), delay) + + if(SSdbcore.Connect()) + var/list/to_set = list() + var/arguments = list() + if(storyteller) + to_set += "game_mode = :game_mode" + arguments["game_mode"] = storyteller.name + if(GLOB.revdata.originmastercommit) + to_set += "commit_hash = :commit_hash" + arguments["commit_hash"] = GLOB.revdata.originmastercommit + if(to_set.len) + arguments["round_id"] = GLOB.round_id + var/datum/db_query/query_round_game_mode = SSdbcore.NewQuery( + "UPDATE [format_table_name("round")] SET [to_set.Join(", ")] WHERE id = :round_id", + arguments + ) + query_round_game_mode.Execute() + qdel(query_round_game_mode) + generate_station_goals() + handle_post_setup_roundstart_events() + handle_post_setup_points() + roundstart_event_view = FALSE + return TRUE + + +///Handles late-join antag assignments +/datum/controller/subsystem/gamemode/proc/make_antag_chance(mob/living/carbon/human/character) + return + +/datum/controller/subsystem/gamemode/proc/check_finished(force_ending) //to be called by SSticker + if(!SSticker.setup_done) + return FALSE + if(SSshuttle.emergency && (SSshuttle.emergency.mode == SHUTTLE_ENDGAME)) + return TRUE + if(GLOB.station_was_nuked) + return TRUE + if(force_ending) + return TRUE + +/* + * Generate a list of station goals available to purchase to report to the crew. + * + * Returns a formatted string all station goals that are available to the station. + */ +/datum/controller/subsystem/gamemode/proc/generate_station_goal_report() + if(!GLOB.station_goals.len) + return + . = "
Special Orders for [station_name()]:
" + for(var/datum/station_goal/station_goal as anything in GLOB.station_goals) + station_goal.on_report() + . += station_goal.get_report() + return + +/* + * Generate a list of active station traits to report to the crew. + * + * Returns a formatted string of all station traits (that are shown) affecting the station. + */ +/datum/controller/subsystem/gamemode/proc/generate_station_trait_report() + if(!SSstation.station_traits.len) + return + . = "
Identified shift divergencies:
" + for(var/datum/station_trait/station_trait as anything in SSstation.station_traits) + if(!station_trait.show_in_report) + continue + . += "[station_trait.get_report()]
" + return + +/* /proc/reopen_roundstart_suicide_roles() + var/include_command = CONFIG_GET(flag/reopen_roundstart_suicide_roles_command_positions) + var/list/reopened_jobs = list() + for(var/mob/living/quitter in GLOB.suicided_mob_list) + var/datum/job/job = SSjob.GetJob(quitter.job) + if(!job || !(job.job_flags & JOB_REOPEN_ON_ROUNDSTART_LOSS)) + continue + if(!include_command && job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + continue + job.current_positions = max(job.current_positions - 1, 0) + reopened_jobs += quitter.job + if(CONFIG_GET(flag/reopen_roundstart_suicide_roles_command_report)) + if(reopened_jobs.len) + var/reopened_job_report_positions + for(var/dead_dudes_job in reopened_jobs) + reopened_job_report_positions = "[reopened_job_report_positions ? "[reopened_job_report_positions]\n":""][dead_dudes_job]" + var/suicide_command_report = "Central Command Human Resources Board
\ + Notice of Personnel Change

\ + To personnel management staff aboard [station_name()]:

\ + Our medical staff have detected a series of anomalies in the vital sensors \ + of some of the staff aboard your station.

\ + Further investigation into the situation on our end resulted in us discovering \ + a series of rather... unforturnate decisions that were made on the part of said staff.

\ + As such, we have taken the liberty to automatically reopen employment opportunities for the positions of the crew members \ + who have decided not to partake in our research. We will be forwarding their cases to our employment review board \ + to determine their eligibility for continued service with the company (and of course the \ + continued storage of cloning records within the central medical backup server.)

\ + The following positions have been reopened on our behalf:

\ + [reopened_job_report_positions]
" + print_command_report(suicide_command_report, "Central Command Personnel Update") */ + +////////////////////////// +//Reports player logouts// +////////////////////////// +/* /proc/display_roundstart_logout_report() + var/list/msg = list("[SPAN_BOLDNOTICE("Roundstart logout report")]\n\n") + for(var/i in GLOB.mob_living_list) + var/mob/living/L = i + var/mob/living/carbon/C = L + if (istype(C) && !C.last_mind) + continue // never had a client + if(L.ckey && !GLOB.directory[L.ckey]) + msg += "[L.name] ([L.key]), the [L.job] (Disconnected)\n" + if(L.ckey && L.client) + var/failed = FALSE + if(L.client.inactivity >= (ROUNDSTART_LOGOUT_REPORT_TIME / 2)) //Connected, but inactive (alt+tabbed or something) + msg += "[L.name] ([L.key]), the [L.job] (Connected, Inactive)\n" + failed = TRUE //AFK client + if(!failed && L.stat) + if(L.suiciding) //Suicider + msg += "[L.name] ([L.key]), the [L.job] ([SPAN_BOLDANNOUNCE("Suicide")])\n" + failed = TRUE //Disconnected client + if(!failed && (L.stat == UNCONSCIOUS || L.stat == HARD_CRIT)) + msg += "[L.name] ([L.key]), the [L.job] (Dying)\n" + failed = TRUE //Unconscious + if(!failed && L.stat == DEAD) + msg += "[L.name] ([L.key]), the [L.job] (Dead)\n" + failed = TRUE //Dead + continue //Happy connected client + for(var/mob/dead/observer/D in GLOB.dead_mob_list) + if(D.mind && D.mind.current == L) + if(L.stat == DEAD) + if(L.suiciding) //Suicider + msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] ([SPAN_BOLDANNOUNCE("Suicide")])\n" + continue //Disconnected client + else + msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Dead)\n" + continue //Dead mob, ghost abandoned + else + if(D.can_reenter_corpse) + continue //Adminghost, or cult/wizard ghost + else + msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] ([SPAN_BOLDANNOUNCE("Ghosted")])\n" + continue //Ghosted while alive + for (var/C in GLOB.admins) + to_chat(C, msg.Join()) */ + +/datum/controller/subsystem/gamemode/proc/generate_station_goals() + var/list/possible = subtypesof(/datum/station_goal) + var/goal_weights = 0 + while(possible.len && goal_weights < 1) // station goal budget is 1 + var/datum/station_goal/picked = pick_n_take(possible) + goal_weights += initial(picked.weight) + GLOB.station_goals += new picked + +//Set result and news report here +/datum/controller/subsystem/gamemode/proc/set_round_result() + SSticker.mode_result = "undefined" + if(GLOB.station_was_nuked) + SSticker.news_report = STATION_DESTROYED_NUKE + if(EMERGENCY_ESCAPED_OR_ENDGAMED) + SSticker.news_report = STATION_EVACUATED + if(SSshuttle.emergency.is_hijacked()) + SSticker.news_report = SHUTTLE_HIJACK + +/// Loads json event config values from events.txt +/datum/controller/subsystem/gamemode/proc/load_event_config_vars() + var/json_file = file("[global.config.directory]/events.json") + if(!fexists(json_file)) + return + var/list/decoded = json_decode(file2text(json_file)) + for(var/event_text_path in decoded) + var/event_path = text2path(event_text_path) + var/datum/round_event_control/event + for(var/datum/round_event_control/iterated_event as anything in control) + if(iterated_event.type == event_path) + event = iterated_event + break + if(!event) + continue + var/list/var_list = decoded[event_text_path] + for(var/variable in var_list) + var/value = var_list[variable] + switch(variable) + if("weight") + event.weight = value + if("min_players") + event.min_players = value + if("max_occurrences") + event.max_occurrences = value + if("earliest_start") + event.earliest_start = value * (1 MINUTES) + if("track") + if(value in event_tracks) + event.track = value + if("cost") + event.cost = value + if("reoccurence_penalty_multiplier") + event.reoccurence_penalty_multiplier = value + if("shared_occurence_type") + if(!isnull(value)) + value = text2path(value) + event.shared_occurence_type = value + +/// Loads config values from game_options.txt +/datum/controller/subsystem/gamemode/proc/load_config_vars() + point_gain_multipliers[EVENT_TRACK_MUNDANE] = CONFIG_GET(number/mundane_point_gain_multiplier) + point_gain_multipliers[EVENT_TRACK_MODERATE] = CONFIG_GET(number/moderate_point_gain_multiplier) + point_gain_multipliers[EVENT_TRACK_MAJOR] = CONFIG_GET(number/major_point_gain_multiplier) + point_gain_multipliers[EVENT_TRACK_ROLESET] = CONFIG_GET(number/roleset_point_gain_multiplier) + point_gain_multipliers[EVENT_TRACK_OBJECTIVES] = CONFIG_GET(number/objectives_point_gain_multiplier) + + roundstart_point_multipliers[EVENT_TRACK_MUNDANE] = CONFIG_GET(number/mundane_roundstart_point_multiplier) + roundstart_point_multipliers[EVENT_TRACK_MODERATE] = CONFIG_GET(number/moderate_roundstart_point_multiplier) + roundstart_point_multipliers[EVENT_TRACK_MAJOR] = CONFIG_GET(number/major_roundstart_point_multiplier) + roundstart_point_multipliers[EVENT_TRACK_ROLESET] = CONFIG_GET(number/roleset_roundstart_point_multiplier) + roundstart_point_multipliers[EVENT_TRACK_OBJECTIVES] = CONFIG_GET(number/objectives_roundstart_point_multiplier) + + min_pop_thresholds[EVENT_TRACK_MUNDANE] = CONFIG_GET(number/mundane_min_pop) + min_pop_thresholds[EVENT_TRACK_MODERATE] = CONFIG_GET(number/moderate_min_pop) + min_pop_thresholds[EVENT_TRACK_MAJOR] = CONFIG_GET(number/major_min_pop) + min_pop_thresholds[EVENT_TRACK_ROLESET] = CONFIG_GET(number/roleset_min_pop) + min_pop_thresholds[EVENT_TRACK_OBJECTIVES] = CONFIG_GET(number/objectives_min_pop) + + point_thresholds[EVENT_TRACK_MUNDANE] = CONFIG_GET(number/mundane_point_threshold) + point_thresholds[EVENT_TRACK_MODERATE] = CONFIG_GET(number/moderate_point_threshold) + point_thresholds[EVENT_TRACK_MAJOR] = CONFIG_GET(number/major_point_threshold) + point_thresholds[EVENT_TRACK_ROLESET] = CONFIG_GET(number/roleset_point_threshold) + point_thresholds[EVENT_TRACK_OBJECTIVES] = CONFIG_GET(number/objectives_point_threshold) + +/datum/controller/subsystem/gamemode/proc/storyteller_vote_choices() + var/client_amount = GLOB.clients.len + var/list/choices = list() + for(var/storyteller_type in storytellers) + var/datum/storyteller/storyboy = storytellers[storyteller_type] + if(!storyboy.votable) + continue + if((storyboy.population_min && storyboy.population_min > client_amount) || (storyboy.population_max && storyboy.population_max < client_amount)) + continue + choices += storyboy.name + choices[storyboy.name] = 0 + return choices + +/datum/controller/subsystem/gamemode/proc/storyteller_desc(storyteller_name) + for(var/storyteller_type in storytellers) + var/datum/storyteller/storyboy = storytellers[storyteller_type] + if(storyboy.name != storyteller_name) + continue + return storyboy.desc + + +/datum/controller/subsystem/gamemode/proc/storyteller_vote_result(winner_name) + for(var/storyteller_type in storytellers) + var/datum/storyteller/storyboy = storytellers[storyteller_type] + if(storyboy.name == winner_name) + voted_storyteller = storyteller_type + break + +/datum/controller/subsystem/gamemode/proc/init_storyteller() + set_storyteller(voted_storyteller) + +/datum/controller/subsystem/gamemode/proc/set_storyteller(passed_type) + if(!storytellers[passed_type]) + message_admins("Attempted to set an invalid storyteller type: [passed_type].") + CRASH("Attempted to set an invalid storyteller type: [passed_type].") + storyteller = storytellers[passed_type] + to_chat(world, span_notice("Storyteller is [storyteller.name]!")) + to_chat(world, span_notice("[storyteller.welcome_text]")) + +/// Panel containing information, variables and controls about the gamemode and scheduled event +/datum/controller/subsystem/gamemode/proc/admin_panel(mob/user) + update_crew_infos() + total_valid_antags = 0 + for(var/mob/checked_mob in GLOB.mob_list) + if(!checked_mob.mind) + continue + if(!checked_mob.mind.special_role) + continue + if(checked_mob.stat == DEAD) + continue + total_valid_antags++ + + var/round_started = SSticker.HasRoundStarted() + var/list/dat = list() + dat += "Storyteller: [storyteller ? "[storyteller.name]" : "None"] " + dat += " HALT Storyteller Event Panel Set Storyteller Refresh" + dat += "
Storyteller determines points gained, event chances, and is the entity responsible for rolling events." + dat += "
Active Players: [active_players] (Head: [head_crew], Sec: [sec_crew], Eng: [eng_crew], Med: [med_crew])" + dat += "
Antagonist Count vs Maximum: [total_valid_antags] / [get_antag_cap()]" + dat += "
" + dat += "Main" + dat += " Variables" + dat += "
" + switch(panel_page) + if(GAMEMODE_PANEL_VARIABLES) + dat += "Reload Config Vars Configs located in game_options.txt." + dat += "
Point Gains Multipliers (only over time):" + dat += "
This affects points gained over time towards scheduling new events of the tracks." + for(var/track in event_tracks) + dat += "
[track]: [point_gain_multipliers[track]]" + dat += "
" + + dat += "Roundstart Points Multipliers:" + dat += "
This affects points generated for roundstart events and antagonists." + for(var/track in event_tracks) + dat += "
[track]: [roundstart_point_multipliers[track]]" + dat += "
" + + dat += "Minimum Population for Tracks:" + dat += "
This are the minimum population caps for events to be able to run." + for(var/track in event_tracks) + dat += "
[track]: [min_pop_thresholds[track]]" + dat += "
" + + dat += "Point Thresholds:" + dat += "
Those are thresholds the tracks require to reach with points to make an event." + for(var/track in event_tracks) + dat += "
[track]: [point_thresholds[track]]" + + if(GAMEMODE_PANEL_MAIN) + var/even = TRUE + dat += "

Event Tracks:

" + dat += "Every track represents progression towards scheduling an event of it's severity" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + for(var/track in event_tracks) + even = !even + var/background_cl = even ? "#17191C" : "#23273C" + var/lower = event_track_points[track] + var/upper = point_thresholds[track] + var/percent = round((lower/upper)*100) + var/next = 0 + var/last_points = last_point_gains[track] + if(last_points) + next = round(((upper - lower) / last_points / STORYTELLER_WAIT_TIME)) + dat += "" + dat += "" //Track + dat += "" //Progress + dat += "" //Next + var/datum/round_event_control/forced_event = forced_next_events[track] + var/forced = forced_event ? "[forced_event.name] X" : "" + dat += "" //Forced + dat += "" //Actions + dat += "" + dat += "
TrackProgressNextForcedActions
[track] - [last_points] per process.[percent]% ([lower]/[upper])~[next] seconds[forced]Set Pts. Next Event
" + + dat += "

Scheduled Events:

" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + var/sorted_scheduled = list() + for(var/datum/scheduled_event/scheduled as anything in scheduled_events) + sorted_scheduled[scheduled] = scheduled.start_time + sortTim(sorted_scheduled, cmp=/proc/cmp_numeric_asc, associative = TRUE) + even = TRUE + for(var/datum/scheduled_event/scheduled as anything in sorted_scheduled) + even = !even + var/background_cl = even ? "#17191C" : "#23273C" + dat += "" + dat += "" //Name + dat += "" //Severity + var/time = (scheduled.event.roundstart && !round_started) ? "ROUNDSTART" : "[(scheduled.start_time - world.time) / (1 SECONDS)] s." + dat += "" //Time + dat += "" //Actions + dat += "" + dat += "
NameSeverityTimeActions
[scheduled.event.name][scheduled.event.track][time][scheduled.get_href_actions()]
" + + dat += "

Running Events:

" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + even = TRUE + for(var/datum/round_event/event as anything in running) + even = !even + var/background_cl = even ? "#17191C" : "#23273C" + dat += "" + dat += "" //Name + dat += "" //Actions + dat += "" + dat += "
NameActions
[event.control.name]-TBA-
" + + var/datum/browser/popup = new(user, "gamemode_admin_panel", "Gamemode Panel", 670, 650) + popup.set_content(dat.Join()) + popup.open() + + /// Panel containing information and actions regarding events +/datum/controller/subsystem/gamemode/proc/event_panel(mob/user) + var/list/dat = list() + if(storyteller) + dat += "Storyteller: [storyteller.name]" + dat += "
Repetition penalty multiplier: [storyteller.event_repetition_multiplier]" + dat += "
Cost variance: [storyteller.cost_variance]" + if(storyteller.tag_multipliers) + dat += "
Tag multipliers:" + for(var/tag in storyteller.tag_multipliers) + dat += "[tag]:[storyteller.tag_multipliers[tag]] | " + storyteller.calculate_weights(statistics_track_page) + else + dat += "Storyteller: None
Weight and chance statistics will be inaccurate due to the present lack of a storyteller." + dat += "
Roundstart Events Forced Roundstart events will use rolled points, and are guaranteed to trigger (even if the used points are not enough)" + dat += "
Avg. event intervals: " + for(var/track in event_tracks) + if(last_point_gains[track]) + var/est_time = round(point_thresholds[track] / last_point_gains[track] / STORYTELLER_WAIT_TIME * 40 / 6) / 10 + dat += "[track]: ~[est_time] m. | " + dat += "
" + for(var/track in EVENT_PANEL_TRACKS) + dat += "[track]" + dat += "
" + /// Create event info and stats table + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + var/even = TRUE + var/total_weight = 0 + var/list/event_lookup + switch(statistics_track_page) + if(ALL_EVENTS) + event_lookup = control + if(UNCATEGORIZED_EVENTS) + event_lookup = uncategorized + else + event_lookup = event_pools[statistics_track_page] + var/list/assoc_spawn_weight = list() + for(var/datum/round_event_control/event as anything in event_lookup) + var/players_amt = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1) + if(event.roundstart != roundstart_event_view) + continue + if(event.can_spawn_event(players_amt)) + total_weight += event.calculated_weight + assoc_spawn_weight[event] = event.calculated_weight + else + assoc_spawn_weight[event] = 0 + sortTim(assoc_spawn_weight, cmp=/proc/cmp_numeric_dsc, associative = TRUE) + for(var/datum/round_event_control/event as anything in assoc_spawn_weight) + even = !even + var/background_cl = even ? "#17191C" : "#23273C" + dat += "" + dat += "" //Name + dat += "" + var/occurence_string = "[event.occurrences]" + if(event.shared_occurence_type) + occurence_string += " (shared: [event.get_occurences()])" + var/max_occurence_string = "[event.max_occurrences]" + dat += "" //Occurences + dat += "" //Max Occurences + dat += "" //Minimum pop + dat += "" //Minimum time + dat += "" //Can happen? + dat += "" //Why can't happen? + var/weight_string = "(new.[event.calculated_weight] /raw.[event.weight])" + if(assoc_spawn_weight[event]) + var/percent = round((event.calculated_weight / total_weight) * 100) + weight_string = "[percent]% - [weight_string]" + dat += "" //Weight + dat += "" //Actions + dat += "" + dat += "
NameTagsOccurencesMax OccurencesM.PopM.TimeCan OccurFailure ReasonWeightActions
[event.name]" //Tags + for(var/tag in event.tags) + dat += "[tag] " + dat += "[occurence_string][max_occurence_string][event.min_players][event.earliest_start / (1 MINUTES)] m.[assoc_spawn_weight[event] ? "Yes" : "No"][event.return_failure_string(active_players)][weight_string][event.get_href_actions()]
" + var/datum/browser/popup = new(user, "gamemode_event_panel", "Event Panel", 1100, 600) + popup.set_content(dat.Join()) + popup.open() + +/datum/controller/subsystem/gamemode/Topic(href, href_list) + . = ..() + var/mob/user = usr + if(!check_rights(R_ADMIN)) + return + switch(href_list["panel"]) + if("main") + switch(href_list["action"]) + if("set_storyteller") + message_admins("[key_name_admin(usr)] is picking a new Storyteller.") + var/list/name_list = list() + for(var/storyteller_type in storytellers) + var/datum/storyteller/storyboy = storytellers[storyteller_type] + name_list[storyboy.name] = storyboy.type + var/new_storyteller_name = input(usr, "Choose new storyteller (circumvents voted one):", "Storyteller") as null|anything in name_list + if(!new_storyteller_name) + message_admins("[key_name_admin(usr)] has cancelled picking a Storyteller.") + return + message_admins("[key_name_admin(usr)] has chosen [new_storyteller_name] as the new Storyteller.") + var/new_storyteller_type = name_list[new_storyteller_name] + set_storyteller(new_storyteller_type) + if("halt_storyteller") + halted_storyteller = !halted_storyteller + message_admins("[key_name_admin(usr)] has [halted_storyteller ? "HALTED" : "un-halted"] the Storyteller.") + if("vars") + var/track = href_list["track"] + switch(href_list["var"]) + if("pts_multiplier") + var/new_value = input(usr, "New value:", "Set new value") as num|null + if(isnull(new_value) || new_value < 0) + return + message_admins("[key_name_admin(usr)] set point gain multiplier for [track] track to [new_value].") + point_gain_multipliers[track] = new_value + if("roundstart_pts") + var/new_value = input(usr, "New value:", "Set new value") as num|null + if(isnull(new_value) || new_value < 0) + return + message_admins("[key_name_admin(usr)] set roundstart pts multiplier for [track] track to [new_value].") + roundstart_point_multipliers[track] = new_value + if("min_pop") + var/new_value = input(usr, "New value:", "Set new value") as num|null + if(isnull(new_value) || new_value < 0) + return + message_admins("[key_name_admin(usr)] set minimum population for [track] track to [new_value].") + min_pop_thresholds[track] = new_value + if("pts_threshold") + var/new_value = input(usr, "New value:", "Set new value") as num|null + if(isnull(new_value) || new_value < 0) + return + message_admins("[key_name_admin(usr)] set point threshold of [track] track to [new_value].") + point_thresholds[track] = new_value + if("reload_config_vars") + message_admins("[key_name_admin(usr)] reloaded gamemode config vars.") + load_config_vars() + if("tab") + var/tab = href_list["tab"] + panel_page = tab + if("open_stats") + event_panel(user) + return + if("track_action") + var/track = href_list["track"] + if(!(track in event_tracks)) + return + switch(href_list["track_action"]) + if("remove_forced") + if(forced_next_events[track]) + var/datum/round_event_control/event = forced_next_events[track] + message_admins("[key_name_admin(usr)] removed forced event [event.name] from track [track].") + forced_next_events -= track + if("set_pts") + var/set_pts = input(usr, "New point amount ([point_thresholds[track]]+ invokes event):", "Set points for [track]") as num|null + if(isnull(set_pts)) + return + event_track_points[track] = set_pts + message_admins("[key_name_admin(usr)] set points of [track] track to [set_pts].") + log_admin_private("[key_name(usr)] set points of [track] track to [set_pts].") + if("next_event") + message_admins("[key_name_admin(usr)] invoked next event for [track] track.") + log_admin_private("[key_name(usr)] invoked next event for [track] track.") + event_track_points[track] = point_thresholds[track] + if(storyteller) + storyteller.handle_tracks() + admin_panel(user) + if("stats") + switch(href_list["action"]) + if("set_roundstart") + roundstart_event_view = !roundstart_event_view + if("set_cat") + var/new_category = href_list["cat"] + if(new_category in EVENT_PANEL_TRACKS) + statistics_track_page = new_category + event_panel(user) + +/datum/controller/subsystem/gamemode/proc/round_end_report() + if(!length(round_end_data)) + return + for(var/datum/round_event/event as anything in round_end_data) + if(!istype(event)) + continue + event.round_end_report() + + +/datum/controller/subsystem/gamemode/proc/store_roundend_data() + var/congealed_string = "" + for(var/event_name as anything in triggered_round_events) + congealed_string += event_name + congealed_string += "," + text2file(congealed_string, "data/last_round_events.txt") + +/datum/controller/subsystem/gamemode/proc/load_roundstart_data() + var/massive_string = trim(file2text("data/last_round_events.txt")) + if(fexists("data/last_round_events.txt")) + fdel("data/last_round_events.txt") + if(!massive_string) + return + last_round_events = splittext(massive_string, ",") + + if(!length(last_round_events)) + return + for(var/event_name as anything in last_round_events) + for(var/datum/round_event_control/listed as anything in control) + if(listed.name != event_name) + continue + listed.occurrences++ + listed.occurrences++ diff --git a/monkestation/code/modules/storytellers/readme.md b/monkestation/code/modules/storytellers/readme.md new file mode 100644 index 000000000000..ace62b725afa --- /dev/null +++ b/monkestation/code/modules/storytellers/readme.md @@ -0,0 +1,44 @@ +## Title: + + +MODULE ID: STORYTELLERS + +### Description: + +This PR adds adds on to the current dynamic system by having events be guided by storytellers, this also caches the events ran last round and depending on severity cuts their weights by x % to make rounds not repeat as often. + + + + +### TG Proc/File Changes: + + + - N/A + +### Defines: + + + - code\__DEFINES\~monkestation\storytellers.dm + +### Master file additions + +- code\modules\events\_event.dm +- code\modules\admin\topic.dm +- code\controllers\subsystem\ticker.dm +- code\controllers\subsystem\statpanel.dm +- all event files + + + +### Included files that are not contained in this module: + +- N/A + + +### Credits: + + + +Made by Unknown Coders on Horizon (Horizon's Repo atleast as of 10/14/2023 no longer exists if this changes please let me know on discord #Borbop) + +Ported by Dwasint diff --git a/monkestation/code/modules/storytellers/scheduled_events.dm b/monkestation/code/modules/storytellers/scheduled_events.dm new file mode 100644 index 000000000000..cfb67a2dcf72 --- /dev/null +++ b/monkestation/code/modules/storytellers/scheduled_events.dm @@ -0,0 +1,94 @@ +///Scheduled event datum for SSgamemode to put events into. +/datum/scheduled_event + /// What event are scheduling. + var/datum/round_event_control/event + /// When do we start our event + var/start_time = 0 + /// If we were created by a storyteller, here's a cost to refund in case. + var/cost + /// Whether we alerted admins about this schedule when it's close to being invoked. + var/alerted_admins = FALSE + /// Whether we are faking an occurence or not + var/fakes_occurence = TRUE + /// Whether this ignores event can run checks. If bussed by an admin, you want to ignore checks + var/ignores_checks + /// Whether the scheduled event will override the announcement change. If null it won't. TRUE = force yes. FALSE = force no. + var/announce_change + +/datum/scheduled_event/New(datum/round_event_control/passed_event, passed_time, passed_cost, passed_ignore, passed_announce) + . = ..() + event = passed_event + start_time = passed_time + cost = passed_cost + ignores_checks = passed_ignore + announce_change = passed_announce + /// Add a fake occurence to make the weightings/checks properly respect the scheduled event. + event.add_occurence() + fakes_occurence = TRUE + +/datum/scheduled_event/proc/remove_occurence() + if(fakes_occurence) + /// Remove the fake occurence if we still have it + event.subtract_occurence() + fakes_occurence = FALSE + +/// For admins who want to reschedule the event. +/datum/scheduled_event/proc/reschedule(new_time) + start_time = new_time + alerted_admins = FALSE + +/datum/scheduled_event/proc/get_href_actions() + var/round_started = SSticker.HasRoundStarted() + if(round_started) + return "Fire Reschedule Cancel Refund" + else + return "Cancel" + +/// Try and fire off the scheduled event +/datum/scheduled_event/proc/try_fire() + /// Remove our fake occurence pre-emptively for the checks. + remove_occurence() + + ///If we can't spawn the scheduled event, refund it. + if(!ignores_checks && !event.can_spawn_event(1000)) //FALSE argument to ignore popchecks, to prevent scheduled events from failing from people dying/cryoing etc. + message_admins("Scheduled Event: [event] was unable to run and has been refunded.") + SSgamemode.refund_scheduled_event(src) + return + + ///Trigger the event and remove the scheduled datum + message_admins("Scheduled Event: [event] successfully triggered.") + SSgamemode.TriggerEvent(event, ignores_checks) + SSgamemode.remove_scheduled_event(src) + +/datum/scheduled_event/Destroy() + remove_occurence() + event = null + return ..() + +/datum/scheduled_event/Topic(href, href_list) + . = ..() + if(QDELETED(src)) + return + var/round_started = SSticker.HasRoundStarted() + switch(href_list["action"]) + if("cancel") + message_admins("[key_name_admin(usr)] cancelled scheduled event [event.name].") + log_admin_private("[key_name(usr)] cancelled scheduled event [event.name].") + SSgamemode.remove_scheduled_event(src) + if("refund") + message_admins("[key_name_admin(usr)] refunded scheduled event [event.name].") + log_admin_private("[key_name(usr)] refunded scheduled event [event.name].") + SSgamemode.refund_scheduled_event(src) + if("reschedule") + var/new_schedule = input(usr, "New schedule time (in seconds):", "Reschedule Event") as num|null + if(isnull(new_schedule) || QDELETED(src)) + return + start_time = world.time + new_schedule * 1 SECONDS + message_admins("[key_name_admin(usr)] rescheduled event [event.name] to [new_schedule] seconds.") + log_admin_private("[key_name(usr)] rescheduled event [event.name] to [new_schedule] seconds.") + if("fire") + if(!round_started) + return + message_admins("[key_name_admin(usr)] has fired scheduled event [event.name].") + log_admin_private("[key_name(usr)] has fired scheduled event [event.name].") + try_fire() diff --git a/monkestation/code/modules/storytellers/storytellers/_storyteller.dm b/monkestation/code/modules/storytellers/storytellers/_storyteller.dm new file mode 100644 index 000000000000..893089a255a1 --- /dev/null +++ b/monkestation/code/modules/storytellers/storytellers/_storyteller.dm @@ -0,0 +1,179 @@ + +///The storyteller datum. He operates with the SSgamemode data to run events +/datum/storyteller + /// Name of our storyteller. + var/name = "Badly coded storyteller" + /// Description of our storyteller. + var/desc = "Report this to the coders." + /// Text that the players will be greeted with when this storyteller is chosen. + var/welcome_text = "Set your eyes on the horizon." + /// This is the multiplier for repetition penalty in event weight. The lower the harsher it is + var/event_repetition_multiplier = 0.6 + /// Multipliers for starting points. + var/list/starting_point_multipliers = list( + EVENT_TRACK_MUNDANE = 1, + EVENT_TRACK_MODERATE = 1, + EVENT_TRACK_MAJOR = 1, + EVENT_TRACK_ROLESET = 1, + EVENT_TRACK_OBJECTIVES = 1 + ) + /// Multipliers for point gains. + var/list/point_gains_multipliers = list( + EVENT_TRACK_MUNDANE = 1, + EVENT_TRACK_MODERATE = 1, + EVENT_TRACK_MAJOR = 1, + EVENT_TRACK_ROLESET = 1, + EVENT_TRACK_OBJECTIVES = 1 + ) + /// Multipliers of weight to apply for each tag of an event. + var/list/tag_multipliers + + /// Variance in cost of the purchased events. Effectively affects frequency of events + var/cost_variance = 15 + + /// Variance in the budget of roundstart points. + var/roundstart_points_variance = 15 + + /// Whether the storyteller guaranteed a roleset roll (antag) on roundstart. (Still needs to pass pop check) + var/guarantees_roundstart_roleset = TRUE + + /// Whether the storyteller has the distributions disabled. Important for ghost storytellers + var/disable_distribution = FALSE + + /// Whether people can vote for the storyteller + var/votable = TRUE + /// If defined, will need a minimum of population to be votable + var/population_min + /// If defined, it will not be votable if exceeding the population + var/population_max + /// has the round gotten to the point where jobs are pre-created? + var/round_started = FALSE + ///have we done roundstart checks? + var/roundstart_checks = FALSE + ///prob of roundstart antag + var/roundstart_prob = 25 + ///do we ignore ran_roundstart + var/ignores_roundstart = FALSE + +/datum/storyteller/process(delta_time) + if(!round_started) // we are differing roundstarted ones until base roundstart so we can get cooler stuff + return + if(disable_distribution) + return + if(!guarantees_roundstart_roleset && prob(roundstart_prob) && !roundstart_checks) + roundstart_checks = TRUE + if(!ignores_roundstart) + SSgamemode.ran_roundstart = TRUE + + add_points(delta_time) + handle_tracks() + +/// Add points to all tracks while respecting the multipliers. +/datum/storyteller/proc/add_points(delta_time) + var/datum/controller/subsystem/gamemode/mode = SSgamemode + var/base_point = EVENT_POINT_GAINED_PER_SECOND * delta_time * mode.event_frequency_multiplier + for(var/track in mode.event_track_points) + var/point_gain = base_point * point_gains_multipliers[track] * mode.point_gain_multipliers[track] + if(mode.allow_pop_scaling) + point_gain *= mode.current_pop_scale_multipliers[track] + mode.event_track_points[track] += point_gain + mode.last_point_gains[track] = point_gain + +/// Goes through every track of the gamemode and checks if it passes a threshold to buy an event, if does, buys one. +/datum/storyteller/proc/handle_tracks() + . = FALSE //Has return value for the roundstart loop + var/datum/controller/subsystem/gamemode/mode = SSgamemode + for(var/track in mode.event_track_points) + var/points = mode.event_track_points[track] + if(points >= mode.point_thresholds[track] && find_and_buy_event_from_track(track)) + . = TRUE + +/// Find and buy a valid event from a track. +/datum/storyteller/proc/find_and_buy_event_from_track(track) + . = FALSE + var/are_forced = FALSE + var/datum/controller/subsystem/gamemode/mode = SSgamemode + var/datum/round_event_control/picked_event + if(mode.forced_next_events[track]) //Forced event by admin + /// Dont check any prerequisites, it has been forced by an admin + picked_event = mode.forced_next_events[track] + mode.forced_next_events -= track + are_forced = TRUE + else + mode.update_crew_infos() + var/pop_required = mode.min_pop_thresholds[track] + if(mode.active_players < pop_required) + message_admins("Storyteller failed to pick an event for track of [track] due to insufficient population. (required: [pop_required] active pop for [track]. Current: [mode.active_players])") + mode.event_track_points[track] *= TRACK_FAIL_POINT_PENALTY_MULTIPLIER + return + calculate_weights(track) + var/list/valid_events = list() + // Determine which events are valid to pick + for(var/datum/round_event_control/event as anything in mode.event_pools[track]) + var/players_amt = get_active_player_count(alive_check = 1, afk_check = 1, human_check = 1) + if(event.can_spawn_event(players_amt)) + if(QDELETED(event)) + message_admins("[event.name] was deleted!") + continue + valid_events[event] = round(event.calculated_weight * 10) //multiply weight by 10 to get first decimal value + ///If we didn't get any events, remove the points inform admins and dont do anything + if(!length(valid_events)) + message_admins("Storyteller failed to pick an event for track of [track].") + mode.event_track_points[track] *= TRACK_FAIL_POINT_PENALTY_MULTIPLIER + return + picked_event = pick_weight(valid_events) + if(!picked_event) + if(length(valid_events)) + var/added_string = "" + for(var/datum/round_event_control/item as anything in valid_events) + added_string += "[item.name]:[valid_events[item]]; " + stack_trace("WARNING: Storyteller picked a null from event pool, defaulting to option 1, look at weights:[added_string]") + shuffle_inplace(valid_events) + picked_event = valid_events[1] + else + message_admins("WARNING: Storyteller picked a null from event pool. Aborting event roll.") + stack_trace("WARNING: Storyteller picked a null from event pool.") + SSgamemode.event_track_points[track] = 0 + return + buy_event(picked_event, track, are_forced) + . = TRUE + +/// Find and buy a valid event from a track. +/datum/storyteller/proc/buy_event(datum/round_event_control/bought_event, track, forced = FALSE) + var/datum/controller/subsystem/gamemode/mode = SSgamemode + // Perhaps use some bell curve instead of a flat variance? + var/total_cost = bought_event.cost * mode.point_thresholds[track] + if(!bought_event.roundstart) + total_cost *= (1 + (rand(-cost_variance, cost_variance)/100)) //Apply cost variance if not roundstart event + mode.event_track_points[track] -= total_cost + message_admins("Storyteller purchased and triggered [bought_event] event, on [track] track, for [total_cost] cost.") + if(bought_event.roundstart) + if(!ignores_roundstart) + SSgamemode.ran_roundstart = TRUE + SSgamemode.current_roundstart_event = bought_event + mode.TriggerEvent(bought_event, forced) + else + mode.schedule_event(bought_event, 3 MINUTES, total_cost, _forced = forced) + SSgamemode.triggered_round_events |= bought_event.name + +/// Calculates the weights of the events from a passed track. +/datum/storyteller/proc/calculate_weights(track) + var/datum/controller/subsystem/gamemode/mode = SSgamemode + for(var/datum/round_event_control/event as anything in mode.event_pools[track]) + var/weight_total = event.weight + /// Apply tag multipliers if able + if(tag_multipliers) + for(var/tag in tag_multipliers) + if(tag in event.tags) + weight_total *= tag_multipliers[tag] + /// Apply occurence multipliers if able + var/occurences = event.get_occurences() + if(occurences) + ///If the event has occured already, apply a penalty multiplier based on amount of occurences + weight_total -= event.reoccurence_penalty_multiplier * weight_total * (1 - (event_repetition_multiplier ** occurences)) + /// Write it + event.calculated_weight = weight_total + +/datum/storyteller/guide + name = "The Guide" + desc = "The Guide will provide a balanced and varied experience. Consider this the default experience." diff --git a/monkestation/code/modules/storytellers/storytellers/ghost.dm b/monkestation/code/modules/storytellers/storytellers/ghost.dm new file mode 100644 index 000000000000..439f83572816 --- /dev/null +++ b/monkestation/code/modules/storytellers/storytellers/ghost.dm @@ -0,0 +1,6 @@ + +/datum/storyteller/ghost + name = "The Ghost" + desc = "The Ghost will not run a single event or create an antagonist." + disable_distribution = TRUE + population_max = 25 diff --git a/monkestation/code/modules/storytellers/storytellers/hermit.dm b/monkestation/code/modules/storytellers/storytellers/hermit.dm new file mode 100644 index 000000000000..964c3b379499 --- /dev/null +++ b/monkestation/code/modules/storytellers/storytellers/hermit.dm @@ -0,0 +1,12 @@ +/datum/storyteller/hermit + name = "The Hermit" + desc = "The Hermit will create mostly internal conflict around the station, and rarely any external threats." + event_repetition_multiplier = 0.7 //Hermit has a smaller event pool, let it repeat a bit more + point_gains_multipliers = list( + EVENT_TRACK_MUNDANE = 1.2, + EVENT_TRACK_MODERATE = 1.1, + EVENT_TRACK_MAJOR = 0.9, + EVENT_TRACK_ROLESET = 0.9, + EVENT_TRACK_OBJECTIVES = 1 + ) + tag_multipliers = list(TAG_EXTERNAL = 0.2) diff --git a/monkestation/code/modules/storytellers/storytellers/jester.dm b/monkestation/code/modules/storytellers/storytellers/jester.dm new file mode 100644 index 000000000000..5ed61b45663c --- /dev/null +++ b/monkestation/code/modules/storytellers/storytellers/jester.dm @@ -0,0 +1,13 @@ +/datum/storyteller/jester + name = "The Jester" + desc = "The Jester will create much more events, with higher possibilities of them repeating." + event_repetition_multiplier = 0.8 + point_gains_multipliers = list( + EVENT_TRACK_MUNDANE = 1.2, + EVENT_TRACK_MODERATE = 1.4, + EVENT_TRACK_MAJOR = 1.4, + EVENT_TRACK_ROLESET = 1, + EVENT_TRACK_OBJECTIVES = 1 + ) + population_min = 40 + ignores_roundstart = TRUE diff --git a/monkestation/code/modules/storytellers/storytellers/nobleman.dm b/monkestation/code/modules/storytellers/storytellers/nobleman.dm new file mode 100644 index 000000000000..7948d886c4db --- /dev/null +++ b/monkestation/code/modules/storytellers/storytellers/nobleman.dm @@ -0,0 +1,11 @@ +/datum/storyteller/nobleman + name = "The Nobleman" + desc = "The Nobleman enjoys a good fight but abhors senseless destruction. Prefers heavy hits on single targets." + point_gains_multipliers = list( + EVENT_TRACK_MUNDANE = 1, + EVENT_TRACK_MODERATE = 1.2, + EVENT_TRACK_MAJOR = 1.15, + EVENT_TRACK_ROLESET = 1, + EVENT_TRACK_OBJECTIVES = 1 + ) + tag_multipliers = list(TAG_COMBAT = 1.4, TAG_DESTRUCTIVE = 0.4) diff --git a/monkestation/code/modules/storytellers/storytellers/sleeper.dm b/monkestation/code/modules/storytellers/storytellers/sleeper.dm new file mode 100644 index 000000000000..d2de014f453d --- /dev/null +++ b/monkestation/code/modules/storytellers/storytellers/sleeper.dm @@ -0,0 +1,12 @@ +/datum/storyteller/sleeper + name = "The Sleeper" + desc = "The Sleeper will create less impactful events, especially ones involving combat or destruction. The chill experience." + point_gains_multipliers = list( + EVENT_TRACK_MUNDANE = 1, + EVENT_TRACK_MODERATE = 1.2, + EVENT_TRACK_MAJOR = 1.2, + EVENT_TRACK_ROLESET = 0.1, ///rolesets are entirely evil atm so crank this down + EVENT_TRACK_OBJECTIVES = 1 + ) + guarantees_roundstart_roleset = FALSE + tag_multipliers = list(TAG_COMBAT = 0.6, TAG_DESTRUCTIVE = 0.7) diff --git a/monkestation/code/modules/storytellers/storytellers/vote.dm b/monkestation/code/modules/storytellers/storytellers/vote.dm new file mode 100644 index 000000000000..705b9a5f733b --- /dev/null +++ b/monkestation/code/modules/storytellers/storytellers/vote.dm @@ -0,0 +1,30 @@ +/datum/vote/var/has_desc = FALSE + +/datum/vote/proc/return_desc(vote_name) + return "" + +/datum/vote/storyteller + name = "Storyteller" + message = "Vote for the storyteller!" + has_desc = TRUE + + +/datum/vote/storyteller/New() + . = ..() + default_choices = list() + default_choices = SSgamemode.storyteller_vote_choices() + + +/datum/vote/storyteller/return_desc(vote_name) + return SSgamemode.storyteller_desc(vote_name) + +/datum/vote/storyteller/create_vote() + . = ..() + if((length(choices) == 1)) // Only one choice, no need to vote. Let's just auto-rotate it to the only remaining map because it would just happen anyways. + var/de_facto_winner = choices[1] + SSgamemode.storyteller_vote_result(de_facto_winner) + to_chat(world, span_boldannounce("The storyteller vote has been skipped because there is only one storyteller left to vote for. The map has been changed to [de_facto_winner].")) + return FALSE + +/datum/vote/storyteller/finalize_vote(winning_option) + SSgamemode.storyteller_vote_result(winning_option) diff --git a/monkestation/code/modules/storytellers/storytellers/warrior.dm b/monkestation/code/modules/storytellers/storytellers/warrior.dm new file mode 100644 index 000000000000..3a10a4451f59 --- /dev/null +++ b/monkestation/code/modules/storytellers/storytellers/warrior.dm @@ -0,0 +1,12 @@ +/datum/storyteller/warrior + name = "The Warrior" + desc = "The Warrior will create more impactful events, often focused on combat." + point_gains_multipliers = list( + EVENT_TRACK_MUNDANE = 1, + EVENT_TRACK_MODERATE = 1.3, + EVENT_TRACK_MAJOR = 1.3, + EVENT_TRACK_ROLESET = 1, + EVENT_TRACK_OBJECTIVES = 1 + ) + tag_multipliers = list(TAG_COMBAT = 1.5) + population_min = 40 diff --git a/monkestation/code/modules/surgery/bodyparts/clockwork_bodyparts.dm b/monkestation/code/modules/surgery/bodyparts/clockwork_bodyparts.dm index 9e54b9375b24..3c48e54f763f 100644 --- a/monkestation/code/modules/surgery/bodyparts/clockwork_bodyparts.dm +++ b/monkestation/code/modules/surgery/bodyparts/clockwork_bodyparts.dm @@ -11,8 +11,8 @@ bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 3 - burn_reduction = 2 + brute_modifier = 0.9 + burn_modifier = 0.95 damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) disabling_threshold_percentage = 1 @@ -29,8 +29,8 @@ bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 3 - burn_reduction = 2 + brute_modifier = 0.9 + burn_modifier = 0.95 damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) disabling_threshold_percentage = 1 @@ -47,8 +47,8 @@ bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 3 - burn_reduction = 2 + brute_modifier = 0.9 + burn_modifier = 0.95 damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) disabling_threshold_percentage = 1 @@ -65,8 +65,8 @@ bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 3 - burn_reduction = 2 + brute_modifier = 0.9 + burn_modifier = 0.95 damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) disabling_threshold_percentage = 1 @@ -84,8 +84,8 @@ bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 3 - burn_reduction = 2 + brute_modifier = 0.9 + burn_modifier = 0.95 damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) disabling_threshold_percentage = 1 @@ -103,7 +103,7 @@ bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC change_exempt_flags = BP_BLOCK_CHANGE_SPECIES dmg_overlay_type = "robotic" - brute_reduction = 3 - burn_reduction = 2 + brute_modifier = 0.9 + burn_modifier = 0.95 damage_examines = list(BRUTE = ROBOTIC_BRUTE_EXAMINE_TEXT, BURN = ROBOTIC_BURN_EXAMINE_TEXT, CLONE = DEFAULT_CLONE_EXAMINE_TEXT) disabling_threshold_percentage = 1 diff --git a/monkestation/code/modules/surgery/bodyparts/floran_bodyparts.dm b/monkestation/code/modules/surgery/bodyparts/floran_bodyparts.dm new file mode 100644 index 000000000000..fc0ff0273c7d --- /dev/null +++ b/monkestation/code/modules/surgery/bodyparts/floran_bodyparts.dm @@ -0,0 +1,37 @@ +/obj/item/bodypart/head/floran + icon_greyscale = 'monkestation/icons/mob/species/floran/bodyparts.dmi' + limb_id = SPECIES_FLORAN + is_dimorphic = FALSE + +/obj/item/bodypart/chest/floran + icon_greyscale = 'monkestation/icons/mob/species/floran/bodyparts.dmi' + limb_id = SPECIES_FLORAN + is_dimorphic = FALSE + +/obj/item/bodypart/arm/left/floran + icon_greyscale = 'monkestation/icons/mob/species/floran/bodyparts.dmi' + limb_id = SPECIES_FLORAN + unarmed_attack_verb = "slash" + unarmed_damage_high = 15 + unarmed_damage_low = 5 + unarmed_attack_effect = ATTACK_EFFECT_CLAW + unarmed_attack_sound = 'sound/weapons/slice.ogg' + unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' + +/obj/item/bodypart/arm/right/floran + icon_greyscale = 'monkestation/icons/mob/species/floran/bodyparts.dmi' + limb_id = SPECIES_FLORAN + unarmed_attack_verb = "slash" + unarmed_damage_high = 15 + unarmed_damage_low = 5 + unarmed_attack_effect = ATTACK_EFFECT_CLAW + unarmed_attack_sound = 'sound/weapons/slice.ogg' + unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' + +/obj/item/bodypart/leg/left/floran + icon_greyscale = 'monkestation/icons/mob/species/floran/bodyparts.dmi' + limb_id = SPECIES_FLORAN + +/obj/item/bodypart/leg/right/floran + icon_greyscale = 'monkestation/icons/mob/species/floran/bodyparts.dmi' + limb_id = SPECIES_FLORAN diff --git a/monkestation/code/modules/surgery/organs/external/chelicerae/chelicerae.dm b/monkestation/code/modules/surgery/organs/external/chelicerae/chelicerae.dm index 138c018c71ff..95a3c24671e7 100644 --- a/monkestation/code/modules/surgery/organs/external/chelicerae/chelicerae.dm +++ b/monkestation/code/modules/surgery/organs/external/chelicerae/chelicerae.dm @@ -4,8 +4,7 @@ preference = "feature_arachnid_chelicerae" zone = BODY_ZONE_HEAD - slot = ORGAN_SLOT_EXTERNAL_SNOUT - external_bodytypes = BODYTYPE_SNOUTED + slot = ORGAN_SLOT_EXTERNAL_ANTENNAE use_mob_sprite_as_obj_sprite = TRUE bodypart_overlay = /datum/bodypart_overlay/mutant/arachnid_chelicerae diff --git a/monkestation/code/modules/surgery/organs/external/floran_accessories.dm b/monkestation/code/modules/surgery/organs/external/floran_accessories.dm new file mode 100644 index 000000000000..d47a91e3b263 --- /dev/null +++ b/monkestation/code/modules/surgery/organs/external/floran_accessories.dm @@ -0,0 +1,42 @@ +/obj/item/organ/external/floran_leaves + name = "floran leaves" + desc = "you shouldn't see this" + organ_flags = ORGAN_UNREMOVABLE + icon_state = "floran_leaves" + icon = 'monkestation/icons/obj/medical/organs/organs.dmi' + + preference = "feature_floran_leaves" + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_EXTERNAL_FLORAN_LEAVES + + use_mob_sprite_as_obj_sprite = TRUE + bodypart_overlay = /datum/bodypart_overlay/mutant/floran_leaves + +/datum/bodypart_overlay/mutant/floran_leaves + layers = EXTERNAL_ADJACENT + feature_key = "floran_leaves" + // color_source = ORGAN_COLOR_MUTSECONDARY + + var/color_swapped_layer = EXTERNAL_ADJACENT//Remove when MUTCOLORS_SECONDARY works + var/color_inverse_base = 255//Remove when MUTCOLORS_SECONDARY works + +/datum/bodypart_overlay/mutant/floran_leaves/get_global_feature_list() + return GLOB.floran_leaves_list + +/datum/bodypart_overlay/mutant/floran_leaves/color_image(image/overlay, draw_layer, obj/item/bodypart/limb)//Remove when MUTCOLORS_SECONDARY works + if(draw_layer != bitflag_to_layer(color_swapped_layer)) + return ..() + + if(draw_color) + var/list/rgb_list = rgb2num(draw_color) + overlay.color = rgb(color_inverse_base - rgb_list[1], color_inverse_base - rgb_list[2], color_inverse_base - rgb_list[3]) + else + overlay.color = null + +/datum/bodypart_overlay/mutant/floran_leaves/get_base_icon_state() + return sprite_datum.icon_state + +/datum/bodypart_overlay/mutant/floran_leaves/can_draw_on_bodypart(mob/living/carbon/human/human) + . = ..() + if(human.wear_suit && (human.wear_suit.flags_inv & HIDEJUMPSUIT)) + return FALSE diff --git a/monkestation/code/modules/surgery/organs/internal/eyes.dm b/monkestation/code/modules/surgery/organs/internal/eyes.dm index 17c5e85de90c..b9f478525ec3 100644 --- a/monkestation/code/modules/surgery/organs/internal/eyes.dm +++ b/monkestation/code/modules/surgery/organs/internal/eyes.dm @@ -15,3 +15,10 @@ low_light_cutoff = list(20, 15, 0) medium_light_cutoff = list(35, 30, 0) high_light_cutoff = list(50, 40, 0) + +/obj/item/organ/internal/eyes/floran + name = "phytoid eyes" + desc = "They look like big berries..." + icon = 'monkestation/icons/obj/medical/organs/organs.dmi' + eye_icon_state = "floraneyes" + icon_state = "floran_eyeballs" diff --git a/monkestation/code/modules/surgery/organs/internal/tongue.dm b/monkestation/code/modules/surgery/organs/internal/tongue.dm index def8bffeb7cc..684fd10d6ddb 100644 --- a/monkestation/code/modules/surgery/organs/internal/tongue.dm +++ b/monkestation/code/modules/surgery/organs/internal/tongue.dm @@ -30,3 +30,15 @@ /obj/item/organ/internal/tongue/arachnid/get_possible_languages() return ..() + /datum/language/buzzwords + +/obj/item/organ/internal/tongue/oozeling + name = "oozeling tongue" + desc = "A goopy organ that mimics the tongues of other carbon beings." + icon = 'monkestation/icons/obj/medical/organs/organs.dmi' + icon_state = "tongue_oozeling" + say_mod = "blurbles" + alpha = 200 + +// Oozeling tongues can speak all default + slime +/obj/item/organ/internal/tongue/oozeling/get_possible_languages() + return ..() + /datum/language/slime diff --git a/monkestation/code/modules/trading/box_rolling.dm b/monkestation/code/modules/trading/box_rolling.dm new file mode 100644 index 000000000000..53144837c7fb --- /dev/null +++ b/monkestation/code/modules/trading/box_rolling.dm @@ -0,0 +1,122 @@ +/atom/movable/screen/fullscreen/lootbox_overlay + icon = 'goon/icons/effects/320x320.dmi' + icon_state = "lootb0" + screen_loc = "CENTER-3, CENTER-3" + mouse_opacity = MOUSE_OPACITY_OPAQUE + plane = HUD_PLANE + show_when_dead = TRUE + +/atom/movable/screen/fullscreen/lootbox_overlay/sparks + icon_state = "sparks" + layer = FULLSCREEN_LAYER + 0.2 + +/atom/movable/screen/fullscreen/lootbox_overlay/background + icon_state = "background" + layer = FULLSCREEN_LAYER + 0.1 + +/atom/movable/screen/fullscreen/lootbox_overlay/item_preview + icon_state = "nuthin" // we set this ourselves + layer = FULLSCREEN_LAYER + 0.3 + screen_loc = "CENTER+1:35, CENTER+2" + +/atom/movable/screen/fullscreen/lootbox_overlay/duplicate + icon_state = "duplicate" + layer = FULLSCREEN_LAYER + 0.4 + plane = ABOVE_HUD_PLANE + +/atom/movable/screen/fullscreen/lootbox_overlay/main + ///have we already opened? prevents spam clicks + var/opened = FALSE + ///are we a guarenteed roll for lootboxes. + var/guarentee_unusual = FALSE + +/atom/movable/screen/fullscreen/lootbox_overlay/main/guaranteed + guarentee_unusual = TRUE + +/atom/movable/screen/fullscreen/lootbox_overlay/main/Click(location, control, params) + if(opened) + return + opened = TRUE + playsound(usr, pick('goon/sounds/misc/openlootcrate.ogg', 'goon/sounds/misc/openlootcrate2.ogg'), 100, 0) + icon_state = "lootb2" + flick("lootb1", src) + addtimer(CALLBACK(src, PROC_REF(after_open), usr), 2 SECONDS) + +/atom/movable/screen/fullscreen/lootbox_overlay/main/proc/after_open(mob/user) + if(!user) // uh + return + + //now we add + user.overlay_fullscreen("lb_spark", /atom/movable/screen/fullscreen/lootbox_overlay/sparks) + user.overlay_fullscreen("lb_bg", /atom/movable/screen/fullscreen/lootbox_overlay/background) + var/atom/movable/screen/fullscreen/lootbox_overlay/item_preview/preview = user.overlay_fullscreen("lb_preview", /atom/movable/screen/fullscreen/lootbox_overlay/item_preview) + + var/type_rolled + if(!guarentee_unusual) + type_rolled = rand(1, 100) + else + type_rolled = 1 + + var/type_string + switch(type_rolled) + if(1) + type_string = "Unusual" + if(2 to 3) + type_string = "High Tier" + if(4 to 8) + type_string = "Medium Tier" + if(9 to 15) + type_string = "Low Tier" + else + type_string = "Loadout Item" + + var/obj/item/rolled_item = return_rolled(type_string, user) + preview.icon_state = rolled_item.icon_state + preview.icon = rolled_item.icon + preview.appearance = rolled_item.appearance + preview.scale_to(10, 10) + user.reload_fullscreen() + preview.plane = ABOVE_HUD_PLANE + + maptext = "[rolled_item.name]" + maptext_width = 360 + maptext_x += 120 - length(rolled_item.name) + maptext_y += 60 + if(user.client) + message_admins("[user.client.ckey] opened a lootbox and recieved [rolled_item.name]!") + log_game("[user.client.ckey] opened a lootbox and recieved [rolled_item.name]!") + preview.filters += filter(type = "drop_shadow", x = 0, y = 0, size= 5, offset = 0, color = "#F0CA85") + if(type_string == "Unusual") + to_chat(world, span_boldannounce("[user] has unboxed an [rolled_item.name]!")) + if(isliving(user) && !user.put_in_hands(rolled_item)) + rolled_item.forceMove(get_turf(user)) + + addtimer(CALLBACK(src, PROC_REF(cleanup), user), 3 SECONDS) + +/atom/movable/screen/fullscreen/lootbox_overlay/main/proc/cleanup(mob/user) + if(!user) + return + user.clear_fullscreen("lb_spark", 1 SECONDS) + user.clear_fullscreen("lb_bg", 1 SECONDS) + user.clear_fullscreen("lb_preview", 1 SECONDS) + user.clear_fullscreen("lb_main", 1 SECONDS) + user.clear_fullscreen("lb_duplicate", 1 SECONDS) + qdel(src) + + +/proc/testing_trigger_lootbox() + var/mob/user = usr + user.overlay_fullscreen("lb_main", /atom/movable/screen/fullscreen/lootbox_overlay/main/guaranteed) + +/mob/proc/trigger_lootbox_on_self() + src.overlay_fullscreen("lb_main", /atom/movable/screen/fullscreen/lootbox_overlay/main) + +/obj/item/lootbox + name = "lootbox" + icon = 'goon/icons/obj/large_storage.dmi' + icon_state = "attachecase-old" + +/obj/item/lootbox/attack_self(mob/user, modifiers) + . = ..() + user.trigger_lootbox_on_self() + qdel(src) diff --git a/monkestation/code/modules/trading/icons/particles.dmi b/monkestation/code/modules/trading/icons/particles.dmi new file mode 100644 index 000000000000..2705144d8e4f Binary files /dev/null and b/monkestation/code/modules/trading/icons/particles.dmi differ diff --git a/monkestation/code/modules/trading/icons/unusual_overlay.dmi b/monkestation/code/modules/trading/icons/unusual_overlay.dmi new file mode 100644 index 000000000000..e163aa7ef88d Binary files /dev/null and b/monkestation/code/modules/trading/icons/unusual_overlay.dmi differ diff --git a/monkestation/code/modules/trading/lootbox_buying.dm b/monkestation/code/modules/trading/lootbox_buying.dm new file mode 100644 index 000000000000..64ee420640bc --- /dev/null +++ b/monkestation/code/modules/trading/lootbox_buying.dm @@ -0,0 +1,52 @@ +/client/proc/try_open_or_buy_lootbox() + if(!prefs) + return + if(!prefs.lootboxes_owned) + buy_lootbox() + if(prefs.lootboxes_owned) + open_lootbox() + +/client/proc/buy_lootbox() + if(!prefs) + return + if(!prefs.has_coins(5000)) + to_chat(src, span_warning("You do not have enough Monkecoins to buy a lootbox")) + return + switch(tgui_alert(src, "Would you like to purchase a lootbox? 5K", "Buy a lootbox!", list("Yes", "No"))) + if("Yes") + attempt_lootbox_buy() + else + return + +/client/proc/attempt_lootbox_buy() + if(!prefs.adjust_metacoins(ckey, -5000, donator_multipler = FALSE)) + return + prefs.lootboxes_owned++ + +/client/proc/open_lootbox() + message_admins("[ckey] opened a lootbox!") + log_game("[ckey] opened a lootbox!") + if(!mob) + return + + if(isnewplayer(mob)) + to_chat(mob, span_warning("Observe or spawn in first!")) + return + + if(!prefs.lootboxes_owned) + return + prefs.lootboxes_owned-- + mob.trigger_lootbox_on_self() + +/proc/give_lootboxes_to_randoms(amount) + for(var/i = 1 to amount) + var/mob/mob = pick(GLOB.player_list) + if(!mob.client) + continue + mob.client.give_lootbox(1) + +/client/proc/give_lootbox(amount) + if(!prefs) + return + prefs.lootboxes_owned += amount + to_chat(mob, span_notice("You have been given [amount] lootboxes! Open it using the escape menu.")) diff --git a/monkestation/code/modules/trading/lootbox_odds.dm b/monkestation/code/modules/trading/lootbox_odds.dm new file mode 100644 index 000000000000..23103913df67 --- /dev/null +++ b/monkestation/code/modules/trading/lootbox_odds.dm @@ -0,0 +1,117 @@ + +//global because its easier long term +//also its own file to make it super easy +//to find and adjust odds of lootbox rolls +/proc/return_rolled(type_string, mob/user) + var/obj/item/temp + switch(type_string) + if("Unusual") + var/list/viable_hats = list( + /obj/item/clothing/head/caphat, + /obj/item/clothing/head/beanie, + /obj/item/clothing/head/beret, + ) + viable_hats += subtypesof(/obj/item/clothing/head/hats) - typesof(/obj/item/clothing/head/hats/hos) - /obj/item/clothing/head/hats/centcom_cap - /obj/item/clothing/head/hats/hopcap - /obj/item/clothing/head/hats/centhat - /obj/item/clothing/head/hats/warden + viable_hats += subtypesof(/obj/item/clothing/head/costume) + var/path = pick(viable_hats) + temp = new path + var/list/viable_unusuals = subtypesof(/datum/component/particle_spewer) - /datum/component/particle_spewer/movement + var/picked_path = pick(viable_unusuals) + var/pulled_key = user.ckey + if(!pulled_key) + pulled_key = "MissingNo." // have fun trying to get this one lol + temp.AddComponent(/datum/component/unusual_handler, particle_path = picked_path, fresh_unusual = TRUE, client_ckey = pulled_key) + + if(user.client?.prefs) + user.client.prefs.save_new_unusual(temp) + + //token adding + if("High Tier") + temp = new /obj/item/coin/antagtoken + temp.name = "High Tier Antag Token" + user.client.saved_tokens.adjust_tokens(HIGH_THREAT, 1) + if("Medium Tier") + temp = new /obj/item/coin/antagtoken + temp.name = "Medium Tier Antag Token" + user.client.saved_tokens.adjust_tokens(MEDIUM_THREAT, 1) + if("Low Tier") + temp = new /obj/item/coin/antagtoken + temp.name = "Low Tier Antag Token" + user.client.saved_tokens.adjust_tokens(LOW_THREAT, 1) + + if("Loadout Item") + var/static/list/viable_types = list() + if(!length(viable_types)) + for(var/datum/loadout_item/type as anything in subtypesof(/datum/loadout_item)) + var/datum/loadout_item/listed = new type() + if(!istype(listed)) + continue + if(!listed.requires_purchase || listed.donator_only) + continue + if(!listed.item_path) + continue + if(length(listed.ckeywhitelist)) + continue + viable_types += listed + var/datum/loadout_item/picked = pick(viable_types) + temp = new picked.item_path + if(picked.item_path in user.client.prefs.inventory) + user.client.prefs.adjust_metacoins(user.ckey, 2500, "Duplicate Loadout Item", donator_multipler = FALSE) + temp.color = COLOR_GRAY + temp.name = "Loadout Item [temp.name] (Duplicate)" + user.overlay_fullscreen("lb_duplicate", /atom/movable/screen/fullscreen/lootbox_overlay/duplicate) + else + picked.add_to_user(usr.client) + temp.name = "Loadout Item [temp.name]" + + return temp + + +/datum/loadout_item/proc/add_to_user(client/buyer) + SHOULD_CALL_PARENT(TRUE) + var/fail_message ="Failed to add lootbox item to database. Will reattempt until added!" + if(!SSdbcore.IsConnected()) + to_chat(buyer, fail_message) + return FALSE + if(!buyer?.prefs) + return FALSE + if(!buyer.prefs.inventory[item_path]) + buyer.prefs.inventory += item_path + var/datum/db_query/query_add_gear_purchase = SSdbcore.NewQuery({" + INSERT INTO [format_table_name("metacoin_item_purchases")] (`ckey`, `item_id`, `amount`) VALUES (:ckey, :item_id, :amount)"}, + list("ckey" = buyer.ckey, "item_id" = item_path, "amount" = 1)) + if(!query_add_gear_purchase.Execute()) + to_chat(buyer, fail_message) + qdel(query_add_gear_purchase) + addtimer(CALLBACK(src, PROC_REF(add_to_user), buyer), 15 SECONDS) + return FALSE + qdel(query_add_gear_purchase) + else + buyer.prefs.inventory += item_path + var/datum/db_query/query_add_gear_purchase = SSdbcore.NewQuery({" + UPDATE [format_table_name("metacoin_item_purchases")] SET amount = :amount WHERE ckey = :ckey AND item_id = :item_id"}, + list("ckey" = buyer.ckey, "item_id" = item_path, "amount" = 1)) + if(!query_add_gear_purchase.Execute()) + to_chat(buyer, fail_message) + qdel(query_add_gear_purchase) + return FALSE + qdel(query_add_gear_purchase) + + return TRUE + +/proc/testing_spawn_bulk_unusuals() + var/turf/turf = get_turf(usr) + + for(var/i = 1 to 20) + var/list/viable_hats = list( + /obj/item/clothing/head/caphat, + /obj/item/clothing/head/beanie, + /obj/item/clothing/head/beret, + ) + viable_hats += subtypesof(/obj/item/clothing/head/hats) - typesof(/obj/item/clothing/head/hats/hos) - /obj/item/clothing/head/hats/centcom_cap - /obj/item/clothing/head/hats/hopcap - /obj/item/clothing/head/hats/centhat - /obj/item/clothing/head/hats/warden + viable_hats += subtypesof(/obj/item/clothing/head/costume) - /obj/item/clothing/head/costume/nightcap + var/path = pick(viable_hats) + var/obj/item/temp = new path(turf) + var/list/viable_unusuals = subtypesof(/datum/component/particle_spewer) - /datum/component/particle_spewer/movement + var/picked_path = pick(viable_unusuals) + temp.AddComponent(/datum/component/unusual_handler, particle_path = picked_path) diff --git a/monkestation/code/modules/trading/readme.md b/monkestation/code/modules/trading/readme.md new file mode 100644 index 000000000000..84186d0fc842 --- /dev/null +++ b/monkestation/code/modules/trading/readme.md @@ -0,0 +1,24 @@ +## Title: + +MODULE ID: TRADING + +### Description: + +Adds in auction house and surrounding systems + +### TG Proc Changes: + +### Defines: + +N/A + +### Master file additions + +N/A + +### Included files that are not contained in this module: + +N/A + +### Credits: +Dwasint diff --git a/monkestation/code/modules/trading/save_unusual_preference.dm b/monkestation/code/modules/trading/save_unusual_preference.dm new file mode 100644 index 000000000000..b2818a69525a --- /dev/null +++ b/monkestation/code/modules/trading/save_unusual_preference.dm @@ -0,0 +1,44 @@ +/datum/preferences/proc/save_new_unusual(obj/item/unusual) + var/datum/component/unusual_handler/component = unusual.GetComponent(/datum/component/unusual_handler) + if(!component) + return + + var/list/data = list() + // These MUST be strings if you don't make them a string whatever daemon lurks inside of byond will get you. + data["name"] = unusual.name + data["type"] = "[component.particle_path]" + data["round"] = "[component.round_id]" + data["original_owner"] = component.original_owner_ckey + data["description"] = component.unusual_description + data["equipslot"] = "[component.unusual_equip_slot]" + data["item_overlay"] = component.unusal_overlay + data["unusual_type"] = "[unusual.type]" + data["unusual_number"] = "[component.unusual_number]" + + extra_stat_inventory["unusual"] += list(data) + save_preferences() + +/datum/preferences/proc/return_unusual_data(number) + return extra_stat_inventory["unusual"][number] + + +/datum/preferences/proc/clear_unusuals() + extra_stat_inventory["unusual"] = list() + save_preferences() + +/mob/proc/spawn_first_stored_unusual() + if(!client?.prefs) + return + var/list/data = client.prefs.return_unusual_data(1) + var/item_path = text2path(data["unusual_type"]) + var/obj/item/new_item = new item_path(get_turf(src)) + + new_item.AddComponent(/datum/component/unusual_handler, data) + +/mob/proc/create_unusual() + if(!client?.prefs) + return + var/obj/item/clothing/head/costume/nightcap/red/created = new() + + created.AddComponent(/datum/component/unusual_handler, particle_path = /datum/component/particle_spewer/fire, fresh_unusual = TRUE, client_ckey = ckey) + client.prefs.save_new_unusual(created) diff --git a/monkestation/code/modules/trading/unusual_effects/_unusual_component.dm b/monkestation/code/modules/trading/unusual_effects/_unusual_component.dm new file mode 100644 index 000000000000..c086f9421291 --- /dev/null +++ b/monkestation/code/modules/trading/unusual_effects/_unusual_component.dm @@ -0,0 +1,109 @@ +GLOBAL_LIST_INIT(total_unusuals_per_type, list()) + + +/datum/component/unusual_handler + var/atom/source_object + ///the description added to the unusual. + var/unusual_description = "Not Implemented Yet Teehee" + ///the round the unusual was created at + var/round_id = 0 + ///the particle spewer component path + var/particle_path = /datum/component/particle_spewer/confetti + /// The original owners name + var/original_owner_ckey = "dwasint" + /// the slot this item goes in used when creating the particle itself + var/unusual_equip_slot = ITEM_SLOT_HEAD + /// the icon_state of the overlay given to unusals + var/unusal_overlay = "none" + ///the unique number our unusual is in the item path + var/unusual_number = 0 + +//this init is handled far differently than others. it parses data from the DB for information about the unusual itself +//it than loads this info into the component itself, the particle_path is purely for spawning temporary ones in round +/datum/component/unusual_handler/Initialize(list/parsed_variables = list(), particle_path = /datum/component/particle_spewer/confetti, fresh_unusual = FALSE, client_ckey = "dwasint") + . = ..() + source_object = parent + if(!length(GLOB.total_unusuals_per_type)) + fetch_unusual_data() + + if(!length(parsed_variables)) + src.particle_path = particle_path + else + setup_from_list(parsed_variables) + + if(fresh_unusual) + original_owner_ckey = client_ckey + round_id = text2num(GLOB.round_id) + GLOB.total_unusuals_per_type["[particle_path]"]++ + unusual_number = "[GLOB.total_unusuals_per_type["[particle_path]"]]" + + + source_object.AddComponent(src.particle_path) + + if(!length(parsed_variables)) + var/datum/component/particle_spewer/created = source_object.GetComponent(/datum/component/particle_spewer) + unusual_description = created.unusual_description + + source_object.desc += span_notice("\n Unboxed by: [original_owner_ckey]") + source_object.desc += span_notice("\n Unboxed on round: [round_id]") + source_object.desc += span_notice("\n Unusual Type: [unusual_description]") + source_object.desc += span_notice("\n Series Number: [unusual_number]") + + if(!length(parsed_variables)) + switch(unusual_number) + if(1) + source_object.name = span_hypnophrase("unusual [unusual_description] [source_object.name]") + if(2 to 5) + source_object.name = span_cult("unusual [unusual_description] [source_object.name]") + if(6 to 10) + source_object.name = span_clown("unusual [unusual_description] [source_object.name]") + if(11 to 25) + source_object.name = span_green("unusual [unusual_description] [source_object.name]") + else + source_object.name = "unusual [unusual_description] [source_object.name]" + + RegisterSignal(source_object, COMSIG_ATOM_UPDATE_DESC, PROC_REF(append_unusual)) + save_unusual_data() + +/datum/component/unusual_handler/Destroy(force, silent) + . = ..() + UnregisterSignal(source_object, COMSIG_ATOM_UPDATE_DESC) + +/datum/component/unusual_handler/proc/append_unusual(atom/source, updates) + SIGNAL_HANDLER + source_object.desc = initial(source_object.desc) + source_object.desc += span_notice("\n Unboxed by: [original_owner_ckey]") + source_object.desc += span_notice("\n Unboxed on: [round_id]") + source_object.desc += span_notice("\n Unusual Type: [unusual_description]") + source_object.desc += span_notice("\n Series Number: [unusual_number]") + +/datum/component/unusual_handler/proc/setup_from_list(list/parsed_results) + particle_path = text2path(parsed_results["type"]) + round_id = text2num(parsed_results["round"]) + original_owner_ckey = parsed_results["original_owner"] + unusual_description = parsed_results["description"] + unusual_equip_slot = text2num(parsed_results["equipslot"]) + unusal_overlay = parsed_results["item_overlay"] + unusual_number = parsed_results["unusual_number"] + source_object.name = parsed_results["name"] + +/datum/component/unusual_handler/proc/fetch_unusual_data() + var/json_file = file("data/unusual_tracking.json") + if(!fexists(json_file)) + stack_trace("We are missing the unusual JSON file, this will mess up unusual counting and unique names!") + var/list/json = json_decode(file2text(json_file)) + + if(!json) + return + + for(var/type in json) + GLOB.total_unusuals_per_type[type] = json[type] + +/datum/component/unusual_handler/proc/save_unusual_data() + var/json_file = file("data/unusual_tracking.json") + if(!fexists(json_file)) + stack_trace("We are missing the unusual JSON file, this will mess up unusual counting and unique names!") + fdel(json_file) + WRITE_FILE(json_file, json_encode(GLOB.total_unusuals_per_type)) + + diff --git a/monkestation/code/modules/trading/unusual_effects/animation_housing/__spawning_component.dm b/monkestation/code/modules/trading/unusual_effects/animation_housing/__spawning_component.dm new file mode 100644 index 000000000000..e59071855d02 --- /dev/null +++ b/monkestation/code/modules/trading/unusual_effects/animation_housing/__spawning_component.dm @@ -0,0 +1,168 @@ + +/obj/effect/abstract/particle + name = "" + plane = GAME_PLANE_FOV_HIDDEN + appearance_flags = RESET_ALPHA | RESET_COLOR | RESET_TRANSFORM | KEEP_APART | TILE_BOUND + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + icon = 'monkestation/code/modules/trading/icons/particles.dmi' + icon_state = "none" + +/datum/component/particle_spewer + var/atom/source_object + ///the unusual_description grabbed into the actual handler itself only needed when used as an unusual + var/unusual_description = "teehee" + //the worn mob + var/mob/worn_mob + ///the duration we last + var/duration = 0 + ///the spawn intervals in game ticks + var/spawn_interval = 1 + ///particles still in the process of animating + var/list/living_particles = list() + ///list of particles that finished (added only as a failsafe) + var/list/dead_particles = list() + ///x offset for source_object + var/offset_x = 0 + ///y offset for source_object + var/offset_y = 0 + ///the dmi location of the particle + var/icon_file = 'monkestation/code/modules/trading/icons/particles.dmi' + ///the icon_state given to the objects + var/particle_state = "none" + ///current process count + var/count = 0 + ///equipped offset ie hats go to 32 if set to 32 will also reset to height changes + var/equipped_offset = 0 + ///per burst spawn amount + var/burst_amount = 1 + ///the actual lifetime of this component before we die [ 0 = infinite] + var/lifetime = 0 + ///kept track of for removal sake + var/added_x = 0 + var/added_y = 0 + /// do we do random amounts of particle bursts? + var/random_bursts = FALSE + ///should we offset + var/offsets = TRUE + /// do we process? + var/processes = TRUE + ///the blend type we use for particles + var/particle_blending = BLEND_DEFAULT + +/datum/component/particle_spewer/Initialize(duration = 0, spawn_interval = 0, offset_x = 0, offset_y = 0, icon_file, particle_state, equipped_offset = 0, burst_amount = 0, lifetime = 0, random_bursts = 0) + . = ..() + if(icon_file) + src.icon_file = icon_file + if(particle_state) + src.particle_state = particle_state + if(offset_x) + src.offset_x = offset_x + rand(-8, 8) + if(offset_y) + src.offset_y = offset_y + rand(-4, 4) + if(spawn_interval) + src.spawn_interval = spawn_interval + if(duration) + src.duration = duration + if(equipped_offset) + src.equipped_offset = equipped_offset + if(burst_amount) + src.burst_amount = burst_amount + if(lifetime) + src.lifetime = lifetime + if(random_bursts) + src.random_bursts = random_bursts + source_object = parent + + if(processes) + START_PROCESSING(SSactualfastprocess, src) + RegisterSignal(source_object, COMSIG_ITEM_EQUIPPED, PROC_REF(handle_equip_offsets)) + RegisterSignal(source_object, COMSIG_ITEM_POST_UNEQUIP, PROC_REF(reset_offsets)) + + if(lifetime) + addtimer(CALLBACK(src, PROC_REF(kill_it_with_fire)), lifetime) + +/datum/component/particle_spewer/Destroy(force, silent) + . = ..() + UnregisterSignal(source_object, list( + COMSIG_ITEM_EQUIPPED, + COMSIG_ITEM_POST_UNEQUIP, + )) + + STOP_PROCESSING(SSactualfastprocess, src) + for(var/atom/listed_atom as anything in living_particles + dead_particles) + qdel(listed_atom) + living_particles = null + dead_particles = null + source_object = null + +/datum/component/particle_spewer/process(seconds_per_tick) + if(spawn_interval != 1) + count++ + if(count < spawn_interval) + return + count = 0 + spawn_particles() + +/datum/component/particle_spewer/proc/spawn_particles(atom/movable/mover, turf/target) + var/burstees = burst_amount + if(random_bursts) + burstees = rand(1, burst_amount) + + for(var/i = 0 to burstees) + //create and assign particle its stuff + var/obj/effect/abstract/particle/spawned = new(get_turf(source_object)) + if(offsets) + spawned.pixel_x = offset_x + spawned.pixel_y = offset_y + spawned.icon = icon_file + spawned.icon_state = particle_state + spawned.blend_mode = particle_blending + + living_particles |= spawned + + animate_particle(spawned) + +///this is the proc that gets overridden when we create new particle spewers that control its movements +//example is animating upwards over duration and deleting +/datum/component/particle_spewer/proc/animate_particle(obj/effect/abstract/particle/spawned) + animate(spawned, alpha = 75, time = duration) + animate(spawned, pixel_y = offset_y + 64, time = duration) + addtimer(CALLBACK(src, PROC_REF(delete_particle), spawned), duration) + +/datum/component/particle_spewer/proc/delete_particle(obj/effect/abstract/particle/spawned) + living_particles -= spawned + qdel(spawned) + +/datum/component/particle_spewer/proc/kill_it_with_fire() + qdel(src) + +/datum/component/particle_spewer/proc/handle_equip_offsets(datum/source, mob/equipper, slot) + SIGNAL_HANDLER + + offset_x -= added_x + offset_y -= added_y + added_x = 0 + added_y = 0 + worn_mob = equipper + + switch(slot) + if(ITEM_SLOT_HEAD) + added_y = 16 + else + added_y = 0 + added_x = 0 + + offset_y += added_y + offset_x += added_x + +/datum/component/particle_spewer/proc/reset_offsets() + SIGNAL_HANDLER + offset_x -= added_x + offset_y -= added_y + added_x = 0 + added_y = 0 + worn_mob = null + +/obj/item/debug_particle_holder/Initialize(mapload) + . = ..() + AddComponent(/datum/component/particle_spewer, 2 SECONDS) diff --git a/monkestation/code/modules/trading/unusual_effects/animation_housing/_footprint.dm b/monkestation/code/modules/trading/unusual_effects/animation_housing/_footprint.dm new file mode 100644 index 000000000000..dec84bd40657 --- /dev/null +++ b/monkestation/code/modules/trading/unusual_effects/animation_housing/_footprint.dm @@ -0,0 +1,29 @@ +//a unique subtype of particle spewer that only runs on equip +/datum/component/particle_spewer/movement + processes = FALSE + var/mob/attached_signal + +/datum/component/particle_spewer/movement/Destroy(force, silent) + UnregisterSignal(source_object, COMSIG_MOVABLE_PRE_MOVE) + . = ..() + UnregisterSignal(attached_signal, COMSIG_MOVABLE_PRE_MOVE) + attached_signal = null + +/datum/component/particle_spewer/movement/Initialize(duration, spawn_interval, offset_x, offset_y, icon_file, particle_state, equipped_offset, burst_amount, lifetime, random_bursts) + . = ..() + RegisterSignal(source_object, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(spawn_particles)) + +/datum/component/particle_spewer/movement/handle_equip_offsets(datum/source, mob/equipper, slot) + . = ..() + if(attached_signal) + UnregisterSignal(attached_signal, COMSIG_MOVABLE_PRE_MOVE) + attached_signal = null + + attached_signal = equipper + RegisterSignal(equipper, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(spawn_particles)) + +/datum/component/particle_spewer/movement/reset_offsets() + . = ..() + if(attached_signal) + UnregisterSignal(attached_signal, COMSIG_MOVABLE_PRE_MOVE) + attached_signal = null diff --git a/monkestation/code/modules/trading/unusual_effects/animation_housing/confetti.dm b/monkestation/code/modules/trading/unusual_effects/animation_housing/confetti.dm new file mode 100644 index 000000000000..ea7ce46d9ddc --- /dev/null +++ b/monkestation/code/modules/trading/unusual_effects/animation_housing/confetti.dm @@ -0,0 +1,27 @@ +/datum/component/particle_spewer/confetti + unusual_description = "partytime" + duration = 2 SECONDS + burst_amount = 5 + particle_blending = BLEND_ADD + spawn_interval = 1 SECONDS + +/datum/component/particle_spewer/confetti/animate_particle(obj/effect/abstract/particle/spawned) + var/matrix/first = matrix() + var/matrix/second = matrix() + + spawned.pixel_x += rand(-3,3) + spawned.pixel_y += rand(-3,3) + + first.Turn(rand(-90, 90)) + first.Scale(0.5,0.5) + second.Turn(rand(-90, 90)) + + spawned.color = rgb(rand(1, 255), rand(1, 255), rand(1, 255)) + + animate(spawned, transform = first, time = 0.4 SECONDS, pixel_y = rand(-32, 32) + spawned.pixel_y, pixel_x = rand(-32, 32) + spawned.pixel_x, easing = LINEAR_EASING) + animate(transform = second, time = 0.5 SECONDS, alpha = 0, pixel_y = spawned.pixel_y - 5, easing = LINEAR_EASING|EASE_OUT) + addtimer(CALLBACK(src, PROC_REF(delete_particle), spawned), duration) + +/obj/item/debug_confetti/Initialize(mapload) + . = ..() + AddComponent(/datum/component/particle_spewer/confetti) diff --git a/monkestation/code/modules/trading/unusual_effects/animation_housing/fire.dm b/monkestation/code/modules/trading/unusual_effects/animation_housing/fire.dm new file mode 100644 index 000000000000..34f110a76ea7 --- /dev/null +++ b/monkestation/code/modules/trading/unusual_effects/animation_housing/fire.dm @@ -0,0 +1,29 @@ +/datum/component/particle_spewer/fire + unusual_description = "flaming" + duration = 2 SECONDS + burst_amount = 3 + spawn_interval = 0.2 SECONDS + particle_state = "1x1" + particle_blending = BLEND_ADD + +/datum/component/particle_spewer/fire/animate_particle(obj/effect/abstract/particle/spawned) + spawned.pixel_x += rand(-6,6) + spawned.pixel_y += rand(-4,4) + + spawned.add_filter("outline", 1, list(type = "outline", size = 1, color = "#FF3300")) + spawned.add_filter("bloom", 2 , list(type = "bloom", threshold = rgb(255,128,255), size = 5, offset = 4, alpha = 255)) + + if(prob(35)) + spawned.layer = ABOVE_MOB_LAYER + + var/normal_x = rand(-4, 4) + spawned.pixel_x + var/inverse_x = 0 - normal_x + spawned.alpha = 130 + + animate(spawned, alpha = 255, time = 0.4 SECONDS, pixel_y = rand(6, 16) + spawned.pixel_y, pixel_x = normal_x, easing = LINEAR_EASING) + animate(time = 0.5 SECONDS, alpha = 0, inverse_x , pixel_y = rand(6, 16) + spawned.pixel_y, easing = LINEAR_EASING|EASE_OUT) + addtimer(CALLBACK(src, PROC_REF(delete_particle), spawned), duration) + +/obj/item/debug_fire/Initialize(mapload) + . = ..() + AddComponent(/datum/component/particle_spewer/fire) diff --git a/monkestation/code/modules/trading/unusual_effects/animation_housing/galaxies.dm b/monkestation/code/modules/trading/unusual_effects/animation_housing/galaxies.dm new file mode 100644 index 000000000000..86ae92317b1a --- /dev/null +++ b/monkestation/code/modules/trading/unusual_effects/animation_housing/galaxies.dm @@ -0,0 +1,28 @@ +/datum/component/particle_spewer/movement/galaxies + unusual_description = "galactic" + duration = 5 SECONDS + spawn_interval = 0.5 SECONDS + burst_amount = 6 + particle_state = "snow_small" + + +/datum/component/particle_spewer/galaxies/animate_particle(obj/effect/abstract/particle/spawned) + var/can_be_shooting = TRUE + if(prob(10)) + spawned.icon_state = "moon" + can_be_shooting = FALSE + + if(prob(10) && can_be_shooting) + spawned.icon_state = "ringed_planet" + can_be_shooting = FALSE + + spawned.pixel_x += rand(-16,16) + spawned.pixel_y += rand(-12,4) + + if(prob(45) && can_be_shooting) + spawned.layer = ABOVE_MOB_LAYER + + animate(spawned, alpha = 0, time = duration) + if(prob(33) && can_be_shooting) + animate(spawned, pixel_y = spawned.pixel_y + rand(-6, 6), pixel_x = spawned.pixel_x + rand(-16, 16), time = 1 SECONDS) + addtimer(CALLBACK(src, PROC_REF(delete_particle), spawned), duration) diff --git a/monkestation/code/modules/trading/unusual_effects/animation_housing/holy_steps.dm b/monkestation/code/modules/trading/unusual_effects/animation_housing/holy_steps.dm new file mode 100644 index 000000000000..456c920bebcf --- /dev/null +++ b/monkestation/code/modules/trading/unusual_effects/animation_housing/holy_steps.dm @@ -0,0 +1,25 @@ +/datum/component/particle_spewer/movement/holy_steps + unusual_description = "holy treads" + duration = 5 SECONDS + burst_amount = 25 + icon_file = 'goon/icons/effects/particles.dmi' + particle_state = "starsmall" + +/datum/component/particle_spewer/movement/holy_steps/animate_particle(obj/effect/abstract/particle/spawned) + var/matrix/first = matrix() + var/matrix/second = matrix() + + spawned.blend_mode = BLEND_ADD + spawned.pixel_x += rand(-3,3) + spawned.pixel_y += rand(-3,3) + + first.Turn(rand(-90, 90)) + first.Scale(0.5,0.5) + second.Turn(rand(-90, 90)) + + spawned.color = rgb(rand(1, 255), rand(1, 255), rand(1, 255)) + + animate(spawned, transform = first, time = 0.4 SECONDS, pixel_y = rand(-32, 32) + spawned.pixel_y, pixel_x = rand(-32, 32) + spawned.pixel_x, easing = LINEAR_EASING) + animate(transform = second, time = 0.5 SECONDS, pixel_y = spawned.pixel_y - 5, easing = LINEAR_EASING|EASE_OUT) + animate(spawned, alpha = 0, time = duration) + addtimer(CALLBACK(src, PROC_REF(delete_particle), spawned), duration) diff --git a/monkestation/code/modules/trading/unusual_effects/animation_housing/music.dm b/monkestation/code/modules/trading/unusual_effects/animation_housing/music.dm new file mode 100644 index 000000000000..3b3280799a59 --- /dev/null +++ b/monkestation/code/modules/trading/unusual_effects/animation_housing/music.dm @@ -0,0 +1,33 @@ +/datum/component/particle_spewer/shooting_star + icon_file = 'goon/icons/effects/particles.dmi' + particle_state = "beamed_eighth" + + unusual_description = "melody" + duration = 2.5 SECONDS + burst_amount = 2 + spawn_interval = 0.5 SECONDS + offsets = FALSE + +/datum/component/particle_spewer/shooting_star/animate_particle(obj/effect/abstract/particle/spawned) + var/matrix/first = matrix() + var/matrix/second = matrix() + var/matrix/default = matrix() + + if(prob(30)) + spawned.icon_state = "eighth" + if(prob(25)) + spawned.icon_state = "quarter" + + spawned.pixel_x += rand(-24, 24) + spawned.pixel_y += rand(-6, 6) + first.Turn(rand(-90, 90)) + spawned.transform = first + + second = first + second.Scale(4,4) + second.Turn(rand(-90, 90)) + + animate(spawned, transform = second, time = 1, alpha = 220) + animate(transform = default, time = duration + rand(-5, 5), pixel_y = spawned.pixel_y + 32, alpha = 1) + + addtimer(CALLBACK(src, PROC_REF(delete_particle), spawned), duration + 0.6 SECONDS) diff --git a/monkestation/code/modules/trading/unusual_effects/animation_housing/shooting_stars.dm b/monkestation/code/modules/trading/unusual_effects/animation_housing/shooting_stars.dm new file mode 100644 index 000000000000..44f2a241a8af --- /dev/null +++ b/monkestation/code/modules/trading/unusual_effects/animation_housing/shooting_stars.dm @@ -0,0 +1,37 @@ +/datum/component/particle_spewer/movement/shooting_star + icon_file = 'goon/icons/effects/particles.dmi' + particle_state = "starsmall" + + unusual_description = "shooting star" + duration = 5 SECONDS + burst_amount = 5 + offsets = FALSE + //has a chance to randomly change on animate + var/direction = NORTH + +/datum/component/particle_spewer/movement/shooting_star/spawn_particles(atom/movable/mover, turf/target) + . = ..() + var/dir = get_dir(mover, target) + direction = dir + +/datum/component/particle_spewer/movement/shooting_star/animate_particle(obj/effect/abstract/particle/spawned) + + spawned.dir = direction + if(prob(30)) + spawned.icon_state = "starlarge" + if(direction & NORTH|SOUTH) + spawned.pixel_x += rand(-16, 16) + + if(direction & EAST|WEST) + spawned.pixel_y += rand(-16, 16) + + switch(direction) + if(NORTH) + animate(spawned, time = rand(0.5 SECONDS, duration), pixel_y = spawned.pixel_y + 160, alpha = 25) + if(SOUTH) + animate(spawned, time = rand(0.5 SECONDS, duration), pixel_y = spawned.pixel_y - 160, alpha = 25) + if(EAST) + animate(spawned, time = rand(0.5 SECONDS, duration), pixel_x = spawned.pixel_x + 160, alpha = 25) + if(WEST) + animate(spawned, time = rand(0.5 SECONDS, duration), pixel_x = spawned.pixel_x - 160, alpha = 25) + addtimer(CALLBACK(src, PROC_REF(delete_particle), spawned), duration) diff --git a/monkestation/code/modules/trading/unusual_effects/animation_housing/skull_rain.dm b/monkestation/code/modules/trading/unusual_effects/animation_housing/skull_rain.dm new file mode 100644 index 000000000000..a65edddd53bc --- /dev/null +++ b/monkestation/code/modules/trading/unusual_effects/animation_housing/skull_rain.dm @@ -0,0 +1,34 @@ +/datum/component/particle_spewer/movement/skull_rain + unusual_description = "spooky" + icon_file = 'goon/icons/effects/particles.dmi' + particle_state = "skull3" + burst_amount = 4 + duration = 2 SECONDS + random_bursts = TRUE + spawn_interval = 0.4 SECONDS + +/datum/component/particle_spewer/movement/skull_rain/animate_particle(obj/effect/abstract/particle/spawned) + var/matrix/first = matrix(rand(1, 60), MATRIX_ROTATE) + var/matrix/second = matrix() + second.Turn(rand(-60, 60)) + + var/chance = rand(1, 6) + switch(chance) + if(1 to 2) + spawned.icon_state = "skull3" + if(3 to 4) + spawned.icon_state = "skull2" + if(5 to 6) + spawned.icon_state = "skull1" + + if(prob(35)) + spawned.layer = ABOVE_MOB_LAYER + spawned.pixel_x += rand(-12, 12) + spawned.pixel_y += rand(5, 10) + spawned.transform = first + spawned.alpha = 10 + + animate(spawned, transform = second, time = 20, pixel_y = rand(-16, -12), alpha = 255, easing = BOUNCE_EASING) + animate(time = duration, alpha = 1, easing = LINEAR_EASING) + + addtimer(CALLBACK(src, PROC_REF(delete_particle), spawned), duration) diff --git a/monkestation/code/modules/trading/unusual_effects/animation_housing/snow.dm b/monkestation/code/modules/trading/unusual_effects/animation_housing/snow.dm new file mode 100644 index 000000000000..41dd9aeea3cd --- /dev/null +++ b/monkestation/code/modules/trading/unusual_effects/animation_housing/snow.dm @@ -0,0 +1,29 @@ +/datum/component/particle_spewer/snow + unusual_description = "snowstorm" + icon_file = 'monkestation/code/modules/outdoors/icons/effects/particles/particle.dmi' + particle_state = "cross" + burst_amount = 8 + duration = 2 SECONDS + random_bursts = TRUE + spawn_interval = 0.3 SECONDS + +/datum/component/particle_spewer/snow/animate_particle(obj/effect/abstract/particle/spawned) + var/chance = rand(1, 10) + switch(chance) + if(1 to 2) + spawned.icon_state = "cross" + if(3 to 4) + spawned.icon_state = "snow_2" + if(5 to 6) + spawned.icon_state = "snow_3" + else + spawned.icon_state = "snow_1" + + if(prob(35)) + spawned.layer = ABOVE_MOB_LAYER + spawned.pixel_x += rand(-12, 12) + spawned.pixel_y += rand(-5, 5) + + animate(spawned, pixel_y = spawned.pixel_y - 32, time = 2 SECONDS) + animate(spawned, alpha = 25, time = 1.5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(delete_particle), spawned), duration) diff --git a/monkestation/code/modules/trading/unusual_effects/animation_housing/weh.dm b/monkestation/code/modules/trading/unusual_effects/animation_housing/weh.dm new file mode 100644 index 000000000000..68856f587825 --- /dev/null +++ b/monkestation/code/modules/trading/unusual_effects/animation_housing/weh.dm @@ -0,0 +1,25 @@ +/datum/component/particle_spewer/movement/weh + unusual_description = "weh" + duration = 5 SECONDS + burst_amount = 3 + + particle_state = "map_plushie_lizard" + icon_file = 'icons/obj/toys/plushes.dmi' + +/datum/component/particle_spewer/movement/weh/animate_particle(obj/effect/abstract/particle/spawned) + var/matrix/first = matrix() + var/matrix/second = matrix() + + spawned.pixel_x += rand(-3,3) + spawned.pixel_y += rand(-3,3) + + first.Turn(rand(-90, 90)) + first.Scale(0.5,0.5) + second.Turn(rand(-90, 90)) + + spawned.color = rgb(rand(1, 255), rand(1, 255), rand(1, 255)) + + animate(spawned, transform = first, time = 0.4 SECONDS, pixel_y = rand(-1, 12) + spawned.pixel_y, pixel_x = rand(-32, 32) + spawned.pixel_x, easing = JUMP_EASING) + animate(transform = second, time = 0.5 SECONDS, pixel_y = spawned.pixel_y - 32) + animate(spawned, alpha = 0, time = duration) + addtimer(CALLBACK(src, PROC_REF(delete_particle), spawned), duration) diff --git a/monkestation/code/modules/uplink/uplink_items.dm b/monkestation/code/modules/uplink/uplink_items.dm new file mode 100644 index 000000000000..406f4c571d06 --- /dev/null +++ b/monkestation/code/modules/uplink/uplink_items.dm @@ -0,0 +1,3 @@ +///Override for any unique checks for specific items, by default returns TRUE +/datum/uplink_item/proc/unique_checks(mob/user, datum/uplink_handler/handler, atom/movable/source) + return TRUE diff --git a/monkestation/code/modules/uplink/uplink_items/bundles.dm b/monkestation/code/modules/uplink/uplink_items/bundles.dm new file mode 100644 index 000000000000..4b5b73d01e44 --- /dev/null +++ b/monkestation/code/modules/uplink/uplink_items/bundles.dm @@ -0,0 +1,52 @@ +/datum/uplink_item/bundles_tc/surplus/lootbox + name = "Syndicate Lootbox Crate" + desc = "A dusty crate from the back of the Syndicate warehouse. Rumored to contain a valuable assortment of items, \ + With their all new kit, codenamed 'scam' the syndicate attempted to extract the energy of the die of fate to \ + make a loot-box style system but failed, so instead just fake their randomness using ook's evil twin brother to sniff out the items to shove in it. \ + Item price not guaranteed. Can contain normally unobtainable items. Purchasing this will prevent you from purchasing any non-random item. \ + Cannot be purchased if you have already bought another item." + +/datum/uplink_item/bundles_tc/surplus/lootbox/unique_checks(mob/user, datum/uplink_handler/handler, atom/movable/source) + //we dont acually have the var that makes this get checked so do it manually + if(length(handler.purchase_log.purchase_log) > 0) + return FALSE + return TRUE + +/datum/uplink_item/bundles_tc/surplus/lootbox/spawn_item(spawn_path, mob/user, datum/uplink_handler/handler, atom/movable/source) + crate_tc_value = rand(1,20) * 5 // randomise how much in TC it gives, from 5 to 100 TC + if(crate_tc_value == 5) //horrible luck, welcome to gambling + crate_tc_value = 0 + to_chat(user, span_warning("You feel an overwhelming sense of pride and accomplishment.")) + if(crate_tc_value == 100) // Jackpot, how lucky + crate_tc_value *= 2 + print_command_report("Congratulations to [user] for being the [rand(2, 9)]th lucky winner of the syndicate lottery! \ + Dread Admiral Sabertooth has authorised the beaming of your special equipment immediately! Happy hunting operative.", + "Syndicate Gambling Division High Command", TRUE) + if(ishuman(user) && !(locate(/obj/item/implant/weapons_auth) in user)) //jackpot winners dont have to find firing pins for any guns they get + var/obj/item/implant/weapons_auth/auth = new + auth.implant(user) + to_chat(user, span_notice("You feel as though the syndicate have given you the ability to use weapons beyond your normal access level.")) + var/obj/structure/closet/crate/surplus_crate = new crate_type() + if(!istype(surplus_crate)) + CRASH("crate_type is not a crate") + + var/list/possible_items = generate_possible_items(user, handler, TRUE) + if(!possible_items || !length(possible_items)) + handler.telecrystals += cost + to_chat(user, span_warning("You get the feeling something went wrong and that you should inform syndicate command.")) + qdel(surplus_crate) + CRASH("lootbox crate failed to generate possible items") + + fill_crate(surplus_crate, possible_items) + + podspawn(list( // unlike other chests, lets give them the chest with STYLE + "target" = get_turf(user), + "style" = STYLE_SYNDICATE, + "spawn" = surplus_crate, + )) + handler.add_locked_entries(subtypesof(/datum/uplink_item) - /datum/uplink_item/bundles_tc/random) + +//pain +///Check if we should ignore handler locked_entries or not +/datum/uplink_item/bundles_tc/random/proc/check_ignore_locked(datum/uplink_handler/handler) + return (length(handler.locked_entries) == (length(subtypesof(/datum/uplink_item)) - 1)) && !(src.type in handler.locked_entries) diff --git a/monkestation/code/modules/uplink/uplink_items/device_tools.dm b/monkestation/code/modules/uplink/uplink_items/device_tools.dm new file mode 100644 index 000000000000..3ccfc94cb441 --- /dev/null +++ b/monkestation/code/modules/uplink/uplink_items/device_tools.dm @@ -0,0 +1,5 @@ +/datum/uplink_item/device_tools/tram_remote + surplus = 40 + +/datum/uplink_item/device_tools/rad_laser + surplus = 40 diff --git a/monkestation/code/modules/uplink/uplink_items/explosive.dm b/monkestation/code/modules/uplink/uplink_items/explosive.dm new file mode 100644 index 000000000000..493b311b441f --- /dev/null +++ b/monkestation/code/modules/uplink/uplink_items/explosive.dm @@ -0,0 +1,2 @@ +/datum/uplink_item/explosives/soap_clusterbang + surplus = 60 diff --git a/monkestation/code/modules/uplink/uplink_items/job.dm b/monkestation/code/modules/uplink/uplink_items/job.dm index bfbb6c547e37..216d4cb5987d 100644 --- a/monkestation/code/modules/uplink/uplink_items/job.dm +++ b/monkestation/code/modules/uplink/uplink_items/job.dm @@ -5,3 +5,9 @@ cost = 1 item = /obj/item/storage/book/bible/mini restricted_roles = list(JOB_CHAPLAIN, JOB_CLOWN) + +/datum/uplink_item/role_restricted/reverse_bear_trap + surplus = 60 + +/datum/uplink_item/role_restricted/modified_syringe_gun + surplus = 50 diff --git a/monkestation/code/modules/antagonists/uplink_items/misc.dm b/monkestation/code/modules/uplink/uplink_items/misc.dm similarity index 100% rename from monkestation/code/modules/antagonists/uplink_items/misc.dm rename to monkestation/code/modules/uplink/uplink_items/misc.dm diff --git a/monkestation/code/modules/uplink/uplink_items/nukeops.dm b/monkestation/code/modules/uplink/uplink_items/nukeops.dm new file mode 100644 index 000000000000..8a918b7ad0b5 --- /dev/null +++ b/monkestation/code/modules/uplink/uplink_items/nukeops.dm @@ -0,0 +1,20 @@ +/datum/uplink_item/stealthy_weapons/romerol_kit + surplus = 10 //very rare from lootboxes + +/datum/uplink_item/dangerous/clownoppin + surplus = 80 + +/datum/uplink_item/dangerous/clownopsuperpin + surplus = 80 + +/datum/uplink_item/bundles_tc/cyber_implants + surplus = 30 + +/datum/uplink_item/bundles_tc/medical + surplus = 40 + +/datum/uplink_item/support/gygax + surplus = 40 + +/datum/uplink_item/support/honker + surplus = 60 diff --git a/monkestation/code/modules/uplink/uplink_items/species.dm b/monkestation/code/modules/uplink/uplink_items/species.dm index 29a4623f1664..db1ee12eac86 100644 --- a/monkestation/code/modules/uplink/uplink_items/species.dm +++ b/monkestation/code/modules/uplink/uplink_items/species.dm @@ -8,3 +8,18 @@ cost = 4 restricted_species = list(SPECIES_MOTH) surplus = 0 + +/datum/uplink_item/race_restricted/monkey_barrel + name = "Angry Monkey Barrel" + desc = "Expert Syndicate Scientists put pissed a couple monkeys off and put them in a barrel. It isn't that complicated, but it's very effective" + cost = 7 + item = /obj/item/grenade/monkey_barrel + restricted_species = list(SPECIES_SIMIAN) + +/datum/uplink_item/race_restricted/monkey_ball + name = "Monkey Ball" + desc = "Stolen experimental MonkeTech designed to bring a monkey's speed to dangerous levels." + cost = 12 + item = /obj/vehicle/ridden/monkey_ball + restricted_species = list(SPECIES_SIMIAN) + diff --git a/monkestation/code/modules/uplink/uplink_items/weapons.dm b/monkestation/code/modules/uplink/uplink_items/weapons.dm new file mode 100644 index 000000000000..c8bd42c70038 --- /dev/null +++ b/monkestation/code/modules/uplink/uplink_items/weapons.dm @@ -0,0 +1,27 @@ +/datum/uplink_item/implants/hardlight + name = "Hardlight Spear Implant" + desc = "An implant that allows you to summon and control a hardlight spear. \ + Adding additional implants to your body will further refine the spear summoning process, allowing you to control up to 5 spears. \ + Wait a minimum of three seconds between injections. Exact mechanism for spear summoning is classified under Aetherofusion NDA." + item = /obj/item/storage/box/syndie_kit/imp_hard_spear + cost = 7 + +/datum/uplink_item/implants/hardlight/max + name = "Commanding Hardlight Spear Implant" + desc = "An implant that allows you to summon and control seven hardlight spears. \ + Additional implants will do nothing, you cannot improve on perfection. Side effects may include: Uncontrollable telepathy, formation of subconscious hiveminds, anamnesis, levitation, and hallucinations of music. \ + Aetherofusion is not responsable for any damages this may cause." + purchasable_from = UPLINK_NUKE_OPS + item = /obj/item/storage/box/syndie_kit/imp_hard_spear/max + cost = 40 + +/datum/uplink_item/dangerous/laser_musket + name = "Syndicate Laser Musket" + desc = "An exprimental 'rifle' designed by Aetherofusion. This laser(probably) uses alien technology to fit 4 high energy capacitors \ + into a small rifle which can be stored safely(?) in any backpack. To charge, simply press down on the main control panel. \ + Rumors of this 'siphoning power off your lifeforce' are greatly exaggerated, and Aetherofusion assures safety for up to 2 years of use." + item = /obj/item/gun/energy/laser/musket/syndicate + progression_minimum = 30 MINUTES + cost = 12 + surplus = 40 + purchasable_from = ~UPLINK_CLOWN_OPS diff --git a/monkestation/code/random_rooms/bars/tramstation.dm b/monkestation/code/random_rooms/bars/tramstation.dm index f585da9cbc71..83e5b88ed91e 100644 --- a/monkestation/code/random_rooms/bars/tramstation.dm +++ b/monkestation/code/random_rooms/bars/tramstation.dm @@ -7,3 +7,39 @@ template_width = 30 weight = 8 station_name = "Tramstation" + +/datum/map_template/random_room/random_bar/tramstation_base/slum_bar + name = "Slum Tram Bar" + room_id = "tram_slum_bar" + mappath = "monkestation/_maps/RandomBars/Tram/tram_slum_bar.dmm" + weight = 6 + +/datum/map_template/random_room/random_bar/tramstation_base/ocean + name = "Ocean Tram Bar" + room_id = "tram_bar_ocean" + mappath = "monkestation/_maps/RandomBars/Tram/tram_bar_ocean.dmm" + weight = 6 + +/datum/map_template/random_room/random_bar/tramstation_base/beachside + name = "Beachside Tram Bar" + room_id = "tram_bar_beach" + mappath = "monkestation/_maps/RandomBars/Tram/tram_bar_beachside.dmm" + weight = 8 + +/datum/map_template/random_room/random_bar/tramstation_base/tram_rvb_bar + name = "Red and Blue Bar" + room_id = "tram_rvb_bar" + mappath = "monkestation/_maps/RandomBars/Tram/tram_rvb_bar.dmm" + weight = 4 + +/datum/map_template/random_room/random_bar/tramstation_base/biodome + name = "Winter Biodome Tram Bar" + room_id = "biodome_tram_bar" + mappath = "monkestation/_maps/RandomBars/Tram/tram_bar_biodome.dmm" + weight = 4 + +/datum/map_template/random_room/random_bar/tramstation_base/cult + name = "Tram cult bar" + room_id = "tram_bar_cult" + mappath = "monkestation/_maps/RandomBars/Tram/tram_bar_cult.dmm" + weight = 4 // has a rune that summons booze across the station, lets keep it a bit more rare than other bars diff --git a/monkestation/icons/effects/96x96.dmi b/monkestation/icons/effects/96x96.dmi new file mode 100644 index 000000000000..21b19d987a3b Binary files /dev/null and b/monkestation/icons/effects/96x96.dmi differ diff --git a/monkestation/icons/effects/hardlightspear.dmi b/monkestation/icons/effects/hardlightspear.dmi new file mode 100644 index 000000000000..c0f4fd367a2a Binary files /dev/null and b/monkestation/icons/effects/hardlightspear.dmi differ diff --git a/monkestation/icons/mob/clothing/feet.dmi b/monkestation/icons/mob/clothing/feet.dmi index 9e95d8f10182..135e5a43743e 100644 Binary files a/monkestation/icons/mob/clothing/feet.dmi and b/monkestation/icons/mob/clothing/feet.dmi differ diff --git a/monkestation/icons/mob/clothing/head.dmi b/monkestation/icons/mob/clothing/head.dmi index 1a409061aaee..5905870683a4 100644 Binary files a/monkestation/icons/mob/clothing/head.dmi and b/monkestation/icons/mob/clothing/head.dmi differ diff --git a/monkestation/icons/mob/clothing/mask.dmi b/monkestation/icons/mob/clothing/mask.dmi index 41d13498159d..639493e982e5 100644 Binary files a/monkestation/icons/mob/clothing/mask.dmi and b/monkestation/icons/mob/clothing/mask.dmi differ diff --git a/monkestation/icons/mob/clothing/neck.dmi b/monkestation/icons/mob/clothing/neck.dmi index 58f7f310228b..d86a09d9bdeb 100644 Binary files a/monkestation/icons/mob/clothing/neck.dmi and b/monkestation/icons/mob/clothing/neck.dmi differ diff --git a/monkestation/icons/mob/clothing/species/feet_digi.dmi b/monkestation/icons/mob/clothing/species/feet_digi.dmi new file mode 100644 index 000000000000..92f76d5b6308 Binary files /dev/null and b/monkestation/icons/mob/clothing/species/feet_digi.dmi differ diff --git a/monkestation/icons/mob/clothing/species/head_muzzled.dmi b/monkestation/icons/mob/clothing/species/head_muzzled.dmi new file mode 100644 index 000000000000..7570b61d7b1b Binary files /dev/null and b/monkestation/icons/mob/clothing/species/head_muzzled.dmi differ diff --git a/monkestation/icons/mob/clothing/species/mask_muzzled.dmi b/monkestation/icons/mob/clothing/species/mask_muzzled.dmi new file mode 100644 index 000000000000..82b13494c5d7 Binary files /dev/null and b/monkestation/icons/mob/clothing/species/mask_muzzled.dmi differ diff --git a/monkestation/icons/mob/clothing/species/simian/suit.dmi b/monkestation/icons/mob/clothing/species/simian/suit.dmi index a5ff9e9bd510..92d02218f37f 100644 Binary files a/monkestation/icons/mob/clothing/species/simian/suit.dmi and b/monkestation/icons/mob/clothing/species/simian/suit.dmi differ diff --git a/monkestation/icons/mob/clothing/species/simian/uniform.dmi b/monkestation/icons/mob/clothing/species/simian/uniform.dmi index d9b0e3378669..398bc9d3dfb8 100644 Binary files a/monkestation/icons/mob/clothing/species/simian/uniform.dmi and b/monkestation/icons/mob/clothing/species/simian/uniform.dmi differ diff --git a/monkestation/icons/mob/clothing/species/suit_digi.dmi b/monkestation/icons/mob/clothing/species/suit_digi.dmi new file mode 100644 index 000000000000..89b99dbf2306 Binary files /dev/null and b/monkestation/icons/mob/clothing/species/suit_digi.dmi differ diff --git a/monkestation/icons/mob/clothing/species/uniform_digi.dmi b/monkestation/icons/mob/clothing/species/uniform_digi.dmi new file mode 100644 index 000000000000..64cee185b819 Binary files /dev/null and b/monkestation/icons/mob/clothing/species/uniform_digi.dmi differ diff --git a/monkestation/icons/mob/clothing/suit.dmi b/monkestation/icons/mob/clothing/suit.dmi index 9a0700e62b0a..08b398e6c981 100644 Binary files a/monkestation/icons/mob/clothing/suit.dmi and b/monkestation/icons/mob/clothing/suit.dmi differ diff --git a/monkestation/icons/mob/clothing/uniform.dmi b/monkestation/icons/mob/clothing/uniform.dmi index f62c6c788363..c103e28a3a18 100644 Binary files a/monkestation/icons/mob/clothing/uniform.dmi and b/monkestation/icons/mob/clothing/uniform.dmi differ diff --git a/monkestation/icons/mob/gags/clothing/lizard_fallbacks.dmi b/monkestation/icons/mob/gags/clothing/lizard_fallbacks.dmi new file mode 100644 index 000000000000..6841a1c9050b Binary files /dev/null and b/monkestation/icons/mob/gags/clothing/lizard_fallbacks.dmi differ diff --git a/monkestation/icons/mob/ggg/glerm.dmi b/monkestation/icons/mob/ggg/glerm.dmi new file mode 100644 index 000000000000..1dec85cc0682 Binary files /dev/null and b/monkestation/icons/mob/ggg/glerm.dmi differ diff --git a/monkestation/icons/mob/ggg/susflash.dmi b/monkestation/icons/mob/ggg/susflash.dmi new file mode 100644 index 000000000000..8ab236ea4ed6 Binary files /dev/null and b/monkestation/icons/mob/ggg/susflash.dmi differ diff --git a/monkestation/icons/mob/hud.dmi b/monkestation/icons/mob/hud.dmi new file mode 100644 index 000000000000..70cc33f1ee1c Binary files /dev/null and b/monkestation/icons/mob/hud.dmi differ diff --git a/monkestation/icons/mob/inhands/polearms_lefthand.dmi b/monkestation/icons/mob/inhands/polearms_lefthand.dmi index bd7e8dea452a..02980e6ad74c 100644 Binary files a/monkestation/icons/mob/inhands/polearms_lefthand.dmi and b/monkestation/icons/mob/inhands/polearms_lefthand.dmi differ diff --git a/monkestation/icons/mob/inhands/polearms_righthand.dmi b/monkestation/icons/mob/inhands/polearms_righthand.dmi index 1f63e5eb78c2..48213a6c1dbb 100644 Binary files a/monkestation/icons/mob/inhands/polearms_righthand.dmi and b/monkestation/icons/mob/inhands/polearms_righthand.dmi differ diff --git a/monkestation/icons/mob/inhands/weapons/guns_lefthand.dmi b/monkestation/icons/mob/inhands/weapons/guns_lefthand.dmi index 5ab121f331c8..0311809edf11 100644 Binary files a/monkestation/icons/mob/inhands/weapons/guns_lefthand.dmi and b/monkestation/icons/mob/inhands/weapons/guns_lefthand.dmi differ diff --git a/monkestation/icons/mob/inhands/weapons/guns_righthand.dmi b/monkestation/icons/mob/inhands/weapons/guns_righthand.dmi index 3f85082af1dc..5bf25ffe8aad 100644 Binary files a/monkestation/icons/mob/inhands/weapons/guns_righthand.dmi and b/monkestation/icons/mob/inhands/weapons/guns_righthand.dmi differ diff --git a/monkestation/icons/mob/mod.dmi b/monkestation/icons/mob/mod.dmi new file mode 100644 index 000000000000..8f053f47ecaa Binary files /dev/null and b/monkestation/icons/mob/mod.dmi differ diff --git a/monkestation/icons/mob/slasher.dmi b/monkestation/icons/mob/slasher.dmi new file mode 100644 index 000000000000..97aa7a27de10 Binary files /dev/null and b/monkestation/icons/mob/slasher.dmi differ diff --git a/monkestation/icons/mob/species/floran/bodyparts.dmi b/monkestation/icons/mob/species/floran/bodyparts.dmi new file mode 100644 index 000000000000..9151db05ad9d Binary files /dev/null and b/monkestation/icons/mob/species/floran/bodyparts.dmi differ diff --git a/monkestation/icons/mob/species/floran/floran_leaves.dmi b/monkestation/icons/mob/species/floran/floran_leaves.dmi new file mode 100644 index 000000000000..e4b5a1c4a9c7 Binary files /dev/null and b/monkestation/icons/mob/species/floran/floran_leaves.dmi differ diff --git a/monkestation/icons/mob/species/lizard/multipart.dmi b/monkestation/icons/mob/species/lizard/multipart.dmi index e5214bbe3bfc..659930eae881 100644 Binary files a/monkestation/icons/mob/species/lizard/multipart.dmi and b/monkestation/icons/mob/species/lizard/multipart.dmi differ diff --git a/monkestation/icons/mob/species/misc/feet_digi.dmi b/monkestation/icons/mob/species/misc/feet_digi.dmi new file mode 100644 index 000000000000..6f37a62c36b3 Binary files /dev/null and b/monkestation/icons/mob/species/misc/feet_digi.dmi differ diff --git a/monkestation/icons/mob/species/misc/head_muzzled.dmi b/monkestation/icons/mob/species/misc/head_muzzled.dmi new file mode 100644 index 000000000000..71df59af70e4 Binary files /dev/null and b/monkestation/icons/mob/species/misc/head_muzzled.dmi differ diff --git a/monkestation/icons/mob/species/misc/mask_muzzled.dmi b/monkestation/icons/mob/species/misc/mask_muzzled.dmi new file mode 100644 index 000000000000..8decaadcc62f Binary files /dev/null and b/monkestation/icons/mob/species/misc/mask_muzzled.dmi differ diff --git a/monkestation/icons/mob/species/misc/mod.dmi b/monkestation/icons/mob/species/misc/mod.dmi new file mode 100644 index 000000000000..b2d514e3ab68 Binary files /dev/null and b/monkestation/icons/mob/species/misc/mod.dmi differ diff --git a/monkestation/icons/mob/species/misc/suit_digi.dmi b/monkestation/icons/mob/species/misc/suit_digi.dmi new file mode 100644 index 000000000000..2ae0ebd6627a Binary files /dev/null and b/monkestation/icons/mob/species/misc/suit_digi.dmi differ diff --git a/monkestation/icons/mob/species/misc/uniform_digi.dmi b/monkestation/icons/mob/species/misc/uniform_digi.dmi new file mode 100644 index 000000000000..36239900b048 Binary files /dev/null and b/monkestation/icons/mob/species/misc/uniform_digi.dmi differ diff --git a/monkestation/icons/mob/sprite_accessories/hair.dmi b/monkestation/icons/mob/sprite_accessories/hair.dmi index eecf3922d236..e727d836ff8b 100644 Binary files a/monkestation/icons/mob/sprite_accessories/hair.dmi and b/monkestation/icons/mob/sprite_accessories/hair.dmi differ diff --git a/monkestation/icons/obj/clothing/hats.dmi b/monkestation/icons/obj/clothing/hats.dmi index c6990529ad70..740eef80cb52 100644 Binary files a/monkestation/icons/obj/clothing/hats.dmi and b/monkestation/icons/obj/clothing/hats.dmi differ diff --git a/monkestation/icons/obj/clothing/masks.dmi b/monkestation/icons/obj/clothing/masks.dmi index 0b986bd05f8a..fd0bd387119f 100644 Binary files a/monkestation/icons/obj/clothing/masks.dmi and b/monkestation/icons/obj/clothing/masks.dmi differ diff --git a/monkestation/icons/obj/clothing/necks.dmi b/monkestation/icons/obj/clothing/necks.dmi index ab4701b0dfa2..ff9ae2e857f9 100644 Binary files a/monkestation/icons/obj/clothing/necks.dmi and b/monkestation/icons/obj/clothing/necks.dmi differ diff --git a/monkestation/icons/obj/clothing/shoes.dmi b/monkestation/icons/obj/clothing/shoes.dmi index 4ee27b879a2c..756c14e98530 100644 Binary files a/monkestation/icons/obj/clothing/shoes.dmi and b/monkestation/icons/obj/clothing/shoes.dmi differ diff --git a/monkestation/icons/obj/clothing/suits.dmi b/monkestation/icons/obj/clothing/suits.dmi index 5942f79eb9c4..e4a71324d665 100644 Binary files a/monkestation/icons/obj/clothing/suits.dmi and b/monkestation/icons/obj/clothing/suits.dmi differ diff --git a/monkestation/icons/obj/clothing/uniforms.dmi b/monkestation/icons/obj/clothing/uniforms.dmi index e63aba5eac3a..10be8c2236fd 100644 Binary files a/monkestation/icons/obj/clothing/uniforms.dmi and b/monkestation/icons/obj/clothing/uniforms.dmi differ diff --git a/monkestation/icons/obj/guns/ammo.dmi b/monkestation/icons/obj/guns/ammo.dmi new file mode 100644 index 000000000000..f01bef56f409 Binary files /dev/null and b/monkestation/icons/obj/guns/ammo.dmi differ diff --git a/monkestation/icons/obj/guns/guns.dmi b/monkestation/icons/obj/guns/guns.dmi index f44ca1a7bf83..80436df8fdd2 100644 Binary files a/monkestation/icons/obj/guns/guns.dmi and b/monkestation/icons/obj/guns/guns.dmi differ diff --git a/monkestation/icons/obj/guns/projectiles.dmi b/monkestation/icons/obj/guns/projectiles.dmi index 49bd316da0a2..22bc28134ae9 100644 Binary files a/monkestation/icons/obj/guns/projectiles.dmi and b/monkestation/icons/obj/guns/projectiles.dmi differ diff --git a/monkestation/icons/obj/implants.dmi b/monkestation/icons/obj/implants.dmi deleted file mode 100644 index e26ffc828b2f..000000000000 Binary files a/monkestation/icons/obj/implants.dmi and /dev/null differ diff --git a/monkestation/icons/obj/items_and_weapons.dmi b/monkestation/icons/obj/items_and_weapons.dmi index a3df06e95990..919998aba182 100644 Binary files a/monkestation/icons/obj/items_and_weapons.dmi and b/monkestation/icons/obj/items_and_weapons.dmi differ diff --git a/monkestation/icons/obj/medical/organs/organs.dmi b/monkestation/icons/obj/medical/organs/organs.dmi index ba92913711a7..05102aa69188 100644 Binary files a/monkestation/icons/obj/medical/organs/organs.dmi and b/monkestation/icons/obj/medical/organs/organs.dmi differ diff --git a/monkestation/icons/obj/tiles.dmi b/monkestation/icons/obj/tiles.dmi new file mode 100644 index 000000000000..5bdd17f76b5c Binary files /dev/null and b/monkestation/icons/obj/tiles.dmi differ diff --git a/monkestation/sound/effects/ggg/whereareyourfingers.mp3 b/monkestation/sound/effects/ggg/whereareyourfingers.mp3 new file mode 100644 index 000000000000..3e999923a967 Binary files /dev/null and b/monkestation/sound/effects/ggg/whereareyourfingers.mp3 differ diff --git a/monkestation/sound/voice/terror-cry.ogg b/monkestation/sound/voice/terror-cry.ogg new file mode 100644 index 000000000000..e13160333769 Binary files /dev/null and b/monkestation/sound/voice/terror-cry.ogg differ diff --git a/monkestation/sound/voice/terror.ogg b/monkestation/sound/voice/terror.ogg new file mode 100644 index 000000000000..9c94163d9a48 Binary files /dev/null and b/monkestation/sound/voice/terror.ogg differ diff --git a/sound/attributions.txt b/sound/attributions.txt index 5fe6032500c4..178082994592 100644 --- a/sound/attributions.txt +++ b/sound/attributions.txt @@ -85,3 +85,11 @@ https://freesound.org/people/aboxinghelena/sounds/401139/ car_crash.ogg is adapted from squareal's "Car Crash" (CC 0) https://freesound.org/people/squareal/sounds/237375/ + +statue_horror_sting.ogg is from Kevin MacLeod: Right Behind You (CC BY 3.0) +https://www.youtube.com/watch?v=dRdpJq6nmWw +ding_short.ogg is from Natty23 (CC 4) +https://freesound.org/people/Natty23/sounds/411747/ + +jingle.ogg is from Zapsplat (https://www.zapsplat.com/license-type/standard-license/) +https://www.zapsplat.com/sound-effect-category/sleigh-bells/ diff --git a/sound/creatures/attribution.txt b/sound/creatures/attribution.txt new file mode 100644 index 000000000000..06d8361868cb --- /dev/null +++ b/sound/creatures/attribution.txt @@ -0,0 +1,14 @@ +cow.ogg sound adapted from Benboncan on Freesound +https://freesound.org/people/Benboncan/sounds/58277/ + +pig1.ogg and pig2.ogg adapted from Jofae on Freesound +https://freesound.org/people/Jofae/sounds/352698/ + +sheep1, sheep2, and sheep3.ogg adapted from milkotz on Freesound +https://freesound.org/people/milkotz/sounds/618865/ + +snake_hissing1.ogg adapted from schreibsel on Freesound (CC 0) +https://freesound.org/people/schreibsel/sounds/540162/ + +snake_hissing2.ogg adapted from xoiziox on Freesound (CC 0) +https://freesound.org/people/xoiziox/sounds/553374/ diff --git a/sound/creatures/cow.ogg b/sound/creatures/cow.ogg new file mode 100644 index 000000000000..c3143c8dd442 Binary files /dev/null and b/sound/creatures/cow.ogg differ diff --git a/sound/creatures/pig1.ogg b/sound/creatures/pig1.ogg new file mode 100644 index 000000000000..470be7a86d33 Binary files /dev/null and b/sound/creatures/pig1.ogg differ diff --git a/sound/creatures/pig2.ogg b/sound/creatures/pig2.ogg new file mode 100644 index 000000000000..597a13464fb5 Binary files /dev/null and b/sound/creatures/pig2.ogg differ diff --git a/sound/creatures/sheep1.ogg b/sound/creatures/sheep1.ogg new file mode 100644 index 000000000000..33c1041086e5 Binary files /dev/null and b/sound/creatures/sheep1.ogg differ diff --git a/sound/creatures/sheep2.ogg b/sound/creatures/sheep2.ogg new file mode 100644 index 000000000000..eed7d6aadbd7 Binary files /dev/null and b/sound/creatures/sheep2.ogg differ diff --git a/sound/creatures/sheep3.ogg b/sound/creatures/sheep3.ogg new file mode 100644 index 000000000000..7a596e088dae Binary files /dev/null and b/sound/creatures/sheep3.ogg differ diff --git a/sound/creatures/snake_hissing1.ogg b/sound/creatures/snake_hissing1.ogg new file mode 100644 index 000000000000..52a37d764c42 Binary files /dev/null and b/sound/creatures/snake_hissing1.ogg differ diff --git a/sound/creatures/snake_hissing2.ogg b/sound/creatures/snake_hissing2.ogg new file mode 100644 index 000000000000..bd11b7fb5f0f Binary files /dev/null and b/sound/creatures/snake_hissing2.ogg differ diff --git a/sound/creatures/statue_horror_sting.ogg b/sound/creatures/statue_horror_sting.ogg new file mode 100644 index 000000000000..f420085b4525 Binary files /dev/null and b/sound/creatures/statue_horror_sting.ogg differ diff --git a/sound/effects/beeps_jingle.ogg b/sound/effects/beeps_jingle.ogg new file mode 100644 index 000000000000..0d4b647f88d5 Binary files /dev/null and b/sound/effects/beeps_jingle.ogg differ diff --git a/sound/effects/glockenspiel_ping.ogg b/sound/effects/glockenspiel_ping.ogg new file mode 100644 index 000000000000..f25300071292 Binary files /dev/null and b/sound/effects/glockenspiel_ping.ogg differ diff --git a/sound/effects/tada_fanfare.ogg b/sound/effects/tada_fanfare.ogg new file mode 100644 index 000000000000..055635e9deca Binary files /dev/null and b/sound/effects/tada_fanfare.ogg differ diff --git a/sound/misc/bonk.ogg b/sound/misc/bonk.ogg new file mode 100644 index 000000000000..c47a8cde63bc Binary files /dev/null and b/sound/misc/bonk.ogg differ diff --git a/strings/farts.txt b/strings/farts.txt index 97e3bb7174b4..aabc7298ae20 100644 --- a/strings/farts.txt +++ b/strings/farts.txt @@ -40,3 +40,4 @@ repressurizes the room. farts and blames it on the dog. winces, must have been a spicy one. didn't fart, it must have been a ghost! +unleashes their animal spirit! diff --git a/strings/names/guardian_descriptions.txt b/strings/names/guardian_descriptions.txt new file mode 100644 index 000000000000..678ec61fef63 --- /dev/null +++ b/strings/names/guardian_descriptions.txt @@ -0,0 +1,24 @@ +Black +Blazing +Bloody +Blue +Bronze +Dawn +Dusk +Gold +Green +Grey +Iron +Midnight +Orange +Pink +Plastitanium +Purple +Red +Shimmering +Shining +Silver +Sparkling +Steel +White +Yellow diff --git a/strings/names/guardian_gamepieces.txt b/strings/names/guardian_gamepieces.txt new file mode 100644 index 000000000000..10a99cf38fb4 --- /dev/null +++ b/strings/names/guardian_gamepieces.txt @@ -0,0 +1,13 @@ +Ace +Bishop +Club +Diamond +Heart +Jack +Joker +King +Knight +Pawn +Queen +Rook +Spade diff --git a/strings/names/guardian_tarot.txt b/strings/names/guardian_tarot.txt new file mode 100644 index 000000000000..5772c90d7ae8 --- /dev/null +++ b/strings/names/guardian_tarot.txt @@ -0,0 +1,23 @@ +Chariot +Death +Devil +Emperor +Empress +Fool +Fortune +Hangman +Hermit +Hierophant +Judgement +Justice +Lover +Magician +Moon +Priestess +Star +Strength +Sun +Temperance +Tower +Wheel +World diff --git a/strings/pill_names.json b/strings/pill_names.json index 4584c1b605e7..b4b8828ab985 100644 --- a/strings/pill_names.json +++ b/strings/pill_names.json @@ -25,6 +25,7 @@ "Bloody", "Blue", "Bomb", +"Bobo", "Bot", "Bourbon", "Borbop", @@ -41,6 +42,7 @@ "Chemist", "Cherry", "Chief", +"Child", "Chokeslam", "Clarity", "Clown", @@ -120,6 +122,7 @@ "Lightning", "Liquid", "Lover", +"Lunchtime", "Macho", "Maid", "Man", @@ -142,6 +145,7 @@ "One", "Ook", "Organic", +"Patrick", "Pete", "Pineapple", "Piss", @@ -149,6 +153,7 @@ "Poor", "Power", "Pressure", +"Pretty", "prob(80)", "Psycho", "Quaalude", @@ -180,6 +185,7 @@ "South", "Space", "Spaceman", +"Special", "Speed", "Spess", "Spessman", @@ -212,6 +218,7 @@ "Wendy", "West", "White", +"Wise", "Woman", "Working", "Xeno", @@ -222,7 +229,6 @@ "ACCESS DENIED", "FORBIDDEN", "REDACTED", -"Dr. Jekyll", "Rime" ] diff --git a/strings/sillytips.txt b/strings/sillytips.txt index 41094d5b215f..9cfd166a364d 100644 --- a/strings/sillytips.txt +++ b/strings/sillytips.txt @@ -36,3 +36,4 @@ To defeat the slaughter demon, shoot at it until it dies. When a round ends nearly everything about it is lost forever, leave your salt behind with it. You can win a pulse rifle from the arcade machine. Honest. Your sprite represents your hitbox, so that afro makes you easier to kill. The sacrifices we make for style. +Gorillas can be killed by land mines placed along forest paths. diff --git a/strings/wounds/bone_scar_desc.json b/strings/wounds/bone_scar_desc.json index b1eb84bb8b79..2a89f0220021 100644 --- a/strings/wounds/bone_scar_desc.json +++ b/strings/wounds/bone_scar_desc.json @@ -1,6 +1,11 @@ { "generic": ["general disfigurement"], + "dislocate": [ + "the bone equivalent of a faded bruise", + "a series of tiny chip marks" + ], + "bluntmoderate": [ "the bone equivalent of a faded bruise", "a series of tiny chip marks" diff --git a/strings/wounds/flesh_scar_desc.json b/strings/wounds/flesh_scar_desc.json index d8c253873cc3..0fd78bec8e4f 100644 --- a/strings/wounds/flesh_scar_desc.json +++ b/strings/wounds/flesh_scar_desc.json @@ -1,6 +1,12 @@ { "generic": ["general disfigurement"], + "dislocate": [ + "light discoloring", + "a slight blue tint", + "a slightly deadened tint" + ], + "bluntmoderate": [ "light discoloring", "a slight blue tint", diff --git a/tgstation.dme b/tgstation.dme index 904191d3af23..04db9cebacb6 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -79,6 +79,7 @@ #include "code\__DEFINES\construction.dm" #include "code\__DEFINES\cooldowns.dm" #include "code\__DEFINES\crafting.dm" +#include "code\__DEFINES\crushing.dm" #include "code\__DEFINES\ctf.dm" #include "code\__DEFINES\cult.dm" #include "code\__DEFINES\database.dm" @@ -152,6 +153,7 @@ #include "code\__DEFINES\mecha.dm" #include "code\__DEFINES\mechcomp.dm" #include "code\__DEFINES\medical.dm" +#include "code\__DEFINES\megafauna.dm" #include "code\__DEFINES\melee.dm" #include "code\__DEFINES\memory_defines.dm" #include "code\__DEFINES\mergers.dm" @@ -161,6 +163,7 @@ #include "code\__DEFINES\mod.dm" #include "code\__DEFINES\modular_computer.dm" #include "code\__DEFINES\monkeys.dm" +#include "code\__DEFINES\mood.dm" #include "code\__DEFINES\move_force.dm" #include "code\__DEFINES\movement.dm" #include "code\__DEFINES\movespeed_modification.dm" @@ -229,6 +232,7 @@ #include "code\__DEFINES\station.dm" #include "code\__DEFINES\station_stuck.dm" #include "code\__DEFINES\status_effects.dm" +#include "code\__DEFINES\stickers.dm" #include "code\__DEFINES\storage.dm" #include "code\__DEFINES\strippable.dm" #include "code\__DEFINES\subsystems.dm" @@ -243,6 +247,7 @@ #include "code\__DEFINES\time.dm" #include "code\__DEFINES\tools.dm" #include "code\__DEFINES\toys.dm" +#include "code\__DEFINES\trader.dm" #include "code\__DEFINES\traits.dm" #include "code\__DEFINES\tram.dm" #include "code\__DEFINES\turbine_defines.dm" @@ -271,6 +276,7 @@ #include "code\__DEFINES\ai\pets.dm" #include "code\__DEFINES\ai\simplemob.dm" #include "code\__DEFINES\ai\tourist.dm" +#include "code\__DEFINES\ai\trader.dm" #include "code\__DEFINES\ai\vending.dm" #include "code\__DEFINES\ai\ventcrawling.dm" #include "code\__DEFINES\atmospherics\atmos_core.dm" @@ -291,6 +297,7 @@ #include "code\__DEFINES\dcs\signals\signals_assembly.dm" #include "code\__DEFINES\dcs\signals\signals_beam.dm" #include "code\__DEFINES\dcs\signals\signals_bitrunning.dm" +#include "code\__DEFINES\dcs\signals\signals_blob.dm" #include "code\__DEFINES\dcs\signals\signals_bot.dm" #include "code\__DEFINES\dcs\signals\signals_changeling.dm" #include "code\__DEFINES\dcs\signals\signals_circuit.dm" @@ -315,6 +322,7 @@ #include "code\__DEFINES\dcs\signals\signals_key.dm" #include "code\__DEFINES\dcs\signals\signals_ladder.dm" #include "code\__DEFINES\dcs\signals\signals_lazy_templates.dm" +#include "code\__DEFINES\dcs\signals\signals_leash.dm" #include "code\__DEFINES\dcs\signals\signals_lift.dm" #include "code\__DEFINES\dcs\signals\signals_light_eater.dm" #include "code\__DEFINES\dcs\signals\signals_medical.dm" @@ -337,6 +345,7 @@ #include "code\__DEFINES\dcs\signals\signals_spatial_grid.dm" #include "code\__DEFINES\dcs\signals\signals_specie.dm" #include "code\__DEFINES\dcs\signals\signals_spell.dm" +#include "code\__DEFINES\dcs\signals\signals_sticker.dm" #include "code\__DEFINES\dcs\signals\signals_storage.dm" #include "code\__DEFINES\dcs\signals\signals_subsystem.dm" #include "code\__DEFINES\dcs\signals\signals_swab.dm" @@ -363,6 +372,7 @@ #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_arcade.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_basic.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_carbon.dm" +#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_guardian.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_living.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_main.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_silicon.dm" @@ -373,6 +383,8 @@ #include "code\__DEFINES\~monkestation\access.dm" #include "code\__DEFINES\~monkestation\ai.dm" #include "code\__DEFINES\~monkestation\antagonists.dm" +#include "code\__DEFINES\~monkestation\artifact.dm" +#include "code\__DEFINES\~monkestation\asteroids.dm" #include "code\__DEFINES\~monkestation\clock_cult.dm" #include "code\__DEFINES\~monkestation\colors.dm" #include "code\__DEFINES\~monkestation\combat.dm" @@ -390,9 +402,11 @@ #include "code\__DEFINES\~monkestation\smoothing.dm" #include "code\__DEFINES\~monkestation\span.dm" #include "code\__DEFINES\~monkestation\status_effects.dm" +#include "code\__DEFINES\~monkestation\storytellers.dm" #include "code\__DEFINES\~monkestation\traits.dm" #include "code\__DEFINES\~monkestation\dcs\signals\signals_atom.dm" #include "code\__DEFINES\~monkestation\dcs\signals\signals_carbon.dm" +#include "code\__DEFINES\~monkestation\dcs\signals\signals_traitor.dm" #include "code\__HELPERS\_auxtools_api.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_planes.dm" @@ -444,7 +458,6 @@ #include "code\__HELPERS\mouse_control.dm" #include "code\__HELPERS\nameof.dm" #include "code\__HELPERS\names.dm" -#include "code\__HELPERS\path.dm" #include "code\__HELPERS\piping_colors_lists.dm" #include "code\__HELPERS\priority_announce.dm" #include "code\__HELPERS\pronouns.dm" @@ -498,6 +511,9 @@ #include "code\__HELPERS\logging\tool.dm" #include "code\__HELPERS\logging\ui.dm" #include "code\__HELPERS\logging\virus.dm" +#include "code\__HELPERS\paths\jps.dm" +#include "code\__HELPERS\paths\path.dm" +#include "code\__HELPERS\paths\sssp.dm" #include "code\__HELPERS\sorts\__main.dm" #include "code\__HELPERS\sorts\InsertSort.dm" #include "code\__HELPERS\sorts\MergeSort.dm" @@ -648,7 +664,6 @@ #include "code\controllers\subsystem\pai.dm" #include "code\controllers\subsystem\parallax.dm" #include "code\controllers\subsystem\pathfinder.dm" -#include "code\controllers\subsystem\persistence.dm" #include "code\controllers\subsystem\persistent_paintings.dm" #include "code\controllers\subsystem\ping.dm" #include "code\controllers\subsystem\points_of_interest.dm" @@ -691,6 +706,15 @@ #include "code\controllers\subsystem\movement\movement.dm" #include "code\controllers\subsystem\movement\movement_types.dm" #include "code\controllers\subsystem\movement\spacedrift.dm" +#include "code\controllers\subsystem\persistence\_persistence.dm" +#include "code\controllers\subsystem\persistence\counter_delamination.dm" +#include "code\controllers\subsystem\persistence\custom_outfits.dm" +#include "code\controllers\subsystem\persistence\engravings.dm" +#include "code\controllers\subsystem\persistence\photo_albums.dm" +#include "code\controllers\subsystem\persistence\recipes.dm" +#include "code\controllers\subsystem\persistence\scars.dm" +#include "code\controllers\subsystem\persistence\tattoos.dm" +#include "code\controllers\subsystem\persistence\trophies.dm" #include "code\controllers\subsystem\processing\acid.dm" #include "code\controllers\subsystem\processing\ai_basic_avoidance.dm" #include "code\controllers\subsystem\processing\ai_behaviors.dm" @@ -805,7 +829,6 @@ #include "code\datums\actions\mobs\open_mob_commands.dm" #include "code\datums\actions\mobs\projectileattack.dm" #include "code\datums\actions\mobs\sign_language.dm" -#include "code\datums\actions\mobs\small_sprite.dm" #include "code\datums\actions\mobs\sneak.dm" #include "code\datums\actions\mobs\transform_weapon.dm" #include "code\datums\actions\mobs\sequences\dash_attack.dm" @@ -821,46 +844,62 @@ #include "code\datums\ai\bane\bane_controller.dm" #include "code\datums\ai\bane\bane_subtrees.dm" #include "code\datums\ai\basic_mobs\base_basic_controller.dm" +#include "code\datums\ai\basic_mobs\generic_controllers.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\basic_attacking.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\climb_tree.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\find_parent.dm" -#include "code\datums\ai\basic_mobs\basic_ai_behaviors\nearest_targetting.dm" +#include "code\datums\ai\basic_mobs\basic_ai_behaviors\nearest_targeting.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\pick_up_item.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\run_away_from_target.dm" +#include "code\datums\ai\basic_mobs\basic_ai_behaviors\set_travel_destination.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\step_towards_turf.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\stop_and_stare.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\targeted_mob_ability.dm" -#include "code\datums\ai\basic_mobs\basic_ai_behaviors\targetting.dm" +#include "code\datums\ai\basic_mobs\basic_ai_behaviors\targeting.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\tipped_reaction.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\travel_towards.dm" +#include "code\datums\ai\basic_mobs\basic_ai_behaviors\unbuckle_mob.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\ventcrawling.dm" +#include "code\datums\ai\basic_mobs\basic_ai_behaviors\wounded_targeting.dm" #include "code\datums\ai\basic_mobs\basic_ai_behaviors\write_on_paper.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\attack_adjacent_target.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\attack_obstacle_in_path.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\call_reinforcements.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\capricious_retaliate.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\climb_tree.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\find_food.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\find_paper_and_write.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\find_parent.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\flee_target.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\maintain_distance.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\mine_walls.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\move_to_cardinal.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\opportunistic_ventcrawler.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\prepare_travel_to_destination.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\ranged_skirmish.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\run_emote.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\shapechange_ambush.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\simple_attack_target.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\simple_find_nearest_target_to_flee.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\simple_find_target.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\simple_find_wounded_target.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\sleep_with_no_target.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\speech_subtree.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\stare_at_thing.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\target_retaliate.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\targeted_mob_ability.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\teleport_away_from_target.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\tipped_subtree.dm" +#include "code\datums\ai\basic_mobs\basic_subtrees\travel_to_point.dm" #include "code\datums\ai\basic_mobs\basic_subtrees\use_mob_ability.dm" #include "code\datums\ai\basic_mobs\pet_commands\fetch.dm" #include "code\datums\ai\basic_mobs\pet_commands\pet_command_planning.dm" #include "code\datums\ai\basic_mobs\pet_commands\pet_follow_friend.dm" -#include "code\datums\ai\basic_mobs\pet_commands\pet_use_targetted_ability.dm" +#include "code\datums\ai\basic_mobs\pet_commands\pet_use_targeted_ability.dm" #include "code\datums\ai\basic_mobs\pet_commands\play_dead.dm" -#include "code\datums\ai\basic_mobs\targetting_datums\basic_targetting_datum.dm" -#include "code\datums\ai\basic_mobs\targetting_datums\dont_target_friends.dm" +#include "code\datums\ai\basic_mobs\targeting_strategies\basic_targeting_strategy.dm" +#include "code\datums\ai\basic_mobs\targeting_strategies\dont_target_friends.dm" +#include "code\datums\ai\basic_mobs\targeting_strategies\with_object.dm" #include "code\datums\ai\cursed\cursed_behaviors.dm" #include "code\datums\ai\cursed\cursed_controller.dm" #include "code\datums\ai\cursed\cursed_subtrees.dm" @@ -874,6 +913,7 @@ #include "code\datums\ai\hauntium\hauntium_subtrees.dm" #include "code\datums\ai\hunting_behavior\hunting_behaviors.dm" #include "code\datums\ai\hunting_behavior\hunting_cockroach.dm" +#include "code\datums\ai\hunting_behavior\hunting_corpses.dm" #include "code\datums\ai\hunting_behavior\hunting_lights.dm" #include "code\datums\ai\hunting_behavior\hunting_mouse.dm" #include "code\datums\ai\idle_behaviors\_idle_behavior.dm" @@ -939,19 +979,22 @@ #include "code\datums\components\anti_magic.dm" #include "code\datums\components\appearance_on_aggro.dm" #include "code\datums\components\aquarium_content.dm" +#include "code\datums\components\area_based_godmode.dm" #include "code\datums\components\area_sound_manager.dm" #include "code\datums\components\areabound.dm" #include "code\datums\components\armor_plate.dm" #include "code\datums\components\atmos_reaction_recorder.dm" -#include "code\datums\components\attached_sticker.dm" #include "code\datums\components\aura_healing.dm" #include "code\datums\components\bakeable.dm" +#include "code\datums\components\basic_inhands.dm" #include "code\datums\components\basic_mob_attack_telegraph.dm" #include "code\datums\components\basic_ranged_ready_overlay.dm" #include "code\datums\components\beetlejuice.dm" +#include "code\datums\components\blob_minion.dm" #include "code\datums\components\blood_walk.dm" #include "code\datums\components\bloodysoles.dm" #include "code\datums\components\boomerang.dm" +#include "code\datums\components\breeding.dm" #include "code\datums\components\bullet_intercepting.dm" #include "code\datums\components\bumpattack.dm" #include "code\datums\components\burning.dm" @@ -976,11 +1019,14 @@ #include "code\datums\components\creamed.dm" #include "code\datums\components\cult_ritual_item.dm" #include "code\datums\components\curse_of_hunger.dm" +#include "code\datums\components\curse_of_polymorph.dm" #include "code\datums\components\customizable_reagent_holder.dm" #include "code\datums\components\damage_aura.dm" +#include "code\datums\components\damage_chain.dm" #include "code\datums\components\deadchat_control.dm" #include "code\datums\components\dejavu.dm" #include "code\datums\components\deployable.dm" +#include "code\datums\components\direct_explosive_trap.dm" #include "code\datums\components\drift.dm" #include "code\datums\components\earprotection.dm" #include "code\datums\components\echolocation.dm" @@ -995,6 +1041,7 @@ #include "code\datums\components\faction_granter.dm" #include "code\datums\components\fertile_egg.dm" #include "code\datums\components\fishing_spot.dm" +#include "code\datums\components\focused_attacker.dm" #include "code\datums\components\food_storage.dm" #include "code\datums\components\force_move.dm" #include "code\datums\components\fov_handler.dm" @@ -1022,11 +1069,15 @@ #include "code\datums\components\itembound.dm" #include "code\datums\components\itempicky.dm" #include "code\datums\components\jetpack.dm" +#include "code\datums\components\joint_damage.dm" #include "code\datums\components\jousting.dm" #include "code\datums\components\keep_me_secure.dm" #include "code\datums\components\knockoff.dm" #include "code\datums\components\label.dm" +#include "code\datums\components\leash.dm" +#include "code\datums\components\life_link.dm" #include "code\datums\components\light_eater.dm" +#include "code\datums\components\listen_and_repeat.dm" #include "code\datums\components\lock_on_cursor.dm" #include "code\datums\components\magnet.dm" #include "code\datums\components\manual_blinking.dm" @@ -1035,6 +1086,7 @@ #include "code\datums\components\mind_linker.dm" #include "code\datums\components\mirage_border.dm" #include "code\datums\components\mirv.dm" +#include "code\datums\components\mob_chain.dm" #include "code\datums\components\mob_harvest.dm" #include "code\datums\components\multiple_lives.dm" #include "code\datums\components\mutant_hands.dm" @@ -1050,13 +1102,14 @@ #include "code\datums\components\phylactery.dm" #include "code\datums\components\pinata.dm" #include "code\datums\components\pricetag.dm" -#include "code\datums\components\pry_open_door.dm" #include "code\datums\components\punchcooldown.dm" #include "code\datums\components\puzzgrid.dm" #include "code\datums\components\radiation_countdown.dm" #include "code\datums\components\radioactive_emitter.dm" #include "code\datums\components\ranged_attacks.dm" +#include "code\datums\components\ranged_mob_full_auto.dm" #include "code\datums\components\reagent_refiller.dm" +#include "code\datums\components\recharging_attacks.dm" #include "code\datums\components\redirect_attack_hand_from_turf.dm" #include "code\datums\components\regenerator.dm" #include "code\datums\components\religious_tool.dm" @@ -1068,6 +1121,7 @@ #include "code\datums\components\scope.dm" #include "code\datums\components\seclight_attachable.dm" #include "code\datums\components\seethrough.dm" +#include "code\datums\components\seethrough_mob.dm" #include "code\datums\components\shell.dm" #include "code\datums\components\shielded.dm" #include "code\datums\components\shovel_hands.dm" @@ -1114,6 +1168,7 @@ #include "code\datums\components\thermite.dm" #include "code\datums\components\tippable.dm" #include "code\datums\components\toggle_suit.dm" +#include "code\datums\components\torn_wall.dm" #include "code\datums\components\transforming.dm" #include "code\datums\components\trapdoor.dm" #include "code\datums\components\tree_climber.dm" @@ -1121,6 +1176,7 @@ #include "code\datums\components\udder.dm" #include "code\datums\components\unbreakable.dm" #include "code\datums\components\unobserved_actor.dm" +#include "code\datums\components\unusual_effect.dm" #include "code\datums\components\uplink.dm" #include "code\datums\components\usb_port.dm" #include "code\datums\components\vacuum.dm" @@ -1170,6 +1226,7 @@ #include "code\datums\components\riding\riding_vehicle.dm" #include "code\datums\components\style\style.dm" #include "code\datums\components\style\style_meter.dm" +#include "code\datums\components\trader\trader.dm" #include "code\datums\diseases\_disease.dm" #include "code\datums\diseases\_MobProcs.dm" #include "code\datums\diseases\adrenal_crisis.dm" @@ -1232,6 +1289,7 @@ #include "code\datums\elements\ai_flee_while_injured.dm" #include "code\datums\elements\ai_held_item.dm" #include "code\datums\elements\ai_retaliate.dm" +#include "code\datums\elements\ai_swap_combat_mode.dm" #include "code\datums\elements\ai_target_damagesource.dm" #include "code\datums\elements\amputating_limbs.dm" #include "code\datums\elements\animal_variety.dm" @@ -1270,8 +1328,10 @@ #include "code\datums\elements\death_linked.dm" #include "code\datums\elements\delete_on_drop.dm" #include "code\datums\elements\deliver_first.dm" +#include "code\datums\elements\dextrous.dm" #include "code\datums\elements\diggable.dm" #include "code\datums\elements\digitalcamo.dm" +#include "code\datums\elements\door_pryer.dm" #include "code\datums\elements\drag_pickup.dm" #include "code\datums\elements\dryable.dm" #include "code\datums\elements\earhealing.dm" @@ -1284,6 +1344,7 @@ #include "code\datums\elements\firestacker.dm" #include "code\datums\elements\floorloving.dm" #include "code\datums\elements\footstep.dm" +#include "code\datums\elements\footstep_override.dm" #include "code\datums\elements\forced_gravity.dm" #include "code\datums\elements\frozen.dm" #include "code\datums\elements\haunted.dm" @@ -1300,6 +1361,7 @@ #include "code\datums\elements\light_eaten.dm" #include "code\datums\elements\light_eater.dm" #include "code\datums\elements\loomable.dm" +#include "code\datums\elements\mob_grabber.dm" #include "code\datums\elements\mob_killed_tally.dm" #include "code\datums\elements\movement_turf_changer.dm" #include "code\datums\elements\movetype_handler.dm" @@ -1307,6 +1369,7 @@ #include "code\datums\elements\noticable_organ.dm" #include "code\datums\elements\obj_regen.dm" #include "code\datums\elements\openspace_item_click_handler.dm" +#include "code\datums\elements\ore_collecting.dm" #include "code\datums\elements\organ_set_bonus.dm" #include "code\datums\elements\pet_bonus.dm" #include "code\datums\elements\plant_backfire.dm" @@ -1329,8 +1392,8 @@ #include "code\datums\elements\soft_landing.dm" #include "code\datums\elements\spooky.dm" #include "code\datums\elements\squish.dm" -#include "code\datums\elements\sticker.dm" #include "code\datums\elements\strippable.dm" +#include "code\datums\elements\structure_repair.dm" #include "code\datums\elements\swabbable.dm" #include "code\datums\elements\tear_wall.dm" #include "code\datums\elements\temporary_atom.dm" @@ -1348,9 +1411,12 @@ #include "code\datums\elements\waddling.dm" #include "code\datums\elements\wall_engraver.dm" #include "code\datums\elements\wall_smasher.dm" +#include "code\datums\elements\wall_tearer.dm" +#include "code\datums\elements\wall_walker.dm" #include "code\datums\elements\weapon_description.dm" #include "code\datums\elements\weather_listener.dm" #include "code\datums\elements\web_walker.dm" +#include "code\datums\elements\wheel.dm" #include "code\datums\elements\decals\_decal.dm" #include "code\datums\elements\decals\blood.dm" #include "code\datums\elements\food\dunkable.dm" @@ -1371,6 +1437,7 @@ #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\greyscale\config_types\greyscale_configs\greyscale_mobs.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" #include "code\datums\helper_datums\icon_snapshot.dm" @@ -1576,13 +1643,16 @@ #include "code\datums\wires\syndicatebomb.dm" #include "code\datums\wires\tesla_coil.dm" #include "code\datums\wires\vending.dm" +#include "code\datums\wounds\_wound_static_data.dm" #include "code\datums\wounds\_wounds.dm" +#include "code\datums\wounds\blunt.dm" #include "code\datums\wounds\bones.dm" #include "code\datums\wounds\burns.dm" #include "code\datums\wounds\loss.dm" #include "code\datums\wounds\pierce.dm" #include "code\datums\wounds\slash.dm" #include "code\datums\wounds\scars\_scars.dm" +#include "code\datums\wounds\scars\_static_scar_data.dm" #include "code\game\alternate_appearance.dm" #include "code\game\atom_defense.dm" #include "code\game\atoms.dm" @@ -1819,7 +1889,7 @@ #include "code\game\objects\effects\particle_holder.dm" #include "code\game\objects\effects\phased_mob.dm" #include "code\game\objects\effects\portals.dm" -#include "code\game\objects\effects\poster.dm" +#include "code\game\objects\effects\poster_demotivational.dm" #include "code\game\objects\effects\poster_motivational.dm" #include "code\game\objects\effects\powerup.dm" #include "code\game\objects\effects\spiderwebs.dm" @@ -1865,6 +1935,9 @@ #include "code\game\objects\effects\particles\note_particles.dm" #include "code\game\objects\effects\particles\smoke.dm" #include "code\game\objects\effects\particles\water.dm" +#include "code\game\objects\effects\posters\contraband.dm" +#include "code\game\objects\effects\posters\official.dm" +#include "code\game\objects\effects\posters\poster.dm" #include "code\game\objects\effects\spawners\bombspawner.dm" #include "code\game\objects\effects\spawners\costume.dm" #include "code\game\objects\effects\spawners\gibspawner.dm" @@ -1979,10 +2052,12 @@ #include "code\game\objects\items\skub.dm" #include "code\game\objects\items\spear.dm" #include "code\game\objects\items\sticker.dm" +#include "code\game\objects\items\syndie_spraycan.dm" #include "code\game\objects\items\tail_pin.dm" #include "code\game\objects\items\taster.dm" #include "code\game\objects\items\teleportation.dm" #include "code\game\objects\items\theft_tools.dm" +#include "code\game\objects\items\tongs.dm" #include "code\game\objects\items\toy_mechs.dm" #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" @@ -2269,6 +2344,7 @@ #include "code\game\objects\structures\morgue.dm" #include "code\game\objects\structures\mystery_box.dm" #include "code\game\objects\structures\noticeboard.dm" +#include "code\game\objects\structures\ore_containers.dm" #include "code\game\objects\structures\petrified_statue.dm" #include "code\game\objects\structures\pinatas.dm" #include "code\game\objects\structures\plasticflaps.dm" @@ -2398,6 +2474,7 @@ #include "code\modules\actionspeed\modifiers\drugs.dm" #include "code\modules\actionspeed\modifiers\mood.dm" #include "code\modules\actionspeed\modifiers\status_effects.dm" +#include "code\modules\actionspeed\modifiers\wound.dm" #include "code\modules\admin\admin.dm" #include "code\modules\admin\admin_fax_panel.dm" #include "code\modules\admin\admin_investigate.dm" @@ -2474,6 +2551,7 @@ #include "code\modules\admin\verbs\adminsay.dm" #include "code\modules\admin\verbs\ai_triumvirate.dm" #include "code\modules\admin\verbs\anonymousnames.dm" +#include "code\modules\admin\verbs\artifacts.dm" #include "code\modules\admin\verbs\atmosdebug.dm" #include "code\modules\admin\verbs\beakerpanel.dm" #include "code\modules\admin\verbs\borgpanel.dm" @@ -2691,6 +2769,7 @@ #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_map.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_moodlets.dm" #include "code\modules\antagonists\heretic\magic\aggressive_spread.dm" +#include "code\modules\antagonists\heretic\magic\ascended_shapeshift.dm" #include "code\modules\antagonists\heretic\magic\ash_ascension.dm" #include "code\modules\antagonists\heretic\magic\ash_jaunt.dm" #include "code\modules\antagonists\heretic\magic\blood_cleave.dm" @@ -2721,12 +2800,12 @@ #include "code\modules\antagonists\heretic\magic\void_cold_cone.dm" #include "code\modules\antagonists\heretic\magic\void_phase.dm" #include "code\modules\antagonists\heretic\magic\void_pull.dm" -#include "code\modules\antagonists\heretic\mobs\maid_in_mirror.dm" #include "code\modules\antagonists\heretic\status_effects\buffs.dm" #include "code\modules\antagonists\heretic\status_effects\debuffs.dm" #include "code\modules\antagonists\heretic\status_effects\ghoul.dm" #include "code\modules\antagonists\heretic\status_effects\mark_effects.dm" #include "code\modules\antagonists\heretic\structures\carving_knife.dm" +#include "code\modules\antagonists\heretic\structures\knock_final.dm" #include "code\modules\antagonists\heretic\structures\mawed_crucible.dm" #include "code\modules\antagonists\highlander\highlander.dm" #include "code\modules\antagonists\hypnotized\hypnotized.dm" @@ -2767,7 +2846,6 @@ #include "code\modules\antagonists\pirate\pirate_special_items.dm" #include "code\modules\antagonists\pyro_slime\pyro_slime.dm" #include "code\modules\antagonists\revenant\haunted_item.dm" -#include "code\modules\antagonists\revenant\revenant_abilities.dm" #include "code\modules\antagonists\revenant\revenant_antag.dm" #include "code\modules\antagonists\revenant\revenant_blight.dm" #include "code\modules\antagonists\revolution\enemy_of_the_revolution.dm" @@ -2795,9 +2873,7 @@ #include "code\modules\antagonists\traitor\components\traitor_objective_limit_per_time.dm" #include "code\modules\antagonists\traitor\components\traitor_objective_mind_tracker.dm" #include "code\modules\antagonists\traitor\objectives\assassination.dm" -#include "code\modules\antagonists\traitor\objectives\demoralise_crew.dm" -#include "code\modules\antagonists\traitor\objectives\demoralise_graffiti.dm" -#include "code\modules\antagonists\traitor\objectives\demoralise_poster.dm" +#include "code\modules\antagonists\traitor\objectives\demoralise_assault.dm" #include "code\modules\antagonists\traitor\objectives\destroy_heirloom.dm" #include "code\modules\antagonists\traitor\objectives\destroy_item.dm" #include "code\modules\antagonists\traitor\objectives\eyesnatching.dm" @@ -3014,15 +3090,16 @@ #include "code\modules\bitrunning\abilities.dm" #include "code\modules\bitrunning\alerts.dm" #include "code\modules\bitrunning\areas.dm" +#include "code\modules\bitrunning\designs.dm" #include "code\modules\bitrunning\event.dm" #include "code\modules\bitrunning\job.dm" +#include "code\modules\bitrunning\outfits.dm" #include "code\modules\bitrunning\turfs.dm" #include "code\modules\bitrunning\antagonists\cyber_police.dm" -#include "code\modules\bitrunning\antagonists\outfit.dm" #include "code\modules\bitrunning\components\avatar_connection.dm" #include "code\modules\bitrunning\components\bitrunning_points.dm" #include "code\modules\bitrunning\components\netpod_healing.dm" -#include "code\modules\bitrunning\objects\bit_vendor.dm" +#include "code\modules\bitrunning\objects\byteforge.dm" #include "code\modules\bitrunning\objects\clothing.dm" #include "code\modules\bitrunning\objects\disks.dm" #include "code\modules\bitrunning\objects\hololadder.dm" @@ -3031,6 +3108,7 @@ #include "code\modules\bitrunning\objects\loot_crate.dm" #include "code\modules\bitrunning\objects\netpod.dm" #include "code\modules\bitrunning\objects\quantum_console.dm" +#include "code\modules\bitrunning\objects\vendor.dm" #include "code\modules\bitrunning\orders\disks.dm" #include "code\modules\bitrunning\orders\flair.dm" #include "code\modules\bitrunning\orders\tech.dm" @@ -3053,6 +3131,8 @@ #include "code\modules\bitrunning\virtual_domain\domains\legion.dm" #include "code\modules\bitrunning\virtual_domain\domains\pipedream.dm" #include "code\modules\bitrunning\virtual_domain\domains\pirates.dm" +#include "code\modules\bitrunning\virtual_domain\domains\psyker_shuffle.dm" +#include "code\modules\bitrunning\virtual_domain\domains\psyker_zombies.dm" #include "code\modules\bitrunning\virtual_domain\domains\stairs_and_cliffs.dm" #include "code\modules\bitrunning\virtual_domain\domains\syndicate_assault.dm" #include "code\modules\bitrunning\virtual_domain\domains\test_only.dm" @@ -3198,6 +3278,7 @@ #include "code\modules\client\preferences\multiz_performance.dm" #include "code\modules\client\preferences\names.dm" #include "code\modules\client\preferences\ooc.dm" +#include "code\modules\client\preferences\operative_species.dm" #include "code\modules\client\preferences\paint_color.dm" #include "code\modules\client\preferences\parallax.dm" #include "code\modules\client\preferences\pda.dm" @@ -3249,6 +3330,7 @@ #include "code\modules\client\verbs\who.dm" #include "code\modules\clothing\chameleon.dm" #include "code\modules\clothing\clothing.dm" +#include "code\modules\clothing\chameleon\chameleon_drone.dm" #include "code\modules\clothing\ears\_ears.dm" #include "code\modules\clothing\glasses\_glasses.dm" #include "code\modules\clothing\glasses\engine_goggles.dm" @@ -3409,6 +3491,7 @@ #include "code\modules\escape_menu\title.dm" #include "code\modules\events\_event.dm" #include "code\modules\events\_event_admin_setup.dm" +#include "code\modules\events\artifact_spawn.dm" #include "code\modules\events\aurora_caelus.dm" #include "code\modules\events\brain_trauma.dm" #include "code\modules\events\brand_intelligence.dm" @@ -3692,6 +3775,7 @@ #include "code\modules\hydroponics\grown\random.dm" #include "code\modules\hydroponics\grown\replicapod.dm" #include "code\modules\hydroponics\grown\root.dm" +#include "code\modules\hydroponics\grown\seedling.dm" #include "code\modules\hydroponics\grown\sugarcane.dm" #include "code\modules\hydroponics\grown\tea_coffee.dm" #include "code\modules\hydroponics\grown\tobacco.dm" @@ -3982,7 +4066,6 @@ #include "code\modules\mining\machine_stacking.dm" #include "code\modules\mining\machine_unloading.dm" #include "code\modules\mining\mine_items.dm" -#include "code\modules\mining\minebot.dm" #include "code\modules\mining\money_bag.dm" #include "code\modules\mining\ores_coins.dm" #include "code\modules\mining\satchel_ore_boxdm.dm" @@ -4065,6 +4148,30 @@ #include "code\modules\mob\living\basic\festivus_pole.dm" #include "code\modules\mob\living\basic\health_adjustment.dm" #include "code\modules\mob\living\basic\tree.dm" +#include "code\modules\mob\living\basic\blob_minions\blob_ai.dm" +#include "code\modules\mob\living\basic\blob_minions\blob_mob.dm" +#include "code\modules\mob\living\basic\blob_minions\blob_spore.dm" +#include "code\modules\mob\living\basic\blob_minions\blob_zombie.dm" +#include "code\modules\mob\living\basic\blob_minions\blobbernaut.dm" +#include "code\modules\mob\living\basic\clown\clown.dm" +#include "code\modules\mob\living\basic\clown\clown_ai.dm" +#include "code\modules\mob\living\basic\cult\shade.dm" +#include "code\modules\mob\living\basic\cult\constructs\_construct.dm" +#include "code\modules\mob\living\basic\cult\constructs\artificer.dm" +#include "code\modules\mob\living\basic\cult\constructs\construct_ai.dm" +#include "code\modules\mob\living\basic\cult\constructs\harvester.dm" +#include "code\modules\mob\living\basic\cult\constructs\juggernaut.dm" +#include "code\modules\mob\living\basic\cult\constructs\proteon.dm" +#include "code\modules\mob\living\basic\cult\constructs\wraith.dm" +#include "code\modules\mob\living\basic\drone\_drone.dm" +#include "code\modules\mob\living\basic\drone\drone_say.dm" +#include "code\modules\mob\living\basic\drone\drone_tools.dm" +#include "code\modules\mob\living\basic\drone\drones_as_items.dm" +#include "code\modules\mob\living\basic\drone\extra_drone_types.dm" +#include "code\modules\mob\living\basic\drone\interaction.dm" +#include "code\modules\mob\living\basic\drone\inventory.dm" +#include "code\modules\mob\living\basic\drone\verbs.dm" +#include "code\modules\mob\living\basic\drone\visuals_icons.dm" #include "code\modules\mob\living\basic\farm_animals\deer.dm" #include "code\modules\mob\living\basic\farm_animals\pig.dm" #include "code\modules\mob\living\basic\farm_animals\rabbit.dm" @@ -4076,14 +4183,55 @@ #include "code\modules\mob\living\basic\farm_animals\cow\cow_ai.dm" #include "code\modules\mob\living\basic\farm_animals\cow\cow_moonicorn.dm" #include "code\modules\mob\living\basic\farm_animals\cow\cow_wisdom.dm" +#include "code\modules\mob\living\basic\farm_animals\goat\_goat.dm" +#include "code\modules\mob\living\basic\farm_animals\goat\goat_ai.dm" +#include "code\modules\mob\living\basic\farm_animals\goat\goat_subtypes.dm" +#include "code\modules\mob\living\basic\farm_animals\gorilla\gorilla.dm" +#include "code\modules\mob\living\basic\farm_animals\gorilla\gorilla_accessories.dm" +#include "code\modules\mob\living\basic\farm_animals\gorilla\gorilla_ai.dm" +#include "code\modules\mob\living\basic\farm_animals\gorilla\gorilla_emotes.dm" +#include "code\modules\mob\living\basic\guardian\guardian.dm" +#include "code\modules\mob\living\basic\guardian\guardian_creator.dm" +#include "code\modules\mob\living\basic\guardian\guardian_fluff.dm" +#include "code\modules\mob\living\basic\guardian\guardian_helpers.dm" +#include "code\modules\mob\living\basic\guardian\guardian_verbs.dm" +#include "code\modules\mob\living\basic\guardian\guardian_types\assassin.dm" +#include "code\modules\mob\living\basic\guardian\guardian_types\charger.dm" +#include "code\modules\mob\living\basic\guardian\guardian_types\dextrous.dm" +#include "code\modules\mob\living\basic\guardian\guardian_types\explosive.dm" +#include "code\modules\mob\living\basic\guardian\guardian_types\gaseous.dm" +#include "code\modules\mob\living\basic\guardian\guardian_types\gravitokinetic.dm" +#include "code\modules\mob\living\basic\guardian\guardian_types\lightning.dm" +#include "code\modules\mob\living\basic\guardian\guardian_types\protector.dm" +#include "code\modules\mob\living\basic\guardian\guardian_types\ranged.dm" +#include "code\modules\mob\living\basic\guardian\guardian_types\standard.dm" +#include "code\modules\mob\living\basic\guardian\guardian_types\support.dm" +#include "code\modules\mob\living\basic\heretic\_heretic_summon.dm" +#include "code\modules\mob\living\basic\heretic\ash_spirit.dm" #include "code\modules\mob\living\basic\heretic\fire_shark.dm" +#include "code\modules\mob\living\basic\heretic\flesh_stalker.dm" +#include "code\modules\mob\living\basic\heretic\flesh_worm.dm" +#include "code\modules\mob\living\basic\heretic\heretic_summon.dm" +#include "code\modules\mob\living\basic\heretic\maid_in_the_mirror.dm" +#include "code\modules\mob\living\basic\heretic\raw_prophet.dm" +#include "code\modules\mob\living\basic\heretic\rust_walker.dm" #include "code\modules\mob\living\basic\heretic\star_gazer.dm" +#include "code\modules\mob\living\basic\icemoon\ice_demon\ice_demon.dm" +#include "code\modules\mob\living\basic\icemoon\ice_demon\ice_demon_abilities.dm" +#include "code\modules\mob\living\basic\icemoon\ice_demon\ice_demon_ai.dm" #include "code\modules\mob\living\basic\icemoon\ice_whelp\ice_whelp.dm" #include "code\modules\mob\living\basic\icemoon\ice_whelp\ice_whelp_abilities.dm" #include "code\modules\mob\living\basic\icemoon\ice_whelp\ice_whelp_ai.dm" +#include "code\modules\mob\living\basic\icemoon\wolf\wolf.dm" +#include "code\modules\mob\living\basic\icemoon\wolf\wolf_ai.dm" +#include "code\modules\mob\living\basic\icemoon\wolf\wolf_extras.dm" +#include "code\modules\mob\living\basic\jungle\venus_human_trap.dm" #include "code\modules\mob\living\basic\jungle\mega_arachnid\mega_arachnid.dm" #include "code\modules\mob\living\basic\jungle\mega_arachnid\mega_arachnid_abilities.dm" #include "code\modules\mob\living\basic\jungle\mega_arachnid\mega_arachnid_ai.dm" +#include "code\modules\mob\living\basic\jungle\seedling\seedling.dm" +#include "code\modules\mob\living\basic\jungle\seedling\seedling_ai.dm" +#include "code\modules\mob\living\basic\jungle\seedling\seedling_projectiles.dm" #include "code\modules\mob\living\basic\lavaland\mining.dm" #include "code\modules\mob\living\basic\lavaland\basilisk\basilisk.dm" #include "code\modules\mob\living\basic\lavaland\basilisk\basilisk_overheat.dm" @@ -4093,6 +4241,10 @@ #include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_instrument.dm" #include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_loot.dm" #include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_vileworm.dm" +#include "code\modules\mob\living\basic\lavaland\brimdemon\brimbeam.dm" +#include "code\modules\mob\living\basic\lavaland\brimdemon\brimdemon.dm" +#include "code\modules\mob\living\basic\lavaland\brimdemon\brimdemon_ai.dm" +#include "code\modules\mob\living\basic\lavaland\brimdemon\brimdemon_loot.dm" #include "code\modules\mob\living\basic\lavaland\goldgrub\goldgrub.dm" #include "code\modules\mob\living\basic\lavaland\goldgrub\goldgrub_abilities.dm" #include "code\modules\mob\living\basic\lavaland\goldgrub\goldgrub_ai.dm" @@ -4101,22 +4253,56 @@ #include "code\modules\mob\living\basic\lavaland\goliath\goliath_ai.dm" #include "code\modules\mob\living\basic\lavaland\goliath\goliath_trophy.dm" #include "code\modules\mob\living\basic\lavaland\goliath\tentacle.dm" +#include "code\modules\mob\living\basic\lavaland\gutlunchers\gutluncher_foodtrough.dm" +#include "code\modules\mob\living\basic\lavaland\gutlunchers\gutlunchers.dm" +#include "code\modules\mob\living\basic\lavaland\gutlunchers\gutlunchers_ai.dm" +#include "code\modules\mob\living\basic\lavaland\gutlunchers\gutlunchers_inherit_datum.dm" +#include "code\modules\mob\living\basic\lavaland\hivelord\hivelord.dm" +#include "code\modules\mob\living\basic\lavaland\hivelord\hivelord_ai.dm" +#include "code\modules\mob\living\basic\lavaland\hivelord\spawn_hivelord_brood.dm" +#include "code\modules\mob\living\basic\lavaland\legion\legion.dm" +#include "code\modules\mob\living\basic\lavaland\legion\legion_ai.dm" +#include "code\modules\mob\living\basic\lavaland\legion\legion_brood.dm" +#include "code\modules\mob\living\basic\lavaland\legion\legion_tumour.dm" +#include "code\modules\mob\living\basic\lavaland\legion\spawn_legions.dm" #include "code\modules\mob\living\basic\lavaland\lobstrosity\lobstrosity.dm" #include "code\modules\mob\living\basic\lavaland\lobstrosity\lobstrosity_ai.dm" #include "code\modules\mob\living\basic\lavaland\lobstrosity\lobstrosity_trophy.dm" +#include "code\modules\mob\living\basic\lavaland\mook\mook.dm" +#include "code\modules\mob\living\basic\lavaland\mook\mook_abilities.dm" +#include "code\modules\mob\living\basic\lavaland\mook\mook_ai.dm" +#include "code\modules\mob\living\basic\lavaland\mook\mook_village.dm" #include "code\modules\mob\living\basic\lavaland\watcher\watcher.dm" #include "code\modules\mob\living\basic\lavaland\watcher\watcher_ai.dm" #include "code\modules\mob\living\basic\lavaland\watcher\watcher_gaze.dm" #include "code\modules\mob\living\basic\lavaland\watcher\watcher_overwatch.dm" #include "code\modules\mob\living\basic\lavaland\watcher\watcher_projectiles.dm" +#include "code\modules\mob\living\basic\minebots\minebot.dm" +#include "code\modules\mob\living\basic\minebots\minebot_abilities.dm" +#include "code\modules\mob\living\basic\minebots\minebot_ai.dm" +#include "code\modules\mob\living\basic\minebots\minebot_upgrades.dm" #include "code\modules\mob\living\basic\pets\fox.dm" #include "code\modules\mob\living\basic\pets\penguin.dm" #include "code\modules\mob\living\basic\pets\pet.dm" +#include "code\modules\mob\living\basic\pets\sloth.dm" #include "code\modules\mob\living\basic\pets\dog\_dog.dm" #include "code\modules\mob\living\basic\pets\dog\corgi.dm" #include "code\modules\mob\living\basic\pets\dog\dog_subtypes.dm" #include "code\modules\mob\living\basic\pets\dog\strippable_items.dm" +#include "code\modules\mob\living\basic\pets\parrot\_parrot.dm" +#include "code\modules\mob\living\basic\pets\parrot\parrot_items.dm" +#include "code\modules\mob\living\basic\pets\parrot\parrot_subtypes.dm" +#include "code\modules\mob\living\basic\pets\parrot\poly.dm" +#include "code\modules\mob\living\basic\pets\parrot\parrot_ai\_parrot_controller.dm" +#include "code\modules\mob\living\basic\pets\parrot\parrot_ai\ghost_parrot_controller.dm" +#include "code\modules\mob\living\basic\pets\parrot\parrot_ai\parrot_hoarding.dm" +#include "code\modules\mob\living\basic\pets\parrot\parrot_ai\parrot_perching.dm" +#include "code\modules\mob\living\basic\pets\parrot\parrot_ai\parroting_action.dm" +#include "code\modules\mob\living\basic\ruin_defender\skeleton.dm" #include "code\modules\mob\living\basic\ruin_defender\stickman.dm" +#include "code\modules\mob\living\basic\ruin_defender\wizard\wizard.dm" +#include "code\modules\mob\living\basic\ruin_defender\wizard\wizard_ai.dm" +#include "code\modules\mob\living\basic\ruin_defender\wizard\wizard_spells.dm" #include "code\modules\mob\living\basic\space_fauna\ant.dm" #include "code\modules\mob\living\basic\space_fauna\cat_surgeon.dm" #include "code\modules\mob\living\basic\space_fauna\faithless.dm" @@ -4127,7 +4313,9 @@ #include "code\modules\mob\living\basic\space_fauna\lightgeist.dm" #include "code\modules\mob\living\basic\space_fauna\morph.dm" #include "code\modules\mob\living\basic\space_fauna\mushroom.dm" +#include "code\modules\mob\living\basic\space_fauna\robot_customer.dm" #include "code\modules\mob\living\basic\space_fauna\spaceman.dm" +#include "code\modules\mob\living\basic\space_fauna\supermatter_spider.dm" #include "code\modules\mob\living\basic\space_fauna\bear\_bear.dm" #include "code\modules\mob\living\basic\space_fauna\bear\bear_ai_behavior.dm" #include "code\modules\mob\living\basic\space_fauna\bear\bear_ai_subtree.dm" @@ -4162,6 +4350,17 @@ #include "code\modules\mob\living\basic\space_fauna\regal_rat\regal_rat.dm" #include "code\modules\mob\living\basic\space_fauna\regal_rat\regal_rat_actions.dm" #include "code\modules\mob\living\basic\space_fauna\regal_rat\regal_rat_ai.dm" +#include "code\modules\mob\living\basic\space_fauna\revenant\_revenant.dm" +#include "code\modules\mob\living\basic\space_fauna\revenant\revenant_abilities.dm" +#include "code\modules\mob\living\basic\space_fauna\revenant\revenant_effects.dm" +#include "code\modules\mob\living\basic\space_fauna\revenant\revenant_harvest.dm" +#include "code\modules\mob\living\basic\space_fauna\revenant\revenant_items.dm" +#include "code\modules\mob\living\basic\space_fauna\revenant\revenant_objectives.dm" +#include "code\modules\mob\living\basic\space_fauna\snake\snake.dm" +#include "code\modules\mob\living\basic\space_fauna\snake\snake_ai.dm" +#include "code\modules\mob\living\basic\space_fauna\space_dragon\dragon_breath.dm" +#include "code\modules\mob\living\basic\space_fauna\space_dragon\dragon_gust.dm" +#include "code\modules\mob\living\basic\space_fauna\space_dragon\space_dragon.dm" #include "code\modules\mob\living\basic\space_fauna\spider\spider.dm" #include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spider_ai.dm" #include "code\modules\mob\living\basic\space_fauna\spider\giant_spider\giant_spiders.dm" @@ -4179,9 +4378,16 @@ #include "code\modules\mob\living\basic\space_fauna\wumborian_fugu\inflation.dm" #include "code\modules\mob\living\basic\space_fauna\wumborian_fugu\wumborian_ai.dm" #include "code\modules\mob\living\basic\space_fauna\wumborian_fugu\wumborian_fugu.dm" -#include "code\modules\mob\living\basic\syndicate\russian.dm" -#include "code\modules\mob\living\basic\syndicate\syndicate.dm" -#include "code\modules\mob\living\basic\syndicate\syndicate_ai.dm" +#include "code\modules\mob\living\basic\trader\trader.dm" +#include "code\modules\mob\living\basic\trader\trader_actions.dm" +#include "code\modules\mob\living\basic\trader\trader_ai.dm" +#include "code\modules\mob\living\basic\trader\trader_data.dm" +#include "code\modules\mob\living\basic\trader\trader_items.dm" +#include "code\modules\mob\living\basic\trooper\nanotrasen.dm" +#include "code\modules\mob\living\basic\trooper\russian.dm" +#include "code\modules\mob\living\basic\trooper\syndicate.dm" +#include "code\modules\mob\living\basic\trooper\trooper.dm" +#include "code\modules\mob\living\basic\trooper\trooper_ai.dm" #include "code\modules\mob\living\basic\vermin\axolotl.dm" #include "code\modules\mob\living\basic\vermin\butterfly.dm" #include "code\modules\mob\living\basic\vermin\cockroach.dm" @@ -4249,7 +4455,7 @@ #include "code\modules\mob\living\carbon\alien\larva\powers.dm" #include "code\modules\mob\living\carbon\alien\special\alien_embryo.dm" #include "code\modules\mob\living\carbon\alien\special\facehugger.dm" -#include "code\modules\mob\living\carbon\human\damage_procs.dm" +#include "code\modules\mob\living\carbon\human\_species.dm" #include "code\modules\mob\living\carbon\human\death.dm" #include "code\modules\mob\living\carbon\human\dummy.dm" #include "code\modules\mob\living\carbon\human\emote.dm" @@ -4269,7 +4475,6 @@ #include "code\modules\mob\living\carbon\human\life.dm" #include "code\modules\mob\living\carbon\human\login.dm" #include "code\modules\mob\living\carbon\human\physiology.dm" -#include "code\modules\mob\living\carbon\human\species.dm" #include "code\modules\mob\living\carbon\human\status_procs.dm" #include "code\modules\mob\living\carbon\human\suicides.dm" #include "code\modules\mob\living\carbon\human\monkey\monkey.dm" @@ -4334,9 +4539,6 @@ #include "code\modules\mob\living\silicon\robot\robot_say.dm" #include "code\modules\mob\living\simple_animal\animal_defense.dm" #include "code\modules\mob\living\simple_animal\damage_procs.dm" -#include "code\modules\mob\living\simple_animal\parrot.dm" -#include "code\modules\mob\living\simple_animal\revenant.dm" -#include "code\modules\mob\living\simple_animal\shade.dm" #include "code\modules\mob\living\simple_animal\simple_animal.dm" #include "code\modules\mob\living\simple_animal\bot\bot.dm" #include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" @@ -4352,65 +4554,19 @@ #include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm" #include "code\modules\mob\living\simple_animal\bot\vibebot.dm" #include "code\modules\mob\living\simple_animal\friendly\cat.dm" -#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" #include "code\modules\mob\living\simple_animal\friendly\gondola.dm" #include "code\modules\mob\living\simple_animal\friendly\pet.dm" -#include "code\modules\mob\living\simple_animal\friendly\robot_customer.dm" -#include "code\modules\mob\living\simple_animal\friendly\sloth.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\_drone.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\drone_say.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\drone_tools.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\drones_as_items.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\extra_drone_types.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\interaction.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\inventory.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\verbs.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\visuals_icons.dm" -#include "code\modules\mob\living\simple_animal\guardian\guardian.dm" -#include "code\modules\mob\living\simple_animal\guardian\guardian_creator.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\assassin.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\charger.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\dextrous.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\explosive.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\gaseous.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\gravitokinetic.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\lightning.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\protector.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\ranged.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\standard.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\support.dm" #include "code\modules\mob\living\simple_animal\hostile\alien.dm" -#include "code\modules\mob\living\simple_animal\hostile\blob.dm" -#include "code\modules\mob\living\simple_animal\hostile\blobbernaut.dm" -#include "code\modules\mob\living\simple_animal\hostile\blobspore.dm" #include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm" -#include "code\modules\mob\living\simple_animal\hostile\heretic_monsters.dm" #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" #include "code\modules\mob\living\simple_animal\hostile\illusion.dm" #include "code\modules\mob\living\simple_animal\hostile\mimic.dm" -#include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm" #include "code\modules\mob\living\simple_animal\hostile\ooze.dm" #include "code\modules\mob\living\simple_animal\hostile\pirate.dm" -#include "code\modules\mob\living\simple_animal\hostile\skeleton.dm" -#include "code\modules\mob\living\simple_animal\hostile\smspider.dm" -#include "code\modules\mob\living\simple_animal\hostile\space_dragon.dm" #include "code\modules\mob\living\simple_animal\hostile\vatbeast.dm" -#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm" -#include "code\modules\mob\living\simple_animal\hostile\wizard.dm" #include "code\modules\mob\living\simple_animal\hostile\zombie.dm" -#include "code\modules\mob\living\simple_animal\hostile\bosses\boss.dm" -#include "code\modules\mob\living\simple_animal\hostile\constructs\artificer.dm" -#include "code\modules\mob\living\simple_animal\hostile\constructs\constructs.dm" -#include "code\modules\mob\living\simple_animal\hostile\constructs\harvester.dm" -#include "code\modules\mob\living\simple_animal\hostile\constructs\juggernaut.dm" -#include "code\modules\mob\living\simple_animal\hostile\constructs\wraith.dm" -#include "code\modules\mob\living\simple_animal\hostile\gorilla\emotes.dm" -#include "code\modules\mob\living\simple_animal\hostile\gorilla\gorilla.dm" -#include "code\modules\mob\living\simple_animal\hostile\gorilla\visuals_icons.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\leaper.dm" -#include "code\modules\mob\living\simple_animal\hostile\jungle\mook.dm" -#include "code\modules\mob\living\simple_animal\hostile\jungle\seedling.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\_megafauna.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm" @@ -4421,11 +4577,7 @@ #include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\wendigo.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\brimdemon.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\curse_blob.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_demon.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\polarbear.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\wolf.dm" @@ -4434,11 +4586,8 @@ #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\herald.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\legionnaire.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\pandora.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\goose.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\snake.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\trader.dm" #include "code\modules\mob\living\simple_animal\slime\death.dm" #include "code\modules\mob\living\simple_animal\slime\emote.dm" #include "code\modules\mob\living\simple_animal\slime\life.dm" @@ -4893,7 +5042,6 @@ #include "code\modules\requests\request_manager.dm" #include "code\modules\research\designs.dm" #include "code\modules\research\destructive_analyzer.dm" -#include "code\modules\research\experimentor.dm" #include "code\modules\research\rdconsole.dm" #include "code\modules\research\rdmachines.dm" #include "code\modules\research\research_disk.dm" @@ -5138,6 +5286,7 @@ #include "code\modules\surgery\advanced\bioware\nerve_splicing.dm" #include "code\modules\surgery\advanced\bioware\vein_threading.dm" #include "code\modules\surgery\bodyparts\_bodyparts.dm" +#include "code\modules\surgery\bodyparts\digitigrade.dm" #include "code\modules\surgery\bodyparts\dismemberment.dm" #include "code\modules\surgery\bodyparts\hair.dm" #include "code\modules\surgery\bodyparts\head.dm" @@ -5462,8 +5611,8 @@ #include "interface\skin.dmf" #include "monkestation\code\__DEFINES\projectile.dm" #include "monkestation\code\__HELPERS\_lists.dm" -#include "monkestation\code\__HELPERS\mobs.dm" #include "monkestation\code\__HELPERS\reagents.dm" +#include "monkestation\code\__HELPERS\turfs.dm" #include "monkestation\code\_onclick\hud\alert.dm" #include "monkestation\code\datums\action.dm" #include "monkestation\code\datums\antag_tokens.dm" @@ -5471,10 +5620,12 @@ #include "monkestation\code\datums\interaction_particle.dm" #include "monkestation\code\datums\patreon_data.dm" #include "monkestation\code\datums\stamina_container.dm" +#include "monkestation\code\datums\twitch_data.dm" #include "monkestation\code\datums\ai\idle_behaviors\idle_dukeman.dm" #include "monkestation\code\datums\ai\monkey\dukeman_controller.dm" #include "monkestation\code\datums\ai_laws\laws_monke.dm" #include "monkestation\code\datums\announcers\duke.dm" +#include "monkestation\code\datums\brain_damage\magic.dm" #include "monkestation\code\datums\components\carbon_sprint.dm" #include "monkestation\code\datums\components\multi_hit.dm" #include "monkestation\code\datums\components\throw_bounce.dm" @@ -5503,10 +5654,12 @@ #include "monkestation\code\game\machinery\trains\train_head.dm" #include "monkestation\code\game\machinery\trains\train_network.dm" #include "monkestation\code\game\objects\effects\countdown.dm" +#include "monkestation\code\game\objects\effects\landmark.dm" #include "monkestation\code\game\objects\effects\sprint_dust.dm" #include "monkestation\code\game\objects\effects\anomalies\anomalies_dimensional_themes.dm" #include "monkestation\code\game\objects\effects\random\ai_module.dm" #include "monkestation\code\game\objects\effects\spawners\roomspawner.dm" +#include "monkestation\code\game\objects\effects\spawners\random\fishing.dm" #include "monkestation\code\game\objects\items\choice_beacon.dm" #include "monkestation\code\game\objects\items\cirno_plush.dm" #include "monkestation\code\game\objects\items\gravity_gun.dm" @@ -5530,15 +5683,21 @@ #include "monkestation\code\game\objects\items\effects\washing_machine.dm" #include "monkestation\code\game\objects\items\food\spaghetti.dm" #include "monkestation\code\game\objects\items\grenades\monkey_barrel.dm" +#include "monkestation\code\game\objects\items\guns\crank_guns.dm" #include "monkestation\code\game\objects\items\guns\shotguns.dm" #include "monkestation\code\game\objects\items\guns\SRN.dm" +#include "monkestation\code\game\objects\items\guns\wt_ammo.dm" #include "monkestation\code\game\objects\items\implants\hardlight.dm" #include "monkestation\code\game\objects\items\objects\items\robot\robot_upgrades.dm" #include "monkestation\code\game\objects\items\storage\book.dm" #include "monkestation\code\game\objects\items\storage\boxes.dm" #include "monkestation\code\game\objects\items\storage\uplink_kits.dm" +#include "monkestation\code\game\turfs\open\water.dm" #include "monkestation\code\modules\admin\antag_tokens.dm" #include "monkestation\code\modules\admin\camera_view.dm" +#include "monkestation\code\modules\admin\ggg\where_are_your_fingers.dm" +#include "monkestation\code\modules\admin\smites\dagothkillsmite.dm" +#include "monkestation\code\modules\admin\smites\dagothstripsmite.dm" #include "monkestation\code\modules\aesthetics\airlock\airlock.dm" #include "monkestation\code\modules\aesthetics\items\clothing.dm" #include "monkestation\code\modules\aesthetics\mapping\tilecoloring.dm" @@ -5657,20 +5816,85 @@ #include "monkestation\code\modules\antagonists\florida_man\florida_events.dm" #include "monkestation\code\modules\antagonists\florida_man\florida_spells.dm" #include "monkestation\code\modules\antagonists\florida_man\supplypods.dm" -#include "monkestation\code\modules\antagonists\uplink_items\bundles.dm" -#include "monkestation\code\modules\antagonists\uplink_items\misc.dm" -#include "monkestation\code\modules\antagonists\uplink_items\species.dm" -#include "monkestation\code\modules\antagonists\uplink_items\weapons.dm" +#include "monkestation\code\modules\antagonists\slasher\__base_slasher_additions.dm" +#include "monkestation\code\modules\antagonists\slasher\ghost_role.dm" +#include "monkestation\code\modules\antagonists\slasher\slasher_datum.dm" +#include "monkestation\code\modules\antagonists\slasher\slasher_punishment.dm" +#include "monkestation\code\modules\antagonists\slasher\abilities\_slasher_base.dm" +#include "monkestation\code\modules\antagonists\slasher\abilities\blood_walk.dm" +#include "monkestation\code\modules\antagonists\slasher\abilities\incorporealize.dm" +#include "monkestation\code\modules\antagonists\slasher\abilities\recall_machette.dm" +#include "monkestation\code\modules\antagonists\slasher\abilities\slasher_regenerate.dm" +#include "monkestation\code\modules\antagonists\slasher\abilities\soul_steal.dm" +#include "monkestation\code\modules\antagonists\slasher\abilities\stalk_target.dm" +#include "monkestation\code\modules\antagonists\slasher\abilities\terror_screech.dm" +#include "monkestation\code\modules\antagonists\slasher\components\team_monitor.dm" +#include "monkestation\code\modules\antagonists\slasher\slasher_outfit\slasher_footwear.dm" +#include "monkestation\code\modules\antagonists\slasher\slasher_outfit\slasher_headgear.dm" +#include "monkestation\code\modules\antagonists\slasher\slasher_outfit\slasher_middlewear.dm" +#include "monkestation\code\modules\antagonists\traitor\uplink_handler.dm" +#include "monkestation\code\modules\antagonists\traitor\objectives\tide_bug_department.dm" +#include "monkestation\code\modules\antagonists\traitor\objectives\final_objective\become_wizard.dm" #include "monkestation\code\modules\antagonists\wizard\equipment\artefact.dm" #include "monkestation\code\modules\antagonists\wizard\equipment\spellbook_entries\defensive.dm" #include "monkestation\code\modules\antagonists\wizard\equipment\spellbook_entries\mobility.dm" #include "monkestation\code\modules\antagonists\wizard\equipment\spellbook_entries\offensive.dm" #include "monkestation\code\modules\antagonists\wizard\equipment\spellbook_entries\summons.dm" +#include "monkestation\code\modules\antagonists\wizard\grand_ritual\grand_rune.dm" #include "monkestation\code\modules\antimatter\code\containment_jar.dm" #include "monkestation\code\modules\antimatter\code\control.dm" #include "monkestation\code\modules\antimatter\code\shielding.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_origins.dm" +#include "monkestation\code\modules\art_sci_overrides\generic_artifact_objects.dm" +#include "monkestation\code\modules\art_sci_overrides\globals.dm" +#include "monkestation\code\modules\art_sci_overrides\item_stimuli.dm" +#include "monkestation\code\modules\art_sci_overrides\new_procs.dm" +#include "monkestation\code\modules\art_sci_overrides\activators\_base.dm" +#include "monkestation\code\modules\art_sci_overrides\activators\range.dm" +#include "monkestation\code\modules\art_sci_overrides\activators\touch.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_components\_base_component.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_components\_base_component_signal_procs.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_components\_base_subtype_helpers.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_components\bomb.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_components\bonk.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_components\borger.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_components\cell.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_components\forcegen.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_components\gun.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_components\heal.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_components\injector.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_components\lamp.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_components\melee.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_components\repulsor.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_components\vomit.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_items\artifact_cell.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_items\artifact_gun.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_items\artifact_melee.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_objects\artifact_powergen.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_testers\analysis_form.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_testers\heater.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_testers\xray.dm" +#include "monkestation\code\modules\art_sci_overrides\artifact_testers\zapper.dm" +#include "monkestation\code\modules\art_sci_overrides\asteroids\areas.dm" +#include "monkestation\code\modules\art_sci_overrides\asteroids\asteroid_generation.dm" +#include "monkestation\code\modules\art_sci_overrides\asteroids\asteroid_magnet.dm" +#include "monkestation\code\modules\art_sci_overrides\asteroids\asteroid_template.dm" +#include "monkestation\code\modules\art_sci_overrides\asteroids\cartesian_plane.dm" +#include "monkestation\code\modules\art_sci_overrides\asteroids\simple_asteroid.dm" +#include "monkestation\code\modules\art_sci_overrides\faults\_fault.dm" +#include "monkestation\code\modules\art_sci_overrides\faults\explosion.dm" +#include "monkestation\code\modules\art_sci_overrides\faults\ignite.dm" +#include "monkestation\code\modules\art_sci_overrides\faults\just_death.dm" +#include "monkestation\code\modules\art_sci_overrides\faults\reagents.dm" +#include "monkestation\code\modules\art_sci_overrides\faults\say.dm" +#include "monkestation\code\modules\art_sci_overrides\faults\size_change.dm" +#include "monkestation\code\modules\art_sci_overrides\faults\warps.dm" +#include "monkestation\code\modules\art_sci_overrides\faults\whispers.dm" +#include "monkestation\code\modules\art_sci_overrides\faults\zap.dm" #include "monkestation\code\modules\ballpit\ballbit_sink.dm" #include "monkestation\code\modules\ballpit\ballpit.dm" +#include "monkestation\code\modules\bitrunners\code\ability_disks.dm" +#include "monkestation\code\modules\bitrunners\code\combat_gear_disks.dm" #include "monkestation\code\modules\bloodsuckers\bloodsucker_assets.dm" #include "monkestation\code\modules\bloodsuckers\bloodsucker\bloodsucker_conversion.dm" #include "monkestation\code\modules\bloodsuckers\bloodsucker\bloodsucker_datum.dm" @@ -5754,6 +5978,7 @@ #include "monkestation\code\modules\cargo\crates\science.dm" #include "monkestation\code\modules\cargo\crates\security.dm" #include "monkestation\code\modules\cargo\crates\service.dm" +#include "monkestation\code\modules\cargo\markets\market_items.dm" #include "monkestation\code\modules\cargoborg\code\cargo_module.dm" #include "monkestation\code\modules\cargoborg\code\cargo_teleporter.dm" #include "monkestation\code\modules\cargoborg\code\cargoborg_items.dm" @@ -5787,6 +6012,7 @@ #include "monkestation\code\modules\client\preferences\alt_jobs\_job.dm" #include "monkestation\code\modules\client\preferences\alt_jobs\titles.dm" #include "monkestation\code\modules\client\preferences\species_features\arachnid.dm" +#include "monkestation\code\modules\client\preferences\species_features\floran.dm" #include "monkestation\code\modules\client\preferences\species_features\goblin.dm" #include "monkestation\code\modules\client\preferences\species_features\ipc.dm" #include "monkestation\code\modules\client\preferences\species_features\secondary_mut_color.dm" @@ -5795,8 +6021,10 @@ #include "monkestation\code\modules\clothing\gloves\gloves.dm" #include "monkestation\code\modules\clothing\head\costume.dm" #include "monkestation\code\modules\clothing\head\misc.dm" +#include "monkestation\code\modules\clothing\masks\gasmask.dm" #include "monkestation\code\modules\clothing\masks\misc.dm" #include "monkestation\code\modules\clothing\neck\cloaks.dm" +#include "monkestation\code\modules\clothing\shoes\clown.dm" #include "monkestation\code\modules\clothing\shoes\shoe.dm" #include "monkestation\code\modules\clothing\spacesuits\hardsuits\_armor.dm" #include "monkestation\code\modules\clothing\spacesuits\hardsuits\_hardsuit.dm" @@ -5807,6 +6035,7 @@ #include "monkestation\code\modules\clothing\spacesuits\hardsuits\science.dm" #include "monkestation\code\modules\clothing\spacesuits\hardsuits\security.dm" #include "monkestation\code\modules\clothing\suits\coats.dm" +#include "monkestation\code\modules\clothing\suits\costume.dm" #include "monkestation\code\modules\clothing\suits\toggles.dm" #include "monkestation\code\modules\clothing\under\costume.dm" #include "monkestation\code\modules\clothing\under\undersuit.dm" @@ -5845,13 +6074,16 @@ #include "monkestation\code\modules\donator\code\datum\loadout.dm" #include "monkestation\code\modules\donator\code\item\choice_beacon.dm" #include "monkestation\code\modules\donator\code\item\clothing.dm" +#include "monkestation\code\modules\donator\code\item\effects.dm" #include "monkestation\code\modules\donator\code\item\plush.dm" #include "monkestation\code\modules\donator\code\mob\pets.dm" #include "monkestation\code\modules\events\wizard\summon_gifts.dm" #include "monkestation\code\modules\food_and_drinks\recipes\boiling.dm" #include "monkestation\code\modules\ghost_players\area_changes.dm" +#include "monkestation\code\modules\ghost_players\centcom_teleporter.dm" #include "monkestation\code\modules\ghost_players\ghost_player.dm" #include "monkestation\code\modules\ghost_players\arena\arena_cleanser.dm" +#include "monkestation\code\modules\ghost_players\arena\arena_items.dm" #include "monkestation\code\modules\ghost_players\arena\fight_button.dm" #include "monkestation\code\modules\ghost_players\arena\map_templates.dm" #include "monkestation\code\modules\ghost_players\arena\arena_assets\alien.dm" @@ -5861,16 +6093,19 @@ #include "monkestation\code\modules\ghost_players\arena\arena_assets\fish.dm" #include "monkestation\code\modules\ghost_players\arena\arena_assets\statues.dm" #include "monkestation\code\modules\ghost_players\arena\arena_assets\water.dm" +#include "monkestation\code\modules\ghost_players\job_helpers\_centcom_item_spawner.dm" +#include "monkestation\code\modules\ghost_players\job_helpers\firing_range_helper.dm" #include "monkestation\code\modules\ghost_players\job_helpers\food_machine.dm" #include "monkestation\code\modules\ghost_players\job_helpers\hydroponics_helper.dm" #include "monkestation\code\modules\ghost_players\job_helpers\injured_spawner.dm" #include "monkestation\code\modules\ghost_players\job_helpers\organ_printer.dm" +#include "monkestation\code\modules\goonimizations\goon_keybinds.dm" +#include "monkestation\code\modules\goonimizations\shuttle_votes.dm" #include "monkestation\code\modules\hydroponics\botanical_lexicon.dm" #include "monkestation\code\modules\hydroponics\plant_genes.dm" #include "monkestation\code\modules\hydroponics\seeds.dm" #include "monkestation\code\modules\hydroponics\grown\coconut.dm" #include "monkestation\code\modules\hydroponics\machines\composter.dm" -#include "monkestation\code\modules\hydroponics\machines\infuser.dm" #include "monkestation\code\modules\hydroponics\machines\splicer.dm" #include "monkestation\code\modules\hydroponics\mutations\_mutations.dm" #include "monkestation\code\modules\hydroponics\mutations\base.dm" @@ -5881,6 +6116,13 @@ #include "monkestation\code\modules\job_xp\milestones\botany_milestones.dm" #include "monkestation\code\modules\job_xp\preferences\base_preferences.dm" #include "monkestation\code\modules\job_xp\preferences\xp_handlers.dm" +#include "monkestation\code\modules\jobs\job_types\candysalesman.dm" +#include "monkestation\code\modules\jobs\job_types\dietwizard.dm" +#include "monkestation\code\modules\jobs\job_types\ghost.dm" +#include "monkestation\code\modules\jobs\job_types\godzilla.dm" +#include "monkestation\code\modules\jobs\job_types\gorilla.dm" +#include "monkestation\code\modules\jobs\job_types\skeleton.dm" +#include "monkestation\code\modules\jobs\job_types\yellowclown.dm" #include "monkestation\code\modules\liquids\drains.dm" #include "monkestation\code\modules\liquids\height_floors.dm" #include "monkestation\code\modules\liquids\liquid_controller.dm" @@ -5917,6 +6159,10 @@ #include "monkestation\code\modules\loadouts\items\toys.dm" #include "monkestation\code\modules\loadouts\items\under\donator.dm" #include "monkestation\code\modules\loadouts\items\under\under.dm" +#include "monkestation\code\modules\loafing\code\loaf.dm" +#include "monkestation\code\modules\loafing\code\loafer.dm" +#include "monkestation\code\modules\mapping\access_helpers.dm" +#include "monkestation\code\modules\mapping\mapping_helpers.dm" #include "monkestation\code\modules\maptext\maptext_image_helper.dm" #include "monkestation\code\modules\mech_comp\_interface.dm" #include "monkestation\code\modules\mech_comp\_message.dm" @@ -5979,6 +6225,7 @@ #include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\arachnid_appendages.dm" #include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\arachnid_chelicerae.dm" #include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\clockwork_sprites.dm" +#include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\floran_leaves.dm" #include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\goblin_accessories.dm" #include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\hair.dm" #include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\ipc_antenna.dm" @@ -5990,6 +6237,8 @@ #include "monkestation\code\modules\mob\living\living_defines.dm" #include "monkestation\code\modules\mob\living\status_procs.dm" #include "monkestation\code\modules\mob\living\basic\animatronic.dm" +#include "monkestation\code\modules\mob\living\basic\ggg\glerm.dm" +#include "monkestation\code\modules\mob\living\basic\ggg\susflash.dm" #include "monkestation\code\modules\mob\living\basic\space_fauna\fugu_gland.dm" #include "monkestation\code\modules\mob\living\basic\vermin\mouse.dm" #include "monkestation\code\modules\mob\living\carbon\carbon_defense.dm" @@ -6001,6 +6250,7 @@ #include "monkestation\code\modules\mob\living\carbon\human\emotes.dm" #include "monkestation\code\modules\mob\living\carbon\human\human.dm" #include "monkestation\code\modules\mob\living\carbon\human\human_defines.dm" +#include "monkestation\code\modules\mob\living\carbon\human\lizard_gags.dm" #include "monkestation\code\modules\mob\living\carbon\human\simian_gags.dm" #include "monkestation\code\modules\mob\living\carbon\human\species.dm" #include "monkestation\code\modules\mob\living\carbon\human\worn_overlays.dm" @@ -6010,6 +6260,7 @@ #include "monkestation\code\modules\mob\living\carbon\human\species_type\arachnid.dm" #include "monkestation\code\modules\mob\living\carbon\human\species_type\dullahan.dm" #include "monkestation\code\modules\mob\living\carbon\human\species_type\ethereal.dm" +#include "monkestation\code\modules\mob\living\carbon\human\species_type\floran.dm" #include "monkestation\code\modules\mob\living\carbon\human\species_type\flypeople.dm" #include "monkestation\code\modules\mob\living\carbon\human\species_type\goblin.dm" #include "monkestation\code\modules\mob\living\carbon\human\species_type\golems.dm" @@ -6026,8 +6277,16 @@ #include "monkestation\code\modules\mob\living\carbon\human\species_type\simian.dm" #include "monkestation\code\modules\mob\living\carbon\human\species_type\skeletons.dm" #include "monkestation\code\modules\mob\living\carbon\human\species_type\zombies.dm" +#include "monkestation\code\modules\mob\living\simple_animal\megafauna\wendigo.dm" #include "monkestation\code\modules\mob\living\simple_animal\pets\bees.dm" #include "monkestation\code\modules\mob\living\simple_animal\pets\honk_platinum.dm" +#include "monkestation\code\modules\modular_bartending\modglass.dm" +#include "monkestation\code\modules\modular_bartending\garnishes\crafting_recipes.dm" +#include "monkestation\code\modules\modular_bartending\garnishes\garnish_items.dm" +#include "monkestation\code\modules\modular_bartending\garnishes\grown_cuts.dm" +#include "monkestation\code\modules\modular_bartending\item_modifications\attack_additions.dm" +#include "monkestation\code\modules\modular_bartending\item_modifications\reagent_modification.dm" +#include "monkestation\code\modules\modular_bartending\reactions\food_reactions.dm" #include "monkestation\code\modules\ocean_content\department_consoles\engineering.dm" #include "monkestation\code\modules\ocean_content\fluff\barrier.dm" #include "monkestation\code\modules\ocean_content\fluff\base_turf_editor.dm" @@ -6070,7 +6329,6 @@ #include "monkestation\code\modules\pissing\bladder.dm" #include "monkestation\code\modules\pissing\emote.dm" #include "monkestation\code\modules\pissing\piss_effect.dm" -#include "monkestation\code\modules\pissing\piss_virus.dm" #include "monkestation\code\modules\pollution\generic_pollutants.dm" #include "monkestation\code\modules\pollution\generic_turf_pollutions.dm" #include "monkestation\code\modules\pollution\pollutant_datum.dm" @@ -6149,7 +6407,9 @@ #include "monkestation\code\modules\ranching\mutations\tier1.dm" #include "monkestation\code\modules\ranching\mutations\tier2.dm" #include "monkestation\code\modules\ranching\mutations\tier3.dm" +#include "monkestation\code\modules\random_rooms\showcase_map_modules.dm" #include "monkestation\code\modules\random_rooms\bars\icebox_bar_modules.dm" +#include "monkestation\code\modules\random_rooms\bars\tram_bar_modules.dm" #include "monkestation\code\modules\reagents\_reagents.dm" #include "monkestation\code\modules\reagents\containers.dm" #include "monkestation\code\modules\reagents\reagent_containers.dm" @@ -6230,13 +6490,42 @@ #include "monkestation\code\modules\store\store_items\suits.dm" #include "monkestation\code\modules\store\store_items\toys.dm" #include "monkestation\code\modules\store\store_items\under.dm" +#include "monkestation\code\modules\storytellers\config.dm" +#include "monkestation\code\modules\storytellers\gamemode_subsystem.dm" +#include "monkestation\code\modules\storytellers\scheduled_events.dm" +#include "monkestation\code\modules\storytellers\converted_events\_base_event.dm" +#include "monkestation\code\modules\storytellers\converted_events\event_overrides.dm" +#include "monkestation\code\modules\storytellers\converted_events\solo\bloodcult.dm" +#include "monkestation\code\modules\storytellers\converted_events\solo\bloodsuckers.dm" +#include "monkestation\code\modules\storytellers\converted_events\solo\changeling.dm" +#include "monkestation\code\modules\storytellers\converted_events\solo\clockwork_cult.dm" +#include "monkestation\code\modules\storytellers\converted_events\solo\clown_operative.dm" +#include "monkestation\code\modules\storytellers\converted_events\solo\heretic.dm" +#include "monkestation\code\modules\storytellers\converted_events\solo\malf.dm" +#include "monkestation\code\modules\storytellers\converted_events\solo\nuclear_operative.dm" +#include "monkestation\code\modules\storytellers\converted_events\solo\obsessed.dm" +#include "monkestation\code\modules\storytellers\converted_events\solo\revolutionary.dm" +#include "monkestation\code\modules\storytellers\converted_events\solo\traitor.dm" +#include "monkestation\code\modules\storytellers\converted_events\solo\wizard.dm" +#include "monkestation\code\modules\storytellers\converted_events\solo\ghosts\nuclear_operative_ghost.dm" +#include "monkestation\code\modules\storytellers\converted_events\solo\ghosts\wizard.dm" +#include "monkestation\code\modules\storytellers\storytellers\_storyteller.dm" +#include "monkestation\code\modules\storytellers\storytellers\ghost.dm" +#include "monkestation\code\modules\storytellers\storytellers\hermit.dm" +#include "monkestation\code\modules\storytellers\storytellers\jester.dm" +#include "monkestation\code\modules\storytellers\storytellers\nobleman.dm" +#include "monkestation\code\modules\storytellers\storytellers\sleeper.dm" +#include "monkestation\code\modules\storytellers\storytellers\vote.dm" +#include "monkestation\code\modules\storytellers\storytellers\warrior.dm" #include "monkestation\code\modules\surgery\bodyparts\arachnid_bodyparts.dm" #include "monkestation\code\modules\surgery\bodyparts\clockwork_bodyparts.dm" +#include "monkestation\code\modules\surgery\bodyparts\floran_bodyparts.dm" #include "monkestation\code\modules\surgery\bodyparts\ipc_bodyparts.dm" #include "monkestation\code\modules\surgery\bodyparts\oozeling_bodyparts.dm" #include "monkestation\code\modules\surgery\bodyparts\simian_bodyparts.dm" #include "monkestation\code\modules\surgery\organs\augments.dm" #include "monkestation\code\modules\surgery\organs\external\anime.dm" +#include "monkestation\code\modules\surgery\organs\external\floran_accessories.dm" #include "monkestation\code\modules\surgery\organs\external\goblin_accessories.dm" #include "monkestation\code\modules\surgery\organs\external\ipc.dm" #include "monkestation\code\modules\surgery\organs\external\simian.dm" @@ -6254,6 +6543,22 @@ #include "monkestation\code\modules\surgery\organs\internal\lungs.dm" #include "monkestation\code\modules\surgery\organs\internal\stomach.dm" #include "monkestation\code\modules\surgery\organs\internal\tongue.dm" +#include "monkestation\code\modules\trading\box_rolling.dm" +#include "monkestation\code\modules\trading\lootbox_buying.dm" +#include "monkestation\code\modules\trading\lootbox_odds.dm" +#include "monkestation\code\modules\trading\save_unusual_preference.dm" +#include "monkestation\code\modules\trading\unusual_effects\_unusual_component.dm" +#include "monkestation\code\modules\trading\unusual_effects\animation_housing\__spawning_component.dm" +#include "monkestation\code\modules\trading\unusual_effects\animation_housing\_footprint.dm" +#include "monkestation\code\modules\trading\unusual_effects\animation_housing\confetti.dm" +#include "monkestation\code\modules\trading\unusual_effects\animation_housing\fire.dm" +#include "monkestation\code\modules\trading\unusual_effects\animation_housing\galaxies.dm" +#include "monkestation\code\modules\trading\unusual_effects\animation_housing\holy_steps.dm" +#include "monkestation\code\modules\trading\unusual_effects\animation_housing\music.dm" +#include "monkestation\code\modules\trading\unusual_effects\animation_housing\shooting_stars.dm" +#include "monkestation\code\modules\trading\unusual_effects\animation_housing\skull_rain.dm" +#include "monkestation\code\modules\trading\unusual_effects\animation_housing\snow.dm" +#include "monkestation\code\modules\trading\unusual_effects\animation_housing\weh.dm" #include "monkestation\code\modules\twitch_bits\admin_command.dm" #include "monkestation\code\modules\twitch_bits\twitch_system.dm" #include "monkestation\code\modules\twitch_bits\events\amongus.dm" @@ -6266,9 +6571,16 @@ #include "monkestation\code\modules\twitch_bits\events\random_item.dm" #include "monkestation\code\modules\twitch_bits\events\rod.dm" #include "monkestation\code\modules\twitch_bits\events\skinny.dm" +#include "monkestation\code\modules\uplink\uplink_items.dm" #include "monkestation\code\modules\uplink\uplink_items\badass.dm" +#include "monkestation\code\modules\uplink\uplink_items\bundles.dm" +#include "monkestation\code\modules\uplink\uplink_items\device_tools.dm" +#include "monkestation\code\modules\uplink\uplink_items\explosive.dm" #include "monkestation\code\modules\uplink\uplink_items\job.dm" +#include "monkestation\code\modules\uplink\uplink_items\misc.dm" +#include "monkestation\code\modules\uplink\uplink_items\nukeops.dm" #include "monkestation\code\modules\uplink\uplink_items\species.dm" +#include "monkestation\code\modules\uplink\uplink_items\weapons.dm" #include "monkestation\code\modules\vehicles\monkey_ball.dm" #include "monkestation\code\modules\vehicles\mecha\mecha_actions.dm" #include "monkestation\code\modules\vehicles\mecha\equipment\tools\other_tools.dm" diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss index 14092402337a..4b2701934106 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss @@ -485,6 +485,11 @@ em { font-size: 90%; } +.bolditalic { + font-style: italic; + font-weight: bold; +} + .boldnotice { color: #6685f5; font-weight: bold; @@ -540,6 +545,10 @@ em { } .blob { + color: #ee4000; +} + +.blobannounce { color: #556b2f; font-weight: bold; font-size: 185%; diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss index 33d8d70ad0d3..16c10544bac8 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss @@ -602,6 +602,10 @@ h2.alert { } .blob { + color: #ee4000; +} + +.blobannounce { color: #323f1c; font-weight: bold; font-size: 185%; diff --git a/tgui/packages/tgui/interfaces/Achievements.js b/tgui/packages/tgui/interfaces/Achievements.js index 6ddb12427ced..1ab38ca3655b 100644 --- a/tgui/packages/tgui/interfaces/Achievements.js +++ b/tgui/packages/tgui/interfaces/Achievements.js @@ -1,5 +1,5 @@ import { useBackend, useLocalState } from '../backend'; -import { Box, Flex, Icon, Table, Tabs } from '../components'; +import { Box, Flex, Icon, Table, Tabs, Tooltip } from '../components'; import { Window } from '../layouts'; export const Achievements = (props, context) => { @@ -52,7 +52,15 @@ const AchievementTable = (props, context) => { const Achievement = (props) => { const { achievement } = props; - const { name, desc, icon_class, value, score } = achievement; + const { + name, + desc, + icon_class, + value, + score, + achieve_info, + achieve_tooltip, + } = achievement; return ( @@ -70,6 +78,13 @@ const Achievement = (props) => { {value ? 'Unlocked' : 'Locked'} )} + {!!achieve_info && ( + + + {achieve_info} + + + )} ); diff --git a/tgui/packages/tgui/interfaces/AntagInfoMalf.tsx b/tgui/packages/tgui/interfaces/AntagInfoMalf.tsx index f2d53da2bb12..6292753cf0ad 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoMalf.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoMalf.tsx @@ -195,6 +195,7 @@ export const AntagInfoMalf = (props, context) => { cost: `${item.cost} PT`, desc: item.desc, disabled: processingTime < item.cost, + is_locked: null, }); } } diff --git a/tgui/packages/tgui/interfaces/ArtifactForm.js b/tgui/packages/tgui/interfaces/ArtifactForm.js new file mode 100644 index 000000000000..650b735ada2c --- /dev/null +++ b/tgui/packages/tgui/interfaces/ArtifactForm.js @@ -0,0 +1,69 @@ +import { useBackend } from '../backend'; + +import { Section, Button } from '../components'; +import { Window } from '../layouts'; + +export const ArtifactForm = (props, context) => { + const { act, data } = useBackend(context); + const { + allorigins, + chosenorigin, + alltypes, + chosentype, + alltriggers, + chosentriggers, + } = data; + return ( + + +
+ {allorigins.map((key) => ( +
+
+ {alltypes.map((x) => ( +
+
+ {alltriggers.map((trig) => ( +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/ArtifactPanel.js b/tgui/packages/tgui/interfaces/ArtifactPanel.js new file mode 100644 index 000000000000..e0dc415b150f --- /dev/null +++ b/tgui/packages/tgui/interfaces/ArtifactPanel.js @@ -0,0 +1,42 @@ +import { useBackend } from '../backend'; +import { Section, Box, Button } from '../components'; +import { Window } from '../layouts'; + +export const ArtifactPanel = (props, context) => { + const { act, data } = useBackend(context); + const { artifacts } = data; + return ( + + + {data.artifacts.map((artifact_data) => ( +
+
+ ))} +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/ArtifactXray.js b/tgui/packages/tgui/interfaces/ArtifactXray.js new file mode 100644 index 000000000000..aebd59fad399 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ArtifactXray.js @@ -0,0 +1,67 @@ +import { useBackend } from '../backend'; +import { Slider, Button, Stack, NoticeBox, Section, Box } from '../components'; +import { Window } from '../layouts'; + +export const ArtifactXray = (props, context) => { + const { act, data } = useBackend(context); + const { + is_open, + artifact_name, + pulsing, + current_strength, + max_strength, + results, + } = data; + return ( + + +
act('toggleopen')} + /> + }> + {(!artifact_name && No artifact detected.) || ( + <> + + Currently loaded object: {artifact_name} + + + + act('change_rate', { target: nu })} + /> + + +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/ArtifactZapper.js b/tgui/packages/tgui/interfaces/ArtifactZapper.js new file mode 100644 index 000000000000..2b8036fd7c58 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ArtifactZapper.js @@ -0,0 +1,37 @@ +import { useBackend } from '../backend'; +import { Slider, Button, Stack, Section } from '../components'; +import { Window } from '../layouts'; + +export const ArtifactZapper = (props, context) => { + const { act, data } = useBackend(context); + const { pulsing, current_strength, max_strength } = data; + return ( + + +
+ + + act('strength', { target: nu })} + /> + + +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/BotanyInfuser.js b/tgui/packages/tgui/interfaces/BotanyInfuser.js deleted file mode 100644 index bf89ebbf1808..000000000000 --- a/tgui/packages/tgui/interfaces/BotanyInfuser.js +++ /dev/null @@ -1,200 +0,0 @@ -import { toFixed } from 'common/math'; -import { useBackend } from '../backend'; -import { Box, Button, Flex, LabeledList, ProgressBar, Section, Table } from '../components'; -import { Window } from '../layouts'; - -export const TimeFormat = (props, context) => { - const { value } = props; - - const seconds = toFixed(Math.floor((value / 10) % 60)).padStart(2, '0'); - const minutes = toFixed(Math.floor((value / (10 * 60)) % 60)).padStart( - 2, - '0' - ); - const hours = toFixed(Math.floor((value / (10 * 60 * 60)) % 24)).padStart( - 2, - '0' - ); - const formattedValue = `${hours}:${minutes}:${seconds}`; - return formattedValue; -}; - -export const BotanyInfuser = (props, context) => { - const { data } = useBackend(context); - const { working, timeleft, error } = data; - return ( - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -}; - -export const CurrentPlantStats = (props, context) => { - const { act, data } = useBackend(context); - const { seed, working } = data; - const seed_1 = data.seed || []; - return ( -
- - {seed_1.map((node) => ( - - - - - {node.potency} | {node.potency_change} - - - - - {node.yield} | {node.yield_change} - - - - - {node.production_speed} | {node.production_change} - - - - - {node.maturation_speed} | {node.maturation_change} - - - - - {node.endurance} | {node.endurance_change} - - - - - {node.lifespan} | {node.lifespan_change} - - - - - {node.weed_rate} | {node.weed_rate_change} - - - - - {node.weed_chance} | {node.weed_chance_change} - - - - - - ))} -
-
- ); -}; - -export const DamageBar = (props, context) => { - const { act, data } = useBackend(context); - const { combined_damage } = data; - return ( -
- = 60 ? 'bad' : 'good'} - value={data.combined_damage / 100} - align="center"> - {'Infusion Damage: ' + toFixed(data.combined_damage) + '/ 100'} - -
- ); -}; - -export const PlantVisuals = (props, context) => { - const { act, data } = useBackend(context); - const { seed } = data; - const seed_1 = data.seed || []; - - return ( -
- {seed_1.map((node) => ( - - - - - {node.name} - - {node.desc} - - - ))} -
- ); -}; - -export const UsableButtons = (props, context) => { - const { act, data } = useBackend(context); - const { has_seed, has_beaker } = data; - return ( - - -